]> xenbits.xensource.com Git - seabios.git/commitdiff
biostables: support looking up RSDP
authorMichael S. Tsirkin <mst@redhat.com>
Thu, 3 Oct 2013 13:30:35 +0000 (16:30 +0300)
committerGerd Hoffmann <kraxel@redhat.com>
Wed, 6 Nov 2013 11:24:57 +0000 (12:24 +0100)
Will be used when it's loaded from QEMU.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
src/fw/biostables.c
src/util.h

index a3ee827fc7f854cead4cf6efbd6fa9eed00d3a28..c7d498dc31ec96ae0b0726c05095f19a6f43fa48 100644 (file)
@@ -60,22 +60,35 @@ copy_mptable(void *pos)
     memcpy((void*)newpos + length, (void*)p->physaddr, mpclength);
 }
 
-static void
-copy_acpi_rsdp(void *pos)
+static int
+get_acpi_rsdp_length(void *pos, unsigned size)
 {
-    if (RsdpAddr)
-        return;
     struct rsdp_descriptor *p = pos;
     if (p->signature != RSDP_SIGNATURE)
-        return;
+        return -1;
     u32 length = 20;
+    if (length > size)
+        return -1;
     if (checksum(pos, length) != 0)
-        return;
+        return -1;
     if (p->revision > 1) {
         length = p->length;
+        if (length > size)
+            return -1;
         if (checksum(pos, length) != 0)
-            return;
+            return -1;
     }
+    return length;
+}
+
+static void
+copy_acpi_rsdp(void *pos)
+{
+    if (RsdpAddr)
+        return;
+    int length = get_acpi_rsdp_length(pos, -1);
+    if (length < 0)
+        return;
     void *newpos = malloc_fseg(length);
     if (!newpos) {
         warn_noalloc();
@@ -118,3 +131,17 @@ copy_table(void *pos)
     copy_acpi_rsdp(pos);
     copy_smbios(pos);
 }
+
+void *find_acpi_rsdp(void)
+{
+    extern u8 zonefseg_start[], zonefseg_end[];
+    unsigned long start = (unsigned long)zonefseg_start;
+    unsigned long end = (unsigned long)zonefseg_end;
+    unsigned long pos;
+
+    for (pos = ALIGN(start, 0x10); pos <= ALIGN_DOWN(end, 0x10); pos += 0x10)
+        if (get_acpi_rsdp_length((void *)pos, end - pos) >= 0)
+            return (void *)pos;
+
+    return NULL;
+}
index c9d463dca9047bd57636b346a6ea23322206d424..e6a6cb5255e60870399592add74eaa0d5017af77 100644 (file)
@@ -73,6 +73,7 @@ void acpi_reboot(void);
 // fw/biostable.c
 void copy_smbios(void *pos);
 void copy_table(void *pos);
+void *find_acpi_rsdp(void);
 
 // fw/coreboot.c
 extern const char *CBvendor, *CBpart;