|
@@ -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(¬_filled_random_ptr_key)) {
|
|
|
spec.field_width = 2 * sizeof(ptr);
|
|
|
/* string length must be less than default_width */
|