]> xenbits.xensource.com Git - people/iwj/xen.git/commitdiff
x86/PVH/libxl: Check whether Linux guest can handle RSDP at 4G boundary
authorBoris Ostrovsky <boris.ostrovsky@oracle.com>
Mon, 9 Apr 2018 14:24:59 +0000 (10:24 -0400)
committerWei Liu <wei.liu2@citrix.com>
Mon, 9 Apr 2018 17:18:00 +0000 (18:18 +0100)
Commit 4a5733771e6f ("libxl: put RSDP for PVH guest near 4GB") breaks
pre-4.17 Linux guests since they do not use start_info's rsdp_paddr
pointer and instread scan BIOS memory for RSDP signature.

Introduce XENFEAT_linux_rsdp_unrestricted feature flag that indicates
whether the guest can handle RSDP at locations pointed to by
rsdp_paddr.

Since only Linux PVH guests suffer from this problem (BSD has always
relied on rsdp_paddr) we check this flag just for those guests. If the
flag is not set we place RSDP in BIOS, as before.

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Release-acked-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Acked-by: George Dunlap <george.dunlap@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
tools/libxl/libxl_x86_acpi.c
xen/include/public/features.h

index fe87418bc1b4fa22f0d2f0652a33832a7c44b9cd..143ce66644118da9c7272c88d665762fa30c8efa 100644 (file)
@@ -218,8 +218,18 @@ int libxl__dom_load_acpi(libxl__gc *gc,
 
     dom->acpi_modules[0].data = (void *)config.rsdp;
     dom->acpi_modules[0].length = 64;
-    dom->acpi_modules[0].guest_addr_out = ACPI_INFO_PHYSICAL_ADDRESS +
-        (1 + acpi_pages_num) * libxl_ctxt.page_size;
+    /*
+     * Some Linux versions cannot properly process hvm_start_info.rsdp_paddr
+     * and so we need to put RSDP in location that can be discovered by ACPI's
+     * standard search method, in R-O BIOS memory (we chose last 64 bytes)
+     */
+    if (strcmp(dom->parms.guest_os, "linux") ||
+        elf_xen_feature_get(XENFEAT_linux_rsdp_unrestricted,
+                            dom->parms.f_supported))
+        dom->acpi_modules[0].guest_addr_out = ACPI_INFO_PHYSICAL_ADDRESS +
+            (1 + acpi_pages_num) * libxl_ctxt.page_size;
+    else
+        dom->acpi_modules[0].guest_addr_out = 0x100000 - 64;
 
     dom->acpi_modules[1].data = (void *)config.infop;
     dom->acpi_modules[1].length = 4096;
index 1a989b8bf979d513b6d5c9e397ccf21c0b5c3e0a..443e6eca5393e1f58946856b2a70ed0ad31d8480 100644 (file)
 /* arm: Hypervisor supports ARM SMC calling convention. */
 #define XENFEAT_ARM_SMCCC_supported       14
 
+/*
+ * x86/PVH: If set, ACPI RSDP can be placed at any address. Otherwise RSDP
+ * must be located in lower 1MB, as required by ACPI Specification for IA-PC
+ * systems.
+ * This feature flag is only consulted if XEN_ELFNOTE_GUEST_OS contains
+ * the "linux" string.
+ */
+#define XENFEAT_linux_rsdp_unrestricted   15
+
 #define XENFEAT_NR_SUBMAPS 1
 
 #endif /* __XEN_PUBLIC_FEATURES_H__ */