* [PATCH] x86/boot/compressed: Exclude 'top_pgtable' from relocation
@ 2018-05-02 16:08 Kirill A. Shutemov
2018-05-03 3:42 ` Hugh Dickins
0 siblings, 1 reply; 8+ messages in thread
From: Kirill A. Shutemov @ 2018-05-02 16:08 UTC (permalink / raw)
To: Ingo Molnar, x86, Thomas Gleixner, H. Peter Anvin
Cc: Hugh Dickins, linux-kernel, Kirill A. Shutemov
startup_64() copies kernel (including .data section) to the new place.
It's required for safe in-place decompression.
This is a problem if the original place is referenced: by mistake I've
put 'top_pgtable' into .data section and the address is loaded into CR3.
If the original place gets overwritten during image decompression the
kernel will crash and the machine will be rebooted.
Move 'top_pgtable' into .pgtable section where the rest of page tables
are. This section is not subject for relocation.
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Fixes: e9d0e6330eb8 ("x86/boot/compressed/64: Prepare new top-level page table for trampoline")
---
arch/x86/boot/compressed/head_64.S | 8 ++++++++
arch/x86/boot/compressed/pgtable_64.c | 4 +---
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
index fca012baba19..c433c21703e6 100644
--- a/arch/x86/boot/compressed/head_64.S
+++ b/arch/x86/boot/compressed/head_64.S
@@ -649,3 +649,11 @@ boot_stack_end:
.balign 4096
pgtable:
.fill BOOT_PGT_SIZE, 1, 0
+
+/*
+ * The page table is going to be used instead of page table in the trampoline
+ * memory.
+ */
+ .global top_pgtable
+top_pgtable:
+ .fill PAGE_SIZE, 1, 0
diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c
index 32af1cbcd903..3a0578f54550 100644
--- a/arch/x86/boot/compressed/pgtable_64.c
+++ b/arch/x86/boot/compressed/pgtable_64.c
@@ -25,10 +25,8 @@ static char trampoline_save[TRAMPOLINE_32BIT_SIZE];
/*
* The page table is going to be used instead of page table in the trampoline
* memory.
- *
- * It must not be in BSS as BSS is cleared after cleanup_trampoline().
*/
-static char top_pgtable[PAGE_SIZE] __aligned(PAGE_SIZE) __section(.data);
+extern char *top_pgtable;
/*
* Trampoline address will be printed by extract_kernel() for debugging
--
2.17.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH] x86/boot/compressed: Exclude 'top_pgtable' from relocation 2018-05-02 16:08 [PATCH] x86/boot/compressed: Exclude 'top_pgtable' from relocation Kirill A. Shutemov @ 2018-05-03 3:42 ` Hugh Dickins 2018-05-03 8:38 ` Kirill A. Shutemov 0 siblings, 1 reply; 8+ messages in thread From: Hugh Dickins @ 2018-05-03 3:42 UTC (permalink / raw) To: Kirill A. Shutemov Cc: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Hugh Dickins, Dave Hansen, linux-kernel, x86 On Wed, 2 May 2018, Kirill A. Shutemov wrote: > startup_64() copies kernel (including .data section) to the new place. > It's required for safe in-place decompression. > > This is a problem if the original place is referenced: by mistake I've > put 'top_pgtable' into .data section and the address is loaded into CR3. > If the original place gets overwritten during image decompression the > kernel will crash and the machine will be rebooted. > > Move 'top_pgtable' into .pgtable section where the rest of page tables > are. This section is not subject for relocation. > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> > Fixes: e9d0e6330eb8 ("x86/boot/compressed/64: Prepare new top-level page table for trampoline") Thanks for the Cc, Kirill, which I presume was because I'd mentioned to you that I was unable to boot 4.17-rc on laptop or workstation. Which is still so with 4.17-rc3, and I'm sorry to say still so with this patch: even if I add the fix which I think this patch needs, see below. I did bisect on Monday, and the first bad was your commit 194a9749c73d "x86/boot/compressed/64: Handle 5-level paging boot if kernel is above 4G". (Cc'ing Dave since his PTI Global work was my other suspect, but that's off the hook - if I revert just 194a9749c73d then I have no trouble.) Am I really the only one getting immediate reboot on x86_64? Perhaps everyone else has machines with 5-level page tables now ?-) I've looked at the changes a little, and tried a few things (hoping to avoid a long back and forth describing and trying things for you); but no success yet, and rather out of my depth with these changes - I've not had to delve into boot/compressed before. (I did briefly get excited by the trampoline_32bit + TRAMPOLINE_32BIT_PGTABLE_OFFSET in cleanup_trampoline(), which lacks a "/ sizeof(unsigned long)"; but since ...PGTABLE_OFFSET is 0 anyway, that's nothing but cosmetic.) Hugh > --- > arch/x86/boot/compressed/head_64.S | 8 ++++++++ > arch/x86/boot/compressed/pgtable_64.c | 4 +--- > 2 files changed, 9 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S > index fca012baba19..c433c21703e6 100644 > --- a/arch/x86/boot/compressed/head_64.S > +++ b/arch/x86/boot/compressed/head_64.S > @@ -649,3 +649,11 @@ boot_stack_end: > .balign 4096 > pgtable: > .fill BOOT_PGT_SIZE, 1, 0 > + > +/* > + * The page table is going to be used instead of page table in the trampoline > + * memory. > + */ > + .global top_pgtable > +top_pgtable: > + .fill PAGE_SIZE, 1, 0 > diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c > index 32af1cbcd903..3a0578f54550 100644 > --- a/arch/x86/boot/compressed/pgtable_64.c > +++ b/arch/x86/boot/compressed/pgtable_64.c > @@ -25,10 +25,8 @@ static char trampoline_save[TRAMPOLINE_32BIT_SIZE]; > /* > * The page table is going to be used instead of page table in the trampoline > * memory. > - * > - * It must not be in BSS as BSS is cleared after cleanup_trampoline(). > */ > -static char top_pgtable[PAGE_SIZE] __aligned(PAGE_SIZE) __section(.data); > +extern char *top_pgtable; Doesn't that need to be extern char top_pgtable[] ? > > /* > * Trampoline address will be printed by extract_kernel() for debugging > -- > 2.17.0 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] x86/boot/compressed: Exclude 'top_pgtable' from relocation 2018-05-03 3:42 ` Hugh Dickins @ 2018-05-03 8:38 ` Kirill A. Shutemov 2018-05-03 10:52 ` Kirill A. Shutemov 0 siblings, 1 reply; 8+ messages in thread From: Kirill A. Shutemov @ 2018-05-03 8:38 UTC (permalink / raw) To: Hugh Dickins Cc: Kirill A. Shutemov, Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Dave Hansen, linux-kernel, x86 On Wed, May 02, 2018 at 08:42:30PM -0700, Hugh Dickins wrote: > On Wed, 2 May 2018, Kirill A. Shutemov wrote: > > > startup_64() copies kernel (including .data section) to the new place. > > It's required for safe in-place decompression. > > > > This is a problem if the original place is referenced: by mistake I've > > put 'top_pgtable' into .data section and the address is loaded into CR3. > > If the original place gets overwritten during image decompression the > > kernel will crash and the machine will be rebooted. > > > > Move 'top_pgtable' into .pgtable section where the rest of page tables > > are. This section is not subject for relocation. > > > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> > > Fixes: e9d0e6330eb8 ("x86/boot/compressed/64: Prepare new top-level page table for trampoline") > > Thanks for the Cc, Kirill, which I presume was because I'd mentioned > to you that I was unable to boot 4.17-rc on laptop or workstation. Right. > Which is still so with 4.17-rc3, and I'm sorry to say still so with this > patch: even if I add the fix which I think this patch needs, see below. Hm.. Could you share your config? IIRC, you use legacy boot. What bootloader? > I did bisect on Monday, and the first bad was your commit 194a9749c73d > "x86/boot/compressed/64: Handle 5-level paging boot if kernel is above 4G". > (Cc'ing Dave since his PTI Global work was my other suspect, but that's > off the hook - if I revert just 194a9749c73d then I have no trouble.) > > Am I really the only one getting immediate reboot on x86_64? There was one more thread: http://lkml.kernel.org/r/5ecfeb13-84e4-f1ef-bd30-391674b2050a@gmail.com But no firm conclusion, only blaming GCC without a good reason. BTW, what compiler do you use? > Perhaps everyone else has machines with 5-level page tables now ?-) No :) > I've looked at the changes a little, and tried a few things (hoping to > avoid a long back and forth describing and trying things for you); but > no success yet, and rather out of my depth with these changes - I've > not had to delve into boot/compressed before. > > (I did briefly get excited by the > trampoline_32bit + TRAMPOLINE_32BIT_PGTABLE_OFFSET > in cleanup_trampoline(), which lacks a "/ sizeof(unsigned long)"; > but since ...PGTABLE_OFFSET is 0 anyway, that's nothing but cosmetic.) It worth fixing anyway. Thanks for pointing it out. > > --- > > arch/x86/boot/compressed/head_64.S | 8 ++++++++ > > arch/x86/boot/compressed/pgtable_64.c | 4 +--- > > 2 files changed, 9 insertions(+), 3 deletions(-) > > > > diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S > > index fca012baba19..c433c21703e6 100644 > > --- a/arch/x86/boot/compressed/head_64.S > > +++ b/arch/x86/boot/compressed/head_64.S > > @@ -649,3 +649,11 @@ boot_stack_end: > > .balign 4096 > > pgtable: > > .fill BOOT_PGT_SIZE, 1, 0 > > + > > +/* > > + * The page table is going to be used instead of page table in the trampoline > > + * memory. > > + */ > > + .global top_pgtable > > +top_pgtable: > > + .fill PAGE_SIZE, 1, 0 > > diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c > > index 32af1cbcd903..3a0578f54550 100644 > > --- a/arch/x86/boot/compressed/pgtable_64.c > > +++ b/arch/x86/boot/compressed/pgtable_64.c > > @@ -25,10 +25,8 @@ static char trampoline_save[TRAMPOLINE_32BIT_SIZE]; > > /* > > * The page table is going to be used instead of page table in the trampoline > > * memory. > > - * > > - * It must not be in BSS as BSS is cleared after cleanup_trampoline(). > > */ > > -static char top_pgtable[PAGE_SIZE] __aligned(PAGE_SIZE) __section(.data); > > +extern char *top_pgtable; > > Doesn't that need to be extern char top_pgtable[] ? Ouch. That's embarrassing. So in my case the top_pgtable is zero and apparently it's good enough place to put the page table. It boots :P The patch is bogus and I still don't understand what is going on. Could you please check if bypassing cleanup_trampoline() altogether fixes the issue for you: diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index fca012baba19..73821ac626f6 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -367,16 +367,6 @@ trampoline_return: /* Restore the stack, the 32-bit trampoline uses its own stack */ leaq boot_stack_end(%rbx), %rsp - /* - * cleanup_trampoline() would restore trampoline memory. - * - * RSI holds real mode data and needs to be preserved across - * this function call. - */ - pushq %rsi - call cleanup_trampoline - popq %rsi - /* Zero EFLAGS */ pushq $0 popfq -- Kirill A. Shutemov ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] x86/boot/compressed: Exclude 'top_pgtable' from relocation 2018-05-03 8:38 ` Kirill A. Shutemov @ 2018-05-03 10:52 ` Kirill A. Shutemov 2018-05-03 17:19 ` Hugh Dickins 0 siblings, 1 reply; 8+ messages in thread From: Kirill A. Shutemov @ 2018-05-03 10:52 UTC (permalink / raw) To: Kirill A. Shutemov Cc: Hugh Dickins, Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Dave Hansen, linux-kernel, x86 On Thu, May 03, 2018 at 08:38:49AM +0000, Kirill A. Shutemov wrote: > The patch is bogus and I still don't understand what is going on. I think I found the issue. Could you check the patch below: diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index fca012baba19..86169ae1c536 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -370,10 +370,13 @@ trampoline_return: /* * cleanup_trampoline() would restore trampoline memory. * + * RDI is address of the page table to use (if required). + * * RSI holds real mode data and needs to be preserved across * this function call. */ pushq %rsi + leaq top_pgtable(%rbx), %rdi call cleanup_trampoline popq %rsi @@ -647,5 +650,14 @@ boot_stack_end: */ .section ".pgtable","a",@nobits .balign 4096 + .global pgtable pgtable: .fill BOOT_PGT_SIZE, 1, 0 + +/* + * The page table is going to be used instead of page table in the trampoline + * memory. + */ + .global top_pgtable +top_pgtable: + .fill PAGE_SIZE, 1, 0 diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c index 32af1cbcd903..a362fa0b849c 100644 --- a/arch/x86/boot/compressed/pgtable_64.c +++ b/arch/x86/boot/compressed/pgtable_64.c @@ -22,14 +22,6 @@ struct paging_config { /* Buffer to preserve trampoline memory */ static char trampoline_save[TRAMPOLINE_32BIT_SIZE]; -/* - * The page table is going to be used instead of page table in the trampoline - * memory. - * - * It must not be in BSS as BSS is cleared after cleanup_trampoline(). - */ -static char top_pgtable[PAGE_SIZE] __aligned(PAGE_SIZE) __section(.data); - /* * Trampoline address will be printed by extract_kernel() for debugging * purposes. @@ -134,7 +126,7 @@ struct paging_config paging_prepare(void) return paging_config; } -void cleanup_trampoline(void) +void cleanup_trampoline(void *pgtable) { void *trampoline_pgtable; @@ -145,8 +137,8 @@ void cleanup_trampoline(void) * if it's there. */ if ((void *)__native_read_cr3() == trampoline_pgtable) { - memcpy(top_pgtable, trampoline_pgtable, PAGE_SIZE); - native_write_cr3((unsigned long)top_pgtable); + memcpy(pgtable, trampoline_pgtable, PAGE_SIZE); + native_write_cr3((unsigned long)pgtable); } /* Restore trampoline memory */ -- Kirill A. Shutemov ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] x86/boot/compressed: Exclude 'top_pgtable' from relocation 2018-05-03 10:52 ` Kirill A. Shutemov @ 2018-05-03 17:19 ` Hugh Dickins 2018-06-21 15:18 ` Ingo Molnar 0 siblings, 1 reply; 8+ messages in thread From: Hugh Dickins @ 2018-05-03 17:19 UTC (permalink / raw) To: Kirill A. Shutemov Cc: Kirill A. Shutemov, Hugh Dickins, Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Dave Hansen, linux-kernel, x86 On Thu, 3 May 2018, Kirill A. Shutemov wrote: > On Thu, May 03, 2018 at 08:38:49AM +0000, Kirill A. Shutemov wrote: > > The patch is bogus and I still don't understand what is going on. > > I think I found the issue. Could you check the patch below: Sorry, no good on either machine, immediate reboot as before. I'm gathering the info you asked, will send privately in an hour or so. Hugh > > diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S > index fca012baba19..86169ae1c536 100644 > --- a/arch/x86/boot/compressed/head_64.S > +++ b/arch/x86/boot/compressed/head_64.S > @@ -370,10 +370,13 @@ trampoline_return: > /* > * cleanup_trampoline() would restore trampoline memory. > * > + * RDI is address of the page table to use (if required). > + * > * RSI holds real mode data and needs to be preserved across > * this function call. > */ > pushq %rsi > + leaq top_pgtable(%rbx), %rdi > call cleanup_trampoline > popq %rsi > > @@ -647,5 +650,14 @@ boot_stack_end: > */ > .section ".pgtable","a",@nobits > .balign 4096 > + .global pgtable > pgtable: > .fill BOOT_PGT_SIZE, 1, 0 > + > +/* > + * The page table is going to be used instead of page table in the trampoline > + * memory. > + */ > + .global top_pgtable > +top_pgtable: > + .fill PAGE_SIZE, 1, 0 > diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c > index 32af1cbcd903..a362fa0b849c 100644 > --- a/arch/x86/boot/compressed/pgtable_64.c > +++ b/arch/x86/boot/compressed/pgtable_64.c > @@ -22,14 +22,6 @@ struct paging_config { > /* Buffer to preserve trampoline memory */ > static char trampoline_save[TRAMPOLINE_32BIT_SIZE]; > > -/* > - * The page table is going to be used instead of page table in the trampoline > - * memory. > - * > - * It must not be in BSS as BSS is cleared after cleanup_trampoline(). > - */ > -static char top_pgtable[PAGE_SIZE] __aligned(PAGE_SIZE) __section(.data); > - > /* > * Trampoline address will be printed by extract_kernel() for debugging > * purposes. > @@ -134,7 +126,7 @@ struct paging_config paging_prepare(void) > return paging_config; > } > > -void cleanup_trampoline(void) > +void cleanup_trampoline(void *pgtable) > { > void *trampoline_pgtable; > > @@ -145,8 +137,8 @@ void cleanup_trampoline(void) > * if it's there. > */ > if ((void *)__native_read_cr3() == trampoline_pgtable) { > - memcpy(top_pgtable, trampoline_pgtable, PAGE_SIZE); > - native_write_cr3((unsigned long)top_pgtable); > + memcpy(pgtable, trampoline_pgtable, PAGE_SIZE); > + native_write_cr3((unsigned long)pgtable); > } > > /* Restore trampoline memory */ > -- > Kirill A. Shutemov > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] x86/boot/compressed: Exclude 'top_pgtable' from relocation 2018-05-03 17:19 ` Hugh Dickins @ 2018-06-21 15:18 ` Ingo Molnar 2018-06-21 15:27 ` Kirill A. Shutemov 0 siblings, 1 reply; 8+ messages in thread From: Ingo Molnar @ 2018-06-21 15:18 UTC (permalink / raw) To: Hugh Dickins Cc: Kirill A. Shutemov, Kirill A. Shutemov, Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Dave Hansen, linux-kernel, x86 * Hugh Dickins <hughd@google.com> wrote: > On Thu, 3 May 2018, Kirill A. Shutemov wrote: > > > On Thu, May 03, 2018 at 08:38:49AM +0000, Kirill A. Shutemov wrote: > > > The patch is bogus and I still don't understand what is going on. > > > > I think I found the issue. Could you check the patch below: > > Sorry, no good on either machine, immediate reboot as before. > I'm gathering the info you asked, will send privately in an hour or so. Hi, any update on this bug? Kirill: mind (re-)sending a series of any resulting patches that you have pending? If there's no fix, is there any list of SHA1's to revert? Thanks, Ingo ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] x86/boot/compressed: Exclude 'top_pgtable' from relocation 2018-06-21 15:18 ` Ingo Molnar @ 2018-06-21 15:27 ` Kirill A. Shutemov 2018-06-21 16:06 ` Ingo Molnar 0 siblings, 1 reply; 8+ messages in thread From: Kirill A. Shutemov @ 2018-06-21 15:27 UTC (permalink / raw) To: Ingo Molnar Cc: Hugh Dickins, Kirill A. Shutemov, Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Dave Hansen, linux-kernel, x86 On Thu, Jun 21, 2018 at 03:18:05PM +0000, Ingo Molnar wrote: > > * Hugh Dickins <hughd@google.com> wrote: > > > On Thu, 3 May 2018, Kirill A. Shutemov wrote: > > > > > On Thu, May 03, 2018 at 08:38:49AM +0000, Kirill A. Shutemov wrote: > > > > The patch is bogus and I still don't understand what is going on. > > > > > > I think I found the issue. Could you check the patch below: > > > > Sorry, no good on either machine, immediate reboot as before. > > I'm gathering the info you asked, will send privately in an hour or so. > > Hi, any update on this bug? > > Kirill: mind (re-)sending a series of any resulting patches that you have pending? > > If there's no fix, is there any list of SHA1's to revert? The root cause of the bug was fixed in v4.17 by 5c9b0b1c4988 ("x86/boot/compressed/64: Set up GOT for paging_prepare() and cleanup_trampoline()"). The only pending patch I have at the moment is http://lkml.kernel.org/r/20180612103657.18041-1-kirill.shutemov@linux.intel.com Do you want me to resend it again? -- Kirill A. Shutemov ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] x86/boot/compressed: Exclude 'top_pgtable' from relocation 2018-06-21 15:27 ` Kirill A. Shutemov @ 2018-06-21 16:06 ` Ingo Molnar 0 siblings, 0 replies; 8+ messages in thread From: Ingo Molnar @ 2018-06-21 16:06 UTC (permalink / raw) To: Kirill A. Shutemov Cc: Hugh Dickins, Kirill A. Shutemov, Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Dave Hansen, linux-kernel, x86 * Kirill A. Shutemov <kirill.shutemov@linux.intel.com> wrote: > > Kirill: mind (re-)sending a series of any resulting patches that you have pending? > > The root cause of the bug was fixed in v4.17 by > > 5c9b0b1c4988 ("x86/boot/compressed/64: Set up GOT for paging_prepare() and cleanup_trampoline()"). Ok, cool! > The only pending patch I have at the moment is > > http://lkml.kernel.org/r/20180612103657.18041-1-kirill.shutemov@linux.intel.com > > Do you want me to resend it again? No need, I think Thomas is handling that one. Thanks, Ingo ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2018-06-21 16:06 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-05-02 16:08 [PATCH] x86/boot/compressed: Exclude 'top_pgtable' from relocation Kirill A. Shutemov 2018-05-03 3:42 ` Hugh Dickins 2018-05-03 8:38 ` Kirill A. Shutemov 2018-05-03 10:52 ` Kirill A. Shutemov 2018-05-03 17:19 ` Hugh Dickins 2018-06-21 15:18 ` Ingo Molnar 2018-06-21 15:27 ` Kirill A. Shutemov 2018-06-21 16:06 ` Ingo Molnar
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox