grml...
[seabios.git] / src / biostables.c
index 21b85734bb3c5a1d9b85c3da3481802e5da9545f..57a5c5753b446ef46d6d835dd4031d7b53ffa432 100644 (file)
@@ -9,6 +9,7 @@
 #include "pci.h" // struct pir_header
 #include "acpi.h" // struct rsdp_descriptor
 #include "mptable.h" // MPTABLE_SIGNATURE
+#include "smbios.h" // struct smbios_entry_point
 
 void
 copy_pir(void *pos)
@@ -81,3 +82,27 @@ copy_acpi_rsdp(void *pos)
     memcpy(newpos, pos, length);
     RsdpAddr = newpos;
 }
+
+void
+copy_smbios(void *pos)
+{
+    if (SMBiosAddr)
+        return;
+    struct smbios_entry_point *p = pos;
+    if (memcmp(p->anchor_string, "_SM_", 4))
+        return;
+    if (checksum(pos, 0x10) != 0)
+        return;
+    if (memcmp(p->intermediate_anchor_string, "_DMI_", 5))
+        return;
+    if (checksum(pos+0x10, p->length-0x10) != 0)
+        return;
+    struct smbios_entry_point *newpos = malloc_fseg(p->length);
+    if (!newpos) {
+        warn_noalloc();
+        return;
+    }
+    dprintf(1, "Copying SMBIOS entry point from %p to %p\n", pos, newpos);
+    memcpy(newpos, pos, p->length);
+    SMBiosAddr = newpos;
+}