aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2013-02-09 13:07:23 -0500
committerKevin O'Connor <kevin@koconnor.net>2013-02-12 21:04:29 -0500
commit7b5bc504ad258228a8571f35ab2f995eea89dc16 (patch)
treeb025faa13269861982196eb948793396fb9feb42
parent897fb1133054e9f1e02931ad782223f40485837e (diff)
downloadseabios-7b5bc504ad258228a8571f35ab2f995eea89dc16.tar.gz
Convert kvm_para_available() to runningOnKVM().
Make the KVM detection code use the same format as the QEMU/Xen detection code. Also, log when KVM is detected. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--src/paravirt.c27
-rw-r--r--src/paravirt.h28
2 files changed, 30 insertions, 25 deletions
diff --git a/src/paravirt.c b/src/paravirt.c
index 73b06ca..7080c7f 100644
--- a/src/paravirt.c
+++ b/src/paravirt.c
@@ -21,6 +21,30 @@
int qemu_cfg_present;
+/* This CPUID returns the signature 'KVMKVMKVM' in ebx, ecx, and edx. It
+ * should be used to determine that a VM is running under KVM.
+ */
+#define KVM_CPUID_SIGNATURE 0x40000000
+
+static void kvm_preinit(void)
+{
+ if (!CONFIG_QEMU)
+ return;
+ unsigned int eax, ebx, ecx, edx;
+ char signature[13];
+
+ cpuid(KVM_CPUID_SIGNATURE, &eax, &ebx, &ecx, &edx);
+ memcpy(signature + 0, &ebx, 4);
+ memcpy(signature + 4, &ecx, 4);
+ memcpy(signature + 8, &edx, 4);
+ signature[12] = 0;
+
+ if (strcmp(signature, "KVMKVMKVM") == 0) {
+ dprintf(1, "Running on KVM\n");
+ PlatformRunningOn |= PF_KVM;
+ }
+}
+
void
qemu_ramsize_preinit(void)
{
@@ -28,6 +52,7 @@ qemu_ramsize_preinit(void)
return;
PlatformRunningOn = PF_QEMU;
+ kvm_preinit();
// On emulators, get memory size from nvram.
u32 rs = ((inb_cmos(CMOS_MEM_EXTMEM2_LOW) << 16)
@@ -60,7 +85,7 @@ qemu_ramsize_preinit(void)
qemu_cfg_e820_load_next(&entry);
add_e820(entry.address, entry.length, entry.type);
}
- } else if (kvm_para_available()) {
+ } else if (runningOnKVM()) {
// Backwards compatibility - provide hard coded range.
// 4 pages before the bios, 3 pages for vmx tss pages, the
// other page for EPT real mode pagetable
diff --git a/src/paravirt.h b/src/paravirt.h
index 62b1664..208d0fb 100644
--- a/src/paravirt.h
+++ b/src/paravirt.h
@@ -2,12 +2,12 @@
#define __PV_H
#include "config.h" // CONFIG_*
-#include "util.h" // memcpy
#include "biosvar.h" // GET_GLOBAL
// Types of paravirtualized platforms.
#define PF_QEMU (1<<0)
#define PF_XEN (1<<1)
+#define PF_KVM (1<<2)
// misc.c
extern int PlatformRunningOn;
@@ -19,31 +19,11 @@ static inline int runningOnQEMU(void) {
static inline int runningOnXen(void) {
return CONFIG_XEN && GET_GLOBAL(PlatformRunningOn) & PF_XEN;
}
-
-/* This CPUID returns the signature 'KVMKVMKVM' in ebx, ecx, and edx. It
- * should be used to determine that a VM is running under KVM.
- */
-#define KVM_CPUID_SIGNATURE 0x40000000
-
-static inline int kvm_para_available(void)
-{
- if (!CONFIG_QEMU)
- return 0;
- unsigned int eax, ebx, ecx, edx;
- char signature[13];
-
- cpuid(KVM_CPUID_SIGNATURE, &eax, &ebx, &ecx, &edx);
- memcpy(signature + 0, &ebx, 4);
- memcpy(signature + 4, &ecx, 4);
- memcpy(signature + 8, &edx, 4);
- signature[12] = 0;
-
- if (strcmp(signature, "KVMKVMKVM") == 0)
- return 1;
-
- return 0;
+static inline int runningOnKVM(void) {
+ return CONFIG_QEMU && GET_GLOBAL(PlatformRunningOn) & PF_KVM;
}
+// QEMU "firmware config (fw_cfg)" interface
#define QEMU_CFG_SIGNATURE 0x00
#define QEMU_CFG_ID 0x01
#define QEMU_CFG_UUID 0x02