From: Stuart Yoder <stuart.yoder@freescale.com>
To: agraf@suse.de, kvm-ppc@vger.kernel.org, kvm@vger.kernel.org
Subject: [PATCH v9 2/4] KVM: PPC: epapr: Add idle hcall support for host
Date: Wed, 07 Mar 2012 23:12:57 +0000 [thread overview]
Message-ID: <1331161979-12759-3-git-send-email-stuart.yoder@freescale.com> (raw)
In-Reply-To: <1331161979-12759-1-git-send-email-stuart.yoder@freescale.com>
From: Liu Yu-B13201 <Yu.Liu@freescale.com>
And add a new flag definition in kvm_ppc_pvinfo to indicate
whether host support EV_IDLE hcall.
Signed-off-by: Liu Yu <yu.liu@freescale.com>
[stuart.yoder@freescale.com: fixes for conditions allowing idle]
Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
---
-v9: pad hcall instruction array with nops
arch/powerpc/include/asm/Kbuild | 1 +
arch/powerpc/include/asm/kvm_para.h | 14 ++++++++++++--
arch/powerpc/kvm/booke.c | 6 ++++++
arch/powerpc/kvm/powerpc.c | 19 ++++++++++++++++---
include/linux/kvm.h | 2 ++
5 files changed, 37 insertions(+), 5 deletions(-)
diff --git a/arch/powerpc/include/asm/Kbuild b/arch/powerpc/include/asm/Kbuild
index d51df17..b68cb1c 100644
--- a/arch/powerpc/include/asm/Kbuild
+++ b/arch/powerpc/include/asm/Kbuild
@@ -34,3 +34,4 @@ header-y += termios.h
header-y += types.h
header-y += ucontext.h
header-y += unistd.h
+header-y += epapr_hcalls.h
diff --git a/arch/powerpc/include/asm/kvm_para.h b/arch/powerpc/include/asm/kvm_para.h
index b3b4667..5617c8c 100644
--- a/arch/powerpc/include/asm/kvm_para.h
+++ b/arch/powerpc/include/asm/kvm_para.h
@@ -90,9 +90,19 @@ struct kvm_vcpu_arch_shared {
};
#define KVM_SC_MAGIC_R0 0x4b564d21 /* "KVM!" */
-#define HC_VENDOR_KVM (42 << 16)
+
+#include <asm/epapr_hcalls.h>
+
+/* ePAPR Hypercall Vendor ID */
+#define HC_VENDOR_EPAPR (EV_EPAPR_VENDOR_ID << 16)
+#define HC_VENDOR_KVM (EV_KVM_VENDOR_ID << 16)
+
+/* ePAPR Hypercall Token */
+#define HC_EV_IDLE EV_IDLE
+
+/* ePAPR Hypercall Return Codes */
#define HC_EV_SUCCESS 0
-#define HC_EV_UNIMPLEMENTED 12
+#define HC_EV_UNIMPLEMENTED EV_UNIMPLEMENTED
#define KVM_FEATURE_MAGIC_PAGE 1
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index f0ef0be..9fde645 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -593,6 +593,12 @@ static void kvmppc_core_check_exceptions(struct kvm_vcpu *vcpu)
unsigned int priority;
if (vcpu->requests) {
+ /* kvm_vcpu_block() sets KVM_REQ_UNHALT, but it is
+ * not cleared elsewhere as on x86. Clear it here
+ * for now, otherwise we never go idle.
+ */
+ clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
+
if (kvm_check_request(KVM_REQ_PENDING_TIMER, vcpu)) {
smp_mb();
update_timer_ints(vcpu);
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index ee489f4..2595916 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -48,8 +48,7 @@ static unsigned int perfmon_refcount;
int kvm_arch_vcpu_runnable(struct kvm_vcpu *v)
{
- bool ret = !(v->arch.shared->msr & MSR_WE) ||
- !!(v->arch.pending_exceptions) ||
+ bool ret = !!(v->arch.pending_exceptions) ||
v->requests;
#ifdef CONFIG_BOOKE
@@ -100,6 +99,10 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu)
/* Second return value is in r4 */
break;
+ case HC_VENDOR_EPAPR | HC_EV_IDLE:
+ r = HC_EV_SUCCESS;
+ kvm_vcpu_block(vcpu);
+ break;
default:
r = HC_EV_UNIMPLEMENTED;
break;
@@ -888,9 +891,16 @@ out:
static int kvm_vm_ioctl_get_pvinfo(struct kvm_ppc_pvinfo *pvinfo)
{
+ u32 inst_nop = 0x60000000;
+#ifdef CONFIG_KVM_BOOKE_HV
+ u32 inst_sc1 = 0x44000022;
+ pvinfo->hcall[0] = inst_sc1;
+ pvinfo->hcall[1] = inst_nop;
+ pvinfo->hcall[2] = inst_nop;
+ pvinfo->hcall[3] = inst_nop;
+#else
u32 inst_lis = 0x3c000000;
u32 inst_ori = 0x60000000;
- u32 inst_nop = 0x60000000;
u32 inst_sc = 0x44000002;
u32 inst_imm_mask = 0xffff;
@@ -907,6 +917,9 @@ static int kvm_vm_ioctl_get_pvinfo(struct kvm_ppc_pvinfo *pvinfo)
pvinfo->hcall[1] = inst_ori | (KVM_SC_MAGIC_R0 & inst_imm_mask);
pvinfo->hcall[2] = inst_sc;
pvinfo->hcall[3] = inst_nop;
+#endif
+
+ pvinfo->flags = KVM_PPC_PVINFO_FLAGS_EV_IDLE;
return 0;
}
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index 28ced78..32b8f54 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -438,6 +438,8 @@ struct kvm_ppc_pvinfo {
__u8 pad[108];
};
+#define KVM_PPC_PVINFO_FLAGS_EV_IDLE (1<<0)
+
#define KVMIO 0xAE
/*
--
1.7.3.4
WARNING: multiple messages have this Message-ID (diff)
From: Stuart Yoder <stuart.yoder@freescale.com>
To: <agraf@suse.de>, <kvm-ppc@vger.kernel.org>, <kvm@vger.kernel.org>
Subject: [PATCH v9 2/4] KVM: PPC: epapr: Add idle hcall support for host
Date: Wed, 7 Mar 2012 17:12:57 -0600 [thread overview]
Message-ID: <1331161979-12759-3-git-send-email-stuart.yoder@freescale.com> (raw)
In-Reply-To: <1331161979-12759-1-git-send-email-stuart.yoder@freescale.com>
From: Liu Yu-B13201 <Yu.Liu@freescale.com>
And add a new flag definition in kvm_ppc_pvinfo to indicate
whether host support EV_IDLE hcall.
Signed-off-by: Liu Yu <yu.liu@freescale.com>
[stuart.yoder@freescale.com: fixes for conditions allowing idle]
Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
---
-v9: pad hcall instruction array with nops
arch/powerpc/include/asm/Kbuild | 1 +
arch/powerpc/include/asm/kvm_para.h | 14 ++++++++++++--
arch/powerpc/kvm/booke.c | 6 ++++++
arch/powerpc/kvm/powerpc.c | 19 ++++++++++++++++---
include/linux/kvm.h | 2 ++
5 files changed, 37 insertions(+), 5 deletions(-)
diff --git a/arch/powerpc/include/asm/Kbuild b/arch/powerpc/include/asm/Kbuild
index d51df17..b68cb1c 100644
--- a/arch/powerpc/include/asm/Kbuild
+++ b/arch/powerpc/include/asm/Kbuild
@@ -34,3 +34,4 @@ header-y += termios.h
header-y += types.h
header-y += ucontext.h
header-y += unistd.h
+header-y += epapr_hcalls.h
diff --git a/arch/powerpc/include/asm/kvm_para.h b/arch/powerpc/include/asm/kvm_para.h
index b3b4667..5617c8c 100644
--- a/arch/powerpc/include/asm/kvm_para.h
+++ b/arch/powerpc/include/asm/kvm_para.h
@@ -90,9 +90,19 @@ struct kvm_vcpu_arch_shared {
};
#define KVM_SC_MAGIC_R0 0x4b564d21 /* "KVM!" */
-#define HC_VENDOR_KVM (42 << 16)
+
+#include <asm/epapr_hcalls.h>
+
+/* ePAPR Hypercall Vendor ID */
+#define HC_VENDOR_EPAPR (EV_EPAPR_VENDOR_ID << 16)
+#define HC_VENDOR_KVM (EV_KVM_VENDOR_ID << 16)
+
+/* ePAPR Hypercall Token */
+#define HC_EV_IDLE EV_IDLE
+
+/* ePAPR Hypercall Return Codes */
#define HC_EV_SUCCESS 0
-#define HC_EV_UNIMPLEMENTED 12
+#define HC_EV_UNIMPLEMENTED EV_UNIMPLEMENTED
#define KVM_FEATURE_MAGIC_PAGE 1
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index f0ef0be..9fde645 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -593,6 +593,12 @@ static void kvmppc_core_check_exceptions(struct kvm_vcpu *vcpu)
unsigned int priority;
if (vcpu->requests) {
+ /* kvm_vcpu_block() sets KVM_REQ_UNHALT, but it is
+ * not cleared elsewhere as on x86. Clear it here
+ * for now, otherwise we never go idle.
+ */
+ clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
+
if (kvm_check_request(KVM_REQ_PENDING_TIMER, vcpu)) {
smp_mb();
update_timer_ints(vcpu);
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index ee489f4..2595916 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -48,8 +48,7 @@ static unsigned int perfmon_refcount;
int kvm_arch_vcpu_runnable(struct kvm_vcpu *v)
{
- bool ret = !(v->arch.shared->msr & MSR_WE) ||
- !!(v->arch.pending_exceptions) ||
+ bool ret = !!(v->arch.pending_exceptions) ||
v->requests;
#ifdef CONFIG_BOOKE
@@ -100,6 +99,10 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu)
/* Second return value is in r4 */
break;
+ case HC_VENDOR_EPAPR | HC_EV_IDLE:
+ r = HC_EV_SUCCESS;
+ kvm_vcpu_block(vcpu);
+ break;
default:
r = HC_EV_UNIMPLEMENTED;
break;
@@ -888,9 +891,16 @@ out:
static int kvm_vm_ioctl_get_pvinfo(struct kvm_ppc_pvinfo *pvinfo)
{
+ u32 inst_nop = 0x60000000;
+#ifdef CONFIG_KVM_BOOKE_HV
+ u32 inst_sc1 = 0x44000022;
+ pvinfo->hcall[0] = inst_sc1;
+ pvinfo->hcall[1] = inst_nop;
+ pvinfo->hcall[2] = inst_nop;
+ pvinfo->hcall[3] = inst_nop;
+#else
u32 inst_lis = 0x3c000000;
u32 inst_ori = 0x60000000;
- u32 inst_nop = 0x60000000;
u32 inst_sc = 0x44000002;
u32 inst_imm_mask = 0xffff;
@@ -907,6 +917,9 @@ static int kvm_vm_ioctl_get_pvinfo(struct kvm_ppc_pvinfo *pvinfo)
pvinfo->hcall[1] = inst_ori | (KVM_SC_MAGIC_R0 & inst_imm_mask);
pvinfo->hcall[2] = inst_sc;
pvinfo->hcall[3] = inst_nop;
+#endif
+
+ pvinfo->flags = KVM_PPC_PVINFO_FLAGS_EV_IDLE;
return 0;
}
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index 28ced78..32b8f54 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -438,6 +438,8 @@ struct kvm_ppc_pvinfo {
__u8 pad[108];
};
+#define KVM_PPC_PVINFO_FLAGS_EV_IDLE (1<<0)
+
#define KVMIO 0xAE
/*
--
1.7.3.4
next prev parent reply other threads:[~2012-03-07 23:12 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-07 23:12 [PATCH v9 0/4] KVM: PPC: Add ePAPR idle hcall support Stuart Yoder
2012-03-07 23:12 ` Stuart Yoder
2012-03-07 23:12 ` [PATCH v9 1/4] KVM: PPC: epapr: Factor out the epapr init Stuart Yoder
2012-03-07 23:12 ` Stuart Yoder
2012-03-07 23:19 ` Alexander Graf
2012-03-07 23:19 ` Alexander Graf
2012-03-15 19:50 ` Stuart Yoder
2012-03-15 19:50 ` Stuart Yoder
2012-03-07 23:12 ` Stuart Yoder [this message]
2012-03-07 23:12 ` [PATCH v9 2/4] KVM: PPC: epapr: Add idle hcall support for host Stuart Yoder
2012-03-07 23:27 ` Alexander Graf
2012-03-07 23:27 ` Alexander Graf
2012-03-07 23:37 ` Scott Wood
2012-03-07 23:37 ` Scott Wood
2012-03-07 23:38 ` Alexander Graf
2012-03-07 23:38 ` Alexander Graf
2012-03-08 4:18 ` Yoder Stuart-B08248
2012-03-08 4:18 ` Yoder Stuart-B08248
2012-03-08 12:20 ` Alexander Graf
2012-03-08 12:20 ` Alexander Graf
2012-03-15 15:56 ` Stuart Yoder
2012-03-15 15:56 ` Stuart Yoder
2012-03-07 23:12 ` [PATCH v9 3/4] KVM: PPC: epapr: install ev_idle hcall for e500 guest Stuart Yoder
2012-03-07 23:12 ` Stuart Yoder
2012-03-07 23:36 ` Alexander Graf
2012-03-07 23:36 ` Alexander Graf
2012-03-07 23:12 ` [PATCH v9 4/4] KVM: PPC: epapr: Update other hypercall invoking Stuart Yoder
2012-03-07 23:12 ` Stuart Yoder
2012-03-07 23:37 ` Alexander Graf
2012-03-07 23:37 ` Alexander Graf
2012-03-07 23:40 ` Scott Wood
2012-03-07 23:40 ` Scott Wood
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=1331161979-12759-3-git-send-email-stuart.yoder@freescale.com \
--to=stuart.yoder@freescale.com \
--cc=agraf@suse.de \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.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.