3dd010ef3a
spoof_on() is internal (spoof-core.h); the smbios.c call site only includes the public spoof.h, which exposes spoof_enabled() (== spoof_on). Fixes the base build: implicit-declaration / nested-externs -Werror. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
64 lines
3.1 KiB
Diff
64 lines
3.1 KiB
Diff
qemu-spoof: SMBIOS type 8 (ports) + type 9 (slots) defaults
|
|
|
|
Real boards expose port connectors (type 8: USB/LAN/audio jacks) and expansion slots
|
|
(type 9: PCIe/M.2). QEMU emits none, so a guest dmidecode shows a conspicuously empty
|
|
machine. Inject a plausible desktop default set (via the existing type8/type9 build
|
|
path) when the operator configured none. Inert without a seed. (spoof.h include added
|
|
by 0015-smbios-vm-bit.)
|
|
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
|
|
index 7d71418..140b42a 100644
|
|
--- a/hw/smbios/smbios.c
|
|
+++ b/hw/smbios/smbios.c
|
|
@@ -1040,6 +1040,51 @@ void smbios_set_defaults(const char *manufacturer, const char *product,
|
|
SMBIOS_SET_DEFAULT(type4.version, version);
|
|
SMBIOS_SET_DEFAULT(type17.loc_pfx, "DIMM");
|
|
SMBIOS_SET_DEFAULT(type17.manufacturer, manufacturer);
|
|
+
|
|
+ /* qemu-spoof: real boards expose port connectors (type 8) and expansion slots
|
|
+ * (type 9); QEMU emits none, so dmidecode is conspicuously empty. Inject a
|
|
+ * plausible desktop default set when none were configured. Inert without a seed. */
|
|
+ if (spoof_enabled() && QTAILQ_EMPTY(&type8)) {
|
|
+ static const struct { const char *intr, *extr; uint8_t ct, pt; } sp_ports[] = {
|
|
+ { "JUSB1", "USB1", 0x12, 0x10 }, /* Access Bus (USB) / USB */
|
|
+ { "JUSB2", "USB2", 0x12, 0x10 },
|
|
+ { "JUSB3", "USB3", 0x12, 0x10 },
|
|
+ { "JRJ45", "LAN", 0x0B, 0x1F }, /* RJ-45 / Network */
|
|
+ { "JAUD1", "Line Out", 0x1D, 0x1C }, /* Mini Jack / Audio */
|
|
+ { "JAUD2", "Mic In", 0x1D, 0x1C },
|
|
+ };
|
|
+ size_t i;
|
|
+ for (i = 0; i < ARRAY_SIZE(sp_ports); i++) {
|
|
+ struct type8_instance *t8 = g_new0(struct type8_instance, 1);
|
|
+ t8->internal_reference = g_strdup(sp_ports[i].intr);
|
|
+ t8->external_reference = g_strdup(sp_ports[i].extr);
|
|
+ t8->connector_type = sp_ports[i].ct;
|
|
+ t8->port_type = sp_ports[i].pt;
|
|
+ QTAILQ_INSERT_TAIL(&type8, t8, next);
|
|
+ }
|
|
+ }
|
|
+ if (spoof_enabled() && QTAILQ_EMPTY(&type9)) {
|
|
+ static const struct {
|
|
+ const char *desig; uint8_t type, width, usage, length; uint16_t id;
|
|
+ } sp_slots[] = {
|
|
+ { "PCIEX16", 0xB6, 0x0D, 0x03, 0x04, 0x01 }, /* PCIe gen3 x16, available */
|
|
+ { "PCIEX1_1", 0xB5, 0x0A, 0x03, 0x03, 0x02 }, /* PCIe gen3 x1 */
|
|
+ { "M2_1", 0xB6, 0x0D, 0x04, 0x03, 0x03 }, /* M.2, in use */
|
|
+ };
|
|
+ size_t i;
|
|
+ for (i = 0; i < ARRAY_SIZE(sp_slots); i++) {
|
|
+ struct type9_instance *t9 = g_new0(struct type9_instance, 1);
|
|
+ t9->slot_designation = g_strdup(sp_slots[i].desig);
|
|
+ t9->slot_type = sp_slots[i].type;
|
|
+ t9->slot_data_bus_width = sp_slots[i].width;
|
|
+ t9->current_usage = sp_slots[i].usage;
|
|
+ t9->slot_length = sp_slots[i].length;
|
|
+ t9->slot_id = sp_slots[i].id;
|
|
+ t9->slot_characteristics1 = 0x04; /* PME# supported */
|
|
+ t9->slot_characteristics2 = 0x01;
|
|
+ QTAILQ_INSERT_TAIL(&type9, t9, next);
|
|
+ }
|
|
+ }
|
|
}
|
|
|
|
static void smbios_entry_point_setup(SmbiosEntryPointType ep_type)
|