[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/EFI: don't apply relocations to l{2, 3}_bootmap
commit c5b4805bcd6bc749a8717e7406faa4a0e95468b4 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Aug 19 17:03:33 2016 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Aug 19 17:03:33 2016 +0200 x86/EFI: don't apply relocations to l{2,3}_bootmap Other than claimed in commit 2ce5963727's ("x86: construct the {l2,l3}_bootmap at compile time") the initialization of the two page tables doesn't take care of everything without furher adjustment: The compile time initialization obviously requires base relocations, and those get processed after efi_arch_memory_setup(). Hence without additional care the correctly initialized values may then get wrongly "adjusted" again. Except the two table from being subject to base relocation. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper@xxxxxxxxxx> --- xen/arch/x86/efi/efi-boot.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h index 1fa9e47..2ae4de1 100644 --- a/xen/arch/x86/efi/efi-boot.h +++ b/xen/arch/x86/efi/efi-boot.h @@ -47,11 +47,23 @@ static void __init efi_arch_relocate_image(unsigned long delta) for ( base_relocs = __base_relocs_start; base_relocs < __base_relocs_end; ) { - unsigned int i, n; + unsigned int i = 0, n; n = (base_relocs->size - sizeof(*base_relocs)) / sizeof(*base_relocs->entries); - for ( i = 0; i < n; ++i ) + + /* + * Relevant l{2,3}_bootmap entries get initialized explicitly in + * efi_arch_memory_setup(), so we must not apply relocations there. + * l2_identmap's first slot, otoh, should be handled normally, as + * efi_arch_memory_setup() won't touch it (xen_phys_start should + * never be zero). + */ + if ( xen_phys_start + base_relocs->rva == (unsigned long)l3_bootmap || + xen_phys_start + base_relocs->rva == (unsigned long)l2_bootmap ) + i = n; + + for ( ; i < n; ++i ) { unsigned long addr = xen_phys_start + base_relocs->rva + (base_relocs->entries[i] & 0xfff); -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |