x86/boot: Allow a "silent" kaslr random byte fetch
authorKees Cook <keescook@chromium.org>
Wed, 13 Oct 2021 17:57:40 +0000 (10:57 -0700)
committerPeter Zijlstra <peterz@infradead.org>
Wed, 27 Oct 2021 09:07:58 +0000 (11:07 +0200)
Under earlyprintk, each RNG call produces a debug report line. To support
the future FGKASLR feature, which will fetch random bytes during function
shuffling, this is not useful information (each line is identical and
tells us nothing new), needlessly spamming the console. Instead, allow
for a NULL "purpose" to suppress the debug reporting.

Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Link: https://lore.kernel.org/r/20211013175742.1197608-3-keescook@chromium.org
arch/x86/lib/kaslr.c

index a536651164584c96a19b1455f743834291a355c6..2b3eb8c948a3d0d303d206f013ef78f840bf693a 100644 (file)
@@ -56,11 +56,14 @@ unsigned long kaslr_get_random_long(const char *purpose)
        unsigned long raw, random = get_boot_seed();
        bool use_i8254 = true;
 
-       debug_putstr(purpose);
-       debug_putstr(" KASLR using");
+       if (purpose) {
+               debug_putstr(purpose);
+               debug_putstr(" KASLR using");
+       }
 
        if (has_cpuflag(X86_FEATURE_RDRAND)) {
-               debug_putstr(" RDRAND");
+               if (purpose)
+                       debug_putstr(" RDRAND");
                if (rdrand_long(&raw)) {
                        random ^= raw;
                        use_i8254 = false;
@@ -68,7 +71,8 @@ unsigned long kaslr_get_random_long(const char *purpose)
        }
 
        if (has_cpuflag(X86_FEATURE_TSC)) {
-               debug_putstr(" RDTSC");
+               if (purpose)
+                       debug_putstr(" RDTSC");
                raw = rdtsc();
 
                random ^= raw;
@@ -76,7 +80,8 @@ unsigned long kaslr_get_random_long(const char *purpose)
        }
 
        if (use_i8254) {
-               debug_putstr(" i8254");
+               if (purpose)
+                       debug_putstr(" i8254");
                random ^= i8254();
        }
 
@@ -86,7 +91,8 @@ unsigned long kaslr_get_random_long(const char *purpose)
            : "a" (random), "rm" (mix_const));
        random += raw;
 
-       debug_putstr("...\n");
+       if (purpose)
+               debug_putstr("...\n");
 
        return random;
 }