diff options
author | Tobin C. Harding <me@tobin.cc> | 2018-06-21 19:15:34 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2018-07-17 21:32:48 -0400 |
commit | 3672476edaa0660eb833f54fa9edeb505417b75c (patch) | |
tree | d60f9e1875ca9fe64a831be8ec83bebcc416257a /lib/vsprintf.c | |
parent | 1c4facb846c7f863bc65483394e80acdbacf671b (diff) |
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>
Diffstat (limited to 'lib/vsprintf.c')
-rw-r--r-- | lib/vsprintf.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 6c1fb395bddf..1ee2829f3b54 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -1651,6 +1651,17 @@ char *device_node_string(char *buf, char *end, struct device_node *dn, | |||
1651 | return widen_string(buf, buf - buf_start, end, spec); | 1651 | return widen_string(buf, buf - buf_start, end, spec); |
1652 | } | 1652 | } |
1653 | 1653 | ||
1654 | /* Make pointers available for printing early in the boot sequence. */ | ||
1655 | static int debug_boot_weak_hash __ro_after_init; | ||
1656 | |||
1657 | static int __init debug_boot_weak_hash_enable(char *str) | ||
1658 | { | ||
1659 | debug_boot_weak_hash = 1; | ||
1660 | pr_info("debug_boot_weak_hash enabled\n"); | ||
1661 | return 0; | ||
1662 | } | ||
1663 | early_param("debug_boot_weak_hash", debug_boot_weak_hash_enable); | ||
1664 | |||
1654 | static DEFINE_STATIC_KEY_TRUE(not_filled_random_ptr_key); | 1665 | static DEFINE_STATIC_KEY_TRUE(not_filled_random_ptr_key); |
1655 | static siphash_key_t ptr_key __read_mostly; | 1666 | static siphash_key_t ptr_key __read_mostly; |
1656 | 1667 | ||
@@ -1703,6 +1714,12 @@ static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec) | |||
1703 | const char *str = sizeof(ptr) == 8 ? "(____ptrval____)" : "(ptrval)"; | 1714 | const char *str = sizeof(ptr) == 8 ? "(____ptrval____)" : "(ptrval)"; |
1704 | unsigned long hashval; | 1715 | unsigned long hashval; |
1705 | 1716 | ||
1717 | /* When debugging early boot use non-cryptographically secure hash. */ | ||
1718 | if (unlikely(debug_boot_weak_hash)) { | ||
1719 | hashval = hash_long((unsigned long)ptr, 32); | ||
1720 | return pointer_string(buf, end, (const void *)hashval, spec); | ||
1721 | } | ||
1722 | |||
1706 | if (static_branch_unlikely(¬_filled_random_ptr_key)) { | 1723 | if (static_branch_unlikely(¬_filled_random_ptr_key)) { |
1707 | spec.field_width = 2 * sizeof(ptr); | 1724 | spec.field_width = 2 * sizeof(ptr); |
1708 | /* string length must be less than default_width */ | 1725 | /* string length must be less than default_width */ |