* [PATCH v3 0/3] x86: fix brk area initialization
@ 2022-06-30 7:14 Juergen Gross
2022-06-30 7:14 ` [PATCH v3 1/3] x86/xen: use clear_bss() for Xen PV guests Juergen Gross
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Juergen Gross @ 2022-06-30 7:14 UTC (permalink / raw)
To: xen-devel, x86, linux-kernel
Cc: jpoimboe, Juergen Gross, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, H. Peter Anvin, Boris Ostrovsky
The brk area needs to be zeroed initially, like the .bss section.
At the same time its memory should be covered by the ELF program
headers.
Juergen Gross (3):
x86/xen: use clear_bss() for Xen PV guests
x86: clear .brk area at early boot
x86: fix .brk attribute in linker script
arch/x86/include/asm/setup.h | 3 +++
arch/x86/kernel/head64.c | 4 +++-
arch/x86/kernel/vmlinux.lds.S | 2 +-
arch/x86/xen/enlighten_pv.c | 8 ++++++--
arch/x86/xen/xen-head.S | 10 +---------
5 files changed, 14 insertions(+), 13 deletions(-)
--
2.35.3
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH v3 1/3] x86/xen: use clear_bss() for Xen PV guests 2022-06-30 7:14 [PATCH v3 0/3] x86: fix brk area initialization Juergen Gross @ 2022-06-30 7:14 ` Juergen Gross 2022-07-02 9:54 ` [tip: x86/urgent] x86/xen: Use " tip-bot2 for Juergen Gross 2022-06-30 7:14 ` [PATCH v3 2/3] x86: clear .brk area at early boot Juergen Gross 2022-06-30 7:14 ` [PATCH v3 3/3] x86: fix .brk attribute in linker script Juergen Gross 2 siblings, 1 reply; 7+ messages in thread From: Juergen Gross @ 2022-06-30 7:14 UTC (permalink / raw) To: xen-devel, x86, linux-kernel Cc: jpoimboe, Juergen Gross, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, H. Peter Anvin, Boris Ostrovsky, Jan Beulich Instead of clearing the bss area in assembly code, use the clear_bss() function. This requires to pass the start_info address as parameter to xen_start_kernel() in order to avoid the xen_start_info being zeroed again. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> --- arch/x86/include/asm/setup.h | 3 +++ arch/x86/kernel/head64.c | 2 +- arch/x86/xen/enlighten_pv.c | 8 ++++++-- arch/x86/xen/xen-head.S | 10 +--------- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h index f8b9ee97a891..f37cbff7354c 100644 --- a/arch/x86/include/asm/setup.h +++ b/arch/x86/include/asm/setup.h @@ -120,6 +120,9 @@ void *extend_brk(size_t size, size_t align); static char __brk_##name[size] extern void probe_roms(void); + +void clear_bss(void); + #ifdef __i386__ asmlinkage void __init i386_start_kernel(void); diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index bd4a34100ed0..e7e233209a8c 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -426,7 +426,7 @@ void __init do_early_exception(struct pt_regs *regs, int trapnr) /* Don't add a printk in there. printk relies on the PDA which is not initialized yet. */ -static void __init clear_bss(void) +void __init clear_bss(void) { memset(__bss_start, 0, (unsigned long) __bss_stop - (unsigned long) __bss_start); diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c index e3297b15701c..70fb2ea85e90 100644 --- a/arch/x86/xen/enlighten_pv.c +++ b/arch/x86/xen/enlighten_pv.c @@ -1183,15 +1183,19 @@ static void __init xen_domu_set_legacy_features(void) extern void early_xen_iret_patch(void); /* First C function to be called on Xen boot */ -asmlinkage __visible void __init xen_start_kernel(void) +asmlinkage __visible void __init xen_start_kernel(struct start_info *si) { struct physdev_set_iopl set_iopl; unsigned long initrd_start = 0; int rc; - if (!xen_start_info) + if (!si) return; + clear_bss(); + + xen_start_info = si; + __text_gen_insn(&early_xen_iret_patch, JMP32_INSN_OPCODE, &early_xen_iret_patch, &xen_iret, JMP32_INSN_SIZE); diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S index 3a2cd93bf059..13af6fe453e3 100644 --- a/arch/x86/xen/xen-head.S +++ b/arch/x86/xen/xen-head.S @@ -48,15 +48,6 @@ SYM_CODE_START(startup_xen) ANNOTATE_NOENDBR cld - /* Clear .bss */ - xor %eax,%eax - mov $__bss_start, %rdi - mov $__bss_stop, %rcx - sub %rdi, %rcx - shr $3, %rcx - rep stosq - - mov %rsi, xen_start_info mov initial_stack(%rip), %rsp /* Set up %gs. @@ -71,6 +62,7 @@ SYM_CODE_START(startup_xen) cdq wrmsr + mov %rsi, %rdi call xen_start_kernel SYM_CODE_END(startup_xen) __FINIT -- 2.35.3 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [tip: x86/urgent] x86/xen: Use clear_bss() for Xen PV guests 2022-06-30 7:14 ` [PATCH v3 1/3] x86/xen: use clear_bss() for Xen PV guests Juergen Gross @ 2022-07-02 9:54 ` tip-bot2 for Juergen Gross 0 siblings, 0 replies; 7+ messages in thread From: tip-bot2 for Juergen Gross @ 2022-07-02 9:54 UTC (permalink / raw) To: linux-tip-commits Cc: Juergen Gross, Borislav Petkov, Jan Beulich, Boris Ostrovsky, x86, linux-kernel The following commit has been merged into the x86/urgent branch of tip: Commit-ID: 96e8fc5818686d4a1591bb6907e7fdb64ef29884 Gitweb: https://git.kernel.org/tip/96e8fc5818686d4a1591bb6907e7fdb64ef29884 Author: Juergen Gross <jgross@suse.com> AuthorDate: Thu, 30 Jun 2022 09:14:39 +02:00 Committer: Borislav Petkov <bp@suse.de> CommitterDate: Fri, 01 Jul 2022 10:57:52 +02:00 x86/xen: Use clear_bss() for Xen PV guests Instead of clearing the bss area in assembly code, use the clear_bss() function. This requires to pass the start_info address as parameter to xen_start_kernel() in order to avoid the xen_start_info being zeroed again. Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Link: https://lore.kernel.org/r/20220630071441.28576-2-jgross@suse.com --- arch/x86/include/asm/setup.h | 3 +++ arch/x86/kernel/head64.c | 2 +- arch/x86/xen/enlighten_pv.c | 8 ++++++-- arch/x86/xen/xen-head.S | 10 +--------- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h index f8b9ee9..f37cbff 100644 --- a/arch/x86/include/asm/setup.h +++ b/arch/x86/include/asm/setup.h @@ -120,6 +120,9 @@ void *extend_brk(size_t size, size_t align); static char __brk_##name[size] extern void probe_roms(void); + +void clear_bss(void); + #ifdef __i386__ asmlinkage void __init i386_start_kernel(void); diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index bd4a341..e7e2332 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -426,7 +426,7 @@ void __init do_early_exception(struct pt_regs *regs, int trapnr) /* Don't add a printk in there. printk relies on the PDA which is not initialized yet. */ -static void __init clear_bss(void) +void __init clear_bss(void) { memset(__bss_start, 0, (unsigned long) __bss_stop - (unsigned long) __bss_start); diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c index e3297b1..70fb2ea 100644 --- a/arch/x86/xen/enlighten_pv.c +++ b/arch/x86/xen/enlighten_pv.c @@ -1183,15 +1183,19 @@ static void __init xen_domu_set_legacy_features(void) extern void early_xen_iret_patch(void); /* First C function to be called on Xen boot */ -asmlinkage __visible void __init xen_start_kernel(void) +asmlinkage __visible void __init xen_start_kernel(struct start_info *si) { struct physdev_set_iopl set_iopl; unsigned long initrd_start = 0; int rc; - if (!xen_start_info) + if (!si) return; + clear_bss(); + + xen_start_info = si; + __text_gen_insn(&early_xen_iret_patch, JMP32_INSN_OPCODE, &early_xen_iret_patch, &xen_iret, JMP32_INSN_SIZE); diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S index 3a2cd93..13af6fe 100644 --- a/arch/x86/xen/xen-head.S +++ b/arch/x86/xen/xen-head.S @@ -48,15 +48,6 @@ SYM_CODE_START(startup_xen) ANNOTATE_NOENDBR cld - /* Clear .bss */ - xor %eax,%eax - mov $__bss_start, %rdi - mov $__bss_stop, %rcx - sub %rdi, %rcx - shr $3, %rcx - rep stosq - - mov %rsi, xen_start_info mov initial_stack(%rip), %rsp /* Set up %gs. @@ -71,6 +62,7 @@ SYM_CODE_START(startup_xen) cdq wrmsr + mov %rsi, %rdi call xen_start_kernel SYM_CODE_END(startup_xen) __FINIT ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 2/3] x86: clear .brk area at early boot 2022-06-30 7:14 [PATCH v3 0/3] x86: fix brk area initialization Juergen Gross 2022-06-30 7:14 ` [PATCH v3 1/3] x86/xen: use clear_bss() for Xen PV guests Juergen Gross @ 2022-06-30 7:14 ` Juergen Gross 2022-07-02 9:54 ` [tip: x86/urgent] x86: Clear " tip-bot2 for Juergen Gross 2022-06-30 7:14 ` [PATCH v3 3/3] x86: fix .brk attribute in linker script Juergen Gross 2 siblings, 1 reply; 7+ messages in thread From: Juergen Gross @ 2022-06-30 7:14 UTC (permalink / raw) To: xen-devel, x86, linux-kernel Cc: jpoimboe, Juergen Gross, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, H. Peter Anvin The .brk section has the same properties as .bss: it is an alloc-only section and should be cleared before being used. Not doing so is especially a problem for Xen PV guests, as the hypervisor will validate page tables (check for writable page tables and hypervisor private bits) before accepting them to be used. Make sure .brk is initially zero by letting clear_bss() clear the brk area, too. Signed-off-by: Juergen Gross <jgross@suse.com> --- arch/x86/kernel/head64.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index e7e233209a8c..6a3cfaf6b72a 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -430,6 +430,8 @@ void __init clear_bss(void) { memset(__bss_start, 0, (unsigned long) __bss_stop - (unsigned long) __bss_start); + memset(__brk_base, 0, + (unsigned long) __brk_limit - (unsigned long) __brk_base); } static unsigned long get_cmd_line_ptr(void) -- 2.35.3 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [tip: x86/urgent] x86: Clear .brk area at early boot 2022-06-30 7:14 ` [PATCH v3 2/3] x86: clear .brk area at early boot Juergen Gross @ 2022-07-02 9:54 ` tip-bot2 for Juergen Gross 0 siblings, 0 replies; 7+ messages in thread From: tip-bot2 for Juergen Gross @ 2022-07-02 9:54 UTC (permalink / raw) To: linux-tip-commits; +Cc: Juergen Gross, Borislav Petkov, x86, linux-kernel The following commit has been merged into the x86/urgent branch of tip: Commit-ID: 38fa5479b41376dc9d7f57e71c83514285a25ca0 Gitweb: https://git.kernel.org/tip/38fa5479b41376dc9d7f57e71c83514285a25ca0 Author: Juergen Gross <jgross@suse.com> AuthorDate: Thu, 30 Jun 2022 09:14:40 +02:00 Committer: Borislav Petkov <bp@suse.de> CommitterDate: Fri, 01 Jul 2022 11:11:34 +02:00 x86: Clear .brk area at early boot The .brk section has the same properties as .bss: it is an alloc-only section and should be cleared before being used. Not doing so is especially a problem for Xen PV guests, as the hypervisor will validate page tables (check for writable page tables and hypervisor private bits) before accepting them to be used. Make sure .brk is initially zero by letting clear_bss() clear the brk area, too. Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: Borislav Petkov <bp@suse.de> Link: https://lore.kernel.org/r/20220630071441.28576-3-jgross@suse.com --- arch/x86/kernel/head64.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index e7e2332..6a3cfaf 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -430,6 +430,8 @@ void __init clear_bss(void) { memset(__bss_start, 0, (unsigned long) __bss_stop - (unsigned long) __bss_start); + memset(__brk_base, 0, + (unsigned long) __brk_limit - (unsigned long) __brk_base); } static unsigned long get_cmd_line_ptr(void) ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 3/3] x86: fix .brk attribute in linker script 2022-06-30 7:14 [PATCH v3 0/3] x86: fix brk area initialization Juergen Gross 2022-06-30 7:14 ` [PATCH v3 1/3] x86/xen: use clear_bss() for Xen PV guests Juergen Gross 2022-06-30 7:14 ` [PATCH v3 2/3] x86: clear .brk area at early boot Juergen Gross @ 2022-06-30 7:14 ` Juergen Gross 2022-07-02 9:54 ` [tip: x86/urgent] x86: Fix " tip-bot2 for Juergen Gross 2 siblings, 1 reply; 7+ messages in thread From: Juergen Gross @ 2022-06-30 7:14 UTC (permalink / raw) To: xen-devel, x86, linux-kernel Cc: jpoimboe, Juergen Gross, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, H. Peter Anvin Commit e32683c6f7d2 ("x86/mm: Fix RESERVE_BRK() for older binutils") added the "NOLOAD" attribute to the .brk section as a "failsafe" measure. Unfortunately this leads to the linker no longer covering the .brk section in a program header, resulting in the kernel loader not knowing that the memory for the .brk section must be reserved. This has led to crashes when loading the kernel as PV dom0 under Xen, but other scenarios could be hit by the same problem (e.g. in case an uncompressed kernel is used and the initrd is placed directly behind it). So drop the "NOLOAD" attribute. This has been verified to correctly cover the .brk section by a program header of the resulting ELF file. Fixes: e32683c6f7d2 ("x86/mm: Fix RESERVE_BRK() for older binutils") Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Josh Poimboeuf <jpoimboe@kernel.org> --- V2: - new patch --- arch/x86/kernel/vmlinux.lds.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 81aba718ecd5..9487ce8c13ee 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S @@ -385,7 +385,7 @@ SECTIONS __end_of_kernel_reserve = .; . = ALIGN(PAGE_SIZE); - .brk (NOLOAD) : AT(ADDR(.brk) - LOAD_OFFSET) { + .brk : AT(ADDR(.brk) - LOAD_OFFSET) { __brk_base = .; . += 64 * 1024; /* 64k alignment slop space */ *(.bss..brk) /* areas brk users have reserved */ -- 2.35.3 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [tip: x86/urgent] x86: Fix .brk attribute in linker script 2022-06-30 7:14 ` [PATCH v3 3/3] x86: fix .brk attribute in linker script Juergen Gross @ 2022-07-02 9:54 ` tip-bot2 for Juergen Gross 0 siblings, 0 replies; 7+ messages in thread From: tip-bot2 for Juergen Gross @ 2022-07-02 9:54 UTC (permalink / raw) To: linux-tip-commits Cc: Juergen Gross, Borislav Petkov, Josh Poimboeuf, x86, linux-kernel The following commit has been merged into the x86/urgent branch of tip: Commit-ID: 7e09ac27f43b382f5fe9bb7c7f4c465ece1f8a23 Gitweb: https://git.kernel.org/tip/7e09ac27f43b382f5fe9bb7c7f4c465ece1f8a23 Author: Juergen Gross <jgross@suse.com> AuthorDate: Thu, 30 Jun 2022 09:14:41 +02:00 Committer: Borislav Petkov <bp@suse.de> CommitterDate: Fri, 01 Jul 2022 11:12:43 +02:00 x86: Fix .brk attribute in linker script Commit in Fixes added the "NOLOAD" attribute to the .brk section as a "failsafe" measure. Unfortunately, this leads to the linker no longer covering the .brk section in a program header, resulting in the kernel loader not knowing that the memory for the .brk section must be reserved. This has led to crashes when loading the kernel as PV dom0 under Xen, but other scenarios could be hit by the same problem (e.g. in case an uncompressed kernel is used and the initrd is placed directly behind it). So drop the "NOLOAD" attribute. This has been verified to correctly cover the .brk section by a program header of the resulting ELF file. Fixes: e32683c6f7d2 ("x86/mm: Fix RESERVE_BRK() for older binutils") Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Josh Poimboeuf <jpoimboe@kernel.org> Link: https://lore.kernel.org/r/20220630071441.28576-4-jgross@suse.com --- arch/x86/kernel/vmlinux.lds.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 81aba71..9487ce8 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S @@ -385,7 +385,7 @@ SECTIONS __end_of_kernel_reserve = .; . = ALIGN(PAGE_SIZE); - .brk (NOLOAD) : AT(ADDR(.brk) - LOAD_OFFSET) { + .brk : AT(ADDR(.brk) - LOAD_OFFSET) { __brk_base = .; . += 64 * 1024; /* 64k alignment slop space */ *(.bss..brk) /* areas brk users have reserved */ ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-07-02 9:54 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-06-30 7:14 [PATCH v3 0/3] x86: fix brk area initialization Juergen Gross 2022-06-30 7:14 ` [PATCH v3 1/3] x86/xen: use clear_bss() for Xen PV guests Juergen Gross 2022-07-02 9:54 ` [tip: x86/urgent] x86/xen: Use " tip-bot2 for Juergen Gross 2022-06-30 7:14 ` [PATCH v3 2/3] x86: clear .brk area at early boot Juergen Gross 2022-07-02 9:54 ` [tip: x86/urgent] x86: Clear " tip-bot2 for Juergen Gross 2022-06-30 7:14 ` [PATCH v3 3/3] x86: fix .brk attribute in linker script Juergen Gross 2022-07-02 9:54 ` [tip: x86/urgent] x86: Fix " tip-bot2 for Juergen Gross
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®