[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/EFI + Live Patch: avoid symbol address truncation
On 28/06/16 15:03, Jan Beulich wrote: > ld associates __init_end, placed outside of any section by the linker > script, with the following section, resulting in a huge (wrapped, as it > would be negative) section relative offset. So in this case, the cause of the truncation is due to __init_end being considered relative to .data.read_mostly? > COFF symbol tables store > section relative addresses, and hence the above leads to assembler > truncation warnings when all symbols get included in the symbol table > (for Live Patching code). To overcome this, move __init_end past both > ALIGN() directives. The consuming code (init_done()) is fine with such > an adjustment (the distinction really would only be relevant for the > loop claring the pages, and I think it's acceptable to clear a few > more on - for now - EFI). This effectively results in the > (__init_begin,__init_end) and (__2M_init_start,__2M_init_end) pairs to > become identical, with their different names only serving documentation > purposes now. > > Note that moving __init_end and __2M_init_end into .init is not a good > idea, as that would significantly grow xen.efi binary size. How about moving just __init_end ? That shouldn't affect the size of any binary, due to the existing page alignment between sections. > > While inspecting symbol table and ld behavior I also noticed that > __2M_text_start gets put at address zero in the EFI case, which hasn't > caused problems solely because we don't actually reference that symbol. The reason that __2M_text_start isn't referenced is because I couldn't get the EFI build working. It was used in my first prototype. > Correct the setting of the initial address, and comment out said symbol > for the time being, as with the initial address correction it would in > turn cause an assembler truncation warning similar to the one mentioned > above. > > While checking init_done() for correctness with the above changes I > noticed that code can easily be folded there, at once correcting the > logged amount of memory which has got freed for the 2M-alignment case > (i.e. EFI right now). > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > > --- a/xen/arch/x86/setup.c > +++ b/xen/arch/x86/setup.c > @@ -515,6 +515,7 @@ static inline bool_t using_2M_mapping(vo > static void noinline init_done(void) > { > void *va; > + unsigned long start, end; > > system_state = SYS_STATE_active; > > @@ -530,18 +531,18 @@ static void noinline init_done(void) > /* Destroy Xen's mappings, and reuse the pages. */ > if ( using_2M_mapping() ) > { > - destroy_xen_mappings((unsigned long)&__2M_init_start, > - (unsigned long)&__2M_init_end); > - init_xenheap_pages(__pa(__2M_init_start), __pa(__2M_init_end)); > + start = (unsigned long)&__2M_init_start, > + end = (unsigned long)&__2M_init_end; > } > else > { > - destroy_xen_mappings((unsigned long)&__init_begin, > - (unsigned long)&__init_end); > - init_xenheap_pages(__pa(__init_begin), __pa(__init_end)); > + start = (unsigned long)&__init_begin; > + end = (unsigned long)&__init_end; > } > > - printk("Freed %ldkB init memory.\n", > (long)(__init_end-__init_begin)>>10); > + destroy_xen_mappings(start, end); > + init_xenheap_pages(__pa(start), __pa(end)); > + printk("Freed %ldkB init memory\n", (end - start) >> 10); The parameter is now unsigned, so %lu. > > startup_cpu_idle_loop(); > } > --- a/xen/arch/x86/xen.lds.S > +++ b/xen/arch/x86/xen.lds.S > @@ -40,9 +40,20 @@ SECTIONS > #if !defined(EFI) > . = __XEN_VIRT_START; > __image_base__ = .; > +#else > + . = __image_base__; > #endif > > +#if 0 > +/* > + * We don't really use this symbol anywhere, and the way it would get defined > + * here would result in it having a negative (wrapped to huge positive) > + * offset relative to the .text section. That, in turn, causes an assembler > + * truncation warning when including all symbols in the symbol table for Live > + * Patching code. > + */ > __2M_text_start = .; /* Start of 2M superpages, mapped RX. */ > +#endif > > . = __XEN_VIRT_START + MB(1); > _start = .; > @@ -194,14 +205,13 @@ SECTIONS > *(.ctors) > __ctors_end = .; > } :text > - . = ALIGN(PAGE_SIZE); > - __init_end = .; > > #ifdef EFI > . = ALIGN(MB(2)); > #else > . = ALIGN(PAGE_SIZE); > #endif > + __init_end = .; > __2M_init_end = .; > > __2M_rwdata_start = .; /* Start of 2M superpages, mapped RW. */ > @@ -296,7 +306,6 @@ ASSERT(__image_base__ > XEN_VIRT_START | > ASSERT(kexec_reloc_size - kexec_reloc <= PAGE_SIZE, "kexec_reloc is too > large") > #endif > > -ASSERT(IS_ALIGNED(__2M_text_start, MB(2)), "__2M_text_start misaligned") If we are #if 0'ing the symbol for documentation purposes, can we #if 0 this as well? ~Andrew > #ifdef EFI > ASSERT(IS_ALIGNED(__2M_text_end, MB(2)), "__2M_text_end misaligned") > ASSERT(IS_ALIGNED(__2M_rodata_start, MB(2)), "__2M_rodata_start misaligned") > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |