|
@@ -12,10 +12,6 @@
|
|
|
#include "misc.h"
|
|
|
#include "error.h"
|
|
|
|
|
|
-#include <asm/msr.h>
|
|
|
-#include <asm/archrandom.h>
|
|
|
-#include <asm/e820.h>
|
|
|
-
|
|
|
#include <generated/compile.h>
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/uts.h>
|
|
@@ -26,26 +22,6 @@
|
|
|
static const char build_str[] = UTS_RELEASE " (" LINUX_COMPILE_BY "@"
|
|
|
LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION;
|
|
|
|
|
|
-#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;
|
|
|
-}
|
|
|
-
|
|
|
static unsigned long rotate_xor(unsigned long hash, const void *area,
|
|
|
size_t size)
|
|
|
{
|
|
@@ -62,7 +38,7 @@ static unsigned long rotate_xor(unsigned long hash, const void *area,
|
|
|
}
|
|
|
|
|
|
/* Attempt to create a simple but unpredictable starting entropy. */
|
|
|
-static unsigned long get_random_boot(void)
|
|
|
+static unsigned long get_boot_seed(void)
|
|
|
{
|
|
|
unsigned long hash = 0;
|
|
|
|
|
@@ -72,50 +48,8 @@ static unsigned long get_random_boot(void)
|
|
|
return hash;
|
|
|
}
|
|
|
|
|
|
-static unsigned long 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_random_boot();
|
|
|
- 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;
|
|
|
-}
|
|
|
+#define KASLR_COMPRESSED_BOOT
|
|
|
+#include "../../lib/kaslr.c"
|
|
|
|
|
|
struct mem_vector {
|
|
|
unsigned long start;
|
|
@@ -349,7 +283,7 @@ static unsigned long slots_fetch_random(void)
|
|
|
if (slot_max == 0)
|
|
|
return 0;
|
|
|
|
|
|
- slot = get_random_long("Physical") % slot_max;
|
|
|
+ slot = kaslr_get_random_long("Physical") % slot_max;
|
|
|
|
|
|
for (i = 0; i < slot_area_index; i++) {
|
|
|
if (slot >= slot_areas[i].num) {
|
|
@@ -479,7 +413,7 @@ static unsigned long find_random_virt_addr(unsigned long minimum,
|
|
|
slots = (KERNEL_IMAGE_SIZE - minimum - image_size) /
|
|
|
CONFIG_PHYSICAL_ALIGN + 1;
|
|
|
|
|
|
- random_addr = get_random_long("Virtual") % slots;
|
|
|
+ random_addr = kaslr_get_random_long("Virtual") % slots;
|
|
|
|
|
|
return random_addr * CONFIG_PHYSICAL_ALIGN + minimum;
|
|
|
}
|