forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86/mm: Refactor KASLR entropy functions
Move the KASLR entropy functions into arch/x86/lib to be used in early kernel boot for KASLR memory randomization. Signed-off-by: Thomas Garnier <[email protected]> Signed-off-by: Kees Cook <[email protected]> Cc: Alexander Kuleshov <[email protected]> Cc: Alexander Popov <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Andy Lutomirski <[email protected]> Cc: Aneesh Kumar K.V <[email protected]> Cc: Baoquan He <[email protected]> Cc: Boris Ostrovsky <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Brian Gerst <[email protected]> Cc: Christian Borntraeger <[email protected]> Cc: Dan Williams <[email protected]> Cc: Dave Hansen <[email protected]> Cc: Dave Young <[email protected]> Cc: Denys Vlasenko <[email protected]> Cc: Dmitry Vyukov <[email protected]> Cc: H. Peter Anvin <[email protected]> Cc: Jan Beulich <[email protected]> Cc: Joerg Roedel <[email protected]> Cc: Jonathan Corbet <[email protected]> Cc: Josh Poimboeuf <[email protected]> Cc: Juergen Gross <[email protected]> Cc: Kirill A. Shutemov <[email protected]> Cc: Linus Torvalds <[email protected]> Cc: Lv Zheng <[email protected]> Cc: Mark Salter <[email protected]> Cc: Martin Schwidefsky <[email protected]> Cc: Matt Fleming <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Stephen Smalley <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Toshi Kani <[email protected]> Cc: Xiao Guangrong <[email protected]> Cc: Yinghai Lu <[email protected]> Cc: [email protected] Cc: [email protected] Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Ingo Molnar <[email protected]>
- Loading branch information
Showing
4 changed files
with
102 additions
and
71 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#ifndef _ASM_KASLR_H_ | ||
#define _ASM_KASLR_H_ | ||
|
||
unsigned long kaslr_get_random_long(const char *purpose); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
/* | ||
* Entropy functions used on early boot for KASLR base and memory | ||
* randomization. The base randomization is done in the compressed | ||
* kernel and memory randomization is done early when the regular | ||
* kernel starts. This file is included in the compressed kernel and | ||
* normally linked in the regular. | ||
*/ | ||
#include <asm/kaslr.h> | ||
#include <asm/msr.h> | ||
#include <asm/archrandom.h> | ||
#include <asm/e820.h> | ||
#include <asm/io.h> | ||
|
||
/* | ||
* When built for the regular kernel, several functions need to be stubbed out | ||
* or changed to their regular kernel equivalent. | ||
*/ | ||
#ifndef KASLR_COMPRESSED_BOOT | ||
#include <asm/cpufeature.h> | ||
#include <asm/setup.h> | ||
|
||
#define debug_putstr(v) early_printk(v) | ||
#define has_cpuflag(f) boot_cpu_has(f) | ||
#define get_boot_seed() kaslr_offset() | ||
#endif | ||
|
||
#define I8254_PORT_CONTROL 0x43 | ||
#define I8254_PORT_COUNTER0 0x40 | ||
#define I8254_CMD_READBACK 0xC0 | ||
#define I8254_SELECT_COUNTER0 0x02 | ||
#define I8254_STATUS_NOTREADY 0x40 | ||
static inline u16 i8254(void) | ||
{ | ||
u16 status, timer; | ||
|
||
do { | ||
outb(I8254_PORT_CONTROL, | ||
I8254_CMD_READBACK | I8254_SELECT_COUNTER0); | ||
status = inb(I8254_PORT_COUNTER0); | ||
timer = inb(I8254_PORT_COUNTER0); | ||
timer |= inb(I8254_PORT_COUNTER0) << 8; | ||
} while (status & I8254_STATUS_NOTREADY); | ||
|
||
return timer; | ||
} | ||
|
||
unsigned long kaslr_get_random_long(const char *purpose) | ||
{ | ||
#ifdef CONFIG_X86_64 | ||
const unsigned long mix_const = 0x5d6008cbf3848dd3UL; | ||
#else | ||
const unsigned long mix_const = 0x3f39e593UL; | ||
#endif | ||
unsigned long raw, random = get_boot_seed(); | ||
bool use_i8254 = true; | ||
|
||
debug_putstr(purpose); | ||
debug_putstr(" KASLR using"); | ||
|
||
if (has_cpuflag(X86_FEATURE_RDRAND)) { | ||
debug_putstr(" RDRAND"); | ||
if (rdrand_long(&raw)) { | ||
random ^= raw; | ||
use_i8254 = false; | ||
} | ||
} | ||
|
||
if (has_cpuflag(X86_FEATURE_TSC)) { | ||
debug_putstr(" RDTSC"); | ||
raw = rdtsc(); | ||
|
||
random ^= raw; | ||
use_i8254 = false; | ||
} | ||
|
||
if (use_i8254) { | ||
debug_putstr(" i8254"); | ||
random ^= i8254(); | ||
} | ||
|
||
/* Circular multiply for better bit diffusion */ | ||
asm("mul %3" | ||
: "=a" (random), "=d" (raw) | ||
: "a" (random), "rm" (mix_const)); | ||
random += raw; | ||
|
||
debug_putstr("...\n"); | ||
|
||
return random; | ||
} |