-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 80678 b: refs/heads/master c: 5f43238 h: refs/heads/master v: v3
- Loading branch information
Christian Borntraeger
authored and
Avi Kivity
committed
Jan 30, 2008
1 parent
569be10
commit 8e04a14
Showing
3 changed files
with
118 additions
and
94 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 8c392696e749171531d155ea5cefdfc1c970fd18 | ||
refs/heads/master: 5f43238d036fb30e73563e81e42d9c6f1de5551a |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
#ifndef __X86_KVM_PARA_H | ||
#define __X86_KVM_PARA_H | ||
|
||
/* 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 | ||
|
||
/* This CPUID returns a feature bitmap in eax. Before enabling a particular | ||
* paravirtualization, the appropriate feature bit should be checked. | ||
*/ | ||
#define KVM_CPUID_FEATURES 0x40000001 | ||
|
||
#ifdef __KERNEL__ | ||
#include <asm/processor.h> | ||
|
||
/* This instruction is vmcall. On non-VT architectures, it will generate a | ||
* trap that we will then rewrite to the appropriate instruction. | ||
*/ | ||
#define KVM_HYPERCALL ".byte 0x0f,0x01,0xc1" | ||
|
||
/* For KVM hypercalls, a three-byte sequence of either the vmrun or the vmmrun | ||
* instruction. The hypervisor may replace it with something else but only the | ||
* instructions are guaranteed to be supported. | ||
* | ||
* Up to four arguments may be passed in rbx, rcx, rdx, and rsi respectively. | ||
* The hypercall number should be placed in rax and the return value will be | ||
* placed in rax. No other registers will be clobbered unless explicited | ||
* noted by the particular hypercall. | ||
*/ | ||
|
||
static inline long kvm_hypercall0(unsigned int nr) | ||
{ | ||
long ret; | ||
asm volatile(KVM_HYPERCALL | ||
: "=a"(ret) | ||
: "a"(nr)); | ||
return ret; | ||
} | ||
|
||
static inline long kvm_hypercall1(unsigned int nr, unsigned long p1) | ||
{ | ||
long ret; | ||
asm volatile(KVM_HYPERCALL | ||
: "=a"(ret) | ||
: "a"(nr), "b"(p1)); | ||
return ret; | ||
} | ||
|
||
static inline long kvm_hypercall2(unsigned int nr, unsigned long p1, | ||
unsigned long p2) | ||
{ | ||
long ret; | ||
asm volatile(KVM_HYPERCALL | ||
: "=a"(ret) | ||
: "a"(nr), "b"(p1), "c"(p2)); | ||
return ret; | ||
} | ||
|
||
static inline long kvm_hypercall3(unsigned int nr, unsigned long p1, | ||
unsigned long p2, unsigned long p3) | ||
{ | ||
long ret; | ||
asm volatile(KVM_HYPERCALL | ||
: "=a"(ret) | ||
: "a"(nr), "b"(p1), "c"(p2), "d"(p3)); | ||
return ret; | ||
} | ||
|
||
static inline long kvm_hypercall4(unsigned int nr, unsigned long p1, | ||
unsigned long p2, unsigned long p3, | ||
unsigned long p4) | ||
{ | ||
long ret; | ||
asm volatile(KVM_HYPERCALL | ||
: "=a"(ret) | ||
: "a"(nr), "b"(p1), "c"(p2), "d"(p3), "S"(p4)); | ||
return ret; | ||
} | ||
|
||
static inline int kvm_para_available(void) | ||
{ | ||
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 unsigned int kvm_arch_para_features(void) | ||
{ | ||
return cpuid_eax(KVM_CPUID_FEATURES); | ||
} | ||
|
||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,110 +1,29 @@ | ||
#ifndef __LINUX_KVM_PARA_H | ||
#define __LINUX_KVM_PARA_H | ||
|
||
/* This CPUID returns the signature 'KVMKVMKVM' in ebx, ecx, and edx. It | ||
* should be used to determine that a VM is running under KVM. | ||
/* | ||
* This header file provides a method for making a hypercall to the host | ||
* Architectures should define: | ||
* - kvm_hypercall0, kvm_hypercall1... | ||
* - kvm_arch_para_features | ||
* - kvm_para_available | ||
*/ | ||
#define KVM_CPUID_SIGNATURE 0x40000000 | ||
|
||
/* This CPUID returns a feature bitmap in eax. Before enabling a particular | ||
* paravirtualization, the appropriate feature bit should be checked. | ||
*/ | ||
#define KVM_CPUID_FEATURES 0x40000001 | ||
|
||
/* Return values for hypercalls */ | ||
#define KVM_ENOSYS 1000 | ||
|
||
#ifdef __KERNEL__ | ||
#include <asm/processor.h> | ||
|
||
/* This instruction is vmcall. On non-VT architectures, it will generate a | ||
* trap that we will then rewrite to the appropriate instruction. | ||
*/ | ||
#define KVM_HYPERCALL ".byte 0x0f,0x01,0xc1" | ||
|
||
/* For KVM hypercalls, a three-byte sequence of either the vmrun or the vmmrun | ||
* instruction. The hypervisor may replace it with something else but only the | ||
* instructions are guaranteed to be supported. | ||
* | ||
* Up to four arguments may be passed in rbx, rcx, rdx, and rsi respectively. | ||
* The hypercall number should be placed in rax and the return value will be | ||
* placed in rax. No other registers will be clobbered unless explicited | ||
* noted by the particular hypercall. | ||
/* | ||
* hypercalls use architecture specific | ||
*/ | ||
|
||
static inline long kvm_hypercall0(unsigned int nr) | ||
{ | ||
long ret; | ||
asm volatile(KVM_HYPERCALL | ||
: "=a"(ret) | ||
: "a"(nr)); | ||
return ret; | ||
} | ||
|
||
static inline long kvm_hypercall1(unsigned int nr, unsigned long p1) | ||
{ | ||
long ret; | ||
asm volatile(KVM_HYPERCALL | ||
: "=a"(ret) | ||
: "a"(nr), "b"(p1)); | ||
return ret; | ||
} | ||
|
||
static inline long kvm_hypercall2(unsigned int nr, unsigned long p1, | ||
unsigned long p2) | ||
{ | ||
long ret; | ||
asm volatile(KVM_HYPERCALL | ||
: "=a"(ret) | ||
: "a"(nr), "b"(p1), "c"(p2)); | ||
return ret; | ||
} | ||
|
||
static inline long kvm_hypercall3(unsigned int nr, unsigned long p1, | ||
unsigned long p2, unsigned long p3) | ||
{ | ||
long ret; | ||
asm volatile(KVM_HYPERCALL | ||
: "=a"(ret) | ||
: "a"(nr), "b"(p1), "c"(p2), "d"(p3)); | ||
return ret; | ||
} | ||
|
||
static inline long kvm_hypercall4(unsigned int nr, unsigned long p1, | ||
unsigned long p2, unsigned long p3, | ||
unsigned long p4) | ||
{ | ||
long ret; | ||
asm volatile(KVM_HYPERCALL | ||
: "=a"(ret) | ||
: "a"(nr), "b"(p1), "c"(p2), "d"(p3), "S"(p4)); | ||
return ret; | ||
} | ||
|
||
static inline int kvm_para_available(void) | ||
{ | ||
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; | ||
} | ||
#include <asm/kvm_para.h> | ||
|
||
static inline int kvm_para_has_feature(unsigned int feature) | ||
{ | ||
if (cpuid_eax(KVM_CPUID_FEATURES) & (1UL << feature)) | ||
if (kvm_arch_para_features() & (1UL << feature)) | ||
return 1; | ||
return 0; | ||
} | ||
#endif /* __KERNEL__ */ | ||
#endif /* __LINUX_KVM_PARA_H */ | ||
|
||
#endif | ||
|
||
#endif |