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....@freescale.com>
[bharat.bhus...@freescale.com: Substantial changes]
Signed-off-by: Bharat Bhushan <bharat.bhus...@freescale.com>

Signed-off-by: Bharat Bhushan <bharat.bhus...@freescale.com>
---
 arch/powerpc/include/asm/kvm_host.h |    1 +
 arch/powerpc/kernel/asm-offsets.c   |    1 +
 arch/powerpc/kvm/booke_interrupts.S |   45 +++++++++++++++++++++++++++++++++++
 3 files changed, 47 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_host.h 
b/arch/powerpc/include/asm/kvm_host.h
index dcee499..bd78523 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -494,6 +494,7 @@ struct kvm_vcpu_arch {
        u32 tlbcfg[4];
        u32 mmucfg;
        u32 epr;
+       u32 crit_save;
 #endif
        gpa_t paddr_accessed;
        gva_t vaddr_accessed;
diff --git a/arch/powerpc/kernel/asm-offsets.c 
b/arch/powerpc/kernel/asm-offsets.c
index 85b05c4..92f149b 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -563,6 +563,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 3539805..890673c 100644
--- a/arch/powerpc/kvm/booke_interrupts.S
+++ b/arch/powerpc/kvm/booke_interrupts.S
@@ -73,6 +73,51 @@ _GLOBAL(kvmppc_handler_\ivor_nr)
        bctr
 .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
+1:     /* debug interrupt happened in guest */
+       mfspr   r4, \scratch
+       mtcr    r3
+       mr      r3, r4
+       mfspr   r4, SPRN_SPRG_THREAD
+       lwz     r4, THREAD_KVM_VCPU(r4)
+       stw     r3, VCPU_GPR(R4)(r4)
+       stw     r5, VCPU_GPR(R5)(r4)
+       stw     r6, VCPU_GPR(R6)(r4)
+       lwz     r3, VCPU_CRIT_SAVE(r4)
+       mfspr   r5, \srr0
+       stw     r3, VCPU_GPR(R3)(r4)
+       stw     r5, VCPU_PC(r4)
+       mfctr   r5
+       lis     r6, kvmppc_resume_host@h
+       stw     r5, VCPU_CTR(r4)
+       li      r5, \ivor_nr
+       ori     r6, r6, kvmppc_resume_host@l
+       mtctr   r6
+       bctr
+.endm
+
 .macro KVM_HANDLER_ADDR ivor_nr
        .long   kvmppc_handler_\ivor_nr
 .endm
-- 
1.7.0.4


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to