On 16.01.2013, at 09:24, Bharat Bhushan wrote: > From: Bharat Bhushan <Bharat.Bhushan@xxxxxxxxxxxxx> > > Installed debug handler will be used for guest debug support > and debug facility emulation features (patches for these > features will follow this patch). > > Signed-off-by: Liu Yu <yu.liu@xxxxxxxxxxxxx> > [bharat.bhushan@xxxxxxxxxxxxx: Substantial changes] > Signed-off-by: Bharat Bhushan <bharat.bhushan@xxxxxxxxxxxxx> > --- > arch/powerpc/include/asm/kvm_host.h | 1 + > arch/powerpc/kernel/asm-offsets.c | 1 + > arch/powerpc/kvm/booke_interrupts.S | 49 ++++++++++++++++++++++++++++++----- > 3 files changed, 44 insertions(+), 7 deletions(-) > > diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h > index 8a72d59..f4ba881 100644 > --- a/arch/powerpc/include/asm/kvm_host.h > +++ b/arch/powerpc/include/asm/kvm_host.h > @@ -503,6 +503,7 @@ struct kvm_vcpu_arch { > u32 tlbcfg[4]; > u32 mmucfg; > u32 epr; > + u32 crit_save; > struct kvmppc_booke_debug_reg dbg_reg; > #endif > gpa_t paddr_accessed; > diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c > index 46f6afd..02048f3 100644 > --- a/arch/powerpc/kernel/asm-offsets.c > +++ b/arch/powerpc/kernel/asm-offsets.c > @@ -562,6 +562,7 @@ int main(void) > DEFINE(VCPU_LAST_INST, offsetof(struct kvm_vcpu, arch.last_inst)); > DEFINE(VCPU_FAULT_DEAR, offsetof(struct kvm_vcpu, arch.fault_dear)); > DEFINE(VCPU_FAULT_ESR, offsetof(struct kvm_vcpu, arch.fault_esr)); > + DEFINE(VCPU_CRIT_SAVE, offsetof(struct kvm_vcpu, arch.crit_save)); > #endif /* CONFIG_PPC_BOOK3S */ > #endif /* CONFIG_KVM */ > > diff --git a/arch/powerpc/kvm/booke_interrupts.S b/arch/powerpc/kvm/booke_interrupts.S > index eae8483..dd9c5d4 100644 > --- a/arch/powerpc/kvm/booke_interrupts.S > +++ b/arch/powerpc/kvm/booke_interrupts.S > @@ -52,12 +52,7 @@ > (1<<BOOKE_INTERRUPT_PROGRAM) | \ > (1<<BOOKE_INTERRUPT_DTLB_MISS)) > > -.macro KVM_HANDLER ivor_nr scratch srr0 > -_GLOBAL(kvmppc_handler_\ivor_nr) > - /* Get pointer to vcpu and record exit number. */ > - mtspr \scratch , r4 > - mfspr r4, SPRN_SPRG_THREAD > - lwz r4, THREAD_KVM_VCPU(r4) > +.macro __KVM_HANDLER ivor_nr scratch srr0 > stw r3, VCPU_GPR(R3)(r4) > stw r5, VCPU_GPR(R5)(r4) > stw r6, VCPU_GPR(R6)(r4) > @@ -74,6 +69,46 @@ _GLOBAL(kvmppc_handler_\ivor_nr) > bctr > .endm > > +.macro KVM_HANDLER ivor_nr scratch srr0 > +_GLOBAL(kvmppc_handler_\ivor_nr) > + /* Get pointer to vcpu and record exit number. */ > + mtspr \scratch , r4 > + mfspr r4, SPRN_SPRG_THREAD > + lwz r4, THREAD_KVM_VCPU(r4) > + __KVM_HANDLER \ivor_nr \scratch \srr0 > +.endm > + > +.macro KVM_DBG_HANDLER ivor_nr scratch srr0 > +_GLOBAL(kvmppc_handler_\ivor_nr) > + mtspr \scratch, r4 > + mfspr r4, SPRN_SPRG_THREAD > + lwz r4, THREAD_KVM_VCPU(r4) > + stw r3, VCPU_CRIT_SAVE(r4) > + mfcr r3 > + mfspr r4, SPRN_CSRR1 > + andi. r4, r4, MSR_PR > + bne 1f > + /* debug interrupt happened in enter/exit path */ > + mfspr r4, SPRN_CSRR1 > + rlwinm r4, r4, 0, ~MSR_DE > + mtspr SPRN_CSRR1, r4 > + lis r4, 0xffff > + ori r4, r4, 0xffff > + mtspr SPRN_DBSR, r4 > + mfspr r4, SPRN_SPRG_THREAD > + lwz r4, THREAD_KVM_VCPU(r4) > + mtcr r3 > + lwz r3, VCPU_CRIT_SAVE(r4) > + mfspr r4, \scratch > + rfci What is this part doing? Try to ignore the debug exit? Why would we have MSR_DE enabled in the first place when we can't handle it? > +1: /* debug interrupt happened in guest */ > + mtcr r3 > + mfspr r4, SPRN_SPRG_THREAD > + lwz r4, THREAD_KVM_VCPU(r4) > + lwz r3, VCPU_CRIT_SAVE(r4) > + __KVM_HANDLER \ivor_nr \scratch \srr0 I don't think you need the __KVM_HANDLER split. This should be quite easily refactorable into a simple DBG prolog. Alex > +.endm > + > .macro KVM_HANDLER_ADDR ivor_nr > .long kvmppc_handler_\ivor_nr > .endm > @@ -98,7 +133,7 @@ KVM_HANDLER BOOKE_INTERRUPT_FIT SPRN_SPRG_RSCRATCH0 SPRN_SRR0 > KVM_HANDLER BOOKE_INTERRUPT_WATCHDOG SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0 > KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS SPRN_SPRG_RSCRATCH0 SPRN_SRR0 > KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS SPRN_SPRG_RSCRATCH0 SPRN_SRR0 > -KVM_HANDLER BOOKE_INTERRUPT_DEBUG SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0 > +KVM_DBG_HANDLER BOOKE_INTERRUPT_DEBUG SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0 > KVM_HANDLER BOOKE_INTERRUPT_SPE_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0 > KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_DATA SPRN_SPRG_RSCRATCH0 SPRN_SRR0 > KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_ROUND SPRN_SPRG_RSCRATCH0 SPRN_SRR0 > -- > 1.7.0.4 > > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html