On Wed, 18 Nov, at 09:14:23AM, Ingo Molnar wrote: > > * Matt Fleming <matt@xxxxxxxxxxxxxxxxxxx> wrote: > > > > > + npages = (_end - _text) >> PAGE_SHIFT; > > > > > > You really need to PFN_ALIGN _end and _text. Has been wrong in the > > > existing code as well. > > > > Hmm... very good point. > > So I think we should instead guarantee that _end and _text are page aligned. > > _text is already page aligned: > > SECTIONS > { > #ifdef CONFIG_X86_32 > . = LOAD_OFFSET + LOAD_PHYSICAL_ADDR; > phys_startup_32 = startup_32 - LOAD_OFFSET; > #else > . = __START_KERNEL; > phys_startup_64 = startup_64 - LOAD_OFFSET; > #endif > > /* Text and read-only data */ > .text : AT(ADDR(.text) - LOAD_OFFSET) { > _text = .; > > The reason for aligning _end as well is that we already page-align the BSS and BRK > sections of the kernel and its various section boundary symbols: > > /* BSS */ > . = ALIGN(PAGE_SIZE); > .bss : AT(ADDR(.bss) - LOAD_OFFSET) { > __bss_start = .; > *(.bss..page_aligned) > *(.bss) > . = ALIGN(PAGE_SIZE); > __bss_stop = .; > } > > . = ALIGN(PAGE_SIZE); > .brk : AT(ADDR(.brk) - LOAD_OFFSET) { > __brk_base = .; > . += 64 * 1024; /* 64k alignment slop space */ > *(.brk_reservation) /* areas brk users have reserved */ > __brk_limit = .; > } > > _end = .; > > STABS_DEBUG > DWARF_DEBUG > > _end is the only odd one out, so we should align it as well - because it's easy to > make such pfn conversion bugs. FWIW, I saw no changes in either 32-bit or 64-bit vmlinux size when building with the following patch, so it seems like a pretty easy win, --- >From 25ad518fa52e589f110376ae06e42fb20b3e4188 Mon Sep 17 00:00:00 2001 From: Matt Fleming <matt@xxxxxxxxxxxxxxxxxxx> Date: Fri, 20 Nov 2015 11:46:11 +0000 Subject: [PATCH] x86: Page align _end to avoid pfn conversion bugs Ingo noted that if we can guarantee _end is aligned to PAGE_SIZE we can automatically avoid bugs along the lines of, size = _end - _text >> PAGE_SHIFT which is missing a call to PFN_ALIGN(). The EFI mixed mode contains this bug, for example. _text is already aligned to PAGE_SIZE through the use of LOAD_PHYSICAL_ADDR, and the BSS and BRK sections are explicitly aligned in the linker script, so it makes sense to align _end to match. Reported-by: Ingo Molnar <mingo@xxxxxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: "H . Peter Anvin" <hpa@xxxxxxxxx> Cc: Toshi Kani <toshi.kani@xxxxxx> Cc: Sai Praneeth Prakhya <sai.praneeth.prakhya@xxxxxxxxx> Cc: Dave Hansen <dave.hansen@xxxxxxxxx> Cc: Borislav Petkov <bp@xxxxxxxxx> Signed-off-by: Matt Fleming <matt@xxxxxxxxxxxxxxxxxxx> --- arch/x86/kernel/vmlinux.lds.S | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 74e4bf11f562..4f1994257a18 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S @@ -325,6 +325,7 @@ SECTIONS __brk_limit = .; } + . = ALIGN(PAGE_SIZE); _end = .; STABS_DEBUG -- 2.6.2 -- To unsubscribe from this list: send the line "unsubscribe linux-efi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html