diff options
Diffstat (limited to 'arch/x86/kernel/setup.c')
-rw-r--r-- | arch/x86/kernel/setup.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index ab4734e5411d..98dc9317286e 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -89,6 +89,7 @@ | |||
89 | #include <asm/cacheflush.h> | 89 | #include <asm/cacheflush.h> |
90 | #include <asm/processor.h> | 90 | #include <asm/processor.h> |
91 | #include <asm/bugs.h> | 91 | #include <asm/bugs.h> |
92 | #include <asm/kasan.h> | ||
92 | 93 | ||
93 | #include <asm/vsyscall.h> | 94 | #include <asm/vsyscall.h> |
94 | #include <asm/cpu.h> | 95 | #include <asm/cpu.h> |
@@ -121,6 +122,8 @@ | |||
121 | unsigned long max_low_pfn_mapped; | 122 | unsigned long max_low_pfn_mapped; |
122 | unsigned long max_pfn_mapped; | 123 | unsigned long max_pfn_mapped; |
123 | 124 | ||
125 | bool __read_mostly kaslr_enabled = false; | ||
126 | |||
124 | #ifdef CONFIG_DMI | 127 | #ifdef CONFIG_DMI |
125 | RESERVE_BRK(dmi_alloc, 65536); | 128 | RESERVE_BRK(dmi_alloc, 65536); |
126 | #endif | 129 | #endif |
@@ -424,6 +427,11 @@ static void __init reserve_initrd(void) | |||
424 | } | 427 | } |
425 | #endif /* CONFIG_BLK_DEV_INITRD */ | 428 | #endif /* CONFIG_BLK_DEV_INITRD */ |
426 | 429 | ||
430 | static void __init parse_kaslr_setup(u64 pa_data, u32 data_len) | ||
431 | { | ||
432 | kaslr_enabled = (bool)(pa_data + sizeof(struct setup_data)); | ||
433 | } | ||
434 | |||
427 | static void __init parse_setup_data(void) | 435 | static void __init parse_setup_data(void) |
428 | { | 436 | { |
429 | struct setup_data *data; | 437 | struct setup_data *data; |
@@ -431,15 +439,13 @@ static void __init parse_setup_data(void) | |||
431 | 439 | ||
432 | pa_data = boot_params.hdr.setup_data; | 440 | pa_data = boot_params.hdr.setup_data; |
433 | while (pa_data) { | 441 | while (pa_data) { |
434 | u32 data_len, map_len, data_type; | 442 | u32 data_len, data_type; |
435 | 443 | ||
436 | map_len = max(PAGE_SIZE - (pa_data & ~PAGE_MASK), | 444 | data = early_memremap(pa_data, sizeof(*data)); |
437 | (u64)sizeof(struct setup_data)); | ||
438 | data = early_memremap(pa_data, map_len); | ||
439 | data_len = data->len + sizeof(struct setup_data); | 445 | data_len = data->len + sizeof(struct setup_data); |
440 | data_type = data->type; | 446 | data_type = data->type; |
441 | pa_next = data->next; | 447 | pa_next = data->next; |
442 | early_iounmap(data, map_len); | 448 | early_iounmap(data, sizeof(*data)); |
443 | 449 | ||
444 | switch (data_type) { | 450 | switch (data_type) { |
445 | case SETUP_E820_EXT: | 451 | case SETUP_E820_EXT: |
@@ -451,6 +457,9 @@ static void __init parse_setup_data(void) | |||
451 | case SETUP_EFI: | 457 | case SETUP_EFI: |
452 | parse_efi_setup(pa_data, data_len); | 458 | parse_efi_setup(pa_data, data_len); |
453 | break; | 459 | break; |
460 | case SETUP_KASLR: | ||
461 | parse_kaslr_setup(pa_data, data_len); | ||
462 | break; | ||
454 | default: | 463 | default: |
455 | break; | 464 | break; |
456 | } | 465 | } |
@@ -833,10 +842,14 @@ static void __init trim_low_memory_range(void) | |||
833 | static int | 842 | static int |
834 | dump_kernel_offset(struct notifier_block *self, unsigned long v, void *p) | 843 | dump_kernel_offset(struct notifier_block *self, unsigned long v, void *p) |
835 | { | 844 | { |
836 | pr_emerg("Kernel Offset: 0x%lx from 0x%lx " | 845 | if (kaslr_enabled) |
837 | "(relocation range: 0x%lx-0x%lx)\n", | 846 | pr_emerg("Kernel Offset: 0x%lx from 0x%lx (relocation range: 0x%lx-0x%lx)\n", |
838 | (unsigned long)&_text - __START_KERNEL, __START_KERNEL, | 847 | (unsigned long)&_text - __START_KERNEL, |
839 | __START_KERNEL_map, MODULES_VADDR-1); | 848 | __START_KERNEL, |
849 | __START_KERNEL_map, | ||
850 | MODULES_VADDR-1); | ||
851 | else | ||
852 | pr_emerg("Kernel Offset: disabled\n"); | ||
840 | 853 | ||
841 | return 0; | 854 | return 0; |
842 | } | 855 | } |
@@ -1176,9 +1189,11 @@ void __init setup_arch(char **cmdline_p) | |||
1176 | 1189 | ||
1177 | x86_init.paging.pagetable_init(); | 1190 | x86_init.paging.pagetable_init(); |
1178 | 1191 | ||
1192 | kasan_init(); | ||
1193 | |||
1179 | if (boot_cpu_data.cpuid_level >= 0) { | 1194 | if (boot_cpu_data.cpuid_level >= 0) { |
1180 | /* A CPU has %cr4 if and only if it has CPUID */ | 1195 | /* A CPU has %cr4 if and only if it has CPUID */ |
1181 | mmu_cr4_features = read_cr4(); | 1196 | mmu_cr4_features = __read_cr4(); |
1182 | if (trampoline_cr4_features) | 1197 | if (trampoline_cr4_features) |
1183 | *trampoline_cr4_features = mmu_cr4_features; | 1198 | *trampoline_cr4_features = mmu_cr4_features; |
1184 | } | 1199 | } |