Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3672476e authored by Tobin C. Harding's avatar Tobin C. Harding Committed by Theodore Ts'o
Browse files

vsprintf: Add command line option debug_boot_weak_hash



Currently printing [hashed] pointers requires enough entropy to be
available.  Early in the boot sequence this may not be the case
resulting in a dummy string '(____ptrval____)' being printed.  This
makes debugging the early boot sequence difficult.  We can relax the
requirement to use cryptographically secure hashing during debugging.
This enables debugging while keeping development/production kernel
behaviour the same.

If new command line option debug_boot_weak_hash is enabled use
cryptographically insecure hashing and hash pointer value immediately.

Reviewed-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: default avatarTobin C. Harding <me@tobin.cc>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent 1c4facb8
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -748,6 +748,14 @@

	debug		[KNL] Enable kernel debugging (events log level).

	debug_boot_weak_hash
			[KNL] Enable printing [hashed] pointers early in the
			boot sequence.  If enabled, we use a weak hash instead
			of siphash to hash pointers.  Use this option if you are
			seeing instances of '(___ptrval___)') and need to see a
			value (hashed pointer) instead. Cryptographically
			insecure, please do not use on production kernels.

	debug_locks_verbose=
			[KNL] verbose self-tests
			Format=<0|1>
+17 −0
Original line number Diff line number Diff line
@@ -1651,6 +1651,17 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
	return widen_string(buf, buf - buf_start, end, spec);
}

/* Make pointers available for printing early in the boot sequence. */
static int debug_boot_weak_hash __ro_after_init;

static int __init debug_boot_weak_hash_enable(char *str)
{
	debug_boot_weak_hash = 1;
	pr_info("debug_boot_weak_hash enabled\n");
	return 0;
}
early_param("debug_boot_weak_hash", debug_boot_weak_hash_enable);

static DEFINE_STATIC_KEY_TRUE(not_filled_random_ptr_key);
static siphash_key_t ptr_key __read_mostly;

@@ -1703,6 +1714,12 @@ static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec)
	const char *str = sizeof(ptr) == 8 ? "(____ptrval____)" : "(ptrval)";
	unsigned long hashval;

	/* When debugging early boot use non-cryptographically secure hash. */
	if (unlikely(debug_boot_weak_hash)) {
		hashval = hash_long((unsigned long)ptr, 32);
		return pointer_string(buf, end, (const void *)hashval, spec);
	}

	if (static_branch_unlikely(&not_filled_random_ptr_key)) {
		spec.field_width = 2 * sizeof(ptr);
		/* string length must be less than default_width */