summaryrefslogtreecommitdiffstats
path: root/hw/acpi/nvdimm.c
diff options
context:
space:
mode:
authorMarian Postevca2021-01-19 01:32:13 +0100
committerMichael S. Tsirkin2021-02-05 14:52:59 +0100
commit602b458201ffd6f261fb8ee16b5175d733d3ec32 (patch)
tree7cd70e99e8b445eea3f4dff35a2cc22f93937bc8 /hw/acpi/nvdimm.c
parenttests/acpi: allow updates for expected data files (diff)
downloadqemu-602b458201ffd6f261fb8ee16b5175d733d3ec32.tar.gz
qemu-602b458201ffd6f261fb8ee16b5175d733d3ec32.tar.xz
qemu-602b458201ffd6f261fb8ee16b5175d733d3ec32.zip
acpi: Permit OEM ID and OEM table ID fields to be changed
Qemu's ACPI table generation sets the fields OEM ID and OEM table ID to "BOCHS " and "BXPCxxxx" where "xxxx" is replaced by the ACPI table name. Some games like Red Dead Redemption 2 seem to check the ACPI OEM ID and OEM table ID for the strings "BOCHS" and "BXPC" and if they are found, the game crashes(this may be an intentional detection mechanism to prevent playing the game in a virtualized environment). This patch allows you to override these default values. The feature can be used in this manner: qemu -machine oem-id=ABCDEF,oem-table-id=GHIJKLMN The oem-id string can be up to 6 bytes in size, and the oem-table-id string can be up to 8 bytes in size. If the string are smaller than their respective sizes they will be padded with space. If either of these parameters is not set, the current default values will be used for the one missing. Note that the the OEM Table ID field will not be extended with the name of the table, but will use either the default name or the user provided one. This does not affect the -acpitable option (for user-defined ACPI tables), which has precedence over -machine option. Signed-off-by: Marian Postevca <posteuca@mutex.one> Message-Id: <20210119003216.17637-3-posteuca@mutex.one> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/acpi/nvdimm.c')
-rw-r--r--hw/acpi/nvdimm.c18
1 files changed, 11 insertions, 7 deletions
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);
}