598a3740c6
virtualization on 32-bit exposes host crash CVE-2013-0151-xsa34.patch - bnc#797287 - VUL-0: Xen: XSA-35 (CVE-2013-0152) - Nested HVM exposes host to being driven out of memory by guest CVE-2013-0152-xsa35.patch - bnc#793717 - NetWare will not boot on Xen 4.2 xnloader.py domUloader.py pygrub-netware-xnloader.patch Removed reverse-24757-use-grant-references.patch - bnc#797523 - VUL-1: CVE-2012-6075: qemu / kvm-qemu: e1000 overflows under some conditions CVE-2012-6075-xsa41.patch - Mask the floating point exceptions for guests like NetWare on machines that support XSAVE. x86-fpu-context-conditional.patch - fate##313584: pass bios information to XEN HVM guest 26341-hvm-firmware-passthrough.patch 26342-hvm-firmware-passthrough.patch 26343-hvm-firmware-passthrough.patch 26344-hvm-firmware-passthrough.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=223
102 lines
3.1 KiB
Diff
102 lines
3.1 KiB
Diff
fate#313584: pass bios information to XEN HVM guest
|
|
|
|
# HG changeset patch
|
|
# User Ross Philipson <ross.philipson@citrix.com>
|
|
# Date 1357838323 0
|
|
# Node ID b9c38bea15b117552ecb51809779c7cfef82dd44
|
|
# Parent a7ce196f40444fafbe8f13b2d80e4885d4321806
|
|
HVM firmware passthrough ACPI processing
|
|
|
|
ACPI table passthrough support allowing additional static tables and
|
|
SSDTs (AML code) to be loaded. These additional tables are added at
|
|
the end of the secondary table list in the RSDT/XSDT tables.
|
|
|
|
Signed-off-by: Ross Philipson <ross.philipson@citrix.com>
|
|
Committed-by: Keir Fraser <keir@xen.org>
|
|
|
|
diff -r a7ce196f4044 -r b9c38bea15b1 tools/firmware/hvmloader/acpi/build.c
|
|
--- a/tools/firmware/hvmloader/acpi/build.c Thu Jan 10 17:18:10 2013 +0000
|
|
+++ b/tools/firmware/hvmloader/acpi/build.c Thu Jan 10 17:18:43 2013 +0000
|
|
@@ -23,6 +23,9 @@
|
|
#include "ssdt_pm.h"
|
|
#include "../config.h"
|
|
#include "../util.h"
|
|
+#include <xen/hvm/hvm_xs_strings.h>
|
|
+
|
|
+#define ACPI_MAX_SECONDARY_TABLES 16
|
|
|
|
#define align16(sz) (((sz) + 15) & ~15)
|
|
#define fixed_strcpy(d, s) strncpy((d), (s), sizeof(d))
|
|
@@ -198,6 +201,52 @@ static struct acpi_20_waet *construct_wa
|
|
return waet;
|
|
}
|
|
|
|
+static int construct_passthrough_tables(unsigned long *table_ptrs,
|
|
+ int nr_tables)
|
|
+{
|
|
+ const char *s;
|
|
+ uint8_t *acpi_pt_addr;
|
|
+ uint32_t acpi_pt_length;
|
|
+ struct acpi_header *header;
|
|
+ int nr_added;
|
|
+ int nr_max = (ACPI_MAX_SECONDARY_TABLES - nr_tables - 1);
|
|
+ uint32_t total = 0;
|
|
+ uint8_t *buffer;
|
|
+
|
|
+ s = xenstore_read(HVM_XS_ACPI_PT_ADDRESS, NULL);
|
|
+ if ( s == NULL )
|
|
+ return 0;
|
|
+
|
|
+ acpi_pt_addr = (uint8_t*)(uint32_t)strtoll(s, NULL, 0);
|
|
+ if ( acpi_pt_addr == NULL )
|
|
+ return 0;
|
|
+
|
|
+ s = xenstore_read(HVM_XS_ACPI_PT_LENGTH, NULL);
|
|
+ if ( s == NULL )
|
|
+ return 0;
|
|
+
|
|
+ acpi_pt_length = (uint32_t)strtoll(s, NULL, 0);
|
|
+
|
|
+ for ( nr_added = 0; nr_added < nr_max; nr_added++ )
|
|
+ {
|
|
+ if ( (acpi_pt_length - total) < sizeof(struct acpi_header) )
|
|
+ break;
|
|
+
|
|
+ header = (struct acpi_header*)acpi_pt_addr;
|
|
+
|
|
+ buffer = mem_alloc(header->length, 16);
|
|
+ if ( buffer == NULL )
|
|
+ break;
|
|
+ memcpy(buffer, header, header->length);
|
|
+
|
|
+ table_ptrs[nr_tables++] = (unsigned long)buffer;
|
|
+ total += header->length;
|
|
+ acpi_pt_addr += header->length;
|
|
+ }
|
|
+
|
|
+ return nr_added;
|
|
+}
|
|
+
|
|
static int construct_secondary_tables(unsigned long *table_ptrs,
|
|
struct acpi_info *info)
|
|
{
|
|
@@ -293,6 +342,9 @@ static int construct_secondary_tables(un
|
|
}
|
|
}
|
|
|
|
+ /* Load any additional tables passed through. */
|
|
+ nr_tables += construct_passthrough_tables(table_ptrs, nr_tables);
|
|
+
|
|
table_ptrs[nr_tables] = 0;
|
|
return nr_tables;
|
|
}
|
|
@@ -327,7 +379,7 @@ void acpi_build_tables(struct acpi_confi
|
|
struct acpi_10_fadt *fadt_10;
|
|
struct acpi_20_facs *facs;
|
|
unsigned char *dsdt;
|
|
- unsigned long secondary_tables[16];
|
|
+ unsigned long secondary_tables[ACPI_MAX_SECONDARY_TABLES];
|
|
int nr_secondaries, i;
|
|
unsigned long vm_gid_addr;
|
|
|