[Patch v2] get MODULES_VADDR by KERNEL_IMAGE_SIZE for x86_64
bhe at redhat.com
bhe at redhat.com
Wed Sep 24 01:02:00 PDT 2014
On 09/24/14 at 07:55am, Atsushi Kumagai wrote:
> Hello Baoquan,
>
> This patch looks good to me, I'll merge it into v1.5.8.
Thanks, Atsushi!
>
>
> Thanks
> Atsushi Kumagai
>
> >In x86_64, since v2.6.26 the KERNEL_IMAGE_SIZE is changed to 512M, and
> >accordingly the MODULES_VADDR is changed to 0xffffffffa0000000. Before
> >that, KERNEL_IMAGE_SIZE is 128M, and MODULES_VADDR is 0xffffffff88000000.
> >
> >However, in v3.12 Kees Cook introduced kaslr to randomise the location
> >of kernel. And the kernel text mapping addr space is enlarged from 512M
> >to 1G. That means now KERNEL_IMAGE_SIZE is variable, its value is 512M
> >with kaslr support not compiled in and 1G with kaslr support compiled
> >in. Accordingly the MODULES_VADDR is changed too to be:
> >
> >So when kaslr is compiled in and enabled, the kernel text mapping addr
> >space and modules vaddr space need be adjusted. Otherwise makedumpfile
> >will collapse since the addr for some symbols is not correct.
> >
> >Hence KERNEL_IMAGE_SIZE need be exported to vmcoreinfo and got in
> >makedumpfile to help calculate MODULES_VADDR.
> >
> >v1->v2:
> > Fix a code bug Atsushi found.
> >
> >Signed-off-by: Baoquan He <bhe at redhat.com>
> >---
> > makedumpfile.c | 10 ++++++++++
> > makedumpfile.h | 5 ++++-
> > 2 files changed, 14 insertions(+), 1 deletion(-)
> >
> >diff --git a/makedumpfile.c b/makedumpfile.c
> >index b4d43d8..65c893f 100644
> >--- a/makedumpfile.c
> >+++ b/makedumpfile.c
> >@@ -1564,6 +1564,14 @@ get_value_for_old_linux(void)
> > NUMBER(PAGE_BUDDY_MAPCOUNT_VALUE) =
> > PAGE_BUDDY_MAPCOUNT_VALUE_v2_6_39_to_latest_version;
> > }
> >+#ifdef __x86_64__
> >+ if (NUMBER(KERNEL_IMAGE_SIZE) == NOT_FOUND_NUMBER) {
> >+ if (info->kernel_version < KERNEL_VERSION(2, 6, 26))
> >+ NUMBER(KERNEL_IMAGE_SIZE) = KERNEL_IMAGE_SIZE_ORIG;
> >+ else
> >+ NUMBER(KERNEL_IMAGE_SIZE) = KERNEL_IMAGE_SIZE_2_6_26;
> >+ }
> >+#endif
> > if (SIZE(pageflags) == NOT_FOUND_STRUCTURE) {
> > if (info->kernel_version >= KERNEL_VERSION(2, 6, 27))
> > SIZE(pageflags) =
> >@@ -1813,6 +1821,7 @@ write_vmcoreinfo_data(void)
> > WRITE_NUMBER("PG_hwpoison", PG_hwpoison);
> >
> > WRITE_NUMBER("PAGE_BUDDY_MAPCOUNT_VALUE", PAGE_BUDDY_MAPCOUNT_VALUE);
> >+ WRITE_NUMBER("KERNEL_IMAGE_SIZE", KERNEL_IMAGE_SIZE);
> >
> > /*
> > * write the source file of 1st kernel
> >@@ -2147,6 +2156,7 @@ read_vmcoreinfo(void)
> > READ_SRCFILE("pud_t", pud_t);
> >
> > READ_NUMBER("PAGE_BUDDY_MAPCOUNT_VALUE", PAGE_BUDDY_MAPCOUNT_VALUE);
> >+ READ_NUMBER("KERNEL_IMAGE_SIZE", KERNEL_IMAGE_SIZE);
> >
> > return TRUE;
> > }
> >diff --git a/makedumpfile.h b/makedumpfile.h
> >index 96830b0..a3d86e7 100644
> >--- a/makedumpfile.h
> >+++ b/makedumpfile.h
> >@@ -549,7 +549,9 @@ do { \
> > #define VMEMMAP_END_2_6_31 (0xffffeaffffffffff) /* 2.6.31, or later */
> >
> > #define __START_KERNEL_map (0xffffffff80000000)
> >-#define MODULES_VADDR (0xffffffff88000000)
> >+#define KERNEL_IMAGE_SIZE_ORIG (0x0000000008000000) /* 2.6.25, or former */
> >+#define KERNEL_IMAGE_SIZE_2_6_26 (0x0000000020000000) /* 2.6.26, or later */
> >+#define MODULES_VADDR (__START_KERNEL_map + NUMBER(KERNEL_IMAGE_SIZE))
> > #define MODULES_END (0xfffffffffff00000)
> > #define KVBASE PAGE_OFFSET
> > #define _SECTION_SIZE_BITS (27)
> >@@ -1531,6 +1533,7 @@ struct number_table {
> > long PG_hwpoison;
> >
> > long PAGE_BUDDY_MAPCOUNT_VALUE;
> >+ long KERNEL_IMAGE_SIZE;
> > long SECTION_SIZE_BITS;
> > long MAX_PHYSMEM_BITS;
> > };
> >--
> >1.8.5.3
More information about the kexec
mailing list