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>
38 lines
1.2 KiB
C
38 lines
1.2 KiB
C
#ifndef ACPI_VMGENID_H
|
|
#define ACPI_VMGENID_H
|
|
|
|
#include "hw/acpi/bios-linker-loader.h"
|
|
#include "hw/qdev-core.h"
|
|
#include "qemu/uuid.h"
|
|
#include "qom/object.h"
|
|
|
|
#define TYPE_VMGENID "vmgenid"
|
|
#define VMGENID_GUID "guid"
|
|
#define VMGENID_GUID_FW_CFG_FILE "etc/vmgenid_guid"
|
|
#define VMGENID_ADDR_FW_CFG_FILE "etc/vmgenid_addr"
|
|
|
|
#define VMGENID_FW_CFG_SIZE 4096 /* Occupy a page of memory */
|
|
#define VMGENID_GUID_OFFSET 40 /* allow space for
|
|
* OVMF SDT Header Probe Supressor
|
|
*/
|
|
|
|
OBJECT_DECLARE_SIMPLE_TYPE(VmGenIdState, VMGENID)
|
|
|
|
struct VmGenIdState {
|
|
DeviceState parent_obj;
|
|
QemuUUID guid; /* The 128-bit GUID seen by the guest */
|
|
uint8_t vmgenid_addr_le[8]; /* Address of the GUID (little-endian) */
|
|
};
|
|
|
|
/* returns NULL unless there is exactly one device */
|
|
static inline Object *find_vmgenid_dev(void)
|
|
{
|
|
return object_resolve_path_type("", TYPE_VMGENID, NULL);
|
|
}
|
|
|
|
void vmgenid_build_acpi(VmGenIdState *vms, GArray *table_data, GArray *guid,
|
|
BIOSLinker *linker, const char *oem_id);
|
|
void vmgenid_add_fw_cfg(VmGenIdState *vms, FWCfgState *s, GArray *guid);
|
|
|
|
#endif
|