]> Git Repo - linux.git/blobdiff - lib/vsprintf.c
mm/sparse.c: make sparse_init_one_section void and remove check
[linux.git] / lib / vsprintf.c
index a48aaa79d352313aa7dda46549f1a3d3e57b0c1f..d5b3a3f95c01c870591a26413c0fb90c6d9f0fc2 100644 (file)
@@ -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;
 
@@ -1675,8 +1686,16 @@ static struct random_ready_callback random_ready = {
 
 static int __init initialize_ptr_random(void)
 {
-       int ret = add_random_ready_callback(&random_ready);
+       int key_size = sizeof(ptr_key);
+       int ret;
 
+       /* Use hw RNG if available. */
+       if (get_random_bytes_arch(&ptr_key, key_size) == key_size) {
+               static_branch_disable(&not_filled_random_ptr_key);
+               return 0;
+       }
+
+       ret = add_random_ready_callback(&random_ready);
        if (!ret) {
                return 0;
        } else if (ret == -EALREADY) {
@@ -1695,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 */
@@ -1942,6 +1967,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
                case 'F':
                        return device_node_string(buf, end, ptr, spec, fmt + 1);
                }
+               break;
        case 'x':
                return pointer_string(buf, end, ptr, spec);
        }
This page took 0.035791 seconds and 4 git commands to generate.