--- /dev/null
+diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S
+index 3360107..f09c556 100644
+--- a/xen/arch/x86/boot/head.S
++++ b/xen/arch/x86/boot/head.S
+@@ -33,6 +33,16 @@ ENTRY(start)
+ /* Checksum: must be the negated sum of the first two fields. */
+ .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
+
++/*** EFI GRUB HEADER ****/
++ .align 8
++ /*Magic number */
++ .quad 0xdeadbeefef104ead
++ .quad sym_phys(efi_loader_signature)
++ .quad sym_phys(efi_system_table_addr)
++ .quad sym_phys(realmode_available)
++ .quad sym_phys(boot_vid_mode)
++ .quad sym_phys(boot_vid_info)
++
+ .section .init.text
+
+ .Lbad_cpu_msg: .asciz "ERR: Not a 64-bit CPU!"
+@@ -198,6 +208,14 @@ __start:
+ reloc:
+ #include "reloc.S"
+
++ .align 8
++.globl efi_loader_signature
++efi_loader_signature:
++ .quad 0x1 /*Must not be placed into bss, as is overwritten by loader*/
++.globl efi_system_table_addr
++efi_system_table_addr:
++ .quad 0x1 /*Must not be placed into bss, as is overwritten by loader*/
++
+ .align 16
+ .globl trampoline_start, trampoline_end
+ trampoline_start:
+diff --git a/xen/arch/x86/boot/trampoline.S b/xen/arch/x86/boot/trampoline.S
+index ad15f5c..3c2e971 100644
+--- a/xen/arch/x86/boot/trampoline.S
++++ b/xen/arch/x86/boot/trampoline.S
+@@ -119,6 +119,8 @@ high_start:
+
+ .code32
+ trampoline_boot_cpu_entry:
++ cmpb $0xff,bootsym_phys(realmode_available)
++ jnz .Lskip_realmode
+ cmpb $0,bootsym_phys(skip_realmode)
+ jnz .Lskip_realmode
+
+@@ -201,6 +203,9 @@ trampoline_boot_cpu_entry:
+ skip_realmode:
+ .byte 0
+
++realmode_available:
++ .byte 0xff /*must not be placed into bss as is overwritten by loader*/
++
+ rm_idt: .word 256*4-1, 0, 0
+
+ #include "mem.S"
--- /dev/null
+diff --git a/xen/arch/x86/dmi_scan.c b/xen/arch/x86/dmi_scan.c
+index cdc4674..58cfe01 100644
+--- a/xen/arch/x86/dmi_scan.c
++++ b/xen/arch/x86/dmi_scan.c
+@@ -105,8 +105,8 @@ int __init dmi_get_table(u32 *base, u32 *len)
+ u8 buf[15];
+ char __iomem *p, *q;
+
+- p = maddr_to_virt(0xF0000);
+- for (q = p; q < p + 0x10000; q += 16) {
++ p = maddr_to_virt(0x90000);
++ for (q = p; q < p + 0x70000; q += 16) {
+ memcpy_fromio(buf, q, 15);
+ if (memcmp(buf, "_DMI_", 5)==0 && dmi_checksum(buf)) {
+ *base=buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8];
+@@ -122,8 +122,8 @@ static int __init dmi_iterate(void (*decode)(struct dmi_header *))
+ u8 buf[15];
+ char __iomem *p, *q;
+
+- p = maddr_to_virt(0xF0000);
+- for (q = p; q < p + 0x10000; q += 16) {
++ p = maddr_to_virt(0x90000);
++ for (q = p; q < p + 0x70000; q += 16) {
+ memcpy_fromio(buf, q, 15);
+ if (memcmp(buf, "_DMI_", 5)==0 && dmi_checksum(buf)) {
+ u16 num=buf[13]<<8|buf[12];
+diff --git a/xen/include/acpi/acconfig.h b/xen/include/acpi/acconfig.h
+index 422f29c..520ae2c 100644
+--- a/xen/include/acpi/acconfig.h
++++ b/xen/include/acpi/acconfig.h
+@@ -166,8 +166,8 @@
+ #define ACPI_EBDA_PTR_LOCATION 0x0000040E /* Physical Address */
+ #define ACPI_EBDA_PTR_LENGTH 2
+ #define ACPI_EBDA_WINDOW_SIZE 1024
+-#define ACPI_HI_RSDP_WINDOW_BASE 0x000E0000 /* Physical Address */
+-#define ACPI_HI_RSDP_WINDOW_SIZE 0x00020000
++#define ACPI_HI_RSDP_WINDOW_BASE 0x00090000 /* Physical Address */
++#define ACPI_HI_RSDP_WINDOW_SIZE 0x00070000
+ #define ACPI_RSDP_SCAN_STEP 16
+
+ /* Operation regions */
--- /dev/null
+efi-grub
+search-harder-for-acpi-and-smbios