[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 8/8] xen/x86: Unilaterally remove .init mappings
Because of the new 2M alignment of .init and .bss, the existing memory guarding infrastructure causes a shattered 2M superpage with non-present entries for .init, and present entries for the alignment space. Do away with the difference in behaviour between debug and non-debug builds; always destroy the .init mappings, and reuse the space for xenheap. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Jan Beulich <JBeulich@xxxxxxxx> --- xen/arch/x86/setup.c | 24 +++++++++++------------- xen/arch/x86/xen.lds.S | 3 +++ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 806fa95..8431f06 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -176,16 +176,6 @@ void __init discard_initial_images(void) initial_images = NULL; } -static void free_xen_data(char *s, char *e) -{ -#ifndef MEMORY_GUARD - init_xenheap_pages(__pa(s), __pa(e)); -#endif - memguard_guard_range(s, e-s); - /* Also zap the mapping in the 1:1 area. */ - memguard_guard_range(__va(__pa(s)), e-s); -} - extern char __init_begin[], __init_end[], __bss_start[], __bss_end[]; static void __init init_idle_domain(void) @@ -509,13 +499,21 @@ static void __init kexec_reserve_area(struct e820map *e820) static void noinline init_done(void) { + void *va; + system_state = SYS_STATE_active; domain_unpause_by_systemcontroller(hardware_domain); - /* Free (or page-protect) the init areas. */ - memset(__init_begin, 0xcc, __init_end - __init_begin); /* int3 poison */ - free_xen_data(__init_begin, __init_end); + /* Zero the .init code and data. */ + for ( va = __init_begin; va < _p(__init_end); va += PAGE_SIZE ) + clear_page(va); + + /* Destroy Xen's mappings, and reuse the pages. */ + destroy_xen_mappings((unsigned long)&__2M_init_start, + (unsigned long)&__2M_init_end); + init_xenheap_pages(__pa(__2M_init_start), __pa(__2M_init_end)); + printk("Freed %ldkB init memory.\n", (long)(__init_end-__init_begin)>>10); startup_cpu_idle_loop(); diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index aadb082..f3908d1 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -257,3 +257,6 @@ ASSERT(IS_ALIGNED(__2M_rwdata_start, MB(2)), "__2M_rwdata_start misaligned") ASSERT(IS_ALIGNED(__2M_rwdata_end, MB(2)), "__2M_rwdata_end misaligned") ASSERT(IS_ALIGNED(cpu0_stack, STACK_SIZE), "cpu0_stack misaligned") + +ASSERT(IS_ALIGNED(__init_begin, PAGE_SIZE), "__init_begin misaligned") +ASSERT(IS_ALIGNED(__init_end, PAGE_SIZE), "__init_end misaligned") -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |