From: Anthony Liguori <anthony-rdkfGonbjUSkNkDKm+mE6A@public.gmane.org>
To: Christian Borntraeger
<borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: [PATCH/RFC] Per-architecture hypercall definitions
Date: Thu, 11 Oct 2007 09:11:31 -0500 [thread overview]
Message-ID: <470E2F13.6030103@codemonkey.ws> (raw)
In-Reply-To: <200710111534.17372.borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
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 <borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
>
> 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/
next prev parent reply other threads:[~2007-10-11 14:11 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-11 12:06 [PATCH/RFC] Per-architecture hypercall definitions Christian Borntraeger
[not found] ` <200710111406.09439.borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-11 12:18 ` Avi Kivity
2007-10-11 13:14 ` Anthony Liguori
[not found] ` <470E21A3.50909-rdkfGonbjUSkNkDKm+mE6A@public.gmane.org>
2007-10-11 13:34 ` Christian Borntraeger
[not found] ` <200710111534.17372.borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-10-11 14:11 ` Anthony Liguori [this message]
2007-10-22 12:06 ` Avi Kivity
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=470E2F13.6030103@codemonkey.ws \
--to=anthony-rdkfgonbjusknkdkm+me6a@public.gmane.org \
--cc=borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org \
--cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.