[SeaBIOS] [PATCH 3/3] POST: Merge platform preinit() calls.

Kevin O'Connor kevin at koconnor.net
Mon Jan 21 18:59:46 CET 2013


Xen and QEMU had multiple platform preinit() calls that were invoked
right after each other.  Merge these together.  This simplifies the
preinit code.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/coreboot.c |  6 ++----
 src/paravirt.c | 10 ++++++++--
 src/paravirt.h |  3 +--
 src/post.c     | 38 ++++++++++++++------------------------
 src/xen.c      | 57 ++++++++++++++++++++++++++++-----------------------------
 src/xen.h      |  1 -
 6 files changed, 53 insertions(+), 62 deletions(-)

diff --git a/src/coreboot.c b/src/coreboot.c
index 5d013cf..9f695ad 100644
--- a/src/coreboot.c
+++ b/src/coreboot.c
@@ -125,6 +125,8 @@ const char *CBvendor = "", *CBpart = "";
 void
 coreboot_preinit(void)
 {
+    if (!CONFIG_COREBOOT)
+        return;
     dprintf(3, "Attempting to find coreboot table\n");
 
     // Find coreboot table.
@@ -165,10 +167,6 @@ coreboot_preinit(void)
     RamSize = maxram;
     RamSizeOver4G = maxram_over4G;
 
-    // Ughh - coreboot likes to set a map at 0x0000-0x1000, but this
-    // confuses grub.  So, override it.
-    add_e820(0, 16*1024, E820_RAM);
-
     struct cb_mainboard *cbmb = find_cb_subtable(cbh, CB_TAG_MAINBOARD);
     if (cbmb) {
         CBvendor = &cbmb->strings[cbmb->vendor_idx];
diff --git a/src/paravirt.c b/src/paravirt.c
index 9022186..5cfda66 100644
--- a/src/paravirt.c
+++ b/src/paravirt.c
@@ -18,12 +18,16 @@
 #include "acpi.h" // acpi_setup
 #include "mptable.h" // mptable_setup
 #include "pci.h" // create_pirtable
+#include "xen.h" // usingXen
 
 int qemu_cfg_present;
 
-void
+static void
 qemu_ramsize_preinit(void)
 {
+    if (CONFIG_COREBOOT || usingXen())
+        return;
+
     // On emulators, get memory size from nvram.
     u32 rs = ((inb_cmos(CMOS_MEM_EXTMEM2_LOW) << 16)
               | (inb_cmos(CMOS_MEM_EXTMEM2_HIGH) << 24));
@@ -98,7 +102,7 @@ qemu_cfg_read_entry(void *buf, int e, int len)
     qemu_cfg_read(buf, len);
 }
 
-void qemu_cfg_preinit(void)
+void qemu_preinit(void)
 {
     char *sig = "QEMU";
     int i;
@@ -116,6 +120,8 @@ void qemu_cfg_preinit(void)
             break;
         }
     dprintf(4, "qemu_cfg_present=%d\n", qemu_cfg_present);
+
+    qemu_ramsize_preinit();
 }
 
 void qemu_cfg_get_uuid(u8 *uuid)
diff --git a/src/paravirt.h b/src/paravirt.h
index 4f2d5b8..04ebde5 100644
--- a/src/paravirt.h
+++ b/src/paravirt.h
@@ -43,9 +43,8 @@ static inline int kvm_para_available(void)
 
 extern int qemu_cfg_present;
 
-void qemu_ramsize_preinit(void);
 void qemu_biostable_setup(void);
-void qemu_cfg_preinit(void);
+void qemu_preinit(void);
 int qemu_cfg_show_boot_menu(void);
 void qemu_cfg_get_uuid(u8 *uuid);
 int qemu_cfg_irq0_override(void);
diff --git a/src/post.c b/src/post.c
index e5435b1..ef67743 100644
--- a/src/post.c
+++ b/src/post.c
@@ -234,26 +234,6 @@ maininit(void)
  * Early initialization (preinit) and code relocation
  ****************************************************************/
 
-static void
-ramsize_preinit(void)
-{
-    dprintf(3, "Find memory size\n");
-    if (CONFIG_COREBOOT)
-        coreboot_preinit();
-    else if (usingXen())
-        xen_ramsize_preinit();
-    else
-        qemu_ramsize_preinit();
-
-    // Don't declare any memory between 0xa0000 and 0x100000
-    add_e820(BUILD_LOWRAM_END, BUILD_BIOS_ADDR-BUILD_LOWRAM_END, E820_HOLE);
-
-    // Mark known areas as reserved.
-    add_e820(BUILD_BIOS_ADDR, BUILD_BIOS_SIZE, E820_RESERVED);
-
-    dprintf(1, "Ram Size=0x%08x (0x%016llx high)\n", RamSize, RamSizeOver4G);
-}
-
 // Update given relocs for the code at 'dest' with a given 'delta'
 static void
 updateRelocs(void *dest, u32 *rstart, u32 *rend, u32 delta)
@@ -310,12 +290,22 @@ preinit(void)
     HaveRunPost = 1;
     outb_cmos(0, CMOS_RESET_CODE);
 
-    // Check if we are running under Xen.
+    // Run platform preinit calls.
+    coreboot_preinit();
     xen_preinit();
+    qemu_preinit();
+    dprintf(1, "Ram Size=0x%08x (0x%016llx high)\n", RamSize, RamSizeOver4G);
+
+    // The first 1 megabyte of the e820 map is "magic".  Various
+    // programs expect to see (and will crash if they don't):
+    // 00000-9fc00=RAM, 9fc00-a0000=RESERVED, f0000-100000=RESERVED.
+    // Force the e820 map to show this (the ebda e820 entry is added
+    // in init_bda).
+    add_e820(0, BUILD_LOWRAM_END, E820_RAM);
+    add_e820(BUILD_LOWRAM_END, BUILD_BIOS_ADDR-BUILD_LOWRAM_END, E820_HOLE);
+    add_e820(BUILD_BIOS_ADDR, BUILD_BIOS_SIZE, E820_RESERVED);
 
-    // Detect ram and setup internal malloc.
-    qemu_cfg_preinit();
-    ramsize_preinit();
+    // Setup malloc.
     malloc_preinit();
 
     // Relocate initialization code.
diff --git a/src/xen.c b/src/xen.c
index c9759f0..525039d 100644
--- a/src/xen.c
+++ b/src/xen.c
@@ -76,8 +76,35 @@ void xen_preinit(void)
             break;
         }
     }
