From mboxrd@z Thu Jan 1 00:00:00 1970 From: Benjamin Herrenschmidt Subject: Re: [PATCH 26/27] KVM: PPC: Add KVM intercept handlers Date: Fri, 16 Apr 2010 16:48:59 +1000 Message-ID: <1271400539.13059.181.camel@pasglop> References: <1271369518-11247-1-git-send-email-agraf@suse.de> <1271369518-11247-27-git-send-email-agraf@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit Cc: kvm-ppc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Alexander Graf Return-path: In-Reply-To: <1271369518-11247-27-git-send-email-agraf-l3A5Bk7waGM@public.gmane.org> Sender: kvm-ppc-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: kvm.vger.kernel.org On Fri, 2010-04-16 at 00:11 +0200, Alexander Graf wrote: > When an interrupt occurs we don't know yet if we're in guest context or > in host context. When in guest context, KVM needs to handle it. > > So let's pull the same trick we did on Book3S_64: Just add a macro to > determine if we're in guest context or not and if so jump on to KVM code. > Acked-by: Benjamin Herrenschmidt > Signed-off-by: Alexander Graf > --- > arch/powerpc/kernel/head_32.S | 14 ++++++++++++++ > 1 files changed, 14 insertions(+), 0 deletions(-) > > diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S > index e025e89..98c4b29 100644 > --- a/arch/powerpc/kernel/head_32.S > +++ b/arch/powerpc/kernel/head_32.S > @@ -33,6 +33,7 @@ > #include > #include > #include > +#include > > /* 601 only have IBAT; cr0.eq is set on 601 when using this macro */ > #define LOAD_BAT(n, reg, RA, RB) \ > @@ -303,6 +304,7 @@ __secondary_hold_acknowledge: > */ > #define EXCEPTION(n, label, hdlr, xfer) \ > . = n; \ > + DO_KVM n; \ > label: \ > EXCEPTION_PROLOG; \ > addi r3,r1,STACK_FRAME_OVERHEAD; \ > @@ -358,6 +360,7 @@ i##n: \ > * -- paulus. > */ > . = 0x200 > + DO_KVM 0x200 > mtspr SPRN_SPRG_SCRATCH0,r10 > mtspr SPRN_SPRG_SCRATCH1,r11 > mfcr r10 > @@ -381,6 +384,7 @@ i##n: \ > > /* Data access exception. */ > . = 0x300 > + DO_KVM 0x300 > DataAccess: > EXCEPTION_PROLOG > mfspr r10,SPRN_DSISR > @@ -397,6 +401,7 @@ DataAccess: > > /* Instruction access exception. */ > . = 0x400 > + DO_KVM 0x400 > InstructionAccess: > EXCEPTION_PROLOG > andis. r0,r9,0x4000 /* no pte found? */ > @@ -413,6 +418,7 @@ InstructionAccess: > > /* Alignment exception */ > . = 0x600 > + DO_KVM 0x600 > Alignment: > EXCEPTION_PROLOG > mfspr r4,SPRN_DAR > @@ -427,6 +433,7 @@ Alignment: > > /* Floating-point unavailable */ > . = 0x800 > + DO_KVM 0x800 > FPUnavailable: > BEGIN_FTR_SECTION > /* > @@ -450,6 +457,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_FPU_UNAVAILABLE) > > /* System call */ > . = 0xc00 > + DO_KVM 0xc00 > SystemCall: > EXCEPTION_PROLOG > EXC_XFER_EE_LITE(0xc00, DoSyscall) > @@ -467,9 +475,11 @@ SystemCall: > * by executing an altivec instruction. > */ > . = 0xf00 > + DO_KVM 0xf00 > b PerformanceMonitor > > . = 0xf20 > + DO_KVM 0xf20 > b AltiVecUnavailable > > /* > @@ -882,6 +892,10 @@ __secondary_start: > RFI > #endif /* CONFIG_SMP */ > > +#ifdef CONFIG_KVM_BOOK3S_HANDLER > +#include "../kvm/book3s_rmhandlers.S" > +#endif > + > /* > * Those generic dummy functions are kept for CPUs not > * included in CONFIG_6xx