\r
typedef union {\r
SMBIOS_TABLE_ENTRY_POINT V2;\r
+ SMBIOS_TABLE_3_0_ENTRY_POINT V3;\r
} QEMU_SMBIOS_ANCHOR;\r
\r
RETURN_STATUS\r
QEMU_SMBIOS_ANCHOR QemuAnchor;\r
UINT16 SmbiosVersion;\r
\r
+ if (PcdGetBool (PcdQemuSmbiosValidated)) {\r
+ //\r
+ // Some other module, linked against this library, has already performed\r
+ // the task at hand. This should never happen, but it's easy to handle;\r
+ // just exit early.\r
+ //\r
+ return RETURN_SUCCESS;\r
+ }\r
+\r
if (RETURN_ERROR (QemuFwCfgFindFile (\r
"etc/smbios/smbios-anchor", &Anchor, &AnchorSize)) ||\r
RETURN_ERROR (QemuFwCfgFindFile (\r
QemuAnchor.V2.MinorVersion);\r
break;\r
\r
+ case sizeof QemuAnchor.V3:\r
+ QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);\r
+\r
+ if (QemuAnchor.V3.MajorVersion != 3 ||\r
+ QemuAnchor.V3.TableMaximumSize != TablesSize ||\r
+ CompareMem (QemuAnchor.V3.AnchorString, "_SM3_", 5) != 0) {\r
+ return RETURN_SUCCESS;\r
+ }\r
+ SmbiosVersion = (UINT16)(QemuAnchor.V3.MajorVersion << 8 |\r
+ QemuAnchor.V3.MinorVersion);\r
+\r
+ DEBUG ((EFI_D_INFO, "%a: SMBIOS 3.x DocRev from QEMU: 0x%02x\n",\r
+ __FUNCTION__, QemuAnchor.V3.DocRev));\r
+ PcdSet8 (PcdSmbiosDocRev, QemuAnchor.V3.DocRev);\r
+ break;\r
+\r
default:\r
return RETURN_SUCCESS;\r
}\r
SmbiosVersion));\r
PcdSet16 (PcdSmbiosVersion, SmbiosVersion);\r
\r
+ //\r
+ // SMBIOS platform drivers can now fetch and install\r
+ // "etc/smbios/smbios-tables" from QEMU.\r
+ //\r
+ PcdSetBool (PcdQemuSmbiosValidated, TRUE);\r
return RETURN_SUCCESS;\r
}\r