From: Thomas Garnier <thgarnie@google.com> To: "Herbert Xu" <herbert@gondor.apana.org.au>, "David S . Miller" <davem@davemloft.net>, "Thomas Gleixner" <tglx@linutronix.de>, "Ingo Molnar" <mingo@redhat.com>, "H . Peter Anvin" <hpa@zytor.com>, "Peter Zijlstra" <peterz@infradead.org>, "Josh Poimboeuf" <jpoimboe@redhat.com>, "Arnd Bergmann" <arnd@arndb.de>, "Thomas Garnier" <thgarnie@google.com>, "Matthias Kaehlcke" <mka@chromium.org>, "Boris Ostrovsky" <boris.ostrovsky@oracle.com>, "Juergen Gross" <jgross@suse.com>, "Paolo Bonzini" <pbonzini@redhat.com>, "Radim Krčmář" <rkrcmar@redhat.com>, "Joerg Roedel" <joro@8bytes.org>, "Tom Lendacky" <thomas.lendacky@amd.com>, "Andy Lutomirski" <luto@kernel.org>, "Borislav Petkov" <bp@suse.de>, "Brian Gerst" <brgerst@gmail.com>, "Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>, "Rafael J . Wysocki" <rjw@rjwysocki.net>, "Len Brown" <len.brown@intel.com>, "Pavel Machek" <pavel@ucw.cz> Cc: linux-arch@vger.kernel.org, kvm@vger.kernel.org, linux-pm@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, linux-sparse@vger.kernel.org, linux-crypto@vger.kernel.org, kernel-hardening@lists.openwall.com, xen-devel@lists.xenproject.org Subject: [RFC v2 23/23] x86/kaslr: Add option to extend KASLR range from 1GB to 3GB Date: Thu, 10 Aug 2017 10:26:15 -0700 [thread overview] Message-ID: <20170810172615.51965-24-thgarnie@google.com> (raw) In-Reply-To: <20170810172615.51965-1-thgarnie@google.com> Add a new CONFIG_RANDOMIZE_BASE_LARGE option to benefit from PIE support. It increases the KASLR range from 1GB to 3GB. The new range stars at 0xffffffff00000000 just above the EFI memory region. This option is off by default. The boot code is adapted to create the appropriate page table spanning three PUD pages. The relocation table uses 64-bit integers generated with the updated relocation tool with the large-reloc option. Signed-off-by: Thomas Garnier <thgarnie@google.com> --- arch/x86/Kconfig | 21 +++++++++++++++++++++ arch/x86/boot/compressed/Makefile | 5 +++++ arch/x86/boot/compressed/misc.c | 10 +++++++++- arch/x86/include/asm/page_64_types.h | 9 +++++++++ arch/x86/kernel/head64.c | 18 ++++++++++++++---- arch/x86/kernel/head_64.S | 11 ++++++++++- 6 files changed, 68 insertions(+), 6 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2b69be667543..f3027000ec60 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2149,6 +2149,27 @@ config X86_MODULE_PLTS select X86_MODULE_MODEL_LARGE select HAVE_MOD_ARCH_SPECIFIC +config RANDOMIZE_BASE_LARGE + bool "Increase the randomization range of the kernel image" + depends on X86_64 && RANDOMIZE_BASE + select X86_PIE + select X86_MODULE_PLTS if MODULES + default n + ---help--- + Build the kernel as a Position Independent Executable (PIE) and + increase the available randomization range from 1GB to 3GB. + + This option impacts performance on kernel CPU intensive workloads up + to 10% due to PIE generated code. Impact on user-mode processes and + typical usage would be significantly less (0.50% when you build the + kernel). + + The kernel and modules will generate slightly more assembly (1 to 2% + increase on the .text sections). The vmlinux binary will be + significantly smaller due to less relocations. + + If unsure say N + config HOTPLUG_CPU bool "Support for hot-pluggable CPUs" depends on SMP diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index 8a958274b54c..94dfee5a7cd2 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile @@ -112,7 +112,12 @@ $(obj)/vmlinux.bin: vmlinux FORCE targets += $(patsubst $(obj)/%,%,$(vmlinux-objs-y)) vmlinux.bin.all vmlinux.relocs +# Large randomization require bigger relocation table +ifeq ($(CONFIG_RANDOMIZE_BASE_LARGE),y) +CMD_RELOCS = arch/x86/tools/relocs --large-reloc +else CMD_RELOCS = arch/x86/tools/relocs +endif quiet_cmd_relocs = RELOCS $@ cmd_relocs = $(CMD_RELOCS) $< > $@;$(CMD_RELOCS) --abs-relocs $< $(obj)/vmlinux.relocs: vmlinux FORCE diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index c20cdc7cbd61..82a0ea17c9dc 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c @@ -170,10 +170,18 @@ void __puthex(unsigned long value) } #if CONFIG_X86_NEED_RELOCS + +/* Large randomization go lower than -2G and use large relocation table */ +#ifdef CONFIG_RANDOMIZE_BASE_LARGE +typedef long rel_t; +#else +typedef int rel_t; +#endif + static void handle_relocations(void *output, unsigned long output_len, unsigned long virt_addr) { - int *reloc; + rel_t *reloc; unsigned long delta, map, ptr; unsigned long min_addr = (unsigned long)output; unsigned long max_addr = min_addr + (VO___bss_start - VO__text); diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h index 3f5f08b010d0..6b65f846dd64 100644 --- a/arch/x86/include/asm/page_64_types.h +++ b/arch/x86/include/asm/page_64_types.h @@ -48,7 +48,11 @@ #define __PAGE_OFFSET __PAGE_OFFSET_BASE #endif /* CONFIG_RANDOMIZE_MEMORY */ +#ifdef CONFIG_RANDOMIZE_BASE_LARGE +#define __START_KERNEL_map _AC(0xffffffff00000000, UL) +#else #define __START_KERNEL_map _AC(0xffffffff80000000, UL) +#endif /* CONFIG_RANDOMIZE_BASE_LARGE */ /* See Documentation/x86/x86_64/mm.txt for a description of the memory map. */ #ifdef CONFIG_X86_5LEVEL @@ -65,9 +69,14 @@ * 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. + * On PIE, we relocate the binary 2G lower so add this extra space. */ #if defined(CONFIG_RANDOMIZE_BASE) +#ifdef CONFIG_RANDOMIZE_BASE_LARGE +#define KERNEL_IMAGE_SIZE (_AC(3, UL) * 1024 * 1024 * 1024) +#else #define KERNEL_IMAGE_SIZE (1024 * 1024 * 1024) +#endif #else #define KERNEL_IMAGE_SIZE (512 * 1024 * 1024) #endif diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index e71f27a20576..7e817e804e89 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -39,6 +39,7 @@ static unsigned int __initdata next_early_pgt; pmdval_t early_pmd_flags = __PAGE_KERNEL_LARGE & ~(_PAGE_GLOBAL | _PAGE_NX); #define __head __section(.head.text) +#define pud_count(x) (((x + (PUD_SIZE - 1)) & ~(PUD_SIZE - 1)) >> PUD_SHIFT) static void __head *fixup_pointer(void *ptr, unsigned long physaddr) { @@ -56,6 +57,8 @@ unsigned long __head notrace __startup_64(unsigned long physaddr, { unsigned long load_delta, *p; unsigned long pgtable_flags; + unsigned long level3_kernel_start, level3_kernel_count; + unsigned long level3_fixmap_start; pgdval_t *pgd; p4dval_t *p4d; pudval_t *pud; @@ -82,6 +85,11 @@ unsigned long __head notrace __startup_64(unsigned long physaddr, /* Include the SME encryption mask in the fixup value */ load_delta += sme_get_me_mask(); + /* Look at the randomization spread to adapt page table used */ + level3_kernel_start = pud_index(__START_KERNEL_map); + level3_kernel_count = pud_count(KERNEL_IMAGE_SIZE); + level3_fixmap_start = level3_kernel_start + level3_kernel_count; + /* Fixup the physical addresses in the page table */ pgd = fixup_pointer(&early_top_pgt, physaddr); @@ -93,8 +101,9 @@ unsigned long __head notrace __startup_64(unsigned long physaddr, } pud = fixup_pointer(&level3_kernel_pgt, physaddr); - pud[510] += load_delta; - pud[511] += load_delta; + for (i = 0; i < level3_kernel_count; i++) + pud[level3_kernel_start + i] += load_delta; + pud[level3_fixmap_start] += load_delta; pmd = fixup_pointer(level2_fixmap_pgt, physaddr); pmd[506] += load_delta; @@ -147,7 +156,7 @@ unsigned long __head notrace __startup_64(unsigned long physaddr, */ pmd = fixup_pointer(level2_kernel_pgt, physaddr); - for (i = 0; i < PTRS_PER_PMD; i++) { + for (i = 0; i < PTRS_PER_PMD * level3_kernel_count; i++) { if (pmd[i] & _PAGE_PRESENT) pmd[i] += load_delta; } @@ -322,7 +331,8 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data) */ BUILD_BUG_ON(MODULES_VADDR < __START_KERNEL_map); BUILD_BUG_ON(MODULES_VADDR - __START_KERNEL_map < KERNEL_IMAGE_SIZE); - BUILD_BUG_ON(MODULES_LEN + KERNEL_IMAGE_SIZE > 2*PUD_SIZE); + BUILD_BUG_ON(!IS_ENABLED(CONFIG_RANDOMIZE_BASE_LARGE) && + MODULES_LEN + KERNEL_IMAGE_SIZE > 2*PUD_SIZE); BUILD_BUG_ON((__START_KERNEL_map & ~PMD_MASK) != 0); BUILD_BUG_ON((MODULES_VADDR & ~PMD_MASK) != 0); BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL)); diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 68bf7892f201..d53942ee83eb 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S @@ -39,11 +39,15 @@ #define p4d_index(x) (((x) >> P4D_SHIFT) & (PTRS_PER_P4D-1)) #define pud_index(x) (((x) >> PUD_SHIFT) & (PTRS_PER_PUD-1)) +#define pud_count(x) (((x + (PUD_SIZE - 1)) & ~(PUD_SIZE - 1)) >> PUD_SHIFT) PGD_PAGE_OFFSET = pgd_index(__PAGE_OFFSET_BASE) PGD_START_KERNEL = pgd_index(__START_KERNEL_map) L3_START_KERNEL = pud_index(__START_KERNEL_map) +/* Adapt page table L3 space based on range of randomization */ +L3_KERNEL_ENTRY_COUNT = pud_count(KERNEL_IMAGE_SIZE) + .text __HEAD .code64 @@ -411,7 +415,12 @@ NEXT_PAGE(level4_kernel_pgt) NEXT_PAGE(level3_kernel_pgt) .fill L3_START_KERNEL,8,0 /* (2^48-(2*1024*1024*1024)-((2^39)*511))/(2^30) = 510 */ - .quad level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC + i = 0 + .rept L3_KERNEL_ENTRY_COUNT + .quad level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC \ + + PAGE_SIZE*i + i = i + 1 + .endr .quad level2_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE_NOENC NEXT_PAGE(level2_kernel_pgt) -- 2.14.0.434.g98096fd7a8-goog _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
WARNING: multiple messages have this Message-ID (diff)
From: Thomas Garnier <thgarnie@google.com> To: "Herbert Xu" <herbert@gondor.apana.org.au>, "David S . Miller" <davem@davemloft.net>, "Thomas Gleixner" <tglx@linutronix.de>, "Ingo Molnar" <mingo@redhat.com>, "H . Peter Anvin" <hpa@zytor.com>, "Peter Zijlstra" <peterz@infradead.org>, "Josh Poimboeuf" <jpoimboe@redhat.com>, "Arnd Bergmann" <arnd@arndb.de>, "Thomas Garnier" <thgarnie@google.com>, "Matthias Kaehlcke" <mka@chromium.org>, "Boris Ostrovsky" <boris.ostrovsky@oracle.com>, "Juergen Gross" <jgross@suse.com>, "Paolo Bonzini" <pbonzini@redhat.com>, "Radim Krčmář" <rkrcmar@redhat.com>, "Joerg Roedel" <joro@8bytes.org>, "Tom Lendacky" <thomas.lendacky@amd.com>, "Andy Lutomirski" <luto@kernel.org>, "Borislav Petkov" <bp@suse.de>, "Brian Gerst" <brgerst@gmail.com>, "Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>, "Rafael J . Wysocki" <rjw@rjwysocki.net>, "Len Brown" <len.brown@intel.com>, "Pavel Machek" <pavel@ucw.cz>, "Tejun Heo" <tj@kernel.org>, "Christoph Lameter" <cl@linux.com>, "Paul Gortmaker" <paul.gortmaker@windriver.com>, "Chris Metcalf" <cmetcalf@mellanox.com>, "Andrew Morton" <akpm@linux-foundation.org>, "Paul E . McKenney" <paulmck@linux.vnet.ibm.com>, "Nicolas Pitre" <nicolas.pitre@linaro.org>, "Christopher Li" <sparse@chrisli.org>, "Rafael J . Wysocki" <rafael.j.wysocki@intel.com>, "Lukas Wunner" <lukas@wunner.de>, "Mika Westerberg" <mika.westerberg@linux.intel.com>, "Dou Liyang" <douly.fnst@cn.fujitsu.com>, "Daniel Borkmann" <daniel@iogearbox.net>, "Alexei Starovoitov" <ast@kernel.org>, "Masahiro Yamada" <yamada.masahiro@socionext.com>, "Markus Trippelsdorf" <markus@trippelsdorf.de>, "Steven Rostedt" <rostedt@goodmis.org>, "Kees Cook" <keescook@chromium.org>, "Rik van Riel" <riel@redhat.com>, "David Howells" <dhowells@redhat.com>, "Waiman Long" <longman@redhat.com>, "Kyle Huey" <me@kylehuey.com>, "Peter Foley" <pefoley2@pefoley.com>, "Tim Chen" <tim.c.chen@linux.intel.com>, "Catalin Marinas" <catalin.marinas@arm.com>, "Ard Biesheuvel" <ard.biesheuvel@linaro.org>, "Michal Hocko" <mhocko@suse.com>, "Matthew Wilcox" <mawilcox@microsoft.com>, "H . J . Lu" <hjl.tools@gmail.com>, "Paul Bolle" <pebolle@tiscali.nl>, "Rob Landley" <rob@landley.net>, "Baoquan He" <bhe@redhat.com>, "Daniel Micay" <danielmicay@gmail.com> Cc: x86@kernel.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, kvm@vger.kernel.org, linux-pm@vger.kernel.org, linux-arch@vger.kernel.org, linux-sparse@vger.kernel.org, kernel-hardening@lists.openwall.com Subject: [kernel-hardening] [RFC v2 23/23] x86/kaslr: Add option to extend KASLR range from 1GB to 3GB Date: Thu, 10 Aug 2017 10:26:15 -0700 [thread overview] Message-ID: <20170810172615.51965-24-thgarnie@google.com> (raw) In-Reply-To: <20170810172615.51965-1-thgarnie@google.com> Add a new CONFIG_RANDOMIZE_BASE_LARGE option to benefit from PIE support. It increases the KASLR range from 1GB to 3GB. The new range stars at 0xffffffff00000000 just above the EFI memory region. This option is off by default. The boot code is adapted to create the appropriate page table spanning three PUD pages. The relocation table uses 64-bit integers generated with the updated relocation tool with the large-reloc option. Signed-off-by: Thomas Garnier <thgarnie@google.com> --- arch/x86/Kconfig | 21 +++++++++++++++++++++ arch/x86/boot/compressed/Makefile | 5 +++++ arch/x86/boot/compressed/misc.c | 10 +++++++++- arch/x86/include/asm/page_64_types.h | 9 +++++++++ arch/x86/kernel/head64.c | 18 ++++++++++++++---- arch/x86/kernel/head_64.S | 11 ++++++++++- 6 files changed, 68 insertions(+), 6 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2b69be667543..f3027000ec60 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2149,6 +2149,27 @@ config X86_MODULE_PLTS select X86_MODULE_MODEL_LARGE select HAVE_MOD_ARCH_SPECIFIC +config RANDOMIZE_BASE_LARGE + bool "Increase the randomization range of the kernel image" + depends on X86_64 && RANDOMIZE_BASE + select X86_PIE + select X86_MODULE_PLTS if MODULES + default n + ---help--- + Build the kernel as a Position Independent Executable (PIE) and + increase the available randomization range from 1GB to 3GB. + + This option impacts performance on kernel CPU intensive workloads up + to 10% due to PIE generated code. Impact on user-mode processes and + typical usage would be significantly less (0.50% when you build the + kernel). + + The kernel and modules will generate slightly more assembly (1 to 2% + increase on the .text sections). The vmlinux binary will be + significantly smaller due to less relocations. + + If unsure say N + config HOTPLUG_CPU bool "Support for hot-pluggable CPUs" depends on SMP diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index 8a958274b54c..94dfee5a7cd2 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile @@ -112,7 +112,12 @@ $(obj)/vmlinux.bin: vmlinux FORCE targets += $(patsubst $(obj)/%,%,$(vmlinux-objs-y)) vmlinux.bin.all vmlinux.relocs +# Large randomization require bigger relocation table +ifeq ($(CONFIG_RANDOMIZE_BASE_LARGE),y) +CMD_RELOCS = arch/x86/tools/relocs --large-reloc +else CMD_RELOCS = arch/x86/tools/relocs +endif quiet_cmd_relocs = RELOCS $@ cmd_relocs = $(CMD_RELOCS) $< > $@;$(CMD_RELOCS) --abs-relocs $< $(obj)/vmlinux.relocs: vmlinux FORCE diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index c20cdc7cbd61..82a0ea17c9dc 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c @@ -170,10 +170,18 @@ void __puthex(unsigned long value) } #if CONFIG_X86_NEED_RELOCS + +/* Large randomization go lower than -2G and use large relocation table */ +#ifdef CONFIG_RANDOMIZE_BASE_LARGE +typedef long rel_t; +#else +typedef int rel_t; +#endif + static void handle_relocations(void *output, unsigned long output_len, unsigned long virt_addr) { - int *reloc; + rel_t *reloc; unsigned long delta, map, ptr; unsigned long min_addr = (unsigned long)output; unsigned long max_addr = min_addr + (VO___bss_start - VO__text); diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h index 3f5f08b010d0..6b65f846dd64 100644 --- a/arch/x86/include/asm/page_64_types.h +++ b/arch/x86/include/asm/page_64_types.h @@ -48,7 +48,11 @@ #define __PAGE_OFFSET __PAGE_OFFSET_BASE #endif /* CONFIG_RANDOMIZE_MEMORY */ +#ifdef CONFIG_RANDOMIZE_BASE_LARGE +#define __START_KERNEL_map _AC(0xffffffff00000000, UL) +#else #define __START_KERNEL_map _AC(0xffffffff80000000, UL) +#endif /* CONFIG_RANDOMIZE_BASE_LARGE */ /* See Documentation/x86/x86_64/mm.txt for a description of the memory map. */ #ifdef CONFIG_X86_5LEVEL @@ -65,9 +69,14 @@ * 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. + * On PIE, we relocate the binary 2G lower so add this extra space. */ #if defined(CONFIG_RANDOMIZE_BASE) +#ifdef CONFIG_RANDOMIZE_BASE_LARGE +#define KERNEL_IMAGE_SIZE (_AC(3, UL) * 1024 * 1024 * 1024) +#else #define KERNEL_IMAGE_SIZE (1024 * 1024 * 1024) +#endif #else #define KERNEL_IMAGE_SIZE (512 * 1024 * 1024) #endif diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index e71f27a20576..7e817e804e89 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -39,6 +39,7 @@ static unsigned int __initdata next_early_pgt; pmdval_t early_pmd_flags = __PAGE_KERNEL_LARGE & ~(_PAGE_GLOBAL | _PAGE_NX); #define __head __section(.head.text) +#define pud_count(x) (((x + (PUD_SIZE - 1)) & ~(PUD_SIZE - 1)) >> PUD_SHIFT) static void __head *fixup_pointer(void *ptr, unsigned long physaddr) { @@ -56,6 +57,8 @@ unsigned long __head notrace __startup_64(unsigned long physaddr, { unsigned long load_delta, *p; unsigned long pgtable_flags; + unsigned long level3_kernel_start, level3_kernel_count; + unsigned long level3_fixmap_start; pgdval_t *pgd; p4dval_t *p4d; pudval_t *pud; @@ -82,6 +85,11 @@ unsigned long __head notrace __startup_64(unsigned long physaddr, /* Include the SME encryption mask in the fixup value */ load_delta += sme_get_me_mask(); + /* Look at the randomization spread to adapt page table used */ + level3_kernel_start = pud_index(__START_KERNEL_map); + level3_kernel_count = pud_count(KERNEL_IMAGE_SIZE); + level3_fixmap_start = level3_kernel_start + level3_kernel_count; + /* Fixup the physical addresses in the page table */ pgd = fixup_pointer(&early_top_pgt, physaddr); @@ -93,8 +101,9 @@ unsigned long __head notrace __startup_64(unsigned long physaddr, } pud = fixup_pointer(&level3_kernel_pgt, physaddr); - pud[510] += load_delta; - pud[511] += load_delta; + for (i = 0; i < level3_kernel_count; i++) + pud[level3_kernel_start + i] += load_delta; + pud[level3_fixmap_start] += load_delta; pmd = fixup_pointer(level2_fixmap_pgt, physaddr); pmd[506] += load_delta; @@ -147,7 +156,7 @@ unsigned long __head notrace __startup_64(unsigned long physaddr, */ pmd = fixup_pointer(level2_kernel_pgt, physaddr); - for (i = 0; i < PTRS_PER_PMD; i++) { + for (i = 0; i < PTRS_PER_PMD * level3_kernel_count; i++) { if (pmd[i] & _PAGE_PRESENT) pmd[i] += load_delta; } @@ -322,7 +331,8 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data) */ BUILD_BUG_ON(MODULES_VADDR < __START_KERNEL_map); BUILD_BUG_ON(MODULES_VADDR - __START_KERNEL_map < KERNEL_IMAGE_SIZE); - BUILD_BUG_ON(MODULES_LEN + KERNEL_IMAGE_SIZE > 2*PUD_SIZE); + BUILD_BUG_ON(!IS_ENABLED(CONFIG_RANDOMIZE_BASE_LARGE) && + MODULES_LEN + KERNEL_IMAGE_SIZE > 2*PUD_SIZE); BUILD_BUG_ON((__START_KERNEL_map & ~PMD_MASK) != 0); BUILD_BUG_ON((MODULES_VADDR & ~PMD_MASK) != 0); BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL)); diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 68bf7892f201..d53942ee83eb 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S @@ -39,11 +39,15 @@ #define p4d_index(x) (((x) >> P4D_SHIFT) & (PTRS_PER_P4D-1)) #define pud_index(x) (((x) >> PUD_SHIFT) & (PTRS_PER_PUD-1)) +#define pud_count(x) (((x + (PUD_SIZE - 1)) & ~(PUD_SIZE - 1)) >> PUD_SHIFT) PGD_PAGE_OFFSET = pgd_index(__PAGE_OFFSET_BASE) PGD_START_KERNEL = pgd_index(__START_KERNEL_map) L3_START_KERNEL = pud_index(__START_KERNEL_map) +/* Adapt page table L3 space based on range of randomization */ +L3_KERNEL_ENTRY_COUNT = pud_count(KERNEL_IMAGE_SIZE) + .text __HEAD .code64 @@ -411,7 +415,12 @@ NEXT_PAGE(level4_kernel_pgt) NEXT_PAGE(level3_kernel_pgt) .fill L3_START_KERNEL,8,0 /* (2^48-(2*1024*1024*1024)-((2^39)*511))/(2^30) = 510 */ - .quad level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC + i = 0 + .rept L3_KERNEL_ENTRY_COUNT + .quad level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE_NOENC \ + + PAGE_SIZE*i + i = i + 1 + .endr .quad level2_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE_NOENC NEXT_PAGE(level2_kernel_pgt) -- 2.14.0.434.g98096fd7a8-goog
next prev parent reply other threads:[~2017-08-10 17:26 UTC|newest] Thread overview: 212+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-08-10 17:25 x86: PIE support and option to extend KASLR randomization Thomas Garnier 2017-08-10 17:25 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:25 ` [RFC v2 01/23] x86/crypto: Adapt assembly for PIE support Thomas Garnier 2017-08-10 17:25 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:25 ` [RFC v2 02/23] x86: Use symbol name on bug table " Thomas Garnier 2017-08-10 17:25 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:25 ` [RFC v2 03/23] x86: Use symbol name in jump " Thomas Garnier 2017-08-10 17:25 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:25 ` [RFC v2 04/23] x86: Add macro to get symbol address " Thomas Garnier 2017-08-10 17:25 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:25 ` [RFC v2 05/23] xen: Adapt assembly " Thomas Garnier 2017-08-10 17:25 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:25 ` [RFC v2 06/23] kvm: " Thomas Garnier 2017-08-10 17:25 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:25 ` [RFC v2 07/23] x86: relocate_kernel - " Thomas Garnier 2017-08-10 17:25 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 08/23] x86/entry/64: " Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 09/23] x86: pm-trace - " Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 10/23] x86/CPU: " Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 11/23] x86/acpi: " Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 12/23] x86/boot/64: " Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 13/23] x86/power/64: " Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-11 12:36 ` Pavel Machek 2017-08-11 12:36 ` Pavel Machek 2017-08-11 12:36 ` [kernel-hardening] " Pavel Machek 2017-08-11 15:09 ` Thomas Garnier 2017-08-11 15:09 ` [kernel-hardening] " Thomas Garnier 2017-08-11 15:09 ` Thomas Garnier 2017-08-10 17:26 ` [RFC v2 14/23] x86/paravirt: " Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 15/23] x86/boot/64: Use _text in a global " Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 16/23] x86/percpu: Adapt percpu " Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 17/23] compiler: Option to default to hidden symbols Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 18/23] x86/relocs: Handle DYN relocations for PIE support Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 19/23] x86: Support global stack cookie Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 20/23] x86/pie: Add option to build the kernel as PIE for x86_64 Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 21/23] x86/relocs: Add option to generate 64-bit relocations Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` [RFC v2 22/23] x86/module: Add support for mcmodel large and PLTs Thomas Garnier 2017-08-10 17:26 ` [kernel-hardening] " Thomas Garnier 2017-08-10 17:26 ` Thomas Garnier [this message] 2017-08-10 17:26 ` [kernel-hardening] [RFC v2 23/23] x86/kaslr: Add option to extend KASLR range from 1GB to 3GB Thomas Garnier 2017-08-11 12:41 ` x86: PIE support and option to extend KASLR randomization Ingo Molnar 2017-08-11 12:41 ` [kernel-hardening] " Ingo Molnar 2017-08-11 15:09 ` Thomas Garnier 2017-08-11 15:09 ` Thomas Garnier 2017-08-11 15:09 ` [kernel-hardening] " Thomas Garnier 2017-08-15 7:56 ` Ingo Molnar 2017-08-15 7:56 ` Ingo Molnar 2017-08-15 7:56 ` [kernel-hardening] " Ingo Molnar 2017-08-15 12:15 ` Jordan Glover 2017-08-15 13:42 ` Rik van Riel 2017-08-15 14:20 ` Thomas Garnier 2017-08-15 14:20 ` Thomas Garnier 2017-08-15 14:20 ` [kernel-hardening] " Thomas Garnier 2017-08-15 14:47 ` Daniel Micay 2017-08-15 14:47 ` Daniel Micay 2017-08-15 14:47 ` [kernel-hardening] " Daniel Micay 2017-08-15 14:58 ` Thomas Garnier 2017-08-15 14:58 ` Thomas Garnier 2017-08-15 14:58 ` [kernel-hardening] " Thomas Garnier 2017-08-16 15:12 ` Ingo Molnar 2017-08-16 15:12 ` Ingo Molnar 2017-08-16 15:12 ` [kernel-hardening] " Ingo Molnar 2017-08-16 16:09 ` Christopher Lameter 2017-08-16 16:09 ` Christopher Lameter 2017-08-16 16:09 ` [kernel-hardening] " Christopher Lameter 2017-08-16 16:26 ` Daniel Micay 2017-08-16 16:26 ` [kernel-hardening] " Daniel Micay 2017-08-16 16:32 ` Ard Biesheuvel 2017-08-16 16:32 ` Ard Biesheuvel 2017-08-16 16:32 ` [kernel-hardening] " Ard Biesheuvel 2017-08-16 16:26 ` Daniel Micay 2017-08-16 16:57 ` Thomas Garnier 2017-08-16 16:57 ` Thomas Garnier 2017-08-16 16:57 ` [kernel-hardening] " Thomas Garnier 2017-08-17 8:09 ` Ingo Molnar 2017-08-17 8:09 ` Ingo Molnar 2017-08-17 8:09 ` [kernel-hardening] " Ingo Molnar 2017-08-17 14:10 ` Thomas Garnier 2017-08-17 14:10 ` Thomas Garnier 2017-08-17 14:10 ` [kernel-hardening] " Thomas Garnier 2017-08-24 21:13 ` Thomas Garnier 2017-08-24 21:13 ` Thomas Garnier 2017-08-24 21:13 ` [kernel-hardening] " Thomas Garnier 2017-08-24 21:42 ` Linus Torvalds 2017-08-24 21:42 ` Linus Torvalds 2017-08-24 21:42 ` [kernel-hardening] " Linus Torvalds 2017-08-25 15:35 ` Thomas Garnier 2017-08-25 15:35 ` [kernel-hardening] " Thomas Garnier 2017-08-25 15:35 ` Thomas Garnier 2017-08-25 1:07 ` Steven Rostedt 2017-08-25 1:07 ` [kernel-hardening] " Steven Rostedt 2017-08-25 8:04 ` Ingo Molnar 2017-08-25 8:04 ` Ingo Molnar 2017-08-25 8:04 ` [kernel-hardening] " Ingo Molnar 2017-08-25 15:05 ` Thomas Garnier 2017-08-25 15:05 ` Thomas Garnier 2017-08-25 15:05 ` [kernel-hardening] " Thomas Garnier 2017-08-29 19:34 ` Thomas Garnier 2017-08-29 19:34 ` [kernel-hardening] " Thomas Garnier 2017-09-21 15:59 ` Ingo Molnar 2017-09-21 15:59 ` [kernel-hardening] " Ingo Molnar 2017-09-21 16:10 ` Ard Biesheuvel 2017-09-21 16:10 ` Ard Biesheuvel 2017-09-21 16:10 ` [kernel-hardening] " Ard Biesheuvel 2017-09-21 21:21 ` Thomas Garnier 2017-09-21 21:21 ` Thomas Garnier 2017-09-21 21:21 ` [kernel-hardening] " Thomas Garnier 2017-09-22 4:24 ` Markus Trippelsdorf 2017-09-22 4:24 ` [kernel-hardening] " Markus Trippelsdorf 2017-09-22 14:38 ` Thomas Garnier 2017-09-22 14:38 ` [kernel-hardening] " Thomas Garnier 2017-09-22 14:38 ` Thomas Garnier 2017-09-22 23:55 ` Thomas Garnier 2017-09-22 23:55 ` Thomas Garnier 2017-09-22 23:55 ` [kernel-hardening] " Thomas Garnier 2017-09-21 21:16 ` Thomas Garnier 2017-09-21 21:16 ` [kernel-hardening] " Thomas Garnier 2017-09-22 0:06 ` Thomas Garnier 2017-09-22 0:06 ` Thomas Garnier 2017-09-22 0:06 ` [kernel-hardening] " Thomas Garnier 2017-09-22 16:32 ` Ingo Molnar 2017-09-22 16:32 ` [kernel-hardening] " Ingo Molnar 2017-09-22 18:08 ` Thomas Garnier 2017-09-22 18:08 ` Thomas Garnier 2017-09-22 18:08 ` [kernel-hardening] " Thomas Garnier 2017-09-23 9:43 ` Ingo Molnar 2017-09-23 9:43 ` [kernel-hardening] " Ingo Molnar 2017-10-02 20:28 ` Thomas Garnier 2017-10-02 20:28 ` Thomas Garnier 2017-10-02 20:28 ` [kernel-hardening] " Thomas Garnier 2017-09-23 9:43 ` Ingo Molnar 2017-09-22 18:38 ` H. Peter Anvin 2017-09-22 18:38 ` [kernel-hardening] " H. Peter Anvin 2017-09-22 18:57 ` Kees Cook 2017-09-22 18:57 ` [kernel-hardening] " Kees Cook 2017-09-22 19:06 ` H. Peter Anvin 2017-09-22 19:06 ` [kernel-hardening] " H. Peter Anvin 2017-09-22 22:19 ` hjl.tools 2017-09-22 22:30 ` hjl.tools 2017-09-22 19:06 ` H. Peter Anvin 2017-09-22 18:57 ` Kees Cook 2017-09-22 18:59 ` Thomas Garnier 2017-09-22 18:59 ` Thomas Garnier 2017-09-22 18:59 ` [kernel-hardening] " Thomas Garnier 2017-09-23 9:49 ` Ingo Molnar 2017-09-23 9:49 ` Ingo Molnar 2017-09-23 9:49 ` [kernel-hardening] " Ingo Molnar 2017-09-22 18:38 ` H. Peter Anvin 2017-09-22 16:32 ` Ingo Molnar 2017-09-21 21:16 ` Thomas Garnier 2017-09-21 15:59 ` Ingo Molnar 2017-08-29 19:34 ` Thomas Garnier 2017-08-17 14:12 ` Boris Lukashev 2017-08-17 14:12 ` [kernel-hardening] " Boris Lukashev 2017-08-25 15:38 ` Christopher Lameter 2017-08-25 15:38 ` [kernel-hardening] " Christopher Lameter 2017-08-27 22:39 ` Boris Lukashev 2017-08-27 22:39 ` Boris Lukashev 2017-08-27 22:39 ` [kernel-hardening] " Boris Lukashev 2017-08-25 15:38 ` Christopher Lameter 2017-08-28 9:59 ` Pavel Machek 2017-08-28 9:59 ` Pavel Machek 2017-08-28 9:59 ` [kernel-hardening] " Pavel Machek 2017-08-17 14:12 ` Boris Lukashev 2017-08-21 13:32 ` Peter Zijlstra 2017-08-21 13:32 ` [kernel-hardening] " Peter Zijlstra 2017-08-21 14:28 ` Peter Zijlstra 2017-08-21 14:28 ` Peter Zijlstra 2017-08-21 14:28 ` [kernel-hardening] " Peter Zijlstra 2017-09-22 18:27 ` H. Peter Anvin 2017-09-22 18:27 ` [kernel-hardening] " H. Peter Anvin 2017-09-23 10:00 ` Ingo Molnar 2017-09-23 10:00 ` [kernel-hardening] " Ingo Molnar 2017-09-24 22:37 ` Pavel Machek 2017-09-24 22:37 ` [kernel-hardening] " Pavel Machek 2017-09-25 7:33 ` Ingo Molnar 2017-09-25 7:33 ` Ingo Molnar 2017-09-25 7:33 ` [kernel-hardening] " Ingo Molnar 2017-10-06 10:39 ` Pavel Machek 2017-10-06 10:39 ` Pavel Machek 2017-10-06 10:39 ` [kernel-hardening] " Pavel Machek 2017-10-20 8:13 ` Ingo Molnar 2017-10-20 8:13 ` [kernel-hardening] " Ingo Molnar 2017-10-20 8:13 ` Ingo Molnar 2017-09-24 22:37 ` Pavel Machek 2017-09-23 10:00 ` Ingo Molnar 2017-09-22 18:27 ` H. Peter Anvin 2017-08-21 13:32 ` Peter Zijlstra 2017-08-21 14:31 ` Peter Zijlstra 2017-08-21 14:31 ` [kernel-hardening] " Peter Zijlstra 2017-08-21 15:57 ` Thomas Garnier 2017-08-21 15:57 ` Thomas Garnier 2017-08-21 15:57 ` [kernel-hardening] " Thomas Garnier 2017-08-28 1:26 ` H. Peter Anvin 2017-08-28 1:26 ` [kernel-hardening] " H. Peter Anvin 2017-08-28 1:26 ` H. Peter Anvin 2017-08-21 14:31 ` Peter Zijlstra 2017-08-11 12:41 ` Ingo Molnar
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20170810172615.51965-24-thgarnie@google.com \ --to=thgarnie@google.com \ --cc=arnd@arndb.de \ --cc=boris.ostrovsky@oracle.com \ --cc=bp@suse.de \ --cc=brgerst@gmail.com \ --cc=davem@davemloft.net \ --cc=herbert@gondor.apana.org.au \ --cc=hpa@zytor.com \ --cc=jgross@suse.com \ --cc=joro@8bytes.org \ --cc=jpoimboe@redhat.com \ --cc=kernel-hardening@lists.openwall.com \ --cc=kirill.shutemov@linux.intel.com \ --cc=kvm@vger.kernel.org \ --cc=len.brown@intel.com \ --cc=linux-arch@vger.kernel.org \ --cc=linux-crypto@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pm@vger.kernel.org \ --cc=linux-sparse@vger.kernel.org \ --cc=luto@kernel.org \ --cc=mingo@redhat.com \ --cc=mka@chromium.org \ --cc=pavel@ucw.cz \ --cc=pbonzini@redhat.com \ --cc=peterz@infradead.org \ --cc=rjw@rjwysocki.net \ --cc=rkrcmar@redhat.com \ --cc=tglx@linutronix.de \ --cc=thomas.lendacky@amd.com \ --cc=x86@kernel.org \ --cc=xen-devel@lists.xenproject.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.