qemu-spoof: SMBIOS type3/4/11/17 identity Wire the remaining SMBIOS getters (module already derives them): - type3 chassis type (Desktop/Notebook, from the persona machine class) - type4 processor socket designation + processor manufacturer (CPU-vendor anchored) - type11 OEM strings: QEMU emits no type 11 at all (a tell); emit the spoofed OEM string when config provided none - type17 memory manufacturer / serial / part (brand-correct, per-unit) All inert unless a spoof-seed is set (getters return the stock value when off). The type0 "VM" bit is handled by 0015; the spoof.h include is added there. diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c index 7d71418..0d8e569 100644 --- a/hw/smbios/smbios.c +++ b/hw/smbios/smbios.c @@ -656,7 +656,7 @@ static void smbios_build_type_3_table(void) SMBIOS_BUILD_TABLE_PRE(3, T3_BASE, true); /* required */ SMBIOS_TABLE_SET_STR(3, manufacturer_str, type3.manufacturer); - t->type = 0x01; /* Other */ + t->type = spoof_smbios_chassis_type(0x01); /* Other (3=Desktop, 10=Notebook) */ SMBIOS_TABLE_SET_STR(3, version_str, type3.version); SMBIOS_TABLE_SET_STR(3, serial_number_str, type3.serial); SMBIOS_TABLE_SET_STR(3, asset_tag_number_str, type3.asset); @@ -690,11 +690,13 @@ static void smbios_build_type_4_table(MachineState *ms, unsigned instance, SMBIOS_BUILD_TABLE_PRE_SIZE(4, T4_BASE + instance, true, tbl_len); /* required */ - snprintf(sock_str, sizeof(sock_str), "%s%2x", type4.sock_pfx, instance); + snprintf(sock_str, sizeof(sock_str), "%s%2x", + spoof_smbios_cpu_socket(type4.sock_pfx), instance); SMBIOS_TABLE_SET_STR(4, socket_designation_str, sock_str); t->processor_type = 0x03; /* CPU */ t->processor_family = 0xfe; /* use Processor Family 2 field */ - SMBIOS_TABLE_SET_STR(4, processor_manufacturer_str, type4.manufacturer); + SMBIOS_TABLE_SET_STR(4, processor_manufacturer_str, + spoof_smbios_cpu_manufacturer(type4.manufacturer)); if (type4.processor_id == 0) { t->processor_id[0] = cpu_to_le32(smbios_cpuid_version); t->processor_id[1] = cpu_to_le32(smbios_cpuid_features); @@ -825,13 +827,23 @@ static void smbios_build_type_11_table(void) { char count_str[128]; size_t i; + /* qemu-spoof: real machines expose OEM strings here; QEMU emits no type 11 at + * all, which is itself a tell. If config gave none, emit the spoofed one. */ + const char *spoof_oem = spoof_smbios_oem_string(NULL); - if (type11.nvalues == 0) { + if (type11.nvalues == 0 && !spoof_oem) { return; } SMBIOS_BUILD_TABLE_PRE(11, T11_BASE, true); /* required */ + if (type11.nvalues == 0) { + t->count = 1; + SMBIOS_TABLE_SET_STR_LIST(11, spoof_oem); + SMBIOS_BUILD_TABLE_POST; + return; + } + snprintf(count_str, sizeof(count_str), "%zu", type11.nvalues); t->count = type11.nvalues; @@ -900,10 +912,13 @@ static void smbios_build_type_17_table(unsigned instance, uint64_t size) t->memory_type = 0x07; /* RAM */ t->type_detail = cpu_to_le16(0x02); /* Other */ t->speed = cpu_to_le16(type17.speed); - SMBIOS_TABLE_SET_STR(17, manufacturer_str, type17.manufacturer); - SMBIOS_TABLE_SET_STR(17, serial_number_str, type17.serial); + SMBIOS_TABLE_SET_STR(17, manufacturer_str, + spoof_smbios_mem_manufacturer(type17.manufacturer)); + SMBIOS_TABLE_SET_STR(17, serial_number_str, + spoof_smbios_mem_serial(type17.serial)); SMBIOS_TABLE_SET_STR(17, asset_tag_number_str, type17.asset); - SMBIOS_TABLE_SET_STR(17, part_number_str, type17.part); + SMBIOS_TABLE_SET_STR(17, part_number_str, + spoof_smbios_mem_part(type17.part)); t->attributes = 0; /* Unknown */ t->configured_clock_speed = t->speed; /* reuse value for max speed */ t->minimum_voltage = cpu_to_le16(0); /* Unknown */