]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c
OvmfPkg: SmbiosVersionLib: recognize SMBIOS 3.x entry point
[mirror_edk2.git] / OvmfPkg / Library / SmbiosVersionLib / DetectSmbiosVersionLib.c
index 0efe020eea4a1343b272e31df0106a484b43a811..950c3f7e0a317213227d0832650c31c548df1cae 100644 (file)
@@ -27,6 +27,7 @@
 \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
@@ -40,6 +41,15 @@ DetectSmbiosVersion (
   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
@@ -64,6 +74,22 @@ DetectSmbiosVersion (
                              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
@@ -72,5 +98,10 @@ DetectSmbiosVersion (
     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