-    if (!xen_cpuid_base)
+    if (!xen_cpuid_base) {
         dprintf(1, "No Xen hypervisor found.\n");
+        return;
+    }
+
+    u64 maxram = 0, maxram_over4G = 0;
+    struct xen_seabios_info *info = (void *)INFO_PHYSICAL_ADDRESS;
+    validate_info(info);
+
+    dprintf(1, "xen: copy e820...\n");
+
+    struct e820entry *e820 = (struct e820entry *)info->e820;
+    int i;
+    for (i = 0; i < info->e820_nr; i++) {
+        struct e820entry *e = &e820[i];
+        if (e->type == E820_ACPI || e->type == E820_RAM) {
+            u64 end = e->start + e->size;
+            if (end > 0x100000000ull) {
+                end -= 0x100000000ull;
+                if (end > maxram_over4G)
+                    maxram_over4G = end;
+            } else if (end > maxram)
+                maxram = end;
+        }
+        add_e820(e->start, e->size, e->type);
+    }
+
+    RamSize = maxram;
+    RamSizeOver4G = maxram_over4G;
 }
 
 static int hypercall_xen_version( int cmd, void *arg)
@@ -121,31 +148,3 @@ void xen_biostable_setup(void)
     for (i=0; i<info->tables_nr; i++)
         copy_table(tables[i]);
 }
-
-void xen_ramsize_preinit(void)
-{
-    u64 maxram = 0, maxram_over4G = 0;
-    int i;
-    struct xen_seabios_info *info = (void *)INFO_PHYSICAL_ADDRESS;
-    struct e820entry *e820 = (struct e820entry *)info->e820;
-    validate_info(info);
-
-    dprintf(1, "xen: copy e820...\n");
-
-    for (i = 0; i < info->e820_nr; i++) {
-        struct e820entry *e = &e820[i];
-        if (e->type == E820_ACPI || e->type == E820_RAM) {
-            u64 end = e->start + e->size;
-            if (end > 0x100000000ull) {
-                end -= 0x100000000ull;
-                if (end > maxram_over4G)
-                    maxram_over4G = end;
-            } else if (end > maxram)
-                maxram = end;
-        }
-        add_e820(e->start, e->size, e->type);
-    }
-
-    RamSize = maxram;
-    RamSizeOver4G = maxram_over4G;
-}
diff --git a/src/xen.h b/src/xen.h
index 9b4178a..2be2453 100644
--- a/src/xen.h
+++ b/src/xen.h
@@ -7,7 +7,6 @@
 extern u32 xen_cpuid_base;
 
 void xen_preinit(void);
-void xen_ramsize_preinit(void);
 void xen_hypercall_setup(void);
 void xen_biostable_setup(void);
 
-- 
1.7.11.7




More information about the SeaBIOS mailing list