mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging
pc,virtio,pci: fixes, features,code removal Fixes all over the place. Ability to control ACPI OEM ID's. Ability to control rom BAR size. Removal of deprecated pc machine types. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # gpg: Signature made Fri 05 Feb 2021 13:54:32 GMT # gpg: using RSA key 5D09FD0871C8F85B94CA8A0D281F0DB8D28D5469 # gpg: issuer "mst@redhat.com" # gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>" [full] # gpg: aka "Michael S. Tsirkin <mst@redhat.com>" [full] # Primary key fingerprint: 0270 606B 6F3C DF3D 0B17 0970 C350 3912 AFBE 8E67 # Subkey fingerprint: 5D09 FD08 71C8 F85B 94CA 8A0D 281F 0DB8 D28D 5469 * remotes/mst/tags/for_upstream: tests/acpi: disallow updates for expected data files tests/acpi: update expected data files tests/acpi: add OEM ID and OEM TABLE ID test acpi: use constants as strncpy limit acpi: Permit OEM ID and OEM table ID fields to be changed tests/acpi: allow updates for expected data files vhost: Check for valid vdev in vhost_backend_handle_iotlb_msg hw/virtio/virtio-balloon: Remove the "class" property hw/i386: Remove the deprecated pc-1.x machine types vhost: Unbreak SMMU and virtio-iommu on dev-iotlb support virtio-pmem: add trace events virtio: Add corresponding memory_listener_unregister to unrealize virtio-mmio: fix guest kernel crash with SHM regions virtio: move 'use-disabled-flag' property to hw_compat_4_2 pci: add romsize property pci: reject too large ROMs Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -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)
|
||||
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
|
||||
@@ -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
|
||||
----------------
|
||||
|
||||
|
||||
+12
-17
@@ -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,
|
||||
|
||||
+3
-2
@@ -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,
|
||||
|
||||
+3
-2
@@ -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);
|
||||
}
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
+11
-7
@@ -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);
|
||||
}
|
||||
|
||||
+3
-2
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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 "
|
||||
|
||||
+26
-14
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
|
||||
+58
-28
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user