summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/system/deprecated.rst6
-rw-r--r--docs/system/removed-features.rst6
-rw-r--r--hw/acpi/aml-build.c29
-rw-r--r--hw/acpi/ghes.c5
-rw-r--r--hw/acpi/hmat.c5
-rw-r--r--hw/acpi/hmat.h3
-rw-r--r--hw/acpi/nvdimm.c18
-rw-r--r--hw/acpi/pci.c5
-rw-r--r--hw/acpi/vmgenid.c4
-rw-r--r--hw/arm/smmuv3.c5
-rw-r--r--hw/arm/virt-acpi-build.c40
-rw-r--r--hw/arm/virt.c63
-rw-r--r--hw/core/machine.c2
-rw-r--r--hw/i386/acpi-build.c86
-rw-r--r--hw/i386/acpi-common.c5
-rw-r--r--hw/i386/acpi-common.h3
-rw-r--r--hw/i386/acpi-microvm.c13
-rw-r--r--hw/i386/microvm.c66
-rw-r--r--hw/i386/pc.c64
-rw-r--r--hw/i386/pc_piix.c94
-rw-r--r--hw/pci/pci.c29
-rw-r--r--hw/virtio/trace-events5
-rw-r--r--hw/virtio/vhost-backend.c5
-rw-r--r--hw/virtio/vhost.c13
-rw-r--r--hw/virtio/virtio-balloon-pci.c11
-rw-r--r--hw/virtio/virtio-iommu.c5
-rw-r--r--hw/virtio/virtio-mmio.c8
-rw-r--r--hw/virtio/virtio-pmem.c4
-rw-r--r--hw/virtio/virtio.c2
-rw-r--r--hw/xen/xen_pt_load_rom.c14
-rw-r--r--include/hw/acpi/acpi-defs.h2
-rw-r--r--include/hw/acpi/aml-build.h8
-rw-r--r--include/hw/acpi/ghes.h3
-rw-r--r--include/hw/acpi/pci.h3
-rw-r--r--include/hw/acpi/vmgenid.h2
-rw-r--r--include/hw/arm/virt.h2
-rw-r--r--include/hw/i386/microvm.h4
-rw-r--r--include/hw/i386/pc.h5
-rw-r--r--include/hw/mem/nvdimm.h3
-rw-r--r--include/hw/pci/pci.h1
-rw-r--r--tests/data/acpi/microvm/APICbin70 -> 70 bytes
-rw-r--r--tests/data/acpi/microvm/APIC.ioapic2bin82 -> 82 bytes
-rw-r--r--tests/data/acpi/microvm/APIC.pciebin110 -> 110 bytes
-rw-r--r--tests/data/acpi/microvm/DSDTbin365 -> 365 bytes
-rw-r--r--tests/data/acpi/microvm/DSDT.ioapic2bin365 -> 365 bytes
-rw-r--r--tests/data/acpi/microvm/DSDT.pciebin3031 -> 3031 bytes
-rw-r--r--tests/data/acpi/microvm/DSDT.rtcbin404 -> 404 bytes
-rw-r--r--tests/data/acpi/microvm/DSDT.usbbin414 -> 414 bytes
-rw-r--r--tests/data/acpi/microvm/FACPbin268 -> 268 bytes
-rw-r--r--tests/data/acpi/pc/APICbin120 -> 120 bytes
-rw-r--r--tests/data/acpi/pc/APIC.acpihmatbin128 -> 128 bytes
-rw-r--r--tests/data/acpi/pc/APIC.cphpbin160 -> 160 bytes
-rw-r--r--tests/data/acpi/pc/APIC.dimmpxmbin144 -> 144 bytes
-rw-r--r--tests/data/acpi/pc/DSDTbin5065 -> 5065 bytes
-rw-r--r--tests/data/acpi/pc/DSDT.acpihmatbin6390 -> 6390 bytes
-rw-r--r--tests/data/acpi/pc/DSDT.bridgebin6924 -> 6924 bytes
-rw-r--r--tests/data/acpi/pc/DSDT.cphpbin5529 -> 5529 bytes
-rw-r--r--tests/data/acpi/pc/DSDT.dimmpxmbin6719 -> 6719 bytes
-rw-r--r--tests/data/acpi/pc/DSDT.hpbridgebin5026 -> 5026 bytes
-rw-r--r--tests/data/acpi/pc/DSDT.hpbrrootbin3084 -> 3084 bytes
-rw-r--r--tests/data/acpi/pc/DSDT.ipmikcsbin5137 -> 5137 bytes
-rw-r--r--tests/data/acpi/pc/DSDT.memhpbin6424 -> 6424 bytes
-rw-r--r--tests/data/acpi/pc/DSDT.numamembin5071 -> 5071 bytes
-rw-r--r--tests/data/acpi/pc/DSDT.roothpbin5261 -> 5261 bytes
-rw-r--r--tests/data/acpi/pc/FACPbin116 -> 116 bytes
-rw-r--r--tests/data/acpi/pc/HMAT.acpihmatbin280 -> 280 bytes
-rw-r--r--tests/data/acpi/pc/HPETbin56 -> 56 bytes
-rw-r--r--tests/data/acpi/pc/NFIT.dimmpxmbin240 -> 240 bytes
-rw-r--r--tests/data/acpi/pc/SLIT.cphpbin48 -> 48 bytes
-rw-r--r--tests/data/acpi/pc/SLIT.memhpbin48 -> 48 bytes
-rw-r--r--tests/data/acpi/pc/SRAT.acpihmatbin280 -> 280 bytes
-rw-r--r--tests/data/acpi/pc/SRAT.cphpbin304 -> 304 bytes
-rw-r--r--tests/data/acpi/pc/SRAT.dimmpxmbin392 -> 392 bytes
-rw-r--r--tests/data/acpi/pc/SRAT.memhpbin264 -> 264 bytes
-rw-r--r--tests/data/acpi/pc/SRAT.numamembin224 -> 224 bytes
-rw-r--r--tests/data/acpi/pc/SSDT.dimmpxmbin734 -> 734 bytes
-rw-r--r--tests/data/acpi/pc/WAETbin40 -> 40 bytes
-rw-r--r--tests/data/acpi/q35/APICbin120 -> 120 bytes
-rw-r--r--tests/data/acpi/q35/APIC.acpihmatbin128 -> 128 bytes
-rw-r--r--tests/data/acpi/q35/APIC.cphpbin160 -> 160 bytes
-rw-r--r--tests/data/acpi/q35/APIC.dimmpxmbin144 -> 144 bytes
-rw-r--r--tests/data/acpi/q35/DSDTbin7801 -> 7801 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.acpihmatbin9126 -> 9126 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.bridgebin7819 -> 7819 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.cphpbin8265 -> 8265 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.dimmpxmbin9455 -> 9455 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.ipmibtbin7876 -> 7876 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.memhpbin9160 -> 9160 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.mmio64bin8932 -> 8932 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.numamembin7807 -> 7807 bytes
-rw-r--r--tests/data/acpi/q35/DSDT.tisbin8407 -> 8407 bytes
-rw-r--r--tests/data/acpi/q35/FACPbin244 -> 244 bytes
-rw-r--r--tests/data/acpi/q35/HMAT.acpihmatbin280 -> 280 bytes
-rw-r--r--tests/data/acpi/q35/HPETbin56 -> 56 bytes
-rw-r--r--tests/data/acpi/q35/MCFGbin60 -> 60 bytes
-rw-r--r--tests/data/acpi/q35/NFIT.dimmpxmbin240 -> 240 bytes
-rw-r--r--tests/data/acpi/q35/SLIT.cphpbin48 -> 48 bytes
-rw-r--r--tests/data/acpi/q35/SLIT.memhpbin48 -> 48 bytes
-rw-r--r--tests/data/acpi/q35/SRAT.acpihmatbin280 -> 280 bytes
-rw-r--r--tests/data/acpi/q35/SRAT.cphpbin304 -> 304 bytes
-rw-r--r--tests/data/acpi/q35/SRAT.dimmpxmbin392 -> 392 bytes
-rw-r--r--tests/data/acpi/q35/SRAT.memhpbin264 -> 264 bytes
-rw-r--r--tests/data/acpi/q35/SRAT.mmio64bin224 -> 224 bytes
-rw-r--r--tests/data/acpi/q35/SRAT.numamembin224 -> 224 bytes
-rw-r--r--tests/data/acpi/q35/SSDT.dimmpxmbin734 -> 734 bytes
-rw-r--r--tests/data/acpi/q35/TPM2.tisbin76 -> 76 bytes
-rw-r--r--tests/data/acpi/q35/WAETbin40 -> 40 bytes
-rw-r--r--tests/data/acpi/virt/APICbin168 -> 168 bytes
-rw-r--r--tests/data/acpi/virt/APIC.memhpbin168 -> 168 bytes
-rw-r--r--tests/data/acpi/virt/APIC.numamembin168 -> 168 bytes
-rw-r--r--tests/data/acpi/virt/DSDTbin5204 -> 5204 bytes
-rw-r--r--tests/data/acpi/virt/DSDT.memhpbin6565 -> 6565 bytes
-rw-r--r--tests/data/acpi/virt/DSDT.numamembin5204 -> 5204 bytes
-rw-r--r--tests/data/acpi/virt/DSDT.pxbbin7689 -> 7689 bytes
-rw-r--r--tests/data/acpi/virt/FACPbin268 -> 268 bytes
-rw-r--r--tests/data/acpi/virt/FACP.memhpbin268 -> 268 bytes
-rw-r--r--tests/data/acpi/virt/FACP.numamembin268 -> 268 bytes
-rw-r--r--tests/data/acpi/virt/GTDTbin96 -> 96 bytes
-rw-r--r--tests/data/acpi/virt/GTDT.memhpbin96 -> 96 bytes
-rw-r--r--tests/data/acpi/virt/GTDT.numamembin96 -> 96 bytes
-rw-r--r--tests/data/acpi/virt/MCFGbin60 -> 60 bytes
-rw-r--r--tests/data/acpi/virt/MCFG.memhpbin60 -> 60 bytes
-rw-r--r--tests/data/acpi/virt/MCFG.numamembin60 -> 60 bytes
-rw-r--r--tests/data/acpi/virt/NFIT.memhpbin224 -> 224 bytes
-rw-r--r--tests/data/acpi/virt/SLIT.memhpbin48 -> 48 bytes
-rw-r--r--tests/data/acpi/virt/SPCRbin80 -> 80 bytes
-rw-r--r--tests/data/acpi/virt/SPCR.memhpbin80 -> 80 bytes
-rw-r--r--tests/data/acpi/virt/SPCR.numamembin80 -> 80 bytes
-rw-r--r--tests/data/acpi/virt/SRAT.memhpbin226 -> 226 bytes
-rw-r--r--tests/data/acpi/virt/SRAT.numamembin106 -> 106 bytes
-rw-r--r--tests/data/acpi/virt/SSDT.memhpbin736 -> 736 bytes
-rw-r--r--tests/qtest/bios-tables-test.c170
132 files changed, 585 insertions, 236 deletions
diff --git a/docs/system/deprecated.rst b/docs/system/deprecated.rst
index 6ac757ed9f..2fcac7861e 100644
--- a/docs/system/deprecated.rst
+++ b/docs/system/deprecated.rst
@@ -322,12 +322,6 @@ The 'scsi-disk' device is deprecated. Users should use 'scsi-hd' or
System emulator machines
------------------------
-``pc-1.0``, ``pc-1.1``, ``pc-1.2`` and ``pc-1.3`` (since 5.0)
-'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
-
-These machine types are very old and likely can not be used for live migration
-from old QEMU versions anymore. A newer machine type should be used instead.
-
Raspberry Pi ``raspi2`` and ``raspi3`` machines (since 5.2)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
diff --git a/docs/system/removed-features.rst b/docs/system/removed-features.rst
index 88b81a6156..c8481cafbd 100644
--- a/docs/system/removed-features.rst
+++ b/docs/system/removed-features.rst
@@ -136,6 +136,12 @@ mips ``fulong2e`` machine alias (removed in 6.0)
This machine has been renamed ``fuloong2e``.
+``pc-1.0``, ``pc-1.1``, ``pc-1.2`` and ``pc-1.3`` (removed in 6.0)
+''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
+
+These machine types were very old and likely could not be used for live
+migration from old QEMU versions anymore. Use a newer machine type instead.
+
Related binaries
----------------
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index 7b6ebb0cc8..a2cd7a5830 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -30,6 +30,7 @@
#include "hw/pci/pci_host.h"
#include "hw/pci/pci_bus.h"
#include "hw/pci/pci_bridge.h"
+#include "qemu/cutils.h"
static GArray *build_alloc_array(void)
{
@@ -1674,21 +1675,12 @@ build_header(BIOSLinker *linker, GArray *table_data,
h->length = cpu_to_le32(len);
h->revision = rev;
- if (oem_id) {
- strncpy((char *)h->oem_id, oem_id, sizeof h->oem_id);
- } else {
- memcpy(h->oem_id, ACPI_BUILD_APPNAME6, 6);
- }
-
- if (oem_table_id) {
- strncpy((char *)h->oem_table_id, oem_table_id, sizeof(h->oem_table_id));
- } else {
- memcpy(h->oem_table_id, ACPI_BUILD_APPNAME4, 4);
- memcpy(h->oem_table_id + 4, sig, 4);
- }
+ strpadcpy((char *)h->oem_id, sizeof h->oem_id, oem_id, ' ');
+ strpadcpy((char *)h->oem_table_id, sizeof h->oem_table_id,
+ oem_table_id, ' ');
h->oem_revision = cpu_to_le32(1);
- memcpy(h->asl_compiler_id, ACPI_BUILD_APPNAME4, 4);
+ memcpy(h->asl_compiler_id, ACPI_BUILD_APPNAME8, 4);
h->asl_compiler_revision = cpu_to_le32(1);
/* Checksum to be filled in by Guest linker */
bios_linker_loader_add_checksum(linker, ACPI_BUILD_TABLE_FILE,
@@ -1871,7 +1863,8 @@ void build_srat_memory(AcpiSratMemoryAffinity *numamem, uint64_t base,
* ACPI spec 5.2.17 System Locality Distance Information Table
* (Revision 2.0 or later)
*/
-void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms)
+void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms,
+ const char *oem_id, const char *oem_table_id)
{
int slit_start, i, j;
slit_start = table_data->len;
@@ -1892,7 +1885,7 @@ void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms)
build_header(linker, table_data,
(void *)(table_data->data + slit_start),
"SLIT",
- table_data->len - slit_start, 1, NULL, NULL);
+ table_data->len - slit_start, 1, oem_id, oem_table_id);
}
/* build rev1/rev3/rev5.1 FADT */
@@ -2024,7 +2017,8 @@ build_hdr:
* table 7: TCG Hardware Interface Description Table Format for TPM 2.0
* of TCG ACPI Specification, Family “1.2” and “2.0”, Version 1.2, Rev 8
*/
-void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog)
+void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
+ const char *oem_id, const char *oem_table_id)
{
uint8_t start_method_params[12] = {};
unsigned log_addr_offset, tpm2_start;
@@ -2073,7 +2067,8 @@ void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog)
log_addr_offset, 8,
ACPI_BUILD_TPMLOG_FILE, 0);
build_header(linker, table_data,
- tpm2_ptr, "TPM2", table_data->len - tpm2_start, 4, NULL, NULL);
+ tpm2_ptr, "TPM2", table_data->len - tpm2_start, 4, oem_id,
+ oem_table_id);
}
Aml *build_crs(PCIHostState *host, CrsRangeSet *range_set, uint32_t io_offset,
diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c
index f0ee9f51ca..a4dac6bf15 100644
--- a/hw/acpi/ghes.c
+++ b/hw/acpi/ghes.c
@@ -359,7 +359,8 @@ static void build_ghes_v2(GArray *table_data, int source_id, BIOSLinker *linker)
}
/* Build Hardware Error Source Table */
-void acpi_build_hest(GArray *table_data, BIOSLinker *linker)
+void acpi_build_hest(GArray *table_data, BIOSLinker *linker,
+ const char *oem_id, const char *oem_table_id)
{
uint64_t hest_start = table_data->len;
@@ -372,7 +373,7 @@ void acpi_build_hest(GArray *table_data, BIOSLinker *linker)
build_ghes_v2(table_data, ACPI_HEST_SRC_ID_SEA, linker);
build_header(linker, table_data, (void *)(table_data->data + hest_start),
- "HEST", table_data->len - hest_start, 1, NULL, NULL);
+ "HEST", table_data->len - hest_start, 1, oem_id, oem_table_id);
}
void acpi_ghes_add_fw_cfg(AcpiGhesState *ags, FWCfgState *s,
diff --git a/hw/acpi/hmat.c b/hw/acpi/hmat.c
index 37806f7a06..edb3fd91b2 100644
--- a/hw/acpi/hmat.c
+++ b/hw/acpi/hmat.c
@@ -253,7 +253,8 @@ static void hmat_build_table_structs(GArray *table_data, NumaState *numa_state)
}
}
-void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state)
+void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state,
+ const char *oem_id, const char *oem_table_id)
{
int hmat_start = table_data->len;
@@ -264,5 +265,5 @@ void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state)
build_header(linker, table_data,
(void *)(table_data->data + hmat_start),
- "HMAT", table_data->len - hmat_start, 2, NULL, NULL);
+ "HMAT", table_data->len - hmat_start, 2, oem_id, oem_table_id);
}
diff --git a/hw/acpi/hmat.h b/hw/acpi/hmat.h
index e9031cac01..b57f0e7e80 100644
--- a/hw/acpi/hmat.h
+++ b/hw/acpi/hmat.h
@@ -37,6 +37,7 @@
*/
#define HMAT_PROXIMITY_INITIATOR_VALID 0x1
-void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state);
+void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state,
+ const char *oem_id, const char *oem_table_id);
#endif
diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
index aa95b0cbaf..e3d5fe1939 100644
--- a/hw/acpi/nvdimm.c
+++ b/hw/acpi/nvdimm.c
@@ -402,7 +402,8 @@ void nvdimm_plug(NVDIMMState *state)
}
static void nvdimm_build_nfit(NVDIMMState *state, GArray *table_offsets,
- GArray *table_data, BIOSLinker *linker)
+ GArray *table_data, BIOSLinker *linker,
+ const char *oem_id, const char *oem_table_id)
{
NvdimmFitBuffer *fit_buf = &state->fit_buf;
unsigned int header;
@@ -417,7 +418,8 @@ static void nvdimm_build_nfit(NVDIMMState *state, GArray *table_offsets,
build_header(linker, table_data,
(void *)(table_data->data + header), "NFIT",
- sizeof(NvdimmNfitHeader) + fit_buf->fit->len, 1, NULL, NULL);
+ sizeof(NvdimmNfitHeader) + fit_buf->fit->len, 1, oem_id,
+ oem_table_id);
}
#define NVDIMM_DSM_MEMORY_SIZE 4096
@@ -1278,7 +1280,7 @@ static void nvdimm_build_nvdimm_devices(Aml *root_dev, uint32_t ram_slots)
static void nvdimm_build_ssdt(GArray *table_offsets, GArray *table_data,
BIOSLinker *linker,
NVDIMMState *nvdimm_state,
- uint32_t ram_slots)
+ uint32_t ram_slots, const char *oem_id)
{
Aml *ssdt, *sb_scope, *dev;
int mem_addr_offset, nvdimm_ssdt;
@@ -1331,7 +1333,7 @@ static void nvdimm_build_ssdt(GArray *table_offsets, GArray *table_data,
NVDIMM_DSM_MEM_FILE, 0);
build_header(linker, table_data,
(void *)(table_data->data + nvdimm_ssdt),
- "SSDT", table_data->len - nvdimm_ssdt, 1, NULL, "NVDIMM");
+ "SSDT", table_data->len - nvdimm_ssdt, 1, oem_id, "NVDIMM");
free_aml_allocator();
}
@@ -1359,7 +1361,8 @@ void nvdimm_build_srat(GArray *table_data)
void nvdimm_build_acpi(GArray *table_offsets, GArray *table_data,
BIOSLinker *linker, NVDIMMState *state,
- uint32_t ram_slots)
+ uint32_t ram_slots, const char *oem_id,
+ const char *oem_table_id)
{
GSList *device_list;
@@ -1369,7 +1372,7 @@ void nvdimm_build_acpi(GArray *table_offsets, GArray *table_data,
}
nvdimm_build_ssdt(table_offsets, table_data, linker, state,
- ram_slots);
+ ram_slots, oem_id);
device_list = nvdimm_get_device_list();
/* no NVDIMM device is plugged. */
@@ -1377,6 +1380,7 @@ void nvdimm_build_acpi(GArray *table_offsets, GArray *table_data,
return;
}
- nvdimm_build_nfit(state, table_offsets, table_data, linker);
+ nvdimm_build_nfit(state, table_offsets, table_data, linker,
+ oem_id, oem_table_id);
g_slist_free(device_list);
}
diff --git a/hw/acpi/pci.c b/hw/acpi/pci.c
index 9510597a19..ec455c3b25 100644
--- a/hw/acpi/pci.c
+++ b/hw/acpi/pci.c
@@ -28,7 +28,8 @@
#include "hw/acpi/pci.h"
#include "hw/pci/pcie_host.h"
-void build_mcfg(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info)
+void build_mcfg(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info,
+ const char *oem_id, const char *oem_table_id)
{
int mcfg_start = table_data->len;
@@ -56,6 +57,6 @@ void build_mcfg(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info)
build_append_int_noprefix(table_data, 0, 4);
build_header(linker, table_data, (void *)(table_data->data + mcfg_start),
- "MCFG", table_data->len - mcfg_start, 1, NULL, NULL);
+ "MCFG", table_data->len - mcfg_start, 1, oem_id, oem_table_id);
}
diff --git a/hw/acpi/vmgenid.c b/hw/acpi/vmgenid.c
index 6c92fdae49..4f41a13ea0 100644
--- a/hw/acpi/vmgenid.c
+++ b/hw/acpi/vmgenid.c
@@ -24,7 +24,7 @@
#include "sysemu/reset.h"
void vmgenid_build_acpi(VmGenIdState *vms, GArray *table_data, GArray *guid,
- BIOSLinker *linker)
+ BIOSLinker *linker, const char *oem_id)
{
Aml *ssdt, *dev, *scope, *method, *addr, *if_ctx;
uint32_t vgia_offset;
@@ -118,7 +118,7 @@ void vmgenid_build_acpi(VmGenIdState *vms, GArray *table_data, GArray *guid,
build_header(linker, table_data,
(void *)(table_data->data + table_data->len - ssdt->buf->len),
- "SSDT", ssdt->buf->len, 1, NULL, "VMGENID");
+ "SSDT", ssdt->buf->len, 1, oem_id, "VMGENID");
free_aml_allocator();
}
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
index 98b99d4fe8..bd1f97000d 100644
--- a/hw/arm/smmuv3.c
+++ b/hw/arm/smmuv3.c
@@ -1497,6 +1497,11 @@ static int smmuv3_notify_flag_changed(IOMMUMemoryRegion *iommu,
SMMUv3State *s3 = sdev->smmu;
SMMUState *s = &(s3->smmu_state);
+ if (new & IOMMU_NOTIFIER_DEVIOTLB_UNMAP) {
+ error_setg(errp, "SMMUv3 does not support dev-iotlb yet");
+ return -EINVAL;
+ }
+
if (new & IOMMU_NOTIFIER_MAP) {
error_setg(errp,
"device %02x.%02x.%x requires iommu MAP notifier which is "
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index 9d9ee24053..f9c9df916c 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -341,7 +341,8 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
iort->length = cpu_to_le32(iort_length);
build_header(linker, table_data, (void *)(table_data->data + iort_start),
- "IORT", table_data->len - iort_start, 0, NULL, NULL);
+ "IORT", table_data->len - iort_start, 0, vms->oem_id,
+ vms->oem_table_id);
}
static void
@@ -375,7 +376,8 @@ build_spcr(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
spcr->pci_vendor_id = 0xffff; /* PCI Vendor ID: not a PCI device */
build_header(linker, table_data, (void *)(table_data->data + spcr_start),
- "SPCR", table_data->len - spcr_start, 2, NULL, NULL);
+ "SPCR", table_data->len - spcr_start, 2, vms->oem_id,
+ vms->oem_table_id);
}
static void
@@ -427,7 +429,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
}
build_header(linker, table_data, (void *)(table_data->data + srat_start),
- "SRAT", table_data->len - srat_start, 3, NULL, NULL);
+ "SRAT", table_data->len - srat_start, 3, vms->oem_id,
+ vms->oem_table_id);
}
/* GTDT */
@@ -462,7 +465,8 @@ build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
build_header(linker, table_data,
(void *)(table_data->data + gtdt_start), "GTDT",
- table_data->len - gtdt_start, 2, NULL, NULL);
+ table_data->len - gtdt_start, 2, vms->oem_id,
+ vms->oem_table_id);
}
/* MADT */
@@ -551,7 +555,8 @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
build_header(linker, table_data,
(void *)(table_data->data + madt_start), "APIC",
- table_data->len - madt_start, 3, NULL, NULL);
+ table_data->len - madt_start, 3, vms->oem_id,
+ vms->oem_table_id);
}
/* FADT */
@@ -581,7 +586,7 @@ static void build_fadt_rev5(GArray *table_data, BIOSLinker *linker,
g_assert_not_reached();
}
- build_fadt(table_data, linker, &fadt, NULL, NULL);
+ build_fadt(table_data, linker, &fadt, vms->oem_id, vms->oem_table_id);
}
/* DSDT */
@@ -645,7 +650,8 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
build_header(linker, table_data,
(void *)(table_data->data + table_data->len - dsdt->buf->len),
- "DSDT", dsdt->buf->len, 2, NULL, NULL);
+ "DSDT", dsdt->buf->len, 2, vms->oem_id,
+ vms->oem_table_id);
free_aml_allocator();
}
@@ -704,7 +710,8 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
.base = vms->memmap[VIRT_ECAM_ID(vms->highmem_ecam)].base,
.size = vms->memmap[VIRT_ECAM_ID(vms->highmem_ecam)].size,
};
- build_mcfg(tables_blob, tables->linker, &mcfg);
+ build_mcfg(tables_blob, tables->linker, &mcfg, vms->oem_id,
+ vms->oem_table_id);
}
acpi_add_table(table_offsets, tables_blob);
@@ -713,7 +720,8 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
if (vms->ras) {
build_ghes_error_table(tables->hardware_errors, tables->linker);
acpi_add_table(table_offsets, tables_blob);
- acpi_build_hest(tables_blob, tables->linker);
+ acpi_build_hest(tables_blob, tables->linker, vms->oem_id,
+ vms->oem_table_id);
}
if (ms->numa_state->num_nodes > 0) {
@@ -721,13 +729,15 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
build_srat(tables_blob, tables->linker, vms);
if (ms->numa_state->have_numa_distance) {
acpi_add_table(table_offsets, tables_blob);
- build_slit(tables_blob, tables->linker, ms);
+ build_slit(tables_blob, tables->linker, ms, vms->oem_id,
+ vms->oem_table_id);
}
}
if (ms->nvdimms_state->is_enabled) {
nvdimm_build_acpi(table_offsets, tables_blob, tables->linker,
- ms->nvdimms_state, ms->ram_slots);
+ ms->nvdimms_state, ms->ram_slots, vms->oem_id,
+ vms->oem_table_id);
}
if (its_class_name() && !vmc->no_its) {
@@ -737,18 +747,20 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
if (tpm_get_version(tpm_find()) == TPM_VERSION_2_0) {
acpi_add_table(table_offsets, tables_blob);
- build_tpm2(tables_blob, tables->linker, tables->tcpalog);
+ build_tpm2(tables_blob, tables->linker, tables->tcpalog, vms->oem_id,
+ vms->oem_table_id);
}
/* XSDT is pointed to by RSDP */
xsdt = tables_blob->len;
- build_xsdt(tables_blob, tables->linker, table_offsets, NULL, NULL);
+ build_xsdt(tables_blob, tables->linker, table_offsets, vms->oem_id,
+ vms->oem_table_id);
/* RSDP is in FSEG memory, so allocate it separately */
{
AcpiRsdpData rsdp_data = {
.revision = 2,
- .oem_id = ACPI_BUILD_APPNAME6,
+ .oem_id = vms->oem_id,
.xsdt_tbl_offset = &xsdt,
.rsdt_tbl_offset = NULL,
};
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 399da73454..371147f3ae 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2155,6 +2155,49 @@ static void virt_set_its(Object *obj, bool value, Error **errp)
vms->its = value;
}
+static char *virt_get_oem_id(Object *obj, Error **errp)
+{
+ VirtMachineState *vms = VIRT_MACHINE(obj);
+
+ return g_strdup(vms->oem_id);
+}
+
+static void virt_set_oem_id(Object *obj, const char *value, Error **errp)
+{
+ VirtMachineState *vms = VIRT_MACHINE(obj);
+ size_t len = strlen(value);
+
+ if (len > 6) {
+ error_setg(errp,
+ "User specified oem-id value is bigger than 6 bytes in size");
+ return;
+ }
+
+ strncpy(vms->oem_id, value, 6);
+}
+
+static char *virt_get_oem_table_id(Object *obj, Error **errp)
+{
+ VirtMachineState *vms = VIRT_MACHINE(obj);
+
+ return g_strdup(vms->oem_table_id);
+}
+
+static void virt_set_oem_table_id(Object *obj, const char *value,
+ Error **errp)
+{
+ VirtMachineState *vms = VIRT_MACHINE(obj);
+ size_t len = strlen(value);
+
+ if (len > 8) {
+ error_setg(errp,
+ "User specified oem-table-id value is bigger than 8 bytes in size");
+ return;
+ }
+ strncpy(vms->oem_table_id, value, 8);
+}
+
+
bool virt_is_acpi_enabled(VirtMachineState *vms)
{
if (vms->acpi == ON_OFF_AUTO_OFF) {
@@ -2604,6 +2647,23 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
"Set on/off to enable/disable "
"ITS instantiation");
+ object_class_property_add_str(oc, "oem-id",
+ virt_get_oem_id,
+ virt_set_oem_id);
+ object_class_property_set_description(oc, "oem-id",
+ "Override the default value of field OEMID "
+ "in ACPI table header."
+ "The string may be up to 6 bytes in size");
+
+
+ object_class_property_add_str(oc, "oem-table-id",
+ virt_get_oem_table_id,
+ virt_set_oem_table_id);
+ object_class_property_set_description(oc, "oem-table-id",
+ "Override the default value of field OEM Table ID "
+ "in ACPI table header."
+ "The string may be up to 8 bytes in size");
+
}
static void virt_instance_init(Object *obj)
@@ -2645,6 +2705,9 @@ static void virt_instance_init(Object *obj)
vms->irqmap = a15irqmap;
virt_flash_create(vms);
+
+ vms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
+ vms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
}
static const TypeInfo virt_machine_info = {
diff --git a/hw/core/machine.c b/hw/core/machine.c
index de3b8f1b31..5d6163ab70 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -70,12 +70,12 @@ GlobalProperty hw_compat_4_2[] = {
{ "qxl", "revision", "4" },
{ "qxl-vga", "revision", "4" },
{ "fw_cfg", "acpi-mr-restore", "false" },
+ { "virtio-device", "use-disabled-flag", "false" },
};
const size_t hw_compat_4_2_len = G_N_ELEMENTS(hw_compat_4_2);
GlobalProperty hw_compat_4_1[] = {
{ "virtio-pci", "x-pcie-flr-init", "off" },
- { "virtio-device", "use-disabled-flag", "false" },
};
const size_t hw_compat_4_1_len = G_N_ELEMENTS(hw_compat_4_1);
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index f56d699c7f..b9190b924a 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1637,12 +1637,13 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
build_header(linker, table_data,
(void *)(table_data->data + table_data->len - dsdt->buf->len),
- "DSDT", dsdt->buf->len, 1, NULL, NULL);
+ "DSDT", dsdt->buf->len, 1, pcms->oem_id, pcms->oem_table_id);
free_aml_allocator();
}
static void
-build_hpet(GArray *table_data, BIOSLinker *linker)
+build_hpet(GArray *table_data, BIOSLinker *linker, const char *oem_id,
+ const char *oem_table_id)
{
Acpi20Hpet *hpet;
@@ -1653,11 +1654,12 @@ build_hpet(GArray *table_data, BIOSLinker *linker)
hpet->timer_block_id = cpu_to_le32(0x8086a201);
hpet->addr.address = cpu_to_le64(HPET_BASE);
build_header(linker, table_data,
- (void *)hpet, "HPET", sizeof(*hpet), 1, NULL, NULL);
+ (void *)hpet, "HPET", sizeof(*hpet), 1, oem_id, oem_table_id);
}
static void
-build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog)
+build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
+ const char *oem_id, const char *oem_table_id)
{
Acpi20Tcpa *tcpa = acpi_data_push(table_data, sizeof *tcpa);
unsigned log_addr_size = sizeof(tcpa->log_area_start_address);
@@ -1677,7 +1679,7 @@ build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog)
ACPI_BUILD_TPMLOG_FILE, 0);
build_header(linker, table_data,
- (void *)tcpa, "TCPA", sizeof(*tcpa), 2, NULL, NULL);
+ (void *)tcpa, "TCPA", sizeof(*tcpa), 2, oem_id, oem_table_id);
}
#define HOLE_640K_START (640 * KiB)
@@ -1812,7 +1814,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
build_header(linker, table_data,
(void *)(table_data->data + srat_start),
"SRAT",
- table_data->len - srat_start, 1, NULL, NULL);
+ table_data->len - srat_start, 1, pcms->oem_id,
+ pcms->oem_table_id);
}
/*
@@ -1820,7 +1823,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
* (version Oct. 2014 or later)
*/
static void
-build_dmar_q35(GArray *table_data, BIOSLinker *linker)
+build_dmar_q35(GArray *table_data, BIOSLinker *linker, const char *oem_id,
+ const char *oem_table_id)
{
int dmar_start = table_data->len;
@@ -1870,7 +1874,7 @@ build_dmar_q35(GArray *table_data, BIOSLinker *linker)
}
build_header(linker, table_data, (void *)(table_data->data + dmar_start),
- "DMAR", table_data->len - dmar_start, 1, NULL, NULL);
+ "DMAR", table_data->len - dmar_start, 1, oem_id, oem_table_id);
}
/*
@@ -1881,7 +1885,8 @@ build_dmar_q35(GArray *table_data, BIOSLinker *linker)
* Helpful to speedup Windows guests and ignored by others.
*/
static void
-build_waet(GArray *table_data, BIOSLinker *linker)
+build_waet(GArray *table_data, BIOSLinker *linker, const char *oem_id,
+ const char *oem_table_id)
{
int waet_start = table_data->len;
@@ -1897,7 +1902,7 @@ build_waet(GArray *table_data, BIOSLinker *linker)
build_append_int_noprefix(table_data, 1 << 1 /* ACPI PM timer good */, 4);
build_header(linker, table_data, (void *)(table_data->data + waet_start),
- "WAET", table_data->len - waet_start, 1, NULL, NULL);
+ "WAET", table_data->len - waet_start, 1, oem_id, oem_table_id);
}
/*
@@ -1999,7 +2004,8 @@ ivrs_host_bridges(Object *obj, void *opaque)
}
static void
-build_amd_iommu(GArray *table_data, BIOSLinker *linker)
+build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id,
+ const char *oem_table_id)
{
int ivhd_table_len = 24;
int iommu_start = table_data->len;
@@ -2094,7 +2100,8 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker)
}
build_header(linker, table_data, (void *)(table_data->data + iommu_start),
- "IVRS", table_data->len - iommu_start, 1, NULL, NULL);
+ "IVRS", table_data->len - iommu_start, 1, oem_id,
+ oem_table_id);
}
typedef
@@ -2150,12 +2157,26 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
GArray *tables_blob = tables->table_data;
AcpiSlicOem slic_oem = { .id = NULL, .table_id = NULL };
Object *vmgenid_dev;
+ char *oem_id;
+ char *oem_table_id;
acpi_get_pm_info(machine, &pm);
acpi_get_misc_info(&misc);
acpi_get_pci_holes(&pci_hole, &pci_hole64);
acpi_get_slic_oem(&slic_oem);
+ if (slic_oem.id) {
+ oem_id = slic_oem.id;
+ } else {
+ oem_id = pcms->oem_id;
+ }
+
+ if (slic_oem.table_id) {
+ oem_table_id = slic_oem.table_id;
+ } else {
+ oem_table_id = pcms->oem_table_id;
+ }
+
table_offsets = g_array_new(false, true /* clear */,
sizeof(uint32_t));
ACPI_BUILD_DPRINTF("init ACPI tables\n");
@@ -2189,32 +2210,35 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
pm.fadt.facs_tbl_offset = &facs;
pm.fadt.dsdt_tbl_offset = &dsdt;
pm.fadt.xdsdt_tbl_offset = &dsdt;
- build_fadt(tables_blob, tables->linker, &pm.fadt,
- slic_oem.id, slic_oem.table_id);
+ build_fadt(tables_blob, tables->linker, &pm.fadt, oem_id, oem_table_id);
aml_len += tables_blob->len - fadt;
acpi_add_table(table_offsets, tables_blob);
acpi_build_madt(tables_blob, tables->linker, x86ms,
- ACPI_DEVICE_IF(x86ms->acpi_dev));
+ ACPI_DEVICE_IF(x86ms->acpi_dev), pcms->oem_id,
+ pcms->oem_table_id);
vmgenid_dev = find_vmgenid_dev();
if (vmgenid_dev) {
acpi_add_table(table_offsets, tables_blob);
vmgenid_build_acpi(VMGENID(vmgenid_dev), tables_blob,
- tables->vmgenid, tables->linker);
+ tables->vmgenid, tables->linker, pcms->oem_id);
}
if (misc.has_hpet) {
acpi_add_table(table_offsets, tables_blob);
- build_hpet(tables_blob, tables->linker);
+ build_hpet(tables_blob, tables->linker, pcms->oem_id,
+ pcms->oem_table_id);
}
if (misc.tpm_version != TPM_VERSION_UNSPEC) {
if (misc.tpm_version == TPM_VERSION_1_2) {
acpi_add_table(table_offsets, tables_blob);
- build_tpm_tcpa(tables_blob, tables->linker, tables->tcpalog);
+ build_tpm_tcpa(tables_blob, tables->linker, tables->tcpalog,
+ pcms->oem_id, pcms->oem_table_id);
} else { /* TPM_VERSION_2_0 */
acpi_add_table(table_offsets, tables_blob);
- build_tpm2(tables_blob, tables->linker, tables->tcpalog);
+ build_tpm2(tables_blob, tables->linker, tables->tcpalog,
+ pcms->oem_id, pcms->oem_table_id);
}
}
if (pcms->numa_nodes) {
@@ -2222,34 +2246,40 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
build_srat(tables_blob, tables->linker, machine);
if (machine->numa_state->have_numa_distance) {
acpi_add_table(table_offsets, tables_blob);
- build_slit(tables_blob, tables->linker, machine);
+ build_slit(tables_blob, tables->linker, machine, pcms->oem_id,
+ pcms->oem_table_id);
}
if (machine->numa_state->hmat_enabled) {
acpi_add_table(table_offsets, tables_blob);
- build_hmat(tables_blob, tables->linker, machine->numa_state);
+ build_hmat(tables_blob, tables->linker, machine->numa_state,
+ pcms->oem_id, pcms->oem_table_id);
}
}
if (acpi_get_mcfg(&mcfg)) {
acpi_add_table(table_offsets, tables_blob);
- build_mcfg(tables_blob, tables->linker, &mcfg);
+ build_mcfg(tables_blob, tables->linker, &mcfg, pcms->oem_id,
+ pcms->oem_table_id);
}
if (x86_iommu_get_default()) {
IommuType IOMMUType = x86_iommu_get_type();
if (IOMMUType == TYPE_AMD) {
acpi_add_table(table_offsets, tables_blob);
- build_amd_iommu(tables_blob, tables->linker);
+ build_amd_iommu(tables_blob, tables->linker, pcms->oem_id,
+ pcms->oem_table_id);
} else if (IOMMUType == TYPE_INTEL) {
acpi_add_table(table_offsets, tables_blob);
- build_dmar_q35(tables_blob, tables->linker);
+ build_dmar_q35(tables_blob, tables->linker, pcms->oem_id,
+ pcms->oem_table_id);
}
}
if (machine->nvdimms_state->is_enabled) {
nvdimm_build_acpi(table_offsets, tables_blob, tables->linker,
- machine->nvdimms_state, machine->ram_slots);
+ machine->nvdimms_state, machine->ram_slots,
+ pcms->oem_id, pcms->oem_table_id);
}
acpi_add_table(table_offsets, tables_blob);
- build_waet(tables_blob, tables->linker);
+ build_waet(tables_blob, tables->linker, pcms->oem_id, pcms->oem_table_id);
/* Add tables supplied by user (if any) */
for (u = acpi_table_first(); u; u = acpi_table_next(u)) {
@@ -2262,13 +2292,13 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
/* RSDT is pointed to by RSDP */
rsdt = tables_blob->len;
build_rsdt(tables_blob, tables->linker, table_offsets,
- slic_oem.id, slic_oem.table_id);
+ oem_id, oem_table_id);
/* RSDP is in FSEG memory, so allocate it separately */
{
AcpiRsdpData rsdp_data = {
.revision = 0,
- .oem_id = ACPI_BUILD_APPNAME6,
+ .oem_id = pcms->oem_id,
.xsdt_tbl_offset = NULL,
.rsdt_tbl_offset = &rsdt,
};
diff --git a/hw/i386/acpi-common.c b/hw/i386/acpi-common.c
index a6a30e8363..1f5947fcf9 100644
--- a/hw/i386/acpi-common.c
+++ b/hw/i386/acpi-common.c
@@ -72,7 +72,8 @@ void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
}
void acpi_build_madt(GArray *table_data, BIOSLinker *linker,
- X86MachineState *x86ms, AcpiDeviceIf *adev)
+ X86MachineState *x86ms, AcpiDeviceIf *adev,
+ const char *oem_id, const char *oem_table_id)
{
MachineClass *mc = MACHINE_GET_CLASS(x86ms);
const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(MACHINE(x86ms));
@@ -157,6 +158,6 @@ void acpi_build_madt(GArray *table_data, BIOSLinker *linker,
build_header(linker, table_data,
(void *)(table_data->data + madt_start), "APIC",
- table_data->len - madt_start, 1, NULL, NULL);
+ table_data->len - madt_start, 1, oem_id, oem_table_id);
}
diff --git a/hw/i386/acpi-common.h b/hw/i386/acpi-common.h
index c30e461f18..b12cd73ea5 100644
--- a/hw/i386/acpi-common.h
+++ b/hw/i386/acpi-common.h
@@ -9,6 +9,7 @@
#define ACPI_BUILD_IOAPIC_ID 0x0
void acpi_build_madt(GArray *table_data, BIOSLinker *linker,
- X86MachineState *x86ms, AcpiDeviceIf *adev);
+ X86MachineState *x86ms, AcpiDeviceIf *adev,
+ const char *oem_id, const char *oem_table_id);
#endif
diff --git a/hw/i386/acpi-microvm.c b/hw/i386/acpi-microvm.c
index d34a301b84..54b3af478a 100644
--- a/hw/i386/acpi-microvm.c
+++ b/hw/i386/acpi-microvm.c
@@ -149,7 +149,7 @@ build_dsdt_microvm(GArray *table_data, BIOSLinker *linker,
g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
build_header(linker, table_data,
(void *)(table_data->data + table_data->len - dsdt->buf->len),
- "DSDT", dsdt->buf->len, 2, NULL, NULL);
+ "DSDT", dsdt->buf->len, 2, mms->oem_id, mms->oem_table_id);
free_aml_allocator();
}
@@ -201,21 +201,24 @@ static void acpi_build_microvm(AcpiBuildTables *tables,
pmfadt.dsdt_tbl_offset = &dsdt;
pmfadt.xdsdt_tbl_offset = &dsdt;
acpi_add_table(table_offsets, tables_blob);
- build_fadt(tables_blob, tables->linker, &pmfadt, NULL, NULL);
+ build_fadt(tables_blob, tables->linker, &pmfadt, mms->oem_id,
+ mms->oem_table_id);
acpi_add_table(table_offsets, tables_blob);
acpi_build_madt(tables_blob, tables->linker, X86_MACHINE(machine),
- ACPI_DEVICE_IF(x86ms->acpi_dev));
+ ACPI_DEVICE_IF(x86ms->acpi_dev), mms->oem_id,
+ mms->oem_table_id);
xsdt = tables_blob->len;
- build_xsdt(tables_blob, tables->linker, table_offsets, NULL, NULL);
+ build_xsdt(tables_blob, tables->linker, table_offsets, mms->oem_id,
+ mms->oem_table_id);
/* RSDP is in FSEG memory, so allocate it separately */
{
AcpiRsdpData rsdp_data = {
/* ACPI 2.0: 5.2.4.3 RSDP Structure */
.revision = 2, /* xsdt needs v2 */
- .oem_id = ACPI_BUILD_APPNAME6,
+ .oem_id = mms->oem_id,
.xsdt_tbl_offset = &xsdt,
.rsdt_tbl_offset = NULL,
};
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index edf2b0f061..4e0cf4c522 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -648,6 +648,51 @@ static void microvm_powerdown_req(Notifier *notifier, void *data)
}
}
+static char *microvm_machine_get_oem_id(Object *obj, Error **errp)
+{
+ MicrovmMachineState *mms = MICROVM_MACHINE(obj);
+
+ return g_strdup(mms->oem_id);
+}
+
+static void microvm_machine_set_oem_id(Object *obj, const char *value,
+ Error **errp)
+{
+ MicrovmMachineState *mms = MICROVM_MACHINE(obj);
+ size_t len = strlen(value);
+
+ if (len > 6) {
+ error_setg(errp,
+ "User specified "MICROVM_MACHINE_OEM_ID" value is bigger than "
+ "6 bytes in size");
+ return;
+ }
+
+ strncpy(mms->oem_id, value, 6);
+}
+
+static char *microvm_machine_get_oem_table_id(Object *obj, Error **errp)
+{
+ MicrovmMachineState *mms = MICROVM_MACHINE(obj);
+
+ return g_strdup(mms->oem_table_id);
+}
+
+static void microvm_machine_set_oem_table_id(Object *obj, const char *value,
+ Error **errp)
+{
+ MicrovmMachineState *mms = MICROVM_MACHINE(obj);
+ size_t len = strlen(value);
+
+ if (len > 8) {
+ error_setg(errp,
+ "User specified "MICROVM_MACHINE_OEM_TABLE_ID" value is bigger than "
+ "8 bytes in size");
+ return;
+ }
+ strncpy(mms->oem_table_id, value, 8);
+}
+
static void microvm_machine_initfn(Object *obj)
{
MicrovmMachineState *mms = MICROVM_MACHINE(obj);
@@ -669,6 +714,9 @@ static void microvm_machine_initfn(Object *obj)
qemu_add_machine_init_done_notifier(&mms->machine_done);
mms->powerdown_req.notify = microvm_powerdown_req;
qemu_register_powerdown_notifier(&mms->powerdown_req);
+
+ mms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
+ mms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
}
static void microvm_class_init(ObjectClass *oc, void *data)
@@ -757,6 +805,24 @@ static void microvm_class_init(ObjectClass *oc, void *data)
MICROVM_MACHINE_AUTO_KERNEL_CMDLINE,
"Set off to disable adding virtio-mmio devices to the kernel cmdline");
+ object_class_property_add_str(oc, MICROVM_MACHINE_OEM_ID,
+ microvm_machine_get_oem_id,
+ microvm_machine_set_oem_id);
+ object_class_property_set_description(oc, MICROVM_MACHINE_OEM_ID,
+ "Override the default value of field OEMID "
+ "in ACPI table header."
+ "The string may be up to 6 bytes in size");
+
+
+ object_class_property_add_str(oc, MICROVM_MACHINE_OEM_TABLE_ID,
+ microvm_machine_get_oem_table_id,
+ microvm_machine_set_oem_table_id);
+ object_class_property_set_description(oc, MICROVM_MACHINE_OEM_TABLE_ID,
+ "Override the default value of field OEM Table ID "
+ "in ACPI table header."
+ "The string may be up to 8 bytes in size");
+
+
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
}
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 5458f61d10..8aa85dec54 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1611,6 +1611,50 @@ static void pc_machine_set_max_fw_size(Object *obj, Visitor *v,
pcms->max_fw_size = value;
}
+static char *pc_machine_get_oem_id(Object *obj, Error **errp)
+{
+ PCMachineState *pcms = PC_MACHINE(obj);
+
+ return g_strdup(pcms->oem_id);
+}
+
+static void pc_machine_set_oem_id(Object *obj, const char *value, Error **errp)
+{
+ PCMachineState *pcms = PC_MACHINE(obj);
+ size_t len = strlen(value);
+
+ if (len > 6) {
+ error_setg(errp,
+ "User specified "PC_MACHINE_OEM_ID" value is bigger than "
+ "6 bytes in size");
+ return;
+ }
+
+ strncpy(pcms->oem_id, value, 6);
+}
+
+static char *pc_machine_get_oem_table_id(Object *obj, Error **errp)
+{
+ PCMachineState *pcms = PC_MACHINE(obj);
+
+ return g_strdup(pcms->oem_table_id);
+}
+
+static void pc_machine_set_oem_table_id(Object *obj, const char *value,
+ Error **errp)
+{
+ PCMachineState *pcms = PC_MACHINE(obj);
+ size_t len = strlen(value);
+
+ if (len > 8) {
+ error_setg(errp,
+ "User specified "PC_MACHINE_OEM_TABLE_ID" value is bigger than "
+ "8 bytes in size");
+ return;
+ }
+ strncpy(pcms->oem_table_id, value, 8);
+}
+
static void pc_machine_initfn(Object *obj)
{
PCMachineState *pcms = PC_MACHINE(obj);
@@ -1623,6 +1667,8 @@ static void pc_machine_initfn(Object *obj)
pcms->max_ram_below_4g = 0; /* use default */
/* acpi build is enabled by default if machine supports it */
pcms->acpi_build_enabled = PC_MACHINE_GET_CLASS(pcms)->has_acpi_build;
+ pcms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
+ pcms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
pcms->smbus_enabled = true;
pcms->sata_enabled = true;
pcms->pit_enabled = true;
@@ -1759,6 +1805,24 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
NULL, NULL);
object_class_property_set_description(oc, PC_MACHINE_MAX_FW_SIZE,
"Maximum combined firmware size");
+
+ object_class_property_add_str(oc, PC_MACHINE_OEM_ID,
+ pc_machine_get_oem_id,
+ pc_machine_set_oem_id);
+ object_class_property_set_description(oc, PC_MACHINE_OEM_ID,
+ "Override the default value of field OEMID "
+ "in ACPI table header."
+ "The string may be up to 6 bytes in size");
+
+
+ object_class_property_add_str(oc, PC_MACHINE_OEM_TABLE_ID,
+ pc_machine_get_oem_table_id,
+ pc_machine_set_oem_table_id);
+ object_class_property_set_description(oc, PC_MACHINE_OEM_TABLE_ID,
+ "Override the default value of field OEM Table ID "
+ "in ACPI table header."
+ "The string may be up to 8 bytes in size");
+
}
static const TypeInfo pc_machine_info = {
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 6188c3e97e..2904b40163 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -359,18 +359,6 @@ static void pc_compat_1_4_fn(MachineState *machine)
pc_compat_1_5_fn(machine);
}
-static void pc_compat_1_3(MachineState *machine)
-{
- pc_compat_1_4_fn(machine);
-}
-
-/* PC compat function for pc-1.0 to pc-1.2 */
-static void pc_compat_1_2(MachineState *machine)
-{
- pc_compat_1_3(machine);
- x86_cpu_change_kvm_default("kvm-pv-eoi", NULL);
-}
-
static void pc_init_isa(MachineState *machine)
{
pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, TYPE_I440FX_PCI_DEVICE);
@@ -772,88 +760,6 @@ static void pc_i440fx_1_4_machine_options(MachineClass *m)
DEFINE_I440FX_MACHINE(v1_4, "pc-i440fx-1.4", pc_compat_1_4_fn,
pc_i440fx_1_4_machine_options);
-static void pc_i440fx_1_3_machine_options(MachineClass *m)
-{
- X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
- static GlobalProperty compat[] = {
- PC_CPU_MODEL_IDS("1.3.0")
- { "usb-tablet", "usb_version", "1" },
- { "virtio-net-pci", "ctrl_mac_addr", "off" },
- { "virtio-net-pci", "mq", "off" },
- { "e1000", "autonegotiation", "off" },
- };
-
- pc_i440fx_1_4_machine_options(m);
- m->hw_version = "1.3.0";
- m->deprecation_reason = "use a newer machine type instead";
- x86mc->compat_apic_id_mode = true;
- compat_props_add(m->compat_props, compat, G_N_ELEMENTS(compat));
-}
-
-DEFINE_I440FX_MACHINE(v1_3, "pc-1.3", pc_compat_1_3,
- pc_i440fx_1_3_machine_options);
-
-
-static void pc_i440fx_1_2_machine_options(MachineClass *m)
-{
- static GlobalProperty compat[] = {
- PC_CPU_MODEL_IDS("1.2.0")
- { "nec-usb-xhci", "msi", "off" },
- { "nec-usb-xhci", "msix", "off" },
- { "qxl", "revision", "3" },
- { "qxl-vga", "revision", "3" },
- { "VGA", "mmio", "off" },
- };
-
- pc_i440fx_1_3_machine_options(m);
- m->hw_version = "1.2.0";
- compat_props_add(m->compat_props, compat, G_N_ELEMENTS(compat));
-}
-
-DEFINE_I440FX_MACHINE(v1_2, "pc-1.2", pc_compat_1_2,
- pc_i440fx_1_2_machine_options);
-
-
-static void pc_i440fx_1_1_machine_options(MachineClass *m)
-{
- static GlobalProperty compat[] = {
- PC_CPU_MODEL_IDS("1.1.0")
- { "virtio-scsi-pci", "hotplug", "off" },
- { "virtio-scsi-pci", "param_change", "off" },
- { "VGA", "vgamem_mb", "8" },
- { "vmware-svga", "vgamem_mb", "8" },
- { "qxl-vga", "vgamem_mb", "8" },
- { "qxl", "vgamem_mb", "8" },
- { "virtio-blk-pci", "config-wce", "off" },
- };
-
- pc_i440fx_1_2_machine_options(m);
- m->hw_version = "1.1.0";
- compat_props_add(m->compat_props, compat, G_N_ELEMENTS(compat));
-}
-
-DEFINE_I440FX_MACHINE(v1_1, "pc-1.1", pc_compat_1_2,
- pc_i440fx_1_1_machine_options);
-
-static void pc_i440fx_1_0_machine_options(MachineClass *m)
-{
- static GlobalProperty compat[] = {
- PC_CPU_MODEL_IDS("1.0")
- { TYPE_ISA_FDC, "check_media_rate", "off" },
- { "virtio-balloon-pci", "class", stringify(PCI_CLASS_MEMORY_RAM) },
- { "apic-common", "vapic", "off" },
- { TYPE_USB_DEVICE, "full-path", "no" },
- };
-
- pc_i440fx_1_1_machine_options(m);
- m->hw_version = "1.0";
- compat_props_add(m->compat_props, compat, G_N_ELEMENTS(compat));
-}
-
-DEFINE_I440FX_MACHINE(v1_0, "pc-1.0", pc_compat_1_2,
- pc_i440fx_1_0_machine_options);
-
-
typedef struct {
uint16_t gpu_device_id;
uint16_t pch_device_id;
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 512e9042ff..a9ebef8a35 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -25,6 +25,7 @@
#include "qemu/osdep.h"
#include "qemu-common.h"
#include "qemu/datadir.h"
+#include "qemu/units.h"
#include "hw/irq.h"
#include "hw/pci/pci.h"
#include "hw/pci/pci_bridge.h"
@@ -68,6 +69,7 @@ static void pcibus_reset(BusState *qbus);
static Property pci_props[] = {
DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
+ DEFINE_PROP_UINT32("romsize", PCIDevice, romsize, -1),
DEFINE_PROP_UINT32("rombar", PCIDevice, rom_bar, 1),
DEFINE_PROP_BIT("multifunction", PCIDevice, cap_present,
QEMU_PCI_CAP_MULTIFUNCTION_BITNR, false),
@@ -2083,6 +2085,11 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp)
bool is_default_rom;
uint16_t class_id;
+ if (pci_dev->romsize != -1 && !is_power_of_2(pci_dev->romsize)) {
+ error_setg(errp, "ROM size %u is not a power of two", pci_dev->romsize);
+ return;
+ }
+
/* initialize cap_present for pci_is_express() and pci_config_size(),
* Note that hybrid PCIs are not set automatically and need to manage
* QEMU_PCI_CAP_EXPRESS manually */
@@ -2234,7 +2241,7 @@ static uint8_t pci_find_capability_at_offset(PCIDevice *pdev, uint8_t offset)
/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
This is needed for an option rom which is used for more than one device. */
-static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
+static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, uint32_t size)
{
uint16_t vendor_id;
uint16_t device_id;
@@ -2292,7 +2299,7 @@ static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
static void pci_add_option_rom(PCIDevice *pdev, bool is_default_rom,
Error **errp)
{
- int size;
+ int64_t size;
char *path;
void *ptr;
char name[32];
@@ -2342,8 +2349,22 @@ static void pci_add_option_rom(PCIDevice *pdev, bool is_default_rom,
error_setg(errp, "romfile \"%s\" is empty", pdev->romfile);
g_free(path);
return;
+ } else if (size > 2 * GiB) {
+ error_setg(errp, "romfile \"%s\" too large (size cannot exceed 2 GiB)",
+ pdev->romfile);
+ g_free(path);
+ return;
+ }
+ if (pdev->romsize != -1) {
+ if (size > pdev->romsize) {
+ error_setg(errp, "romfile \"%s\" (%u bytes) is too large for ROM size %u",
+ pdev->romfile, (uint32_t)size, pdev->romsize);
+ g_free(path);
+ return;
+ }
+ } else {
+ pdev->romsize = pow2ceil(size);
}
- size = pow2ceil(size);
vmsd = qdev_get_vmsd(DEVICE(pdev));
@@ -2353,7 +2374,7 @@ static void pci_add_option_rom(PCIDevice *pdev, bool is_default_rom,
snprintf(name, sizeof(name), "%s.rom", object_get_typename(OBJECT(pdev)));
}
pdev->has_rom = true;
- memory_region_init_rom(&pdev->rom, OBJECT(pdev), name, size, &error_fatal);
+ memory_region_init_rom(&pdev->rom, OBJECT(pdev), name, pdev->romsize, &error_fatal);
ptr = memory_region_get_ram_ptr(&pdev->rom);
if (load_image_size(path, ptr, size) < 0) {
error_setg(errp, "failed to load romfile \"%s\"", pdev->romfile);
diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events
index 2060a144a2..c62727f879 100644
--- a/hw/virtio/trace-events
+++ b/hw/virtio/trace-events
@@ -122,3 +122,8 @@ virtio_mem_unplug_all_request(void) ""
virtio_mem_resized_usable_region(uint64_t old_size, uint64_t new_size) "old_size=0x%" PRIx64 "new_size=0x%" PRIx64
virtio_mem_state_request(uint64_t addr, uint16_t nb_blocks) "addr=0x%" PRIx64 " nb_blocks=%" PRIu16
virtio_mem_state_response(uint16_t state) "state=%" PRIu16
+
+# virtio-pmem.c
+virtio_pmem_flush_request(void) "flush request"
+virtio_pmem_response(void) "flush response"
+virtio_pmem_flush_done(int type) "fsync return=%d"
diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c
index 222bbcc62d..31b33bde37 100644
--- a/hw/virtio/vhost-backend.c
+++ b/hw/virtio/vhost-backend.c
@@ -406,6 +406,11 @@ int vhost_backend_handle_iotlb_msg(struct vhost_dev *dev,
{
int ret = 0;
+ if (unlikely(!dev->vdev)) {
+ error_report("Unexpected IOTLB message when virtio device is stopped");
+ return -EINVAL;
+ }
+
switch (imsg->type) {
case VHOST_IOTLB_MISS:
ret = vhost_device_iotlb_miss(dev, imsg->iova,
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index 28c7d78172..6e17d631f7 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -704,6 +704,7 @@ static void vhost_iommu_region_add(MemoryListener *listener,
Int128 end;
int iommu_idx;
IOMMUMemoryRegion *iommu_mr;
+ int ret;
if (!memory_region_is_iommu(section->mr)) {
return;
@@ -726,8 +727,16 @@ static void vhost_iommu_region_add(MemoryListener *listener,
iommu->iommu_offset = section->offset_within_address_space -
section->offset_within_region;
iommu->hdev = dev;
- memory_region_register_iommu_notifier(section->mr, &iommu->n,
- &error_fatal);
+ ret = memory_region_register_iommu_notifier(section->mr, &iommu->n, NULL);
+ if (ret) {
+ /*
+ * Some vIOMMUs do not support dev-iotlb yet. If so, try to use the
+ * UNMAP legacy message
+ */
+ iommu->n.notifier_flags = IOMMU_NOTIFIER_UNMAP;
+ memory_region_register_iommu_notifier(section->mr, &iommu->n,
+ &error_fatal);
+ }
QLIST_INSERT_HEAD(&dev->iommu_list, iommu, iommu_next);
/* TODO: can replay help performance here? */
}
diff --git a/hw/virtio/virtio-balloon-pci.c b/hw/virtio/virtio-balloon-pci.c
index a2c5cc7207..79a3ba979a 100644
--- a/hw/virtio/virtio-balloon-pci.c
+++ b/hw/virtio/virtio-balloon-pci.c
@@ -34,21 +34,13 @@ struct VirtIOBalloonPCI {
VirtIOPCIProxy parent_obj;
VirtIOBalloon vdev;
};
-static Property virtio_balloon_pci_properties[] = {
- DEFINE_PROP_UINT32("class", VirtIOPCIProxy, class_code, 0),
- DEFINE_PROP_END_OF_LIST(),
-};
static void virtio_balloon_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
{
VirtIOBalloonPCI *dev = VIRTIO_BALLOON_PCI(vpci_dev);
DeviceState *vdev = DEVICE(&dev->vdev);
- if (vpci_dev->class_code != PCI_CLASS_OTHERS &&
- vpci_dev->class_code != PCI_CLASS_MEMORY_RAM) { /* qemu < 1.1 */
- vpci_dev->class_code = PCI_CLASS_OTHERS;
- }
-
+ vpci_dev->class_code = PCI_CLASS_OTHERS;
qdev_realize(vdev, BUS(&vpci_dev->bus), errp);
}
@@ -59,7 +51,6 @@ static void virtio_balloon_pci_class_init(ObjectClass *klass, void *data)
PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
k->realize = virtio_balloon_pci_realize;
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
- device_class_set_props(dc, virtio_balloon_pci_properties);
pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_BALLOON;
pcidev_k->revision = VIRTIO_PCI_ABI_VERSION;
diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
index 6b9ef7f6b2..c2883a2f6c 100644
--- a/hw/virtio/virtio-iommu.c
+++ b/hw/virtio/virtio-iommu.c
@@ -893,6 +893,11 @@ static int virtio_iommu_notify_flag_changed(IOMMUMemoryRegion *iommu_mr,
IOMMUNotifierFlag new,
Error **errp)
{
+ if (new & IOMMU_NOTIFIER_DEVIOTLB_UNMAP) {
+ error_setg(errp, "Virtio-iommu does not support dev-iotlb yet");
+ return -EINVAL;
+ }
+
if (old == IOMMU_NOTIFIER_NONE) {
trace_virtio_iommu_notify_flag_add(iommu_mr->parent_obj.name);
} else if (new == IOMMU_NOTIFIER_NONE) {
diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
index e1b5c3b81e..610661d6a5 100644
--- a/hw/virtio/virtio-mmio.c
+++ b/hw/virtio/virtio-mmio.c
@@ -191,6 +191,14 @@ static uint64_t virtio_mmio_read(void *opaque, hwaddr offset, unsigned size)
return 0;
}
return vdev->generation;
+ case VIRTIO_MMIO_SHM_LEN_LOW:
+ case VIRTIO_MMIO_SHM_LEN_HIGH:
+ /*
+ * VIRTIO_MMIO_SHM_SEL is unimplemented
+ * according to the linux driver, if region length is -1
+ * the shared memory doesn't exist
+ */
+ return -1;
case VIRTIO_MMIO_DEVICE_FEATURES_SEL:
case VIRTIO_MMIO_DRIVER_FEATURES:
case VIRTIO_MMIO_DRIVER_FEATURES_SEL:
diff --git a/hw/virtio/virtio-pmem.c b/hw/virtio/virtio-pmem.c
index ddb0125901..d83e973bf2 100644
--- a/hw/virtio/virtio-pmem.c
+++ b/hw/virtio/virtio-pmem.c
@@ -24,6 +24,7 @@
#include "sysemu/hostmem.h"
#include "block/aio.h"
#include "block/thread-pool.h"
+#include "trace.h"
typedef struct VirtIODeviceRequest {
VirtQueueElement elem;
@@ -41,6 +42,7 @@ static int worker_cb(void *opaque)
/* flush raw backing image */
err = fsync(req_data->fd);
+ trace_virtio_pmem_flush_done(err);
if (err != 0) {
err = 1;
}
@@ -59,6 +61,7 @@ static void done_cb(void *opaque, int ret)
/* Callbacks are serialized, so no need to use atomic ops. */
virtqueue_push(req_data->pmem->rq_vq, &req_data->elem, len);
virtio_notify((VirtIODevice *)req_data->pmem, req_data->pmem->rq_vq);
+ trace_virtio_pmem_response();
g_free(req_data);
}
@@ -69,6 +72,7 @@ static void virtio_pmem_flush(VirtIODevice *vdev, VirtQueue *vq)
HostMemoryBackend *backend = MEMORY_BACKEND(pmem->memdev);
ThreadPool *pool = aio_get_thread_pool(qemu_get_aio_context());
+ trace_virtio_pmem_flush_request();
req_data = virtqueue_pop(vq, sizeof(VirtIODeviceRequest));
if (!req_data) {
virtio_error(vdev, "virtio-pmem missing request data");
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index b308026596..1fd1917ca0 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -3680,6 +3680,7 @@ static void virtio_device_unrealize(DeviceState *dev)
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(dev);
+ memory_listener_unregister(&vdev->listener);
virtio_bus_device_unplugged(vdev);
if (vdc->unrealize != NULL) {
@@ -3710,7 +3711,6 @@ static void virtio_device_instance_finalize(Object *obj)
{
VirtIODevice *vdev = VIRTIO_DEVICE(obj);
- memory_listener_unregister(&vdev->listener);
virtio_device_free_virtqueues(vdev);
g_free(vdev->config);
diff --git a/hw/xen/xen_pt_load_rom.c b/hw/xen/xen_pt_load_rom.c
index a50a80837e..03422a8a71 100644
--- a/hw/xen/xen_pt_load_rom.c
+++ b/hw/xen/xen_pt_load_rom.c
@@ -53,10 +53,20 @@ void *pci_assign_dev_load_option_rom(PCIDevice *dev,
}
fseek(fp, 0, SEEK_SET);
+ if (dev->romsize != -1) {
+ if (st.st_size > dev->romsize) {
+ error_report("ROM BAR \"%s\" (%ld bytes) is too large for ROM size %u",
+ rom_file, (long) st.st_size, dev->romsize);
+ goto close_rom;
+ }
+ } else {
+ dev->romsize = st.st_size;
+ }
+
snprintf(name, sizeof(name), "%s.rom", object_get_typename(owner));
- memory_region_init_ram(&dev->rom, owner, name, st.st_size, &error_abort);
+ memory_region_init_ram(&dev->rom, owner, name, dev->romsize, &error_abort);
ptr = memory_region_get_ram_ptr(&dev->rom);
- memset(ptr, 0xff, st.st_size);
+ memset(ptr, 0xff, dev->romsize);
if (!fread(ptr, 1, st.st_size, fp)) {
error_report("pci-assign: Cannot read from host %s", rom_file);
diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 38a42f409a..cf9f44299c 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -41,7 +41,7 @@ enum {
};
typedef struct AcpiRsdpData {
- uint8_t oem_id[6] QEMU_NONSTRING; /* OEM identification */
+ char *oem_id; /* OEM identification */
uint8_t revision; /* Must be 0 for 1.0, 2 for 2.0 */
unsigned *rsdt_tbl_offset;
diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
index 54a5aec4d7..380d3e3924 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -8,7 +8,7 @@
#define ACPI_BUILD_TABLE_MAX_SIZE 0x200000
#define ACPI_BUILD_APPNAME6 "BOCHS "
-#define ACPI_BUILD_APPNAME4 "BXPC"
+#define ACPI_BUILD_APPNAME8 "BXPC "
#define ACPI_BUILD_TABLE_FILE "etc/acpi/tables"
#define ACPI_BUILD_RSDP_FILE "etc/acpi/rsdp"
@@ -459,10 +459,12 @@ Aml *build_crs(PCIHostState *host, CrsRangeSet *range_set, uint32_t io_offset,
void build_srat_memory(AcpiSratMemoryAffinity *numamem, uint64_t base,
uint64_t len, int node, MemoryAffinityFlags flags);
-void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms);
+void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms,
+ const char *oem_id, const char *oem_table_id);
void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f,
const char *oem_id, const char *oem_table_id);
-void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog);
+void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
+ const char *oem_id, const char *oem_table_id);
#endif
diff --git a/include/hw/acpi/ghes.h b/include/hw/acpi/ghes.h
index 4ad025e09a..2ae8bc1ded 100644
--- a/include/hw/acpi/ghes.h
+++ b/include/hw/acpi/ghes.h
@@ -67,7 +67,8 @@ typedef struct AcpiGhesState {
} AcpiGhesState;
void build_ghes_error_table(GArray *hardware_errors, BIOSLinker *linker);
-void acpi_build_hest(GArray *table_data, BIOSLinker *linker);
+void acpi_build_hest(GArray *table_data, BIOSLinker *linker,
+ const char *oem_id, const char *oem_table_id);
void acpi_ghes_add_fw_cfg(AcpiGhesState *vms, FWCfgState *s,
GArray *hardware_errors);
int acpi_ghes_record_errors(uint8_t notify, uint64_t error_physical_addr);
diff --git a/include/hw/acpi/pci.h b/include/hw/acpi/pci.h
index bf2a3ed0ba..e514f179d8 100644
--- a/include/hw/acpi/pci.h
+++ b/include/hw/acpi/pci.h
@@ -33,5 +33,6 @@ typedef struct AcpiMcfgInfo {
uint32_t size;
} AcpiMcfgInfo;
-void build_mcfg(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info);
+void build_mcfg(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info,
+ const char *oem_id, const char *oem_table_id);
#endif
diff --git a/include/hw/acpi/vmgenid.h b/include/hw/acpi/vmgenid.h
index cb4ad37fc5..dc8bb3433e 100644
--- a/include/hw/acpi/vmgenid.h
+++ b/include/hw/acpi/vmgenid.h
@@ -31,7 +31,7 @@ static inline Object *find_vmgenid_dev(void)
}
void vmgenid_build_acpi(VmGenIdState *vms, GArray *table_data, GArray *guid,
- BIOSLinker *linker);
+ BIOSLinker *linker, const char *oem_id);
void vmgenid_add_fw_cfg(VmGenIdState *vms, FWCfgState *s, GArray *guid);
#endif
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
index 36fcb29641..ee9a93101e 100644
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
@@ -165,6 +165,8 @@ struct VirtMachineState {
DeviceState *acpi_dev;
Notifier powerdown_notifier;
PCIBus *bus;
+ char *oem_id;
+ char *oem_table_id;
};
#define VIRT_ECAM_ID(high) (high ? VIRT_HIGH_PCIE_ECAM : VIRT_PCIE_ECAM)
diff --git a/include/hw/i386/microvm.h b/include/hw/i386/microvm.h
index f25f837441..372b05774e 100644
--- a/include/hw/i386/microvm.h
+++ b/include/hw/i386/microvm.h
@@ -76,6 +76,8 @@
#define MICROVM_MACHINE_ISA_SERIAL "isa-serial"
#define MICROVM_MACHINE_OPTION_ROMS "x-option-roms"
#define MICROVM_MACHINE_AUTO_KERNEL_CMDLINE "auto-kernel-cmdline"
+#define MICROVM_MACHINE_OEM_ID "oem-id"
+#define MICROVM_MACHINE_OEM_TABLE_ID "oem-table-id"
struct MicrovmMachineClass {
X86MachineClass parent;
@@ -104,6 +106,8 @@ struct MicrovmMachineState {
Notifier machine_done;
Notifier powerdown_req;
struct GPEXConfig gpex;
+ char *oem_id;
+ char *oem_table_id;
};
#define TYPE_MICROVM_MACHINE MACHINE_TYPE_NAME("microvm")
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 2aa8797c6e..5f93540a43 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -45,6 +45,8 @@ typedef struct PCMachineState {
bool pit_enabled;
bool hpet_enabled;
uint64_t max_fw_size;
+ char *oem_id;
+ char *oem_table_id;
/* NUMA information: */
uint64_t numa_nodes;
@@ -62,7 +64,8 @@ typedef struct PCMachineState {
#define PC_MACHINE_SATA "sata"
#define PC_MACHINE_PIT "pit"
#define PC_MACHINE_MAX_FW_SIZE "max-fw-size"
-
+#define PC_MACHINE_OEM_ID "oem-id"
+#define PC_MACHINE_OEM_TABLE_ID "oem-table-id"
/**
* PCMachineClass:
*
diff --git a/include/hw/mem/nvdimm.h b/include/hw/mem/nvdimm.h
index c699842dd0..bcf62f825c 100644
--- a/include/hw/mem/nvdimm.h
+++ b/include/hw/mem/nvdimm.h
@@ -154,7 +154,8 @@ void nvdimm_init_acpi_state(NVDIMMState *state, MemoryRegion *io,
void nvdimm_build_srat(GArray *table_data);
void nvdimm_build_acpi(GArray *table_offsets, GArray *table_data,
BIOSLinker *linker, NVDIMMState *state,
- uint32_t ram_slots);
+ uint32_t ram_slots, const char *oem_id,
+ const char *oem_table_id);
void nvdimm_plug(NVDIMMState *state);
void nvdimm_acpi_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev);
#endif
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index 66db08462f..1bc231480f 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -344,6 +344,7 @@ struct PCIDevice {
/* Location of option rom */
char *romfile;
+ uint32_t romsize;
bool has_rom;
MemoryRegion rom;
uint32_t rom_bar;
diff --git a/tests/data/acpi/microvm/APIC b/tests/data/acpi/microvm/APIC
index 7472c7e830..68dbd44a7e 100644
--- a/tests/data/acpi/microvm/APIC
+++ b/tests/data/acpi/microvm/APIC
Binary files differ
diff --git a/tests/data/acpi/microvm/APIC.ioapic2 b/tests/data/acpi/microvm/APIC.ioapic2
index a305f89d99..3063c52cd3 100644
--- a/tests/data/acpi/microvm/APIC.ioapic2
+++ b/tests/data/acpi/microvm/APIC.ioapic2
Binary files differ
diff --git a/tests/data/acpi/microvm/APIC.pcie b/tests/data/acpi/microvm/APIC.pcie
index 6c51081b50..4e8f6ed8d6 100644
--- a/tests/data/acpi/microvm/APIC.pcie
+++ b/tests/data/acpi/microvm/APIC.pcie
Binary files differ
diff --git a/tests/data/acpi/microvm/DSDT b/tests/data/acpi/microvm/DSDT
index b43f427a22..f477668f2e 100644
--- a/tests/data/acpi/microvm/DSDT
+++ b/tests/data/acpi/microvm/DSDT
Binary files differ
diff --git a/tests/data/acpi/microvm/DSDT.ioapic2 b/tests/data/acpi/microvm/DSDT.ioapic2
index aee44dd3de..e5924a4996 100644
--- a/tests/data/acpi/microvm/DSDT.ioapic2
+++ b/tests/data/acpi/microvm/DSDT.ioapic2
Binary files differ
diff --git a/tests/data/acpi/microvm/DSDT.pcie b/tests/data/acpi/microvm/DSDT.pcie
index e590b98f99..3fb373fd97 100644
--- a/tests/data/acpi/microvm/DSDT.pcie
+++ b/tests/data/acpi/microvm/DSDT.pcie
Binary files differ
diff --git a/tests/data/acpi/microvm/DSDT.rtc b/tests/data/acpi/microvm/DSDT.rtc
index 5960d6929a..e375473b5f 100644
--- a/tests/data/acpi/microvm/DSDT.rtc
+++ b/tests/data/acpi/microvm/DSDT.rtc
Binary files differ
diff --git a/tests/data/acpi/microvm/DSDT.usb b/tests/data/acpi/microvm/DSDT.usb
index 14423381ea..d63fd84620 100644
--- a/tests/data/acpi/microvm/DSDT.usb
+++ b/tests/data/acpi/microvm/DSDT.usb
Binary files differ
diff --git a/tests/data/acpi/microvm/FACP b/tests/data/acpi/microvm/FACP
index 0ba5795d62..f12cef5cb6 100644
--- a/tests/data/acpi/microvm/FACP
+++ b/tests/data/acpi/microvm/FACP
Binary files differ
diff --git a/tests/data/acpi/pc/APIC b/tests/data/acpi/pc/APIC
index 84509e0ae4..208331db53 100644
--- a/tests/data/acpi/pc/APIC
+++ b/tests/data/acpi/pc/APIC
Binary files differ
diff --git a/tests/data/acpi/pc/APIC.acpihmat b/tests/data/acpi/pc/APIC.acpihmat
index a21f164699..812c4603f2 100644
--- a/tests/data/acpi/pc/APIC.acpihmat
+++ b/tests/data/acpi/pc/APIC.acpihmat
Binary files differ
diff --git a/tests/data/acpi/pc/APIC.cphp b/tests/data/acpi/pc/APIC.cphp
index 1bf8a0a63b..65cc4f4a9a 100644
--- a/tests/data/acpi/pc/APIC.cphp
+++ b/tests/data/acpi/pc/APIC.cphp
Binary files differ
diff --git a/tests/data/acpi/pc/APIC.dimmpxm b/tests/data/acpi/pc/APIC.dimmpxm
index 427bb08248..d904d4a70d 100644
--- a/tests/data/acpi/pc/APIC.dimmpxm
+++ b/tests/data/acpi/pc/APIC.dimmpxm
Binary files differ
diff --git a/tests/data/acpi/pc/DSDT b/tests/data/acpi/pc/DSDT
index f6173df1d5..11ef89bd32 100644
--- a/tests/data/acpi/pc/DSDT
+++ b/tests/data/acpi/pc/DSDT
Binary files differ
diff --git a/tests/data/acpi/pc/DSDT.acpihmat b/tests/data/acpi/pc/DSDT.acpihmat
index 67f3f7249e..c561e91be7 100644
--- a/tests/data/acpi/pc/DSDT.acpihmat
+++ b/tests/data/acpi/pc/DSDT.acpihmat
Binary files differ
diff --git a/tests/data/acpi/pc/DSDT.bridge b/tests/data/acpi/pc/DSDT.bridge
index 643390f4c4..a234075518 100644
--- a/tests/data/acpi/pc/DSDT.bridge
+++ b/tests/data/acpi/pc/DSDT.bridge
Binary files differ
diff --git a/tests/data/acpi/pc/DSDT.cphp b/tests/data/acpi/pc/DSDT.cphp
index 1ddcf7d881..6ac47a7d10 100644
--- a/tests/data/acpi/pc/DSDT.cphp
+++ b/tests/data/acpi/pc/DSDT.cphp
Binary files differ
diff --git a/tests/data/acpi/pc/DSDT.dimmpxm b/tests/data/acpi/pc/DSDT.dimmpxm
index c44385cc01..d24377279c 100644
--- a/tests/data/acpi/pc/DSDT.dimmpxm
+++ b/tests/data/acpi/pc/DSDT.dimmpxm
Binary files differ
diff --git a/tests/data/acpi/pc/DSDT.hpbridge b/tests/data/acpi/pc/DSDT.hpbridge
index 4ecf1eb13b..9dfac45eab 100644
--- a/tests/data/acpi/pc/DSDT.hpbridge
+++ b/tests/data/acpi/pc/DSDT.hpbridge
Binary files differ
diff --git a/tests/data/acpi/pc/DSDT.hpbrroot b/tests/data/acpi/pc/DSDT.hpbrroot
index a3046226ec..6ff6f198c7 100644
--- a/tests/data/acpi/pc/DSDT.hpbrroot
+++ b/tests/data/acpi/pc/DSDT.hpbrroot
Binary files differ
diff --git a/tests/data/acpi/pc/DSDT.ipmikcs b/tests/data/acpi/pc/DSDT.ipmikcs
index f1638c5d07..1814f291b7 100644
--- a/tests/data/acpi/pc/DSDT.ipmikcs
+++ b/tests/data/acpi/pc/DSDT.ipmikcs
Binary files differ
diff --git a/tests/data/acpi/pc/DSDT.memhp b/tests/data/acpi/pc/DSDT.memhp
index 4c19e45e66..3c81339d39 100644
--- a/tests/data/acpi/pc/DSDT.memhp
+++ b/tests/data/acpi/pc/DSDT.memhp
Binary files differ
diff --git a/tests/data/acpi/pc/DSDT.numamem b/tests/data/acpi/pc/DSDT.numamem
index 40cfd93325..195f8da900 100644
--- a/tests/data/acpi/pc/DSDT.numamem
+++ b/tests/data/acpi/pc/DSDT.numamem
Binary files differ
diff --git a/tests/data/acpi/pc/DSDT.roothp b/tests/data/acpi/pc/DSDT.roothp
index 078fc8031b..1d0a2c2f3c 100644
--- a/tests/data/acpi/pc/DSDT.roothp
+++ b/tests/data/acpi/pc/DSDT.roothp
Binary files differ
diff --git a/tests/data/acpi/pc/FACP b/tests/data/acpi/pc/FACP
index 261ebdc5d1..5fe21a5967 100644
--- a/tests/data/acpi/pc/FACP
+++ b/tests/data/acpi/pc/FACP
Binary files differ
diff --git a/tests/data/acpi/pc/HMAT.acpihmat b/tests/data/acpi/pc/HMAT.acpihmat
index c00f7ba6cd..a9d8e5cd47 100644
--- a/tests/data/acpi/pc/HMAT.acpihmat
+++ b/tests/data/acpi/pc/HMAT.acpihmat
Binary files differ
diff --git a/tests/data/acpi/pc/HPET b/tests/data/acpi/pc/HPET
index df689b8f99..19f704abdd 100644
--- a/tests/data/acpi/pc/HPET
+++ b/tests/data/acpi/pc/HPET
Binary files differ
diff --git a/tests/data/acpi/pc/NFIT.dimmpxm b/tests/data/acpi/pc/NFIT.dimmpxm
index 598d331b75..02d23385bc 100644
--- a/tests/data/acpi/pc/NFIT.dimmpxm
+++ b/tests/data/acpi/pc/NFIT.dimmpxm
Binary files differ
diff --git a/tests/data/acpi/pc/SLIT.cphp b/tests/data/acpi/pc/SLIT.cphp
index 74ec3b4b46..67f00813af 100644
--- a/tests/data/acpi/pc/SLIT.cphp
+++ b/tests/data/acpi/pc/SLIT.cphp
Binary files differ
diff --git a/tests/data/acpi/pc/SLIT.memhp b/tests/data/acpi/pc/SLIT.memhp
index 74ec3b4b46..67f00813af 100644
--- a/tests/data/acpi/pc/SLIT.memhp
+++ b/tests/data/acpi/pc/SLIT.memhp
Binary files differ
diff --git a/tests/data/acpi/pc/SRAT.acpihmat b/tests/data/acpi/pc/SRAT.acpihmat
index 1dcae90aec..e0b36e97f6 100644
--- a/tests/data/acpi/pc/SRAT.acpihmat
+++ b/tests/data/acpi/pc/SRAT.acpihmat
Binary files differ
diff --git a/tests/data/acpi/pc/SRAT.cphp b/tests/data/acpi/pc/SRAT.cphp
index ff2137642f..d8ce4f5a9c 100644
--- a/tests/data/acpi/pc/SRAT.cphp
+++ b/tests/data/acpi/pc/SRAT.cphp
Binary files differ
diff --git a/tests/data/acpi/pc/SRAT.dimmpxm b/tests/data/acpi/pc/SRAT.dimmpxm
index 5a13c61b90..7eed48cf2d 100644
--- a/tests/data/acpi/pc/SRAT.dimmpxm
+++ b/tests/data/acpi/pc/SRAT.dimmpxm
Binary files differ
diff --git a/tests/data/acpi/pc/SRAT.memhp b/tests/data/acpi/pc/SRAT.memhp
index e508b4ae3c..a5b5f9adef 100644
--- a/tests/data/acpi/pc/SRAT.memhp
+++ b/tests/data/acpi/pc/SRAT.memhp
Binary files differ
diff --git a/tests/data/acpi/pc/SRAT.numamem b/tests/data/acpi/pc/SRAT.numamem
index 119922f497..56da58e269 100644
--- a/tests/data/acpi/pc/SRAT.numamem
+++ b/tests/data/acpi/pc/SRAT.numamem
Binary files differ
diff --git a/tests/data/acpi/pc/SSDT.dimmpxm b/tests/data/acpi/pc/SSDT.dimmpxm
index ac55387d57..a50a961fa1 100644
--- a/tests/data/acpi/pc/SSDT.dimmpxm
+++ b/tests/data/acpi/pc/SSDT.dimmpxm
Binary files differ
diff --git a/tests/data/acpi/pc/WAET b/tests/data/acpi/pc/WAET
index c2240f58df..ac0db59183 100644
--- a/tests/data/acpi/pc/WAET
+++ b/tests/data/acpi/pc/WAET
Binary files differ
diff --git a/tests/data/acpi/q35/APIC b/tests/data/acpi/q35/APIC
index 84509e0ae4..208331db53 100644
--- a/tests/data/acpi/q35/APIC
+++ b/tests/data/acpi/q35/APIC
Binary files differ
diff --git a/tests/data/acpi/q35/APIC.acpihmat b/tests/data/acpi/q35/APIC.acpihmat
index a21f164699..812c4603f2 100644
--- a/tests/data/acpi/q35/APIC.acpihmat
+++ b/tests/data/acpi/q35/APIC.acpihmat
Binary files differ
diff --git a/tests/data/acpi/q35/APIC.cphp b/tests/data/acpi/q35/APIC.cphp
index 1bf8a0a63b..65cc4f4a9a 100644
--- a/tests/data/acpi/q35/APIC.cphp
+++ b/tests/data/acpi/q35/APIC.cphp
Binary files differ
diff --git a/tests/data/acpi/q35/APIC.dimmpxm b/tests/data/acpi/q35/APIC.dimmpxm
index 427bb08248..d904d4a70d 100644
--- a/tests/data/acpi/q35/APIC.dimmpxm
+++ b/tests/data/acpi/q35/APIC.dimmpxm
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT b/tests/data/acpi/q35/DSDT
index d25cd70729..008a3d7d0f 100644
--- a/tests/data/acpi/q35/DSDT
+++ b/tests/data/acpi/q35/DSDT
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.acpihmat b/tests/data/acpi/q35/DSDT.acpihmat
index 722e06af83..2723b69008 100644
--- a/tests/data/acpi/q35/DSDT.acpihmat
+++ b/tests/data/acpi/q35/DSDT.acpihmat
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.bridge b/tests/data/acpi/q35/DSDT.bridge
index 06bac139d6..8671145557 100644
--- a/tests/data/acpi/q35/DSDT.bridge
+++ b/tests/data/acpi/q35/DSDT.bridge
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.cphp b/tests/data/acpi/q35/DSDT.cphp
index 2b933ac482..42b7819ea8 100644
--- a/tests/data/acpi/q35/DSDT.cphp
+++ b/tests/data/acpi/q35/DSDT.cphp
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.dimmpxm b/tests/data/acpi/q35/DSDT.dimmpxm
index bd8f8305b0..7c3526d967 100644
--- a/tests/data/acpi/q35/DSDT.dimmpxm
+++ b/tests/data/acpi/q35/DSDT.dimmpxm
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.ipmibt b/tests/data/acpi/q35/DSDT.ipmibt
index a8f868e23c..8d3ccc3e75 100644
--- a/tests/data/acpi/q35/DSDT.ipmibt
+++ b/tests/data/acpi/q35/DSDT.ipmibt
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.memhp b/tests/data/acpi/q35/DSDT.memhp
index 9a802e4c67..f1c545d94b 100644
--- a/tests/data/acpi/q35/DSDT.memhp
+++ b/tests/data/acpi/q35/DSDT.memhp
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.mmio64 b/tests/data/acpi/q35/DSDT.mmio64
index 948c2dc726..4fb285f2ef 100644
--- a/tests/data/acpi/q35/DSDT.mmio64
+++ b/tests/data/acpi/q35/DSDT.mmio64
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.numamem b/tests/data/acpi/q35/DSDT.numamem
index 44ec1b0af4..dd9dc9d025 100644
--- a/tests/data/acpi/q35/DSDT.numamem
+++ b/tests/data/acpi/q35/DSDT.numamem
Binary files differ
diff --git a/tests/data/acpi/q35/DSDT.tis b/tests/data/acpi/q35/DSDT.tis
index 30da3ec279..b8e3803402 100644
--- a/tests/data/acpi/q35/DSDT.tis
+++ b/tests/data/acpi/q35/DSDT.tis
Binary files differ
diff --git a/tests/data/acpi/q35/FACP b/tests/data/acpi/q35/FACP
index 72c9d97902..f6a864cc86 100644
--- a/tests/data/acpi/q35/FACP
+++ b/tests/data/acpi/q35/FACP
Binary files differ
diff --git a/tests/data/acpi/q35/HMAT.acpihmat b/tests/data/acpi/q35/HMAT.acpihmat
index c00f7ba6cd..a9d8e5cd47 100644
--- a/tests/data/acpi/q35/HMAT.acpihmat
+++ b/tests/data/acpi/q35/HMAT.acpihmat
Binary files differ
diff --git a/tests/data/acpi/q35/HPET b/tests/data/acpi/q35/HPET
index df689b8f99..19f704abdd 100644
--- a/tests/data/acpi/q35/HPET
+++ b/tests/data/acpi/q35/HPET
Binary files differ
diff --git a/tests/data/acpi/q35/MCFG b/tests/data/acpi/q35/MCFG
index 79ceb27a03..696bc969f2 100644
--- a/tests/data/acpi/q35/MCFG
+++ b/tests/data/acpi/q35/MCFG
Binary files differ
diff --git a/tests/data/acpi/q35/NFIT.dimmpxm b/tests/data/acpi/q35/NFIT.dimmpxm
index 598d331b75..02d23385bc 100644
--- a/tests/data/acpi/q35/NFIT.dimmpxm
+++ b/tests/data/acpi/q35/NFIT.dimmpxm
Binary files differ
diff --git a/tests/data/acpi/q35/SLIT.cphp b/tests/data/acpi/q35/SLIT.cphp
index 74ec3b4b46..67f00813af 100644
--- a/tests/data/acpi/q35/SLIT.cphp
+++ b/tests/data/acpi/q35/SLIT.cphp
Binary files differ
diff --git a/tests/data/acpi/q35/SLIT.memhp b/tests/data/acpi/q35/SLIT.memhp
index 74ec3b4b46..67f00813af 100644
--- a/tests/data/acpi/q35/SLIT.memhp
+++ b/tests/data/acpi/q35/SLIT.memhp
Binary files differ
diff --git a/tests/data/acpi/q35/SRAT.acpihmat b/tests/data/acpi/q35/SRAT.acpihmat
index 1dcae90aec..e0b36e97f6 100644
--- a/tests/data/acpi/q35/SRAT.acpihmat
+++ b/tests/data/acpi/q35/SRAT.acpihmat
Binary files differ
diff --git a/tests/data/acpi/q35/SRAT.cphp b/tests/data/acpi/q35/SRAT.cphp
index ff2137642f..d8ce4f5a9c 100644
--- a/tests/data/acpi/q35/SRAT.cphp
+++ b/tests/data/acpi/q35/SRAT.cphp
Binary files differ
diff --git a/tests/data/acpi/q35/SRAT.dimmpxm b/tests/data/acpi/q35/SRAT.dimmpxm
index 5a13c61b90..7eed48cf2d 100644
--- a/tests/data/acpi/q35/SRAT.dimmpxm
+++ b/tests/data/acpi/q35/SRAT.dimmpxm
Binary files differ
diff --git a/tests/data/acpi/q35/SRAT.memhp b/tests/data/acpi/q35/SRAT.memhp
index e508b4ae3c..a5b5f9adef 100644
--- a/tests/data/acpi/q35/SRAT.memhp
+++ b/tests/data/acpi/q35/SRAT.memhp
Binary files differ
diff --git a/tests/data/acpi/q35/SRAT.mmio64 b/tests/data/acpi/q35/SRAT.mmio64
index ac35f3dac4..f5e1e3932a 100644
--- a/tests/data/acpi/q35/SRAT.mmio64
+++ b/tests/data/acpi/q35/SRAT.mmio64
Binary files differ
diff --git a/tests/data/acpi/q35/SRAT.numamem b/tests/data/acpi/q35/SRAT.numamem
index 119922f497..56da58e269 100644
--- a/tests/data/acpi/q35/SRAT.numamem
+++ b/tests/data/acpi/q35/SRAT.numamem
Binary files differ
diff --git a/tests/data/acpi/q35/SSDT.dimmpxm b/tests/data/acpi/q35/SSDT.dimmpxm
index 98e6f0e3f3..617a1c911c 100644
--- a/tests/data/acpi/q35/SSDT.dimmpxm
+++ b/tests/data/acpi/q35/SSDT.dimmpxm
Binary files differ
diff --git a/tests/data/acpi/q35/TPM2.tis b/tests/data/acpi/q35/TPM2.tis
index 7878a6e79a..fe0f05987b 100644
--- a/tests/data/acpi/q35/TPM2.tis
+++ b/tests/data/acpi/q35/TPM2.tis
Binary files differ
diff --git a/tests/data/acpi/q35/WAET b/tests/data/acpi/q35/WAET
index c2240f58df..ac0db59183 100644
--- a/tests/data/acpi/q35/WAET
+++ b/tests/data/acpi/q35/WAET
Binary files differ
diff --git a/tests/data/acpi/virt/APIC b/tests/data/acpi/virt/APIC
index 797dfde284..023f15f12e 100644
--- a/tests/data/acpi/virt/APIC
+++ b/tests/data/acpi/virt/APIC
Binary files differ
diff --git a/tests/data/acpi/virt/APIC.memhp b/tests/data/acpi/virt/APIC.memhp
index 797dfde284..023f15f12e 100644
--- a/tests/data/acpi/virt/APIC.memhp
+++ b/tests/data/acpi/virt/APIC.memhp
Binary files differ
diff --git a/tests/data/acpi/virt/APIC.numamem b/tests/data/acpi/virt/APIC.numamem
index 797dfde284..023f15f12e 100644
--- a/tests/data/acpi/virt/APIC.numamem
+++ b/tests/data/acpi/virt/APIC.numamem
Binary files differ
diff --git a/tests/data/acpi/virt/DSDT b/tests/data/acpi/virt/DSDT
index ea8a0869af..134d8ae5b6 100644
--- a/tests/data/acpi/virt/DSDT
+++ b/tests/data/acpi/virt/DSDT
Binary files differ
diff --git a/tests/data/acpi/virt/DSDT.memhp b/tests/data/acpi/virt/DSDT.memhp
index 897648637c..140976b23e 100644
--- a/tests/data/acpi/virt/DSDT.memhp
+++ b/tests/data/acpi/virt/DSDT.memhp
Binary files differ
diff --git a/tests/data/acpi/virt/DSDT.numamem b/tests/data/acpi/virt/DSDT.numamem
index ea8a0869af..134d8ae5b6 100644
--- a/tests/data/acpi/virt/DSDT.numamem
+++ b/tests/data/acpi/virt/DSDT.numamem
Binary files differ
diff --git a/tests/data/acpi/virt/DSDT.pxb b/tests/data/acpi/virt/DSDT.pxb
index ce3b67dff2..eaa507b4bb 100644
--- a/tests/data/acpi/virt/DSDT.pxb
+++ b/tests/data/acpi/virt/DSDT.pxb
Binary files differ
diff --git a/tests/data/acpi/virt/FACP b/tests/data/acpi/virt/FACP
index 27de99f51b..1f764220f8 100644
--- a/tests/data/acpi/virt/FACP
+++ b/tests/data/acpi/virt/FACP
Binary files differ
diff --git a/tests/data/acpi/virt/FACP.memhp b/tests/data/acpi/virt/FACP.memhp
index 27de99f51b..1f764220f8 100644
--- a/tests/data/acpi/virt/FACP.memhp
+++ b/tests/data/acpi/virt/FACP.memhp
Binary files differ
diff --git a/tests/data/acpi/virt/FACP.numamem b/tests/data/acpi/virt/FACP.numamem
index 27de99f51b..1f764220f8 100644
--- a/tests/data/acpi/virt/FACP.numamem
+++ b/tests/data/acpi/virt/FACP.numamem
Binary files differ
diff --git a/tests/data/acpi/virt/GTDT b/tests/data/acpi/virt/GTDT
index 10107a65e9..9408b71b59 100644
--- a/tests/data/acpi/virt/GTDT
+++ b/tests/data/acpi/virt/GTDT
Binary files differ
diff --git a/tests/data/acpi/virt/GTDT.memhp b/tests/data/acpi/virt/GTDT.memhp
index 10107a65e9..9408b71b59 100644
--- a/tests/data/acpi/virt/GTDT.memhp
+++ b/tests/data/acpi/virt/GTDT.memhp
Binary files differ
diff --git a/tests/data/acpi/virt/GTDT.numamem b/tests/data/acpi/virt/GTDT.numamem
index 10107a65e9..9408b71b59 100644
--- a/tests/data/acpi/virt/GTDT.numamem
+++ b/tests/data/acpi/virt/GTDT.numamem
Binary files differ
diff --git a/tests/data/acpi/virt/MCFG b/tests/data/acpi/virt/MCFG
index e8987e1af0..f4ae3203a4 100644
--- a/tests/data/acpi/virt/MCFG
+++ b/tests/data/acpi/virt/MCFG
Binary files differ
diff --git a/tests/data/acpi/virt/MCFG.memhp b/tests/data/acpi/virt/MCFG.memhp
index e8987e1af0..f4ae3203a4 100644
--- a/tests/data/acpi/virt/MCFG.memhp
+++ b/tests/data/acpi/virt/MCFG.memhp
Binary files differ
diff --git a/tests/data/acpi/virt/MCFG.numamem b/tests/data/acpi/virt/MCFG.numamem
index e8987e1af0..f4ae3203a4 100644
--- a/tests/data/acpi/virt/MCFG.numamem
+++ b/tests/data/acpi/virt/MCFG.numamem
Binary files differ
diff --git a/tests/data/acpi/virt/NFIT.memhp b/tests/data/acpi/virt/NFIT.memhp
index 738c6f74c0..203db8c7be 100644
--- a/tests/data/acpi/virt/NFIT.memhp
+++ b/tests/data/acpi/virt/NFIT.memhp
Binary files differ
diff --git a/tests/data/acpi/virt/SLIT.memhp b/tests/data/acpi/virt/SLIT.memhp
index 74ec3b4b46..67f00813af 100644
--- a/tests/data/acpi/virt/SLIT.memhp
+++ b/tests/data/acpi/virt/SLIT.memhp
Binary files differ
diff --git a/tests/data/acpi/virt/SPCR b/tests/data/acpi/virt/SPCR
index 377271a0e7..24e0a579e7 100644
--- a/tests/data/acpi/virt/SPCR
+++ b/tests/data/acpi/virt/SPCR
Binary files differ
diff --git a/tests/data/acpi/virt/SPCR.memhp b/tests/data/acpi/virt/SPCR.memhp
index 377271a0e7..24e0a579e7 100644
--- a/tests/data/acpi/virt/SPCR.memhp
+++ b/tests/data/acpi/virt/SPCR.memhp
Binary files differ
diff --git a/tests/data/acpi/virt/SPCR.numamem b/tests/data/acpi/virt/SPCR.numamem
index 377271a0e7..24e0a579e7 100644
--- a/tests/data/acpi/virt/SPCR.numamem
+++ b/tests/data/acpi/virt/SPCR.numamem
Binary files differ
diff --git a/tests/data/acpi/virt/SRAT.memhp b/tests/data/acpi/virt/SRAT.memhp
index 9a35adb40c..01294cc892 100644
--- a/tests/data/acpi/virt/SRAT.memhp
+++ b/tests/data/acpi/virt/SRAT.memhp
Binary files differ
diff --git a/tests/data/acpi/virt/SRAT.numamem b/tests/data/acpi/virt/SRAT.numamem
index 9526e5a28e..d45f40338c 100644
--- a/tests/data/acpi/virt/SRAT.numamem
+++ b/tests/data/acpi/virt/SRAT.numamem
Binary files differ
diff --git a/tests/data/acpi/virt/SSDT.memhp b/tests/data/acpi/virt/SSDT.memhp
index 375d7b6fc8..e8b850ae22 100644
--- a/tests/data/acpi/virt/SSDT.memhp
+++ b/tests/data/acpi/virt/SSDT.memhp
Binary files differ
diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index 669202fc95..77053975aa 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -64,13 +64,17 @@
#include "boot-sector.h"
#include "tpm-emu.h"
#include "hw/acpi/tpm.h"
-
+#include "qemu/cutils.h"
#define MACHINE_PC "pc"
#define MACHINE_Q35 "q35"
#define ACPI_REBUILD_EXPECTED_AML "TEST_ACPI_REBUILD_AML"
+#define OEM_ID "TEST"
+#define OEM_TABLE_ID "OEM"
+#define OEM_TEST_ARGS "-machine oem-id="OEM_ID",oem-table-id="OEM_TABLE_ID
+
typedef struct {
bool tcg_only;
const char *machine;
@@ -654,17 +658,28 @@ static void test_smbios_structs(test_data *data)
}
}
-static void test_acpi_one(const char *params, test_data *data)
+static void test_acpi_load_tables(test_data *data, bool use_uefi)
{
- char *args;
- bool use_uefi = data->uefi_fl1 && data->uefi_fl2;
-
-#ifndef CONFIG_TCG
- if (data->tcg_only) {
- g_test_skip("TCG disabled, skipping ACPI tcg_only test");
- return;
+ if (use_uefi) {
+ g_assert(data->scan_len);
+ data->rsdp_addr = acpi_find_rsdp_address_uefi(data->qts,
+ data->ram_start, data->scan_len);
+ } else {
+ boot_sector_test(data->qts);
+ data->rsdp_addr = acpi_find_rsdp_address(data->qts);
+ g_assert_cmphex(data->rsdp_addr, <, 0x100000);
}
-#endif /* CONFIG_TCG */
+
+ data->tables = g_array_new(false, true, sizeof(AcpiSdtTable));
+ test_acpi_rsdp_table(data);
+ test_acpi_rxsdt_table(data);
+ test_acpi_fadt_table(data);
+}
+
+static char *test_acpi_create_args(test_data *data, const char *params,
+ bool use_uefi)
+{
+ char *args;
if (use_uefi) {
/*
@@ -695,23 +710,24 @@ static void test_acpi_one(const char *params, test_data *data)
params ? params : "", disk,
data->blkdev ?: "ide-hd");
}
+ return args;
+}
- data->qts = qtest_init(args);
+static void test_acpi_one(const char *params, test_data *data)
+{
+ char *args;
+ bool use_uefi = data->uefi_fl1 && data->uefi_fl2;
- if (use_uefi) {
- g_assert(data->scan_len);
- data->rsdp_addr = acpi_find_rsdp_address_uefi(data->qts,
- data->ram_start, data->scan_len);
- } else {
- boot_sector_test(data->qts);
- data->rsdp_addr = acpi_find_rsdp_address(data->qts);
- g_assert_cmphex(data->rsdp_addr, <, 0x100000);
+#ifndef CONFIG_TCG
+ if (data->tcg_only) {
+ g_test_skip("TCG disabled, skipping ACPI tcg_only test");
+ return;
}
+#endif /* CONFIG_TCG */
- data->tables = g_array_new(false, true, sizeof(AcpiSdtTable));
- test_acpi_rsdp_table(data);
- test_acpi_rxsdt_table(data);
- test_acpi_fadt_table(data);
+ args = test_acpi_create_args(data, params, use_uefi);
+ data->qts = qtest_init(args);
+ test_acpi_load_tables(data, use_uefi);
if (getenv(ACPI_REBUILD_EXPECTED_AML)) {
dump_aml_files(data, true);
@@ -1292,6 +1308,109 @@ static void test_acpi_virt_tcg(void)
free_test_data(&data);
}
+static void test_oem_fields(test_data *data)
+{
+ int i;
+ char oem_id[6];
+ char oem_table_id[8];
+
+ strpadcpy(oem_id, sizeof oem_id, OEM_ID, ' ');
+ strpadcpy(oem_table_id, sizeof oem_table_id, OEM_TABLE_ID, ' ');
+ for (i = 0; i < data->tables->len; ++i) {
+ AcpiSdtTable *sdt;
+
+ sdt = &g_array_index(data->tables, AcpiSdtTable, i);
+ /* FACS doesn't have OEMID and OEMTABLEID fields */
+ if (compare_signature(sdt, "FACS")) {
+ continue;
+ }
+
+ g_assert(memcmp(sdt->aml + 10, oem_id, 6) == 0);
+ g_assert(memcmp(sdt->aml + 16, oem_table_id, 8) == 0);
+ }
+}
+
+static void test_acpi_oem_fields_pc(void)
+{
+ test_data data;
+ char *args;
+
+ memset(&data, 0, sizeof(data));
+ data.machine = MACHINE_PC;
+ data.required_struct_types = base_required_struct_types;
+ data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
+
+ args = test_acpi_create_args(&data,
+ OEM_TEST_ARGS, false);
+ data.qts = qtest_init(args);
+ test_acpi_load_tables(&data, false);
+ test_oem_fields(&data);
+ qtest_quit(data.qts);
+ free_test_data(&data);
+ g_free(args);
+}
+
+static void test_acpi_oem_fields_q35(void)
+{
+ test_data data;
+ char *args;
+
+ memset(&data, 0, sizeof(data));
+ data.machine = MACHINE_Q35;
+ data.required_struct_types = base_required_struct_types;
+ data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
+
+ args = test_acpi_create_args(&data,
+ OEM_TEST_ARGS, false);
+ data.qts = qtest_init(args);
+ test_acpi_load_tables(&data, false);
+ test_oem_fields(&data);
+ qtest_quit(data.qts);
+ free_test_data(&data);
+ g_free(args);
+}
+
+static void test_acpi_oem_fields_microvm(void)
+{
+ test_data data;
+ char *args;
+
+ test_acpi_microvm_prepare(&data);
+
+ args = test_acpi_create_args(&data,
+ OEM_TEST_ARGS",acpi=on", false);
+ data.qts = qtest_init(args);
+ test_acpi_load_tables(&data, false);
+ test_oem_fields(&data);
+ qtest_quit(data.qts);
+ free_test_data(&data);
+ g_free(args);
+}
+
+static void test_acpi_oem_fields_virt(void)
+{
+ test_data data = {
+ .machine = "virt",
+ .tcg_only = true,
+ .uefi_fl1 = "pc-bios/edk2-aarch64-code.fd",
+ .uefi_fl2 = "pc-bios/edk2-arm-vars.fd",
+ .cd = "tests/data/uefi-boot-images/bios-tables-test.aarch64.iso.qcow2",
+ .ram_start = 0x40000000ULL,
+ .scan_len = 128ULL * 1024 * 1024,
+ };
+ char *args;
+
+ args = test_acpi_create_args(&data,
+ "-cpu cortex-a57 "OEM_TEST_ARGS, true);
+ data.qts = qtest_init(args);
+ test_acpi_load_tables(&data, true);
+ test_oem_fields(&data);
+ qtest_quit(data.qts);
+ free_test_data(&data);
+ g_free(args);
+}
+
+
int main(int argc, char *argv[])
{
const char *arch = qtest_get_arch();
@@ -1304,9 +1423,10 @@ int main(int argc, char *argv[])
if (ret) {
return ret;
}
-
+ qtest_add_func("acpi/q35/oem-fields", test_acpi_oem_fields_q35);
qtest_add_func("acpi/q35/tpm-tis", test_acpi_q35_tcg_tpm_tis);
qtest_add_func("acpi/piix4", test_acpi_piix4_tcg);
+ qtest_add_func("acpi/oem-fields", test_acpi_oem_fields_pc);
qtest_add_func("acpi/piix4/bridge", test_acpi_piix4_tcg_bridge);
qtest_add_func("acpi/piix4/pci-hotplug/no_root_hotplug",
test_acpi_piix4_no_root_hotplug);
@@ -1333,6 +1453,7 @@ int main(int argc, char *argv[])
qtest_add_func("acpi/microvm/usb", test_acpi_microvm_usb_tcg);
qtest_add_func("acpi/microvm/rtc", test_acpi_microvm_rtc_tcg);
qtest_add_func("acpi/microvm/ioapic2", test_acpi_microvm_ioapic2_tcg);
+ qtest_add_func("acpi/microvm/oem-fields", test_acpi_oem_fields_microvm);
if (strcmp(arch, "x86_64") == 0) {
qtest_add_func("acpi/microvm/pcie", test_acpi_microvm_pcie_tcg);
}
@@ -1341,6 +1462,7 @@ int main(int argc, char *argv[])
qtest_add_func("acpi/virt/numamem", test_acpi_virt_tcg_numamem);
qtest_add_func("acpi/virt/memhp", test_acpi_virt_tcg_memhp);
qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb);
+ qtest_add_func("acpi/virt/oem-fields", test_acpi_oem_fields_virt);
}
ret = g_test_run();
boot_sector_cleanup(disk);