Re: [PATCH] x86/kexec: Make kexec work in 5-level paging mode
On Mon, Jan 29, 2018 at 03:59:27AM -0800, Matthew Wilcox wrote: > On Mon, Jan 29, 2018 at 02:08:45PM +0300, Kirill A. Shutemov wrote: > > I've missed that we need to change relocate_kernel() to set CR4.LA57 > > flag if the kernel has 5-level paging enabled. > > > > I avoided to use ifdef CONFIG_X86_5LEVEL here and inferred if we need to > > enabled 5-level paging from previous CR4 value. This way the code is > > ready for boot-time switching between paging modes. > > Forgive me if I'm missing something ... can you kexec a 5-level kernel > from a 4-level kernel or vice versa? With this patch you can kexec from 4-to-5 and from 5-to-5 in addition to current 4-to-4. 4-to-5 basically takes the same path as UEFI boot in new kernel. I think I will be able to make 5-to-4 work too, when boot-time switching code will be upstream, assuming both kernels are build from the tree with boot-time switching support and the new kernel is loaded below 128TiB. For 5-to-4, kernel decompression code of the new kernel starts on 5-level paging identity mapping constructed by caller. Decompression code then would switch over to 4-level paging via 32-bit trampoline (we cannot switch between 4- and 5-level paging directly) and proceed as in normal boot. Let me check. -- Kirill A. Shutemov
Re: [PATCH] x86/kexec: Make kexec work in 5-level paging mode
On Mon, Jan 29, 2018 at 03:59:27AM -0800, Matthew Wilcox wrote: > On Mon, Jan 29, 2018 at 02:08:45PM +0300, Kirill A. Shutemov wrote: > > I've missed that we need to change relocate_kernel() to set CR4.LA57 > > flag if the kernel has 5-level paging enabled. > > > > I avoided to use ifdef CONFIG_X86_5LEVEL here and inferred if we need to > > enabled 5-level paging from previous CR4 value. This way the code is > > ready for boot-time switching between paging modes. > > Forgive me if I'm missing something ... can you kexec a 5-level kernel > from a 4-level kernel or vice versa? With this patch you can kexec from 4-to-5 and from 5-to-5 in addition to current 4-to-4. 4-to-5 basically takes the same path as UEFI boot in new kernel. I think I will be able to make 5-to-4 work too, when boot-time switching code will be upstream, assuming both kernels are build from the tree with boot-time switching support and the new kernel is loaded below 128TiB. For 5-to-4, kernel decompression code of the new kernel starts on 5-level paging identity mapping constructed by caller. Decompression code then would switch over to 4-level paging via 32-bit trampoline (we cannot switch between 4- and 5-level paging directly) and proceed as in normal boot. Let me check. -- Kirill A. Shutemov
Re: [PATCH] x86/kexec: Make kexec work in 5-level paging mode
On 01/29/18 at 07:19pm, Baoquan He wrote: > On 01/29/18 at 02:08pm, Kirill A. Shutemov wrote: > > I've missed that we need to change relocate_kernel() to set CR4.LA57 > > flag if the kernel has 5-level paging enabled. > > > > I avoided to use ifdef CONFIG_X86_5LEVEL here and inferred if we need to > > enabled 5-level paging from previous CR4 value. This way the code is > > ready for boot-time switching between paging modes. > > > > Fixes: 77ef56e4f0fb ("x86: Enable 5-level paging support via > > CONFIG_X86_5LEVEL=y") > > Signed-off-by: Kirill A. Shutemov> > Reported-by: Baoquan He > > Thanks, Kirill. > > Tested on qemu with la57 support, kexec works well. Kdump kernel can > boot into kernel, while there's a memory allocation failure during > boot which I am trying to fix. The reason is kdump kernel need reserve > as small memory as possible. Will post soon. By the way, the kdump failure can be worked around by increasing crashkernel memory, then kdump kernel can still work well. So this patch is necessary fix for kexec/kdump. > > For this patch, feel free to add my Tested-by. > > Tested-by: Baoquan He > > Thanks > Baoquan > > --- > > arch/x86/kernel/relocate_kernel_64.S | 8 > > 1 file changed, 8 insertions(+) > > > > diff --git a/arch/x86/kernel/relocate_kernel_64.S > > b/arch/x86/kernel/relocate_kernel_64.S > > index 307d3bac5f04..11eda21eb697 100644 > > --- a/arch/x86/kernel/relocate_kernel_64.S > > +++ b/arch/x86/kernel/relocate_kernel_64.S > > @@ -68,6 +68,9 @@ relocate_kernel: > > movq%cr4, %rax > > movq%rax, CR4(%r11) > > > > + /* Save CR4. Required to enable the right paging mode later. */ > > + movq%rax, %r13 > > + > > /* zero out flags, and disable interrupts */ > > pushq $0 > > popfq > > @@ -126,8 +129,13 @@ identity_mapped: > > /* > > * Set cr4 to a known state: > > * - physical address extension enabled > > +* - 5-level paging, if it was enabled before > > */ > > movl$X86_CR4_PAE, %eax > > + testq $X86_CR4_LA57, %r13 > > + jz 1f > > + orl $X86_CR4_LA57, %eax > > +1: > > movq%rax, %cr4 > > > > jmp 1f > > -- > > 2.15.1 > >
Re: [PATCH] x86/kexec: Make kexec work in 5-level paging mode
On 01/29/18 at 07:19pm, Baoquan He wrote: > On 01/29/18 at 02:08pm, Kirill A. Shutemov wrote: > > I've missed that we need to change relocate_kernel() to set CR4.LA57 > > flag if the kernel has 5-level paging enabled. > > > > I avoided to use ifdef CONFIG_X86_5LEVEL here and inferred if we need to > > enabled 5-level paging from previous CR4 value. This way the code is > > ready for boot-time switching between paging modes. > > > > Fixes: 77ef56e4f0fb ("x86: Enable 5-level paging support via > > CONFIG_X86_5LEVEL=y") > > Signed-off-by: Kirill A. Shutemov > > Reported-by: Baoquan He > > Thanks, Kirill. > > Tested on qemu with la57 support, kexec works well. Kdump kernel can > boot into kernel, while there's a memory allocation failure during > boot which I am trying to fix. The reason is kdump kernel need reserve > as small memory as possible. Will post soon. By the way, the kdump failure can be worked around by increasing crashkernel memory, then kdump kernel can still work well. So this patch is necessary fix for kexec/kdump. > > For this patch, feel free to add my Tested-by. > > Tested-by: Baoquan He > > Thanks > Baoquan > > --- > > arch/x86/kernel/relocate_kernel_64.S | 8 > > 1 file changed, 8 insertions(+) > > > > diff --git a/arch/x86/kernel/relocate_kernel_64.S > > b/arch/x86/kernel/relocate_kernel_64.S > > index 307d3bac5f04..11eda21eb697 100644 > > --- a/arch/x86/kernel/relocate_kernel_64.S > > +++ b/arch/x86/kernel/relocate_kernel_64.S > > @@ -68,6 +68,9 @@ relocate_kernel: > > movq%cr4, %rax > > movq%rax, CR4(%r11) > > > > + /* Save CR4. Required to enable the right paging mode later. */ > > + movq%rax, %r13 > > + > > /* zero out flags, and disable interrupts */ > > pushq $0 > > popfq > > @@ -126,8 +129,13 @@ identity_mapped: > > /* > > * Set cr4 to a known state: > > * - physical address extension enabled > > +* - 5-level paging, if it was enabled before > > */ > > movl$X86_CR4_PAE, %eax > > + testq $X86_CR4_LA57, %r13 > > + jz 1f > > + orl $X86_CR4_LA57, %eax > > +1: > > movq%rax, %cr4 > > > > jmp 1f > > -- > > 2.15.1 > >
Re: [PATCH] x86/kexec: Make kexec work in 5-level paging mode
On Mon, Jan 29, 2018 at 02:08:45PM +0300, Kirill A. Shutemov wrote: > I've missed that we need to change relocate_kernel() to set CR4.LA57 > flag if the kernel has 5-level paging enabled. > > I avoided to use ifdef CONFIG_X86_5LEVEL here and inferred if we need to > enabled 5-level paging from previous CR4 value. This way the code is > ready for boot-time switching between paging modes. Forgive me if I'm missing something ... can you kexec a 5-level kernel from a 4-level kernel or vice versa?
Re: [PATCH] x86/kexec: Make kexec work in 5-level paging mode
On Mon, Jan 29, 2018 at 02:08:45PM +0300, Kirill A. Shutemov wrote: > I've missed that we need to change relocate_kernel() to set CR4.LA57 > flag if the kernel has 5-level paging enabled. > > I avoided to use ifdef CONFIG_X86_5LEVEL here and inferred if we need to > enabled 5-level paging from previous CR4 value. This way the code is > ready for boot-time switching between paging modes. Forgive me if I'm missing something ... can you kexec a 5-level kernel from a 4-level kernel or vice versa?
Re: [PATCH] x86/kexec: Make kexec work in 5-level paging mode
On 01/29/18 at 02:08pm, Kirill A. Shutemov wrote: > I've missed that we need to change relocate_kernel() to set CR4.LA57 > flag if the kernel has 5-level paging enabled. > > I avoided to use ifdef CONFIG_X86_5LEVEL here and inferred if we need to > enabled 5-level paging from previous CR4 value. This way the code is > ready for boot-time switching between paging modes. > > Fixes: 77ef56e4f0fb ("x86: Enable 5-level paging support via > CONFIG_X86_5LEVEL=y") > Signed-off-by: Kirill A. Shutemov> Reported-by: Baoquan He Thanks, Kirill. Tested on qemu with la57 support, kexec works well. Kdump kernel can boot into kernel, while there's a memory allocation failure during boot which I am trying to fix. The reason is kdump kernel need reserve as small memory as possible. Will post soon. For this patch, feel free to add my Tested-by. Tested-by: Baoquan He Thanks Baoquan > --- > arch/x86/kernel/relocate_kernel_64.S | 8 > 1 file changed, 8 insertions(+) > > diff --git a/arch/x86/kernel/relocate_kernel_64.S > b/arch/x86/kernel/relocate_kernel_64.S > index 307d3bac5f04..11eda21eb697 100644 > --- a/arch/x86/kernel/relocate_kernel_64.S > +++ b/arch/x86/kernel/relocate_kernel_64.S > @@ -68,6 +68,9 @@ relocate_kernel: > movq%cr4, %rax > movq%rax, CR4(%r11) > > + /* Save CR4. Required to enable the right paging mode later. */ > + movq%rax, %r13 > + > /* zero out flags, and disable interrupts */ > pushq $0 > popfq > @@ -126,8 +129,13 @@ identity_mapped: > /* >* Set cr4 to a known state: >* - physical address extension enabled > + * - 5-level paging, if it was enabled before >*/ > movl$X86_CR4_PAE, %eax > + testq $X86_CR4_LA57, %r13 > + jz 1f > + orl $X86_CR4_LA57, %eax > +1: > movq%rax, %cr4 > > jmp 1f > -- > 2.15.1 >
Re: [PATCH] x86/kexec: Make kexec work in 5-level paging mode
On 01/29/18 at 02:08pm, Kirill A. Shutemov wrote: > I've missed that we need to change relocate_kernel() to set CR4.LA57 > flag if the kernel has 5-level paging enabled. > > I avoided to use ifdef CONFIG_X86_5LEVEL here and inferred if we need to > enabled 5-level paging from previous CR4 value. This way the code is > ready for boot-time switching between paging modes. > > Fixes: 77ef56e4f0fb ("x86: Enable 5-level paging support via > CONFIG_X86_5LEVEL=y") > Signed-off-by: Kirill A. Shutemov > Reported-by: Baoquan He Thanks, Kirill. Tested on qemu with la57 support, kexec works well. Kdump kernel can boot into kernel, while there's a memory allocation failure during boot which I am trying to fix. The reason is kdump kernel need reserve as small memory as possible. Will post soon. For this patch, feel free to add my Tested-by. Tested-by: Baoquan He Thanks Baoquan > --- > arch/x86/kernel/relocate_kernel_64.S | 8 > 1 file changed, 8 insertions(+) > > diff --git a/arch/x86/kernel/relocate_kernel_64.S > b/arch/x86/kernel/relocate_kernel_64.S > index 307d3bac5f04..11eda21eb697 100644 > --- a/arch/x86/kernel/relocate_kernel_64.S > +++ b/arch/x86/kernel/relocate_kernel_64.S > @@ -68,6 +68,9 @@ relocate_kernel: > movq%cr4, %rax > movq%rax, CR4(%r11) > > + /* Save CR4. Required to enable the right paging mode later. */ > + movq%rax, %r13 > + > /* zero out flags, and disable interrupts */ > pushq $0 > popfq > @@ -126,8 +129,13 @@ identity_mapped: > /* >* Set cr4 to a known state: >* - physical address extension enabled > + * - 5-level paging, if it was enabled before >*/ > movl$X86_CR4_PAE, %eax > + testq $X86_CR4_LA57, %r13 > + jz 1f > + orl $X86_CR4_LA57, %eax > +1: > movq%rax, %cr4 > > jmp 1f > -- > 2.15.1 >
[PATCH] x86/kexec: Make kexec work in 5-level paging mode
I've missed that we need to change relocate_kernel() to set CR4.LA57 flag if the kernel has 5-level paging enabled. I avoided to use ifdef CONFIG_X86_5LEVEL here and inferred if we need to enabled 5-level paging from previous CR4 value. This way the code is ready for boot-time switching between paging modes. Fixes: 77ef56e4f0fb ("x86: Enable 5-level paging support via CONFIG_X86_5LEVEL=y") Signed-off-by: Kirill A. ShutemovReported-by: Baoquan He --- arch/x86/kernel/relocate_kernel_64.S | 8 1 file changed, 8 insertions(+) diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S index 307d3bac5f04..11eda21eb697 100644 --- a/arch/x86/kernel/relocate_kernel_64.S +++ b/arch/x86/kernel/relocate_kernel_64.S @@ -68,6 +68,9 @@ relocate_kernel: movq%cr4, %rax movq%rax, CR4(%r11) + /* Save CR4. Required to enable the right paging mode later. */ + movq%rax, %r13 + /* zero out flags, and disable interrupts */ pushq $0 popfq @@ -126,8 +129,13 @@ identity_mapped: /* * Set cr4 to a known state: * - physical address extension enabled +* - 5-level paging, if it was enabled before */ movl$X86_CR4_PAE, %eax + testq $X86_CR4_LA57, %r13 + jz 1f + orl $X86_CR4_LA57, %eax +1: movq%rax, %cr4 jmp 1f -- 2.15.1
[PATCH] x86/kexec: Make kexec work in 5-level paging mode
I've missed that we need to change relocate_kernel() to set CR4.LA57 flag if the kernel has 5-level paging enabled. I avoided to use ifdef CONFIG_X86_5LEVEL here and inferred if we need to enabled 5-level paging from previous CR4 value. This way the code is ready for boot-time switching between paging modes. Fixes: 77ef56e4f0fb ("x86: Enable 5-level paging support via CONFIG_X86_5LEVEL=y") Signed-off-by: Kirill A. Shutemov Reported-by: Baoquan He --- arch/x86/kernel/relocate_kernel_64.S | 8 1 file changed, 8 insertions(+) diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S index 307d3bac5f04..11eda21eb697 100644 --- a/arch/x86/kernel/relocate_kernel_64.S +++ b/arch/x86/kernel/relocate_kernel_64.S @@ -68,6 +68,9 @@ relocate_kernel: movq%cr4, %rax movq%rax, CR4(%r11) + /* Save CR4. Required to enable the right paging mode later. */ + movq%rax, %r13 + /* zero out flags, and disable interrupts */ pushq $0 popfq @@ -126,8 +129,13 @@ identity_mapped: /* * Set cr4 to a known state: * - physical address extension enabled +* - 5-level paging, if it was enabled before */ movl$X86_CR4_PAE, %eax + testq $X86_CR4_LA57, %r13 + jz 1f + orl $X86_CR4_LA57, %eax +1: movq%rax, %cr4 jmp 1f -- 2.15.1