This provide a precise way to avoid confounding settings of guest and host.
Also the guest hardware emulation about debug can be implemented based on this.

Signed-off-by: Liu Yu <yu....@freescale.com>
---
 arch/powerpc/kernel/asm-offsets.c   |    3 ++
 arch/powerpc/kvm/booke_interrupts.S |   58 +++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/kernel/asm-offsets.c 
b/arch/powerpc/kernel/asm-offsets.c
index 957ceb7..67e978d 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -425,6 +425,9 @@ 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_SHADOW_DBG, offsetof(struct kvm_vcpu, arch.shadow_dbg_reg));
+       DEFINE(VCPU_HOST_DBG, offsetof(struct kvm_vcpu, arch.host_dbg_reg));
+       DEFINE(VCPU_GUEST_DEBUG, offsetof(struct kvm_vcpu, guest_debug));
 
        /* book3s_64 */
 #ifdef CONFIG_PPC64
diff --git a/arch/powerpc/kvm/booke_interrupts.S 
b/arch/powerpc/kvm/booke_interrupts.S
index 380a78c..644ff1d 100644
--- a/arch/powerpc/kvm/booke_interrupts.S
+++ b/arch/powerpc/kvm/booke_interrupts.S
@@ -168,6 +168,26 @@ _GLOBAL(kvmppc_resume_host)
        stw     r9, VCPU_FAULT_ESR(r4)
 ..skip_esr:
 
+       lwz     r6, VCPU_GUEST_DEBUG(r4)
+       or.     r6, r6, r6
+       beq     ..skip_load_host_debug
+       addi    r7, r4, VCPU_HOST_DBG - 4
+       lwzu    r9, 4(r7)
+       mtspr   SPRN_DBCR0, r9
+       lwzu    r9, 4(r7)
+       mtspr   SPRN_IAC1, r9
+       lwzu    r9, 4(r7)
+       mtspr   SPRN_IAC2, r9
+       lwzu    r9, 4(r7)
+       mtspr   SPRN_IAC3, r9
+       lwzu    r9, 4(r7)
+       mtspr   SPRN_IAC4, r9
+       lwzu    r9, 4(r7)
+       mtspr   SPRN_DAC1, r9
+       lwzu    r9, 4(r7)
+       mtspr   SPRN_DAC2, r9
+..skip_load_host_debug:
+
        /* Save remaining volatile guest register state to vcpu. */
        stw     r0, VCPU_GPR(r0)(r4)
        stw     r1, VCPU_GPR(r1)(r4)
@@ -392,6 +412,44 @@ lightweight_exit:
        lwz     r3, VCPU_SPRG7(r4)
        mtspr   SPRN_SPRG7W, r3
 
+       lwz     r6, VCPU_GUEST_DEBUG(r4)
+       or.     r6, r6, r6
+       beq     ..skip_load_guest_debug
+       mfmsr   r7
+       rlwinm  r7, r7, 0, ~MSR_DE
+       mtmsr   r7
+       addi    r7, r4, VCPU_HOST_DBG - 4
+       mfspr   r8, SPRN_DBCR0
+       stwu    r8, 4(r7)
+       mfspr   r8, SPRN_IAC1
+       stwu    r8, 4(r7)
+       mfspr   r8, SPRN_IAC2
+       stwu    r8, 4(r7)
+       mfspr   r8, SPRN_IAC3
+       stwu    r8, 4(r7)
+       mfspr   r8, SPRN_IAC4
+       stwu    r8, 4(r7)
+       mfspr   r8, SPRN_DAC1
+       stwu    r8, 4(r7)
+       mfspr   r8, SPRN_DAC2
+       stwu    r8, 4(r7)
+       addi    r7, r4, VCPU_SHADOW_DBG - 4
+       lwzu    r8, 4(r7)
+       mtspr   SPRN_DBCR0, r8
+       lwzu    r8, 4(r7)
+       mtspr   SPRN_IAC1, r8
+       lwzu    r8, 4(r7)
+       mtspr   SPRN_IAC2, r8
+       lwzu    r8, 4(r7)
+       mtspr   SPRN_IAC3, r8
+       lwzu    r8, 4(r7)
+       mtspr   SPRN_IAC4, r8
+       lwzu    r8, 4(r7)
+       mtspr   SPRN_DAC1, r8
+       lwzu    r8, 4(r7)
+       mtspr   SPRN_DAC2, r8
+..skip_load_guest_debug:
+
 #ifdef CONFIG_KVM_EXIT_TIMING
        /* save enter time */
 1:
-- 
1.6.4

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" 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