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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel