Loading Documentation/admin-guide/kernel-parameters.txt +15 −0 Original line number Diff line number Diff line Loading @@ -3281,6 +3281,21 @@ in certain environments such as networked servers or real-time systems. no_hash_pointers Force pointers printed to the console or buffers to be unhashed. By default, when a pointer is printed via %p format string, that pointer is "hashed", i.e. obscured by hashing the pointer value. This is a security feature that hides actual kernel addresses from unprivileged users, but it also makes debugging the kernel more difficult since unequal pointers can no longer be compared. However, if this command-line option is specified, then all normal pointers will have their true value printed. Pointers printed via %pK may still be hashed. This option should only be specified when debugging the kernel. Please do not use on production kernels. nohibernate [HIBERNATION] Disable hibernation and resume. nohz= [KNL] Boottime enable/disable dynamic ticks Loading lib/test_bitmap.c +1 −2 Original line number Diff line number Diff line Loading @@ -16,8 +16,7 @@ #include "../tools/testing/selftests/kselftest_module.h" static unsigned total_tests __initdata; static unsigned failed_tests __initdata; KSTM_MODULE_GLOBALS(); static char pbl_buffer[PAGE_SIZE] __initdata; Loading lib/test_printf.c +10 −2 Original line number Diff line number Diff line Loading @@ -30,11 +30,13 @@ #define PAD_SIZE 16 #define FILL_CHAR '$' static unsigned total_tests __initdata; static unsigned failed_tests __initdata; KSTM_MODULE_GLOBALS(); static char *test_buffer __initdata; static char *alloced_buffer __initdata; extern bool no_hash_pointers; static int __printf(4, 0) __init do_test(int bufsize, const char *expect, int elen, const char *fmt, va_list ap) Loading Loading @@ -301,6 +303,12 @@ plain(void) { int err; if (no_hash_pointers) { pr_warn("skipping plain 'p' tests"); skipped_tests += 2; return; } err = plain_hash(); if (err) { pr_warn("plain 'p' does not appear to be hashed\n"); Loading lib/vsprintf.c +34 −2 Original line number Diff line number Diff line Loading @@ -2090,6 +2090,32 @@ char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode, return widen_string(buf, buf - buf_start, end, spec); } /* Disable pointer hashing if requested */ bool no_hash_pointers __ro_after_init; EXPORT_SYMBOL_GPL(no_hash_pointers); static int __init no_hash_pointers_enable(char *str) { no_hash_pointers = true; pr_warn("**********************************************************\n"); pr_warn("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **\n"); pr_warn("** **\n"); pr_warn("** This system shows unhashed kernel memory addresses **\n"); pr_warn("** via the console, logs, and other interfaces. This **\n"); pr_warn("** might reduce the security of your system. **\n"); pr_warn("** **\n"); pr_warn("** If you see this message and you are not debugging **\n"); pr_warn("** the kernel, report this immediately to your system **\n"); pr_warn("** administrator! **\n"); pr_warn("** **\n"); pr_warn("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **\n"); pr_warn("**********************************************************\n"); return 0; } early_param("no_hash_pointers", no_hash_pointers_enable); /* * Show a '%p' thing. A kernel extension is that the '%p' is followed * by an extra set of alphanumeric characters that are extended format Loading Loading @@ -2297,7 +2323,13 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, } } /* default is to _not_ leak addresses, hash before printing */ /* * default is to _not_ leak addresses, so hash before printing, * unless no_hash_pointers is specified on the command line. */ if (unlikely(no_hash_pointers)) return pointer_string(buf, end, ptr, spec); else return ptr_to_id(buf, end, ptr, spec); } Loading tools/testing/selftests/kselftest_module.h +12 −6 Original line number Diff line number Diff line Loading @@ -11,7 +11,8 @@ #define KSTM_MODULE_GLOBALS() \ static unsigned int total_tests __initdata; \ static unsigned int failed_tests __initdata static unsigned int failed_tests __initdata; \ static unsigned int skipped_tests __initdata #define KSTM_CHECK_ZERO(x) do { \ total_tests++; \ Loading @@ -21,11 +22,16 @@ static unsigned int failed_tests __initdata } \ } while (0) static inline int kstm_report(unsigned int total_tests, unsigned int failed_tests) static inline int kstm_report(unsigned int total_tests, unsigned int failed_tests, unsigned int skipped_tests) { if (failed_tests == 0) if (failed_tests == 0) { if (skipped_tests) { pr_info("skipped %u tests\n", skipped_tests); pr_info("remaining %u tests passed\n", total_tests); } else pr_info("all %u tests passed\n", total_tests); else } else pr_warn("failed %u out of %u tests\n", failed_tests, total_tests); return failed_tests ? -EINVAL : 0; Loading @@ -36,7 +42,7 @@ static int __init __module##_init(void) \ { \ pr_info("loaded.\n"); \ selftest(); \ return kstm_report(total_tests, failed_tests); \ return kstm_report(total_tests, failed_tests, skipped_tests); \ } \ static void __exit __module##_exit(void) \ { \ Loading Loading
Documentation/admin-guide/kernel-parameters.txt +15 −0 Original line number Diff line number Diff line Loading @@ -3281,6 +3281,21 @@ in certain environments such as networked servers or real-time systems. no_hash_pointers Force pointers printed to the console or buffers to be unhashed. By default, when a pointer is printed via %p format string, that pointer is "hashed", i.e. obscured by hashing the pointer value. This is a security feature that hides actual kernel addresses from unprivileged users, but it also makes debugging the kernel more difficult since unequal pointers can no longer be compared. However, if this command-line option is specified, then all normal pointers will have their true value printed. Pointers printed via %pK may still be hashed. This option should only be specified when debugging the kernel. Please do not use on production kernels. nohibernate [HIBERNATION] Disable hibernation and resume. nohz= [KNL] Boottime enable/disable dynamic ticks Loading
lib/test_bitmap.c +1 −2 Original line number Diff line number Diff line Loading @@ -16,8 +16,7 @@ #include "../tools/testing/selftests/kselftest_module.h" static unsigned total_tests __initdata; static unsigned failed_tests __initdata; KSTM_MODULE_GLOBALS(); static char pbl_buffer[PAGE_SIZE] __initdata; Loading
lib/test_printf.c +10 −2 Original line number Diff line number Diff line Loading @@ -30,11 +30,13 @@ #define PAD_SIZE 16 #define FILL_CHAR '$' static unsigned total_tests __initdata; static unsigned failed_tests __initdata; KSTM_MODULE_GLOBALS(); static char *test_buffer __initdata; static char *alloced_buffer __initdata; extern bool no_hash_pointers; static int __printf(4, 0) __init do_test(int bufsize, const char *expect, int elen, const char *fmt, va_list ap) Loading Loading @@ -301,6 +303,12 @@ plain(void) { int err; if (no_hash_pointers) { pr_warn("skipping plain 'p' tests"); skipped_tests += 2; return; } err = plain_hash(); if (err) { pr_warn("plain 'p' does not appear to be hashed\n"); Loading
lib/vsprintf.c +34 −2 Original line number Diff line number Diff line Loading @@ -2090,6 +2090,32 @@ char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode, return widen_string(buf, buf - buf_start, end, spec); } /* Disable pointer hashing if requested */ bool no_hash_pointers __ro_after_init; EXPORT_SYMBOL_GPL(no_hash_pointers); static int __init no_hash_pointers_enable(char *str) { no_hash_pointers = true; pr_warn("**********************************************************\n"); pr_warn("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **\n"); pr_warn("** **\n"); pr_warn("** This system shows unhashed kernel memory addresses **\n"); pr_warn("** via the console, logs, and other interfaces. This **\n"); pr_warn("** might reduce the security of your system. **\n"); pr_warn("** **\n"); pr_warn("** If you see this message and you are not debugging **\n"); pr_warn("** the kernel, report this immediately to your system **\n"); pr_warn("** administrator! **\n"); pr_warn("** **\n"); pr_warn("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **\n"); pr_warn("**********************************************************\n"); return 0; } early_param("no_hash_pointers", no_hash_pointers_enable); /* * Show a '%p' thing. A kernel extension is that the '%p' is followed * by an extra set of alphanumeric characters that are extended format Loading Loading @@ -2297,7 +2323,13 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, } } /* default is to _not_ leak addresses, hash before printing */ /* * default is to _not_ leak addresses, so hash before printing, * unless no_hash_pointers is specified on the command line. */ if (unlikely(no_hash_pointers)) return pointer_string(buf, end, ptr, spec); else return ptr_to_id(buf, end, ptr, spec); } Loading
tools/testing/selftests/kselftest_module.h +12 −6 Original line number Diff line number Diff line Loading @@ -11,7 +11,8 @@ #define KSTM_MODULE_GLOBALS() \ static unsigned int total_tests __initdata; \ static unsigned int failed_tests __initdata static unsigned int failed_tests __initdata; \ static unsigned int skipped_tests __initdata #define KSTM_CHECK_ZERO(x) do { \ total_tests++; \ Loading @@ -21,11 +22,16 @@ static unsigned int failed_tests __initdata } \ } while (0) static inline int kstm_report(unsigned int total_tests, unsigned int failed_tests) static inline int kstm_report(unsigned int total_tests, unsigned int failed_tests, unsigned int skipped_tests) { if (failed_tests == 0) if (failed_tests == 0) { if (skipped_tests) { pr_info("skipped %u tests\n", skipped_tests); pr_info("remaining %u tests passed\n", total_tests); } else pr_info("all %u tests passed\n", total_tests); else } else pr_warn("failed %u out of %u tests\n", failed_tests, total_tests); return failed_tests ? -EINVAL : 0; Loading @@ -36,7 +42,7 @@ static int __init __module##_init(void) \ { \ pr_info("loaded.\n"); \ selftest(); \ return kstm_report(total_tests, failed_tests); \ return kstm_report(total_tests, failed_tests, skipped_tests); \ } \ static void __exit __module##_exit(void) \ { \ Loading