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: Steven Rostedt (VMware) <rostedt@goodmis.org> Signed-off-by: Tobin C. Harding <me@tobin.cc> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
parent
1c4facb846
commit
3672476eda
|
@ -748,6 +748,14 @@
|
||||||
|
|
||||||
debug [KNL] Enable kernel debugging (events log level).
|
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=
|
debug_locks_verbose=
|
||||||
[KNL] verbose self-tests
|
[KNL] verbose self-tests
|
||||||
Format=<0|1>
|
Format=<0|1>
|
||||||
|
|
|
@ -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);
|
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 DEFINE_STATIC_KEY_TRUE(not_filled_random_ptr_key);
|
||||||
static siphash_key_t ptr_key __read_mostly;
|
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)";
|
const char *str = sizeof(ptr) == 8 ? "(____ptrval____)" : "(ptrval)";
|
||||||
unsigned long hashval;
|
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(¬_filled_random_ptr_key)) {
|
if (static_branch_unlikely(¬_filled_random_ptr_key)) {
|
||||||
spec.field_width = 2 * sizeof(ptr);
|
spec.field_width = 2 * sizeof(ptr);
|
||||||
/* string length must be less than default_width */
|
/* string length must be less than default_width */
|
||||||
|
|
Loading…
Reference in New Issue