Christian Borntraeger wrote: > > I agree. It seems I can simply remove the kvm_hypercall macro. > > Here is the updated patch (without the s390 parts. Will send them later > when ready) and the changes mentioned above. > > Avi, Anthony, comments? >
It looks good to me. Regards, Anthony Liguori > [PATCH/RFC] Per-architecture hypercall definitions > > Currently kvm provides hypercalls only for x86* architectures. To > provide hypercall infrastructure for other kvm architectures I split > kvm_para.h into a generic header file and architecture specific > definitions. > > Signed-off-by: Christian Borntraeger <[EMAIL PROTECTED]> > > Index: kvm/include/asm-x86/kvm_para.h > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ kvm/include/asm-x86/kvm_para.h 2007-10-11 15:41:24.000000000 +0200 > @@ -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 > Index: kvm/include/linux/kvm_para.h > =================================================================== > --- kvm.orig/include/linux/kvm_para.h 2007-10-11 13:28:46.000000000 +0200 > +++ kvm/include/linux/kvm_para.h 2007-10-11 15:41:53.000000000 +0200 > @@ -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 > > > > ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel