Kernel KVM-PPC virtualization development
 help / color / mirror / Atom feed
From: Alexander Graf <agraf@suse.de>
To: kvm-ppc@vger.kernel.org
Cc: KVM list <kvm@vger.kernel.org>,
	linuxppc-dev <linuxppc-dev@lists.ozlabs.org>,
	Liu Yu <B13201@freescale.com>,
	Segher Boessenkool <segher@kernel.crashing.org>
Subject: [PATCH 27/27] KVM: PPC: Add get_pvinfo interface to query hypercall instructions
Date: Thu, 29 Jul 2010 12:48:08 +0000	[thread overview]
Message-ID: <1280407688-9815-28-git-send-email-agraf@suse.de> (raw)
In-Reply-To: <1280407688-9815-1-git-send-email-agraf@suse.de>

We need to tell the guest the opcodes that make up a hypercall through
interfaces that are controlled by userspace. So we need to add a call
for userspace to allow it to query those opcodes so it can pass them
on.

This is required because the hypercall opcodes can change based on
the hypervisor conditions. If we're running in hardware accelerated
hypervisor mode, a hypercall looks different from when we're running
without hardware acceleration.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 Documentation/kvm/api.txt  |   23 +++++++++++++++++++++++
 arch/powerpc/kvm/powerpc.c |   38 ++++++++++++++++++++++++++++++++++++++
 include/linux/kvm.h        |   11 +++++++++++
 3 files changed, 72 insertions(+), 0 deletions(-)

diff --git a/Documentation/kvm/api.txt b/Documentation/kvm/api.txt
index 5f5b649..44d9893 100644
--- a/Documentation/kvm/api.txt
+++ b/Documentation/kvm/api.txt
@@ -1032,6 +1032,29 @@ are defined as follows:
    eax, ebx, ecx, edx: the values returned by the cpuid instruction for
          this function/index combination
 
+4.46 KVM_PPC_GET_PVINFO
+
+Capability: KVM_CAP_PPC_GET_PVINFO
+Architectures: ppc
+Type: vm ioctl
+Parameters: struct kvm_ppc_pvinfo (out)
+Returns: 0 on success, !0 on error
+
+struct kvm_ppc_pvinfo {
+	__u32 flags;
+	__u32 hcall[4];
+	__u8  pad[108];
+};
+
+This ioctl fetches PV specific information that need to be passed to the guest
+using the device tree or other means from vm context.
+
+For now the only implemented piece of information distributed here is an array
+of 4 instructions that make up a hypercall.
+
+If any additional field gets added to this structure later on, a bit for that
+additional piece of information will be set in the flags bitmap.
+
 5. The kvm_run structure
 
 Application code obtains a pointer to the kvm_run structure by
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index fecfe04..6a53a3f 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -191,6 +191,7 @@ int kvm_dev_ioctl_check_extension(long ext)
 	case KVM_CAP_PPC_UNSET_IRQ:
 	case KVM_CAP_ENABLE_CAP:
 	case KVM_CAP_PPC_OSI:
+	case KVM_CAP_PPC_GET_PVINFO:
 		r = 1;
 		break;
 	case KVM_CAP_COALESCED_MMIO:
@@ -578,16 +579,53 @@ out:
 	return r;
 }
 
+static int kvm_vm_ioctl_get_pvinfo(struct kvm_ppc_pvinfo *pvinfo)
+{
+	u32 inst_lis = 0x3c000000;
+	u32 inst_ori = 0x60000000;
+	u32 inst_nop = 0x60000000;
+	u32 inst_sc = 0x44000002;
+	u32 inst_imm_mask = 0xffff;
+
+	/*
+	 * The hypercall to get into KVM from within guest context is as
+	 * follows:
+	 *
+	 *    lis r0, r0, KVM_SC_MAGIC_R0@h
+	 *    ori r0, KVM_SC_MAGIC_R0@l
+	 *    sc
+	 *    nop
+	 */
+	pvinfo->hcall[0] = inst_lis | ((KVM_SC_MAGIC_R0 >> 16) & inst_imm_mask);
+	pvinfo->hcall[1] = inst_ori | (KVM_SC_MAGIC_R0 & inst_imm_mask);
+	pvinfo->hcall[2] = inst_sc;
+	pvinfo->hcall[3] = inst_nop;
+
+	return 0;
+}
+
 long kvm_arch_vm_ioctl(struct file *filp,
                        unsigned int ioctl, unsigned long arg)
 {
+	void __user *argp = (void __user *)arg;
 	long r;
 
 	switch (ioctl) {
+	case KVM_PPC_GET_PVINFO: {
+		struct kvm_ppc_pvinfo pvinfo;
+		r = kvm_vm_ioctl_get_pvinfo(&pvinfo);
+		if (copy_to_user(argp, &pvinfo, sizeof(pvinfo))) {
+			r = -EFAULT;
+			goto out;
+		}
+
+		break;
+	}
 	default:
 		r = -ENOTTY;
 	}
 
+out:
 	return r;
 }
 
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index 636fc38..3707704 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -414,6 +414,14 @@ struct kvm_enable_cap {
 	__u8  pad[64];
 };
 
