hvmloader, libxl: use the correct ACPI settings depending on device model

We need to choose ACPI tables and ACPI IO port location
properly depending on the device model version we are running.
Previously, this decision was made by BIOS type specific
code in hvmloader, e.g. always load QEMU traditional specific
tables if it's ROMBIOS and always load QEMU Xen specific
tables if it's SeaBIOS.

This change saves this behavior (for compatibility) but adds
an additional way (xenstore key) to specify the correct
device model if we happen to run a non-default one. Toolstack
bit makes use of it.

The enforcement of BIOS type depending on QEMU version will
be lifted later when the rest of ROMBIOS compatibility fixes
are in place.

Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>
Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
Igor Druzhinin authored and Wei Liu committed 2017-08-22 16:36:48 +01:00
1 parent 88bfbf90e3
commit 149c6bbbf7
7 files changed
+34 -12

No files matched your search

-2
View File
@@ -405,8 +405,6 @@ int main(void)
}
acpi_enable_sci();
hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
}
init_vm86_tss();
+2 -3
View File
@@ -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 */
@@ -127,6 +124,8 @@ static void ovmf_acpi_build_tables(void)
.dsdt_15cpu_len = 0
};
hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
hvmloader_acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS);
}
+2 -3
View File
@@ -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)
{
/*
@@ -181,6 +178,8 @@ static void rombios_acpi_build_tables(void)
.dsdt_15cpu_len = dsdt_15cpu_len,
};
hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0);
hvmloader_acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS);
}
+3 -3
View File
@@ -28,9 +28,7 @@
#include <acpi2_0.h>
#include <libacpi.h>
extern unsigned char dsdt_anycpu_qemu_xen[];
extern int dsdt_anycpu_qemu_xen_len;
#include <xen/hvm/params.h>
struct seabios_info {
char signature[14]; /* XenHVMSeaBIOS\0 */
@@ -99,6 +97,8 @@ static void seabios_acpi_build_tables(void)
.dsdt_15cpu_len = 0,
};
hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
hvmloader_acpi_build_tables(&config, rsdp);
add_table(rsdp);
}
+21
View File
@@ -897,6 +897,27 @@ 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;
hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0);
}
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;
hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
}
config->lapic_base_address = LAPIC_BASE_ADDRESS;
config->lapic_id = acpi_lapic_id;
config->ioapic_base_address = ioapic_base_address;
+3
View File
@@ -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 unsigned char dsdt_anycpu_qemu_xen[], dsdt_anycpu[], dsdt_15cpu[];
extern 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);
+3 -1
View File
@@ -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:
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.