Christian Borntraeger wrote: > --- > include/asm-s390/kvm_para.h | 128 > ++++++++++++++++++++++++++++++++++++++++++++ > include/asm-x86/kvm_para.h | 110 +++++++++++++++++++++++++++++++++++++ > include/linux/kvm_para.h | 112 ++++---------------------------------- > 3 files changed, 251 insertions(+), 99 deletions(-) > > 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 14:05:25.000000000 +0200 > @@ -0,0 +1,108 @@ > +#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 > + > +/* Return values for hypercalls */ > +#define KVM_ENOSYS 1000 >
errno's can probably be in common code, right? > > +#define kvm_hypercall(nr_params, args...) \ > +({ \ > + long __ret; \ > + \ > + __ret = kvm_hypercall##nr_params(args); \ > + \ > + __ret; \ > +}) > Why store results to a variable? It would also probably be better to use the C99 variadic macro format which would be: #define kvm_hypercall(nr_params, ...) kvm_hypercall##nr_params(__VA_ARGS__) I originally had one of these in my paravirt_ops implementation but quickly found that the code it produced was pretty ugly. I think: kvm_hypercall0(KVM_HYPERCALL_FOO); Is a lot more understandable than: kvm_hypercall(0, KVM_HYPERCALL_FOO); It's much harder to guess with the later what the significance of the first parameter is. Regards, Anthony Liguori > +#endif > #endif > Index: kvm/include/asm-s390/kvm_para.h > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ kvm/include/asm-s390/kvm_para.h 2007-10-11 14:09:12.000000000 +0200 > @@ -0,0 +1,146 @@ > +#ifndef __S390_KVM_PARA_H > +#define __S390_KVM_PARA_H > + > +/* > + * This is subject to change: > + * > + * Hypercalls for KVM on s390. The calling convention is similar to the > + * s390 ABI, so we use R2-R6 for parameters 1-5. In addition we use R1 > + * as hypercall number and R7 as parameter 6. The return value is > + * written to R2. We use the diagnose instruction as hypercall. To avoid > + * conflicts with existing diagnoses for LPAR and z/VM, we do not use > + * the instruction encoded number, but specify the number in R1 and > + * use 0xBB as KVM diagnose number. > + * > + * Copyright 2007, IBM Corp. > + * Author(s) Christian Borntraeger <[EMAIL PROTECTED]> > + * > + * This work is licensed under the terms of the GNU GPL, version 2. > + */ > + > +static inline long kvm_hypercall0(unsigned long nr) > +{ > + register unsigned long __nr asm("1") = nr; > + register long __rc asm("2"); > + > + asm volatile ("diag 2,4,0xBB\n" > + : "=d" (__rc) : "d" (__nr): "memory", "cc"); > + return __rc; > +} > + > +static inline long kvm_hypercall1(unsigned long nr, unsigned long p1) > +{ > + register unsigned long __nr asm("1") = nr; > + register unsigned long __p1 asm("2") = p1; > + register long __rc asm("2"); > + > + asm volatile ("diag 2,4,0xBB\n" > + : "=d" (__rc) : "d" (__nr), "0" (__p1) : "memory", "cc"); > + return __rc; > +} > + > +static inline long kvm_hypercall2(unsigned long nr, unsigned long p1, > + unsigned long p2) > +{ > + register unsigned long __nr asm("1") = nr; > + register unsigned long __p1 asm("2") = p1; > + register unsigned long __p2 asm("3") = p2; > + register long __rc asm("2"); > + > + asm volatile ("diag 2,4,0xBB\n" > + : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2) > + : "memory", "cc"); > + return __rc; > +} > + > +static inline long kvm_hypercall3(unsigned long nr, unsigned long p1, > + unsigned long p2, unsigned long p3) > +{ > + register unsigned long __nr asm("1") = nr; > + register unsigned long __p1 asm("2") = p1; > + register unsigned long __p2 asm("3") = p2; > + register unsigned long __p3 asm("4") = p3; > + register long __rc asm("2"); > + > + asm volatile ("diag 2,4,0xBB\n" > + : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2), > + "d" (__p3) : "memory", "cc"); > + return __rc; > +} > + > + > +static inline long kvm_hypercall4(unsigned long nr, unsigned long p1, > + unsigned long p2, unsigned long p3, > + unsigned long p4) > +{ > + register unsigned long __nr asm("1") = nr; > + register unsigned long __p1 asm("2") = p1; > + register unsigned long __p2 asm("3") = p2; > + register unsigned long __p3 asm("4") = p3; > + register unsigned long __p4 asm("5") = p4; > + register long __rc asm("2"); > + > + asm volatile ("diag 2,4,0xBB\n" > + : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2), > + "d" (__p3), "d" (__p4) : "memory", "cc"); > + return __rc; > +} > + > +static inline long kvm_hypercall5(unsigned long nr, unsigned long p1, > + unsigned long p2, unsigned long p3, > + unsigned long p4, unsigned long p5) > +{ > + register unsigned long __nr asm("1") = nr; > + register unsigned long __p1 asm("2") = p1; > + register unsigned long __p2 asm("3") = p2; > + register unsigned long __p3 asm("4") = p3; > + register unsigned long __p4 asm("5") = p4; > + register unsigned long __p5 asm("6") = p5; > + register long __rc asm("2"); > + > + asm volatile ("diag 2,4,0xBB\n" > + : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2), > + "d" (__p3), "d" (__p4), "d" (__p5) : "memory", "cc"); > + return __rc; > +} > + > +static inline long kvm_hypercall6(unsigned long nr, unsigned long p1, > + unsigned long p2, unsigned long p3, > + unsigned long p4, unsigned long p5, > + unsigned long p6) > +{ > + register unsigned long __nr asm("1") = nr; > + register unsigned long __p1 asm("2") = p1; > + register unsigned long __p2 asm("3") = p2; > + register unsigned long __p3 asm("4") = p3; > + register unsigned long __p4 asm("5") = p4; > + register unsigned long __p5 asm("6") = p5; > + register unsigned long __p6 asm("7") = p6; > + register long __rc asm("2"); > + > + asm volatile ("diag 2,4,0xBB\n" > + : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2), > + "d" (__p3), "d" (__p4), "d" (__p5), "d" (__p6) > + : "memory", "cc"); > + return __rc; > +} > + > +/* > + * FIXME: make a real check as soon as we define how to check > + */ > +static inline int kvm_para_available(void) > +{ > + return 1; > +} > + > +/* > + * FIXME: return available features > + */ > +static inline unsigned int kvm_arch_para_features(void) > +{ > + return 0; > +} > + > + > + > +#endif /* __S390_KVM_PARA_H */ > > > ------------------------------------------------------------------------- > 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 > > ------------------------------------------------------------------------- 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