diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2013-02-09 13:07:23 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2013-02-12 21:04:29 -0500 |
commit | 7b5bc504ad258228a8571f35ab2f995eea89dc16 (patch) | |
tree | b025faa13269861982196eb948793396fb9feb42 | |
parent | 897fb1133054e9f1e02931ad782223f40485837e (diff) | |
download | seabios-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.c | 27 | ||||
-rw-r--r-- | src/paravirt.h | 28 |
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 |