mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-27 16:15:54 +08:00
x86, kaslr: Raise the maximum virtual address to -1 GiB on x86_64
On 64-bit, this raises the maximum location to -1 GiB (from -1.5 GiB), the upper limit currently, since the kernel fixmap page mappings need to be moved to use the other 1 GiB (which would be the theoretical limit when building with -mcmodel=kernel). Signed-off-by: Kees Cook <keescook@chromium.org> Link: http://lkml.kernel.org/r/1381450698-28710-7-git-send-email-keescook@chromium.org Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
parent
f32360ef66
commit
6145cfe394
@ -1746,13 +1746,23 @@ config RANDOMIZE_BASE
|
||||
config RANDOMIZE_BASE_MAX_OFFSET
|
||||
hex "Maximum ASLR offset allowed"
|
||||
depends on RANDOMIZE_BASE
|
||||
default "0x10000000"
|
||||
range 0x0 0x10000000
|
||||
range 0x0 0x20000000 if X86_32
|
||||
default "0x20000000" if X86_32
|
||||
range 0x0 0x40000000 if X86_64
|
||||
default "0x40000000" if X86_64
|
||||
---help---
|
||||
Determines the maximal offset in bytes that will be applied to the
|
||||
kernel when Address Space Layout Randomization (ASLR) is active.
|
||||
Must be less than or equal to the actual physical memory on the
|
||||
system. This must be a power of two.
|
||||
system. This must be a multiple of CONFIG_PHYSICAL_ALIGN.
|
||||
|
||||
On 32-bit this is limited to 512MiB.
|
||||
|
||||
On 64-bit this is limited by how the kernel fixmap page table is
|
||||
positioned, so this cannot be larger that 1GiB currently. Normally
|
||||
there is a 512MiB to 1.5GiB split between kernel and modules. When
|
||||
this is raised above the 512MiB default, the modules area will
|
||||
shrink to compensate, up to the current maximum 1GiB to 1GiB split.
|
||||
|
||||
# Relocation on x86 needs some additional build support
|
||||
config X86_NEED_RELOCS
|
||||
|
@ -39,9 +39,18 @@
|
||||
#define __VIRTUAL_MASK_SHIFT 47
|
||||
|
||||
/*
|
||||
* Kernel image size is limited to 512 MB (see level2_kernel_pgt in
|
||||
* arch/x86/kernel/head_64.S), and it is mapped here:
|
||||
* Kernel image size is limited to 1GiB due to the fixmap living in the
|
||||
* next 1GiB (see level2_kernel_pgt in arch/x86/kernel/head_64.S). Use
|
||||
* 512MiB by default, leaving 1.5GiB for modules once the page tables
|
||||
* are fully set up. If kernel ASLR is configured, it can extend the
|
||||
* kernel page table mapping, reducing the size of the modules area.
|
||||
*/
|
||||
#define KERNEL_IMAGE_SIZE (512 * 1024 * 1024)
|
||||
#define KERNEL_IMAGE_SIZE_DEFAULT (512 * 1024 * 1024)
|
||||
#if defined(CONFIG_RANDOMIZE_BASE) && \
|
||||
CONFIG_RANDOMIZE_BASE_MAX_OFFSET > KERNEL_IMAGE_SIZE_DEFAULT
|
||||
#define KERNEL_IMAGE_SIZE CONFIG_RANDOMIZE_BASE_MAX_OFFSET
|
||||
#else
|
||||
#define KERNEL_IMAGE_SIZE KERNEL_IMAGE_SIZE_DEFAULT
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_PAGE_64_DEFS_H */
|
||||
|
@ -58,7 +58,7 @@ typedef struct { pteval_t pte; } pte_t;
|
||||
#define VMALLOC_START _AC(0xffffc90000000000, UL)
|
||||
#define VMALLOC_END _AC(0xffffe8ffffffffff, UL)
|
||||
#define VMEMMAP_START _AC(0xffffea0000000000, UL)
|
||||
#define MODULES_VADDR _AC(0xffffffffa0000000, UL)
|
||||
#define MODULES_VADDR (__START_KERNEL_map + KERNEL_IMAGE_SIZE)
|
||||
#define MODULES_END _AC(0xffffffffff000000, UL)
|
||||
#define MODULES_LEN (MODULES_END - MODULES_VADDR)
|
||||
|
||||
|
@ -806,6 +806,9 @@ void __init mem_init(void)
|
||||
BUILD_BUG_ON(VMALLOC_START >= VMALLOC_END);
|
||||
#undef high_memory
|
||||
#undef __FIXADDR_TOP
|
||||
#ifdef CONFIG_RANDOMIZE_BASE
|
||||
BUILD_BUG_ON(CONFIG_RANDOMIZE_BASE_MAX_OFFSET > KERNEL_IMAGE_SIZE);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
BUG_ON(PKMAP_BASE + LAST_PKMAP*PAGE_SIZE > FIXADDR_START);
|
||||
|
Loading…
Reference in New Issue
Block a user