@@ -41,9 +41,6 @@
#define LOWCHUNK_MAXOFFSET 0x0000FFFF
#define OVMF_INFO_PHYSICAL_ADDRESS 0x00001000
-extern unsigned char dsdt_anycpu_qemu_xen[];
-extern int dsdt_anycpu_qemu_xen_len;
-
#define OVMF_INFO_MAX_TABLES 4
struct ovmf_info {
char signature[14]; /* XenHVMOVMF\0\0\0\0 */
@@ -42,9 +42,6 @@
#define ROMBIOS_MAXOFFSET 0x0000FFFF
#define ROMBIOS_END (ROMBIOS_BEGIN + ROMBIOS_SIZE)
-extern unsigned char dsdt_anycpu[], dsdt_15cpu[];
-extern int dsdt_anycpu_len, dsdt_15cpu_len;
-
static void rombios_setup_e820(void)
{
/*
@@ -29,9 +29,6 @@
#include <acpi2_0.h>
#include <libacpi.h>
-extern unsigned char dsdt_anycpu_qemu_xen[];
-extern int dsdt_anycpu_qemu_xen_len;
-
struct seabios_info {
char signature[14]; /* XenHVMSeaBIOS\0 */
uint8_t length; /* Length of this struct */
@@ -897,6 +897,23 @@ void hvmloader_acpi_build_tables(struct acpi_config *config,
/* Allocate and initialise the acpi info area. */
mem_hole_populate_ram(ACPI_INFO_PHYSICAL_ADDRESS >> PAGE_SHIFT, 1);
+ /* If the device model is specified switch to the corresponding tables */
+ s = xenstore_read("platform/device-model", "");
+ if ( !strncmp(s, "qemu_xen_traditional", 21) )
+ {
+ config->dsdt_anycpu = dsdt_anycpu;
+ config->dsdt_anycpu_len = dsdt_anycpu_len;
+ config->dsdt_15cpu = dsdt_15cpu;
+ config->dsdt_15cpu_len = dsdt_15cpu_len;
+ }
+ else if ( !strncmp(s, "qemu_xen", 9) )
+ {
+ config->dsdt_anycpu = dsdt_anycpu_qemu_xen;
+ config->dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len;
+ config->dsdt_15cpu = NULL;
+ config->dsdt_15cpu_len = 0;
+ }
+
config->lapic_base_address = LAPIC_BASE_ADDRESS;
config->lapic_id = acpi_lapic_id;
config->ioapic_base_address = ioapic_base_address;
@@ -276,6 +276,9 @@ extern struct e820map memory_map;
bool check_overlap(uint64_t start, uint64_t size,
uint64_t reserved_start, uint64_t reserved_size);
+extern const unsigned char dsdt_anycpu_qemu_xen[], dsdt_anycpu[], dsdt_15cpu[];
+extern const int dsdt_anycpu_qemu_xen_len, dsdt_anycpu_len, dsdt_15cpu_len;
+
struct acpi_config;
void hvmloader_acpi_build_tables(struct acpi_config *config,
unsigned int physical);
@@ -451,7 +451,7 @@ int libxl__domain_build(libxl__gc *gc,
vments[4] = "start_time";
vments[5] = GCSPRINTF("%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
- localents = libxl__calloc(gc, 11, sizeof(char *));
+ localents = libxl__calloc(gc, 13, sizeof(char *));
i = 0;
localents[i++] = "platform/acpi";
localents[i++] = libxl__acpi_defbool_val(info) ? "1" : "0";
@@ -472,6 +472,8 @@ int libxl__domain_build(libxl__gc *gc,
info->u.hvm.mmio_hole_memkb << 10);
}
}
+ localents[i++] = "platform/device-model";
+ localents[i++] = (char *)libxl_device_model_version_to_string(info->device_model_version);
break;
case LIBXL_DOMAIN_TYPE_PV:
@@ -103,14 +103,19 @@ typedef struct buffered_iopage buffered_iopage_t;
* version number in HVM_PARAM_ACPI_IOPORTS_LOCATION.
*/
-/* Version 0 (default): Traditional Xen locations. */
+/*
+ * Version 0 (default): Traditional (obsolete) Xen locations.
+ *
+ * These are now only used for compatibility with VMs migrated
+ * from older Xen versions.
+ */
#define ACPI_PM1A_EVT_BLK_ADDRESS_V0 0x1f40
#define ACPI_PM1A_CNT_BLK_ADDRESS_V0 (ACPI_PM1A_EVT_BLK_ADDRESS_V0 + 0x04)
#define ACPI_PM_TMR_BLK_ADDRESS_V0 (ACPI_PM1A_EVT_BLK_ADDRESS_V0 + 0x08)
#define ACPI_GPE0_BLK_ADDRESS_V0 (ACPI_PM_TMR_BLK_ADDRESS_V0 + 0x20)
#define ACPI_GPE0_BLK_LEN_V0 0x08
-/* Version 1: Locations preferred by modern Qemu. */
+/* Version 1: Locations preferred by modern Qemu (including Qemu-trad). */
#define ACPI_PM1A_EVT_BLK_ADDRESS_V1 0xb000
#define ACPI_PM1A_CNT_BLK_ADDRESS_V1 (ACPI_PM1A_EVT_BLK_ADDRESS_V1 + 0x04)
#define ACPI_PM_TMR_BLK_ADDRESS_V1 (ACPI_PM1A_EVT_BLK_ADDRESS_V1 + 0x08)