[SeaBIOS] [PATCH 2/5] Introduce framework for detecting what platform SeaBIOS is running on.

Kevin O'Connor kevin at koconnor.net
Fri Feb 8 06:07:56 CET 2013


Introduce startedOnQEMU()/startedOnCoreboot()/etc. calls to enable
code to determine what platform invoked the initial SeaBIOS startup.
Also introduce runningOnQEMU()/etc. calls for cases where SeaBIOS can
detect it is running on a platform even though it wasn't directly
launched by that platform (eg, Xen may have started SeaBIOS, but Xen
may be running under qemu).

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/coreboot.c |  3 ++
 src/csm.c      |  2 ++
 src/paravirt.c | 10 +++++--
 src/paravirt.h | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 src/xen.c      |  1 +
 5 files changed, 104 insertions(+), 5 deletions(-)

diff --git a/src/coreboot.c b/src/coreboot.c
index 57c9737..40a7e72 100644
--- a/src/coreboot.c
+++ b/src/coreboot.c
@@ -12,6 +12,7 @@
 #include "boot.h" // boot_add_cbfs
 #include "disk.h" // MAXDESCSIZE
 #include "config.h" // CONFIG_*
+#include "paravirt.h" // PlatformStartedOn
 
 
 /****************************************************************
@@ -145,6 +146,8 @@ coreboot_preinit(void)
     if (!cbm)
         goto fail;
 
+    PlatformStartedOn = PlatformRunningOn = PF_COREBOOT;
+
     u64 maxram = 0, maxram_over4G = 0;
     int i, count = MEM_RANGE_COUNT(cbm);
     for (i=0; i<count; i++) {
diff --git a/src/csm.c b/src/csm.c
index 169b608..c8069d2 100644
--- a/src/csm.c
+++ b/src/csm.c
@@ -17,6 +17,7 @@
 #include "boot.h"
 #include "smbios.h"
 #include "pic.h"
+#include "paravirt.h" // PlatformStartedOn
 
 struct rsdp_descriptor VAR32FLATVISIBLE __aligned(16) csm_rsdp;
 
@@ -74,6 +75,7 @@ handle_csm_0000(struct bregs *regs)
     dprintf(3, "LoPmmMemory     %08x\n", csm_init_table->LowPmmMemory);
     dprintf(3, "LoPmmMemorySize %08x\n", csm_init_table->LowPmmMemorySizeInBytes);
 
+    PlatformStartedOn = PlatformRunningOn = PF_CSM;
     csm_malloc_preinit(csm_init_table->LowPmmMemory,
                        csm_init_table->LowPmmMemorySizeInBytes,
                        csm_init_table->HiPmmMemory,
diff --git a/src/paravirt.c b/src/paravirt.c
index ebab256..35b7c11 100644
--- a/src/paravirt.c
+++ b/src/paravirt.c
@@ -19,6 +19,8 @@
 #include "mptable.h" // mptable_setup
 #include "pci.h" // create_pirtable
 
+int PlatformStartedOn, PlatformRunningOn;
+
 int qemu_cfg_present;
 
 void
@@ -27,6 +29,7 @@ qemu_preinit(void)
     if (!CONFIG_QEMU)
         return;
 
+    PlatformStartedOn = PlatformRunningOn = PF_QEMU;
     qemu_cfg_preinit();
 
     // On emulators, get memory size from nvram.
@@ -108,12 +111,13 @@ qemu_cfg_read_entry(void *buf, int e, int len)
 
 void qemu_cfg_preinit(void)
 {
+    if (!CONFIG_QEMU)
+        return;
+    PlatformRunningOn |= PF_QEMU;
+
     char *sig = "QEMU";
     int i;
 
-    if (CONFIG_COREBOOT)
-        return;
-
     qemu_cfg_present = 1;
 
     qemu_cfg_select(QEMU_CFG_SIGNATURE);
diff --git a/src/paravirt.h b/src/paravirt.h
index 2448993..3b00697 100644
--- a/src/paravirt.h
+++ b/src/paravirt.h
@@ -1,8 +1,97 @@
 #ifndef __PV_H
 #define __PV_H
 
-#include "config.h" // CONFIG_COREBOOT
-#include "util.h"
+#include "config.h" // CONFIG_*
+#include "util.h" // memcpy
+
+
+/****************************************************************
+ * Current platform detection
+ ****************************************************************/
+
+#define PF_QEMU     (1<<0)
+#define PF_COREBOOT (1<<1)
+#define PF_XEN      (1<<2)
+#define PF_CSM      (1<<3)
+
+extern int PlatformStartedOn, PlatformRunningOn;
+
+static inline int startedOnQEMU(void)
+{
+    if (!CONFIG_QEMU)
+        return 0;
+    if (!CONFIG_COREBOOT && !CONFIG_XEN && !CONFIG_CSM)
+        return 1;
+    return PlatformStartedOn == PF_QEMU;
+}
+
+static inline int startedOnCoreboot(void)
+{
+    if (!CONFIG_COREBOOT)
+        return 0;
+    if (!CONFIG_QEMU && !CONFIG_XEN && !CONFIG_CSM)
+        return 1;
+    return PlatformStartedOn == PF_COREBOOT;
+}
+
+static inline int startedOnXen(void)
+{
+    if (!CONFIG_XEN)
+        return 0;
+    if (!CONFIG_QEMU && !CONFIG_COREBOOT && !CONFIG_CSM)
+        return 1;
+    return PlatformStartedOn == PF_XEN;
+}
+
+static inline int startedOnCSM(void)
+{
+    if (!CONFIG_CSM)
+        return 0;
+    if (!CONFIG_QEMU && !CONFIG_COREBOOT && !CONFIG_XEN)
+        return 1;
+    return PlatformStartedOn == PF_CSM;
+}
+
+static inline int runningOnQEMU(void)
+{
+    if (!CONFIG_QEMU)
+        return 0;
+    if (!CONFIG_COREBOOT && !CONFIG_XEN && !CONFIG_CSM)
+        return 1;
+    return PlatformRunningOn & PF_QEMU;
+}
+
+static inline int runningOnCoreboot(void)
+{
+    if (!CONFIG_COREBOOT)
+        return 0;
+    if (!CONFIG_QEMU && !CONFIG_XEN && !CONFIG_CSM)
+        return 1;
+    return PlatformRunningOn & PF_COREBOOT;
+}
+
+static inline int runningOnXen(void)
+{
+    if (!CONFIG_XEN)
+        return 0;
+    if (!CONFIG_QEMU && !CONFIG_COREBOOT && !CONFIG_CSM)
+        return 1;
+    return PlatformRunningOn & PF_XEN;
+}
+
+static inline int runningOnCSM(void)
+{
+    if (!CONFIG_CSM)
+        return 0;
+    if (!CONFIG_QEMU && !CONFIG_COREBOOT && !CONFIG_XEN)
+        return 1;
+    return PlatformRunningOn & PF_CSM;
+}
+
+
+/****************************************************************
+ * KVM/QEMU firmware
+ ****************************************************************/
 
 /* This CPUID returns the signature 'KVMKVMKVM' in ebx, ecx, and edx.  It
  * should be used to determine that a VM is running under KVM.
diff --git a/src/xen.c b/src/xen.c
index a506b42..5122a3c 100644
--- a/src/xen.c
+++ b/src/xen.c
@@ -81,6 +81,7 @@ void xen_preinit(void)
         return;
     }
 
+    PlatformStartedOn = PlatformRunningOn = PF_XEN;
     qemu_cfg_preinit();
 
     u64 maxram = 0, maxram_over4G = 0;
-- 
1.7.11.7




More information about the SeaBIOS mailing list