+/* for KVM_PPC_GET_PVINFO */
+struct kvm_ppc_pvinfo {
+	/* out */
+	__u32 flags;
+	__u32 hcall[4];
+	__u8  pad[108];
+};
+
 #define KVMIO 0xAE
 
 /*
@@ -530,6 +538,7 @@ struct kvm_enable_cap {
 #ifdef __KVM_HAVE_XCRS
 #define KVM_CAP_XCRS 56
 #endif
+#define KVM_CAP_PPC_GET_PVINFO 57
 
 #ifdef KVM_CAP_IRQ_ROUTING
 
@@ -664,6 +673,8 @@ struct kvm_clock_data {
 /* Available with KVM_CAP_PIT_STATE2 */
 #define KVM_GET_PIT2              _IOR(KVMIO,  0x9f, struct kvm_pit_state2)
 #define KVM_SET_PIT2              _IOW(KVMIO,  0xa0, struct kvm_pit_state2)
+/* Available with KVM_CAP_PPC_GET_PVINFO */
+#define KVM_PPC_GET_PVINFO	  _IOW(KVMIO,  0xa1, struct kvm_ppc_pvinfo)
 
 /*
  * ioctls for vcpu fds
-- 
1.6.0.2


      parent reply	other threads:[~2010-07-29 12:48 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-29 12:47 [PATCH 00/27] KVM PPC PV framework v3 Alexander Graf
2010-07-29 12:47 ` [PATCH 04/27] KVM: PPC: Convert DAR to shared page Alexander Graf
2010-07-29 12:47 ` [PATCH 05/27] KVM: PPC: Convert SRR0 and SRR1 " Alexander Graf
2010-07-29 12:47 ` [PATCH 07/27] KVM: PPC: Implement hypervisor interface Alexander Graf
2010-07-29 12:47 ` [PATCH 09/27] KVM: PPC: Add PV guest scratch registers Alexander Graf
2010-07-29 12:47 ` [PATCH 11/27] KVM: PPC: Make PAM a define Alexander Graf
2010-07-29 12:47 ` [PATCH 12/27] KVM: PPC: First magic page steps Alexander Graf
2010-07-29 12:47 ` [PATCH 13/27] KVM: PPC: Magic Page Book3s support Alexander Graf
2010-07-29 12:47 ` [PATCH 15/27] KVM: Move kvm_guest_init out of generic code Alexander Graf
2010-07-29 12:47 ` [PATCH 16/27] KVM: PPC: Generic KVM PV guest support Alexander Graf
2010-07-29 12:47 ` [PATCH 17/27] KVM: PPC: KVM PV guest stubs Alexander Graf
     [not found]   ` <1280407688-9815-18-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-08-05 17:16     ` Hollis Blanchard
2010-07-29 12:47 ` [PATCH 18/27] KVM: PPC: PV instructions to loads and stores Alexander Graf
2010-07-29 12:48 ` [PATCH 22/27] KVM: PPC: PV assembler helpers Alexander Graf
2010-07-29 12:48 ` [PATCH 24/27] KVM: PPC: PV mtmsrd L=0 and mtmsr Alexander Graf
     [not found] ` <1280407688-9815-1-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-07-29 12:47   ` [PATCH 01/27] KVM: PPC: Introduce shared page Alexander Graf
     [not found]     ` <1280407688-9815-2-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org>
2010-08-05 17:05       ` Hollis Blanchard
2010-07-29 12:47   ` [PATCH 02/27] KVM: PPC: Convert MSR to " Alexander Graf
2010-07-29 12:47   ` [PATCH 03/27] KVM: PPC: Convert DSISR " Alexander Graf
2010-07-29 12:47   ` [PATCH 06/27] KVM: PPC: Convert SPRG[0-4] " Alexander Graf
2010-07-29 12:47   ` [PATCH 08/27] KVM: PPC: Add PV guest critical sections Alexander Graf
2010-07-29 12:47   ` [PATCH 10/27] KVM: PPC: Tell guest about pending interrupts Alexander Graf
2010-07-29 12:47   ` [PATCH 14/27] KVM: PPC: Expose magic page support to guest Alexander Graf
2010-07-29 12:48   ` [PATCH 19/27] KVM: PPC: PV tlbsync to nop Alexander Graf
2010-07-29 12:48   ` [PATCH 20/27] KVM: PPC: Introduce kvm_tmp framework Alexander Graf
2010-07-29 12:48   ` [PATCH 21/27] KVM: PPC: Introduce branch patching helper Alexander Graf
2010-07-29 12:48   ` [PATCH 23/27] KVM: PPC: PV mtmsrd L=1 Alexander Graf
2010-07-29 12:48   ` [PATCH 25/27] KVM: PPC: PV wrteei Alexander Graf
2010-07-29 12:48   ` [PATCH 26/27] KVM: PPC: Add Documentation about PV interface Alexander Graf
2010-08-01 14:02   ` [PATCH 00/27] KVM PPC PV framework v3 Avi Kivity
     [not found]     ` <4C557E7A.3010606-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-08-01 20:21       ` Alexander Graf
2010-08-03 16:16         ` Scott Wood
     [not found]           ` <20100803111611.38ca87e6-1MYqz8GpK7RekFaExTCHk1jVikpgYyvb5NbjCUgZEJk@public.gmane.org>
2010-08-05  7:57             ` Avi Kivity
2010-08-05  8:01               ` Alexander Graf
2010-08-05  8:05                 ` Avi Kivity
2010-08-05  8:25   ` Avi Kivity
2010-08-06 16:28   ` Kumar Gala
     [not found]     ` <17DF4824-9EC7-44F4-9408-EA6241C33E70-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org>
2010-08-16 13:11       ` Alexander Graf
2010-07-29 12:48 ` Alexander Graf [this message]

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=1280407688-9815-28-git-send-email-agraf@suse.de \
    --to=agraf@suse.de \
    --cc=B13201@freescale.com \
    --cc=kvm-ppc@vger.kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=segher@kernel.crashing.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox