aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2014-01-08 05:25:28 -0500
committerAlexander Graf <agraf@suse.de>2014-01-27 10:01:13 -0500
commit5d00f66b865e3782c5852cdafe1cea11a292a81e (patch)
tree5d1fc36361174c760ab5c315b98c336fdcaf83f3
parente0622bd9f2fccc8a801fa7aaf4fa6d7c728c3a78 (diff)
KVM: PPC: Book3S HV: Prepare for host using hypervisor doorbells
POWER8 has support for hypervisor doorbell interrupts. Though the kernel doesn't use them for IPIs on the powernv platform yet, it probably will in future, so this makes KVM cope gracefully if a hypervisor doorbell interrupt arrives while in a guest. Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r--arch/powerpc/include/asm/kvm_asm.h1
-rw-r--r--arch/powerpc/kvm/book3s_hv.c1
-rw-r--r--arch/powerpc/kvm/book3s_hv_rmhandlers.S7
3 files changed, 9 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/kvm_asm.h b/arch/powerpc/include/asm/kvm_asm.h
index dba8fb244100..c3815b1e79e8 100644
--- a/arch/powerpc/include/asm/kvm_asm.h
+++ b/arch/powerpc/include/asm/kvm_asm.h
@@ -96,6 +96,7 @@
96#define BOOK3S_INTERRUPT_H_DATA_STORAGE 0xe00 96#define BOOK3S_INTERRUPT_H_DATA_STORAGE 0xe00
97#define BOOK3S_INTERRUPT_H_INST_STORAGE 0xe20 97#define BOOK3S_INTERRUPT_H_INST_STORAGE 0xe20
98#define BOOK3S_INTERRUPT_H_EMUL_ASSIST 0xe40 98#define BOOK3S_INTERRUPT_H_EMUL_ASSIST 0xe40
99#define BOOK3S_INTERRUPT_H_DOORBELL 0xe80
99#define BOOK3S_INTERRUPT_PERFMON 0xf00 100#define BOOK3S_INTERRUPT_PERFMON 0xf00
100#define BOOK3S_INTERRUPT_ALTIVEC 0xf20 101#define BOOK3S_INTERRUPT_ALTIVEC 0xf20
101#define BOOK3S_INTERRUPT_VSX 0xf40 102#define BOOK3S_INTERRUPT_VSX 0xf40
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index d7f2ec6f1419..216049ff7368 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -651,6 +651,7 @@ static int kvmppc_handle_exit_hv(struct kvm_run *run, struct kvm_vcpu *vcpu,
651 r = RESUME_GUEST; 651 r = RESUME_GUEST;
652 break; 652 break;
653 case BOOK3S_INTERRUPT_EXTERNAL: 653 case BOOK3S_INTERRUPT_EXTERNAL:
654 case BOOK3S_INTERRUPT_H_DOORBELL:
654 vcpu->stat.ext_intr_exits++; 655 vcpu->stat.ext_intr_exits++;
655 r = RESUME_GUEST; 656 r = RESUME_GUEST;
656 break; 657 break;
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
index 9e89c7577b4a..eae4ab9b9135 100644
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
@@ -1997,10 +1997,17 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_207S)
1997BEGIN_FTR_SECTION 1997BEGIN_FTR_SECTION
1998 cmpwi r6, 5 /* privileged doorbell? */ 1998 cmpwi r6, 5 /* privileged doorbell? */
1999 beq 0f 1999 beq 0f
2000 cmpwi r6, 3 /* hypervisor doorbell? */
2001 beq 3f
2000END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) 2002END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2001 li r3, 1 /* anything else, return 1 */ 2003 li r3, 1 /* anything else, return 1 */
20020: blr 20040: blr
2003 2005
2006 /* hypervisor doorbell */
20073: li r12, BOOK3S_INTERRUPT_H_DOORBELL
2008 li r3, 1
2009 blr
2010
2004/* 2011/*
2005 * Determine what sort of external interrupt is pending (if any). 2012 * Determine what sort of external interrupt is pending (if any).
2006 * Returns: 2013 * Returns: