[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/link: Don't merge .init.text and .init.data
On Thu, Jan 11, 2018 at 02:17:57PM +0000, Andrew Cooper wrote: > c/s 1308f0170c merged .init.text and .init.data, because EFI might properly > write-protect r/o sections. > > However, this change makes xen-syms unusable for disassembly analysis. In s/this makes/that made/ > particular, searching for indirect branches as part of the SP2/Spectre > mitigation series. > > Revert the relevent bits of 1308f0170c and instead modify the EFI relocation > code to disable CR0.WP, which is how we deal with relocations in r/o mappings > elsewhere. > > Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> with that change above: Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> > --- > CC: Jan Beulich <JBeulich@xxxxxxxx> > --- > xen/arch/x86/efi/efi-boot.h | 12 ++++++++++++ > xen/arch/x86/efi/mkreloc.c | 5 ----- > xen/arch/x86/xen.lds.S | 7 +++---- > 3 files changed, 15 insertions(+), 9 deletions(-) > > diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h > index d30f688..0b5f218 100644 > --- a/xen/arch/x86/efi/efi-boot.h > +++ b/xen/arch/x86/efi/efi-boot.h > @@ -47,8 +47,17 @@ extern const struct pe_base_relocs { > > static void __init efi_arch_relocate_image(unsigned long delta) > { > + unsigned long cr0; > const struct pe_base_relocs *base_relocs; > > + /* > + * Conditionally disable CR0.WP in case there are relocations present in > + * read-only mappings. > + */ > + cr0 = read_cr0(); > + if ( cr0 & X86_CR0_WP ) > + write_cr0(cr0 & ~X86_CR0_WP); > + > for ( base_relocs = __base_relocs_start; base_relocs < > __base_relocs_end; ) > { > unsigned int i = 0, n; > @@ -96,6 +105,9 @@ static void __init efi_arch_relocate_image(unsigned long > delta) > } > base_relocs = (const void *)(base_relocs->entries + i + (i & 1)); > } > + > + if ( cr0 & X86_CR0_WP ) > + write_cr0(cr0); > } > > extern const s32 __trampoline_rel_start[], __trampoline_rel_stop[]; > diff --git a/xen/arch/x86/efi/mkreloc.c b/xen/arch/x86/efi/mkreloc.c > index 1aca796..509fd83 100644 > --- a/xen/arch/x86/efi/mkreloc.c > +++ b/xen/arch/x86/efi/mkreloc.c > @@ -267,11 +267,6 @@ static void diff_sections(const unsigned char *ptr1, > const unsigned char *ptr2, > exit(3); > } > > - if ( !(sec->flags & COFF_SECTION_WRITEABLE) ) > - fprintf(stderr, > - "Warning: relocation to r/o section %.8s:%08" PRIxFAST32 > "\n", > - sec->name, i); > - > printf("\t.word (%u << 12) | 0x%03" PRIxFAST32 "\n", > reloc, sec->rva + i - disp - rva); > reloc_size += 2; > diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S > index d5e8821..6a7bbb8 100644 > --- a/xen/arch/x86/xen.lds.S > +++ b/xen/arch/x86/xen.lds.S > @@ -159,7 +159,7 @@ SECTIONS > __2M_init_start = .; /* Start of 2M superpages, mapped RWX (boot > only). */ > . = ALIGN(PAGE_SIZE); /* Init code and data */ > __init_begin = .; > - .init : { > + .init.text : { > _sinittext = .; > *(.init.text) > /* > @@ -169,9 +169,8 @@ SECTIONS > */ > *(.altinstr_replacement) > _einittext = .; > - > - . = ALIGN(SMP_CACHE_BYTES); > - > + } :text > + .init.data : { > *(.init.rodata) > *(.init.rodata.rel) > *(.init.rodata.str*) > -- > 2.1.4 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |