49 lines
1.9 KiB
Diff
49 lines
1.9 KiB
Diff
|
References: bsc#978755 bsc#983697
|
||
|
|
||
|
# Commit c5b4805bcd6bc749a8717e7406faa4a0e95468b4
|
||
|
# Date 2016-08-19 17:03:33 +0200
|
||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||
|
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@suse.com>
|
||
|
Reviewed-by: Andrew Cooper <andrew.cooper@citrix.com>
|
||
|
|
||
|
--- 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_ima
|
||
|
|
||
|
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);
|