Re: [PATCH v4 2/3] x86/kexec/64: Error out if try to jump to old 4-level kernel from 5-level kernel
On 05/22/19 at 11:20am, Dave Young wrote: > How about the userspace kexec-tools? It needs a similar detection, but > I'm not sure how to detect paging mode, maybe some sysfs entry or > vmcoreinfo in /proc/vmcore In usersapce, I plan to parse /proc/kcore to get the starting address of page_offset or vmalloc. You can see the different level has different value range. 4-level: 8880 | -119.5 TB | c87f | 64 TB | direct mapping of all physical memory (page_offset_base) c880 | -55.5 TB | c8ff | 0.5 TB | ... unused hole c900 | -55TB | e8ff | 32 TB | vmalloc/ioremap space (vmalloc_base) e900 | -23TB | e9ff |1 TB | ... unused hole ea00 | -22TB | eaff |1 TB | virtual memory map (vmemmap_base) 5-level: ff11 | -59.75 PB | ff90 | 32 PB | direct mapping of all physical memory (page_offset_base) ff91 | -27.75 PB | ff9f | 3.75 PB | ... unused hole ffa0 | -24PB | ffd1 | 12.5 PB | vmalloc/ioremap space (vmalloc_base) ffd2 | -11.5 PB | ffd3 | 0.5 PB | ... unused hole ffd4 | -11PB | ffd5 | 0.5 PB | virtual memory map (vmemmap_base) > > > > 1 file changed, 5 insertions(+) > > > > diff --git a/arch/x86/kernel/kexec-bzimage64.c > > b/arch/x86/kernel/kexec-bzimage64.c > > index 22f60dd26460..858cc892672f 100644 > > --- a/arch/x86/kernel/kexec-bzimage64.c > > +++ b/arch/x86/kernel/kexec-bzimage64.c > > @@ -321,6 +321,11 @@ static int bzImage64_probe(const char *buf, unsigned > > long len) > > return ret; > > } > > > > + if (!(header->xloadflags & XLF_5LEVEL) && pgtable_l5_enabled()) { > > + pr_err("Can not jump to old 4-level kernel from 5-level > > kernel.\n"); > > 4-level kernel sounds not very clear, maybe something like below? > > "5-level paging enabled, can not kexec into an old kernel without 5-level > paging facility"? Oops, tglx commented on this message. He suggested changing it like: "bzImage cannot handle 5-level paging mode\n" I forgot updating this part. Any one is fine to me. Will update. Thanks Baoquan
Re: [PATCH v4 2/3] x86/kexec/64: Error out if try to jump to old 4-level kernel from 5-level kernel
On 05/22/19 at 11:20am, Dave Young wrote: > On 05/09/19 at 09:36am, Baoquan He wrote: > > If the running kernel has 5-level paging activated, the 5-level paging > > mode is preserved across kexec. If the kexec'ed kernel does not contain > > support for handling active 5-level paging mode in the decompressor, the > > decompressor will crash with #GP. > > > > Prevent this situation at load time. If 5-level paging is active, check the > > xloadflags whether the kexec kernel can handle 5-level paging at least in > > the decompressor. If not, reject the load attempt and print out error > > message. > > > > Signed-off-by: Baoquan He > > Acked-by: Kirill A. Shutemov > > --- > > arch/x86/kernel/kexec-bzimage64.c | 5 + > > How about the userspace kexec-tools? It needs a similar detection, but > I'm not sure how to detect paging mode, maybe some sysfs entry or > vmcoreinfo in /proc/vmcore meant /proc/kcore ... Thanks Dave
Re: [PATCH v4 2/3] x86/kexec/64: Error out if try to jump to old 4-level kernel from 5-level kernel
On 05/09/19 at 09:36am, Baoquan He wrote: > If the running kernel has 5-level paging activated, the 5-level paging > mode is preserved across kexec. If the kexec'ed kernel does not contain > support for handling active 5-level paging mode in the decompressor, the > decompressor will crash with #GP. > > Prevent this situation at load time. If 5-level paging is active, check the > xloadflags whether the kexec kernel can handle 5-level paging at least in > the decompressor. If not, reject the load attempt and print out error > message. > > Signed-off-by: Baoquan He > Acked-by: Kirill A. Shutemov > --- > arch/x86/kernel/kexec-bzimage64.c | 5 + How about the userspace kexec-tools? It needs a similar detection, but I'm not sure how to detect paging mode, maybe some sysfs entry or vmcoreinfo in /proc/vmcore > 1 file changed, 5 insertions(+) > > diff --git a/arch/x86/kernel/kexec-bzimage64.c > b/arch/x86/kernel/kexec-bzimage64.c > index 22f60dd26460..858cc892672f 100644 > --- a/arch/x86/kernel/kexec-bzimage64.c > +++ b/arch/x86/kernel/kexec-bzimage64.c > @@ -321,6 +321,11 @@ static int bzImage64_probe(const char *buf, unsigned > long len) > return ret; > } > > + if (!(header->xloadflags & XLF_5LEVEL) && pgtable_l5_enabled()) { > + pr_err("Can not jump to old 4-level kernel from 5-level > kernel.\n"); 4-level kernel sounds not very clear, maybe something like below? "5-level paging enabled, can not kexec into an old kernel without 5-level paging facility"? > + return ret; > + } > + > /* I've got a bzImage */ > pr_debug("It's a relocatable bzImage64\n"); > ret = 0; > -- > 2.17.2 > Thanks Dave
Re: [PATCH v4 2/3] x86/kexec/64: Error out if try to jump to old 4-level kernel from 5-level kernel
On 05/09/19 at 09:36am, Baoquan He wrote: > If the running kernel has 5-level paging activated, the 5-level paging > mode is preserved across kexec. If the kexec'ed kernel does not contain > support for handling active 5-level paging mode in the decompressor, the > decompressor will crash with #GP. > > Prevent this situation at load time. If 5-level paging is active, check the > xloadflags whether the kexec kernel can handle 5-level paging at least in > the decompressor. If not, reject the load attempt and print out error > message. > > Signed-off-by: Baoquan He > Acked-by: Kirill A. Shutemov > --- > arch/x86/kernel/kexec-bzimage64.c | 5 + > 1 file changed, 5 insertions(+) > > diff --git a/arch/x86/kernel/kexec-bzimage64.c > b/arch/x86/kernel/kexec-bzimage64.c > index 22f60dd26460..858cc892672f 100644 > --- a/arch/x86/kernel/kexec-bzimage64.c > +++ b/arch/x86/kernel/kexec-bzimage64.c > @@ -321,6 +321,11 @@ static int bzImage64_probe(const char *buf, unsigned > long len) > return ret; > } > > + if (!(header->xloadflags & XLF_5LEVEL) && pgtable_l5_enabled()) { > + pr_err("Can not jump to old 4-level kernel from 5-level > kernel.\n"); Check the old thread again, found Thomas also had comment about this error message. Just forgot updating it. Will update it with a new one. > + return ret; > + } > + > /* I've got a bzImage */ > pr_debug("It's a relocatable bzImage64\n"); > ret = 0; > -- > 2.17.2 >
[PATCH v4 2/3] x86/kexec/64: Error out if try to jump to old 4-level kernel from 5-level kernel
If the running kernel has 5-level paging activated, the 5-level paging mode is preserved across kexec. If the kexec'ed kernel does not contain support for handling active 5-level paging mode in the decompressor, the decompressor will crash with #GP. Prevent this situation at load time. If 5-level paging is active, check the xloadflags whether the kexec kernel can handle 5-level paging at least in the decompressor. If not, reject the load attempt and print out error message. Signed-off-by: Baoquan He Acked-by: Kirill A. Shutemov --- arch/x86/kernel/kexec-bzimage64.c | 5 + 1 file changed, 5 insertions(+) diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c index 22f60dd26460..858cc892672f 100644 --- a/arch/x86/kernel/kexec-bzimage64.c +++ b/arch/x86/kernel/kexec-bzimage64.c @@ -321,6 +321,11 @@ static int bzImage64_probe(const char *buf, unsigned long len) return ret; } + if (!(header->xloadflags & XLF_5LEVEL) && pgtable_l5_enabled()) { + pr_err("Can not jump to old 4-level kernel from 5-level kernel.\n"); + return ret; + } + /* I've got a bzImage */ pr_debug("It's a relocatable bzImage64\n"); ret = 0; -- 2.17.2