Commit 294a9ddd authored by Mark Brown's avatar Mark Brown Committed by Catalin Marinas

arm64: kaslr: Announce KASLR status on boot

Currently the KASLR code is silent at boot unless it forces on KPTI in
which case a message will be printed for that. This can lead to users
incorrectly believing their system has the feature enabled when it in
fact does not, and if they notice the problem the lack of any
diagnostics makes it harder to understand the problem. Add an initcall
which prints a message showing the status of KASLR during boot to make
the status clear.

This is particularly useful in cases where we don't have a seed. It
seems to be a relatively common error for system integrators and
administrators to enable KASLR in their configuration but not provide
the seed at runtime, often due to seed provisioning breaking at some
later point after it is initially enabled and verified.
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 4f5cafb5
...@@ -19,6 +19,14 @@ ...@@ -19,6 +19,14 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/sections.h> #include <asm/sections.h>
enum kaslr_status {
KASLR_ENABLED,
KASLR_DISABLED_CMDLINE,
KASLR_DISABLED_NO_SEED,
KASLR_DISABLED_FDT_REMAP,
};
enum kaslr_status __ro_after_init kaslr_status;
u64 __ro_after_init module_alloc_base; u64 __ro_after_init module_alloc_base;
u16 __initdata memstart_offset_seed; u16 __initdata memstart_offset_seed;
...@@ -91,15 +99,19 @@ u64 __init kaslr_early_init(u64 dt_phys) ...@@ -91,15 +99,19 @@ u64 __init kaslr_early_init(u64 dt_phys)
*/ */
early_fixmap_init(); early_fixmap_init();
fdt = fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL); fdt = fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);
if (!fdt) if (!fdt) {
kaslr_status = KASLR_DISABLED_FDT_REMAP;
return 0; return 0;
}
/* /*
* Retrieve (and wipe) the seed from the FDT * Retrieve (and wipe) the seed from the FDT
*/ */
seed = get_kaslr_seed(fdt); seed = get_kaslr_seed(fdt);
if (!seed) if (!seed) {
kaslr_status = KASLR_DISABLED_NO_SEED;
return 0; return 0;
}
/* /*
* Check if 'nokaslr' appears on the command line, and * Check if 'nokaslr' appears on the command line, and
...@@ -107,8 +119,10 @@ u64 __init kaslr_early_init(u64 dt_phys) ...@@ -107,8 +119,10 @@ u64 __init kaslr_early_init(u64 dt_phys)
*/ */
cmdline = kaslr_get_cmdline(fdt); cmdline = kaslr_get_cmdline(fdt);
str = strstr(cmdline, "nokaslr"); str = strstr(cmdline, "nokaslr");
if (str == cmdline || (str > cmdline && *(str - 1) == ' ')) if (str == cmdline || (str > cmdline && *(str - 1) == ' ')) {
kaslr_status = KASLR_DISABLED_CMDLINE;
return 0; return 0;
}
/* /*
* OK, so we are proceeding with KASLR enabled. Calculate a suitable * OK, so we are proceeding with KASLR enabled. Calculate a suitable
...@@ -170,3 +184,24 @@ u64 __init kaslr_early_init(u64 dt_phys) ...@@ -170,3 +184,24 @@ u64 __init kaslr_early_init(u64 dt_phys)
return offset; return offset;
} }
static int __init kaslr_init(void)
{
switch (kaslr_status) {
case KASLR_ENABLED:
pr_info("KASLR enabled\n");
break;
case KASLR_DISABLED_CMDLINE:
pr_info("KASLR disabled on command line\n");
break;
case KASLR_DISABLED_NO_SEED:
pr_warn("KASLR disabled due to lack of seed\n");
break;
case KASLR_DISABLED_FDT_REMAP:
pr_warn("KASLR disabled due to FDT remapping failure\n");
break;
}
return 0;
}
core_initcall(kaslr_init)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment