All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] KVM: PPC: booke: Allow multiple exception types
@ 2012-07-26  5:44 ` Bharat Bhushan
  0 siblings, 0 replies; 26+ messages in thread
From: Bharat Bhushan @ 2012-07-26  5:32 UTC (permalink / raw)
  To: kvm-ppc, kvm, agraf; +Cc: Bharat Bhushan

Current kvmppc_booke_handlers uses the same macro (KVM_HANDLER) and
all handlers are considered to be the same size. This will not be
the case if we want to use different macros for different handlers.

This patch improves the kvmppc_booke_handler so that it can
support different macros for different handlers.

Signed-off-by: Liu Yu <yu.liu@freescale.com>
Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
---
 arch/powerpc/include/asm/kvm_asm.h  |    2 ++
 arch/powerpc/kvm/booke.c            |    9 +++++----
 arch/powerpc/kvm/booke.h            |    1 +
 arch/powerpc/kvm/booke_interrupts.S |   30 ++++++++++++++++++++++++++++++
 arch/powerpc/kvm/e500.c             |   13 ++++++++-----
 5 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_asm.h b/arch/powerpc/include/asm/kvm_asm.h
index 76fdcfe..97afd4a 100644
--- a/arch/powerpc/include/asm/kvm_asm.h
+++ b/arch/powerpc/include/asm/kvm_asm.h
@@ -67,6 +67,8 @@
 #define BOOKE_INTERRUPT_HV_SYSCALL 40
 #define BOOKE_INTERRUPT_HV_PRIV 41
 
+#define BOOKE_INTERRUPT_END 1023
+
 /* book3s */
 
 #define BOOK3S_INTERRUPT_SYSTEM_RESET	0x100
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 47a7925..6fbdcfc 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -1528,6 +1528,7 @@ int __init kvmppc_booke_init(void)
 {
 #ifndef CONFIG_KVM_BOOKE_HV
 	unsigned long ivor[16];
+	unsigned long *handler = kvmppc_booke_handler_addr;
 	unsigned long max_ivor = 0;
 	int i;
 
@@ -1561,14 +1562,14 @@ int __init kvmppc_booke_init(void)
 
 	for (i = 0; i < 16; i++) {
 		if (ivor[i] > max_ivor)
-			max_ivor = ivor[i];
+			max_ivor = i;
 
 		memcpy((void *)kvmppc_booke_handlers + ivor[i],
-		       kvmppc_handlers_start + i * kvmppc_handler_len,
-		       kvmppc_handler_len);
+		       (void *)handler[i], handler[i + 1] - handler[i]);
 	}
 	flush_icache_range(kvmppc_booke_handlers,
-	                   kvmppc_booke_handlers + max_ivor + kvmppc_handler_len);
+	                   kvmppc_booke_handlers + ivor[max_ivor] +
+                               handler[max_ivor + 1] - handler[max_ivor]);
 #endif /* !BOOKE_HV */
 	return 0;
 }
diff --git a/arch/powerpc/kvm/booke.h b/arch/powerpc/kvm/booke.h
index ba61974..de9e526 100644
--- a/arch/powerpc/kvm/booke.h
+++ b/arch/powerpc/kvm/booke.h
@@ -65,6 +65,7 @@
 			  (1 << BOOKE_IRQPRIO_CRITICAL))
 
 extern unsigned long kvmppc_booke_handlers;
+extern unsigned long kvmppc_booke_handler_addr[];
 
 void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr);
 void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr);
diff --git a/arch/powerpc/kvm/booke_interrupts.S b/arch/powerpc/kvm/booke_interrupts.S
index 09456c4..bcb34ea 100644
--- a/arch/powerpc/kvm/booke_interrupts.S
+++ b/arch/powerpc/kvm/booke_interrupts.S
@@ -74,6 +74,10 @@ _GLOBAL(kvmppc_handler_\ivor_nr)
 	bctr
 .endm
 
+.macro KVM_HANDLER_ADDR ivor_nr
+	.long	kvmppc_handler_\ivor_nr
+.endm
+
 _GLOBAL(kvmppc_handlers_start)
 KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
 KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK  SPRN_SPRG_RSCRATCH_MC SPRN_MCSRR0
@@ -94,6 +98,7 @@ KVM_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
+KVM_HANDLER BOOKE_INTERRUPT_END SPRN_SPRG_RSCRATCH0 SPRN_SRR0
 
 _GLOBAL(kvmppc_handler_len)
 	.long kvmppc_handler_1 - kvmppc_handler_0
@@ -464,6 +469,31 @@ lightweight_exit:
 	lwz	r4, VCPU_GPR(r4)(r4)
 	rfi
 
+	.data
+	.align	4
+	.globl	kvmppc_booke_handler_addr
+kvmppc_booke_handler_addr:
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_CRITICAL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_MACHINE_CHECK
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DATA_STORAGE
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_INST_STORAGE
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_EXTERNAL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_ALIGNMENT
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_PROGRAM
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_FP_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SYSCALL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_AP_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DECREMENTER
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_FIT
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_WATCHDOG
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DTLB_MISS
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_ITLB_MISS
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DEBUG
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_DATA
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_ROUND
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_END
+
 #ifdef CONFIG_SPE
 _GLOBAL(kvmppc_save_guest_spe)
 	cmpi	0,r3,0
diff --git a/arch/powerpc/kvm/e500.c b/arch/powerpc/kvm/e500.c
index b479ed7..cb7a5e7 100644
--- a/arch/powerpc/kvm/e500.c
+++ b/arch/powerpc/kvm/e500.c
@@ -491,12 +491,15 @@ static int __init kvmppc_e500_init(void)
 {
 	int r, i;
 	unsigned long ivor[3];
+	unsigned long *handler = kvmppc_booke_handler_addr;
 	unsigned long max_ivor = 0;
 
 	r = kvmppc_core_check_processor_compat();
 	if (r)
 		return r;
 
+	handler += 16;
+
 	r = kvmppc_booke_init();
 	if (r)
 		return r;
@@ -506,15 +509,15 @@ static int __init kvmppc_e500_init(void)
 	ivor[1] = mfspr(SPRN_IVOR33);
 	ivor[2] = mfspr(SPRN_IVOR34);
 	for (i = 0; i < 3; i++) {
-		if (ivor[i] > max_ivor)
-			max_ivor = ivor[i];
+		if (ivor[i] > ivor[max_ivor])
+			max_ivor = i;
 
 		memcpy((void *)kvmppc_booke_handlers + ivor[i],
-		       kvmppc_handlers_start + (i + 16) * kvmppc_handler_len,
-		       kvmppc_handler_len);
+		       (void *)handler[i], handler[i + 1] - handler[i]);
 	}
 	flush_icache_range(kvmppc_booke_handlers,
-			kvmppc_booke_handlers + max_ivor + kvmppc_handler_len);
+	                   kvmppc_booke_handlers + ivor[max_ivor] +
+	                       handler[max_ivor + 1] - handler[max_ivor]);
 
 	return kvm_init(NULL, sizeof(struct kvmppc_vcpu_e500), 0, THIS_MODULE);
 }
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
  2012-07-26  5:44 ` Bharat Bhushan
@ 2012-07-26  5:44   ` Bharat Bhushan
  -1 siblings, 0 replies; 26+ messages in thread
From: Bharat Bhushan @ 2012-07-26  5:32 UTC (permalink / raw)
  To: kvm-ppc, kvm, agraf; +Cc: Bharat Bhushan

This patch adds:
 1) KVM debug handler added for e500v2.
 2) Guest debug by qemu gdb stub.

Signed-off-by: Liu Yu <yu.liu@freescale.com>
Signed-off-by: Varun Sethi <Varun.Sethi@freescale.com>
[bharat.bhushan@freescale.com: Substantial changes]
Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
---
 arch/powerpc/include/asm/kvm.h        |   21 +++++
 arch/powerpc/include/asm/kvm_host.h   |    7 ++
 arch/powerpc/include/asm/kvm_ppc.h    |    2 +
 arch/powerpc/include/asm/reg_booke.h  |    1 +
 arch/powerpc/kernel/asm-offsets.c     |   31 ++++++-
 arch/powerpc/kvm/booke.c              |  146 +++++++++++++++++++++++++++---
 arch/powerpc/kvm/booke_interrupts.S   |  160 ++++++++++++++++++++++++++++++++-
 arch/powerpc/kvm/bookehv_interrupts.S |  141 ++++++++++++++++++++++++++++-
 arch/powerpc/kvm/e500mc.c             |    3 +-
 arch/powerpc/kvm/powerpc.c            |    2 +-
 10 files changed, 492 insertions(+), 22 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm.h b/arch/powerpc/include/asm/kvm.h
index 3c14202..da71c84 100644
--- a/arch/powerpc/include/asm/kvm.h
+++ b/arch/powerpc/include/asm/kvm.h
@@ -25,6 +25,7 @@
 /* Select powerpc specific features in <linux/kvm.h> */
 #define __KVM_HAVE_SPAPR_TCE
 #define __KVM_HAVE_PPC_SMT
+#define __KVM_HAVE_GUEST_DEBUG
 
 struct kvm_regs {
 	__u64 pc;
@@ -265,10 +266,19 @@ struct kvm_fpu {
 };
 
 struct kvm_debug_exit_arch {
+	__u32 exception;
+	__u32 pc;
+	__u32 status;
 };
 
 /* for KVM_SET_GUEST_DEBUG */
 struct kvm_guest_debug_arch {
+	struct {
+		__u64 addr;
+		__u32 type;
+		__u32 pad1;
+		__u64 pad2;
+	} bp[16];
 };
 
 /* definition of registers in kvm_run */
@@ -285,6 +295,17 @@ struct kvm_sync_regs {
 #define KVM_CPU_3S_64		4
 #define KVM_CPU_E500MC		5
 
+/* Debug related defines */
+#define KVM_INST_GUESTGDB               0x7C00021C      /* ehpriv OC=0 */
+
+#define KVM_GUESTDBG_USE_SW_BP          0x00010000
+#define KVM_GUESTDBG_USE_HW_BP          0x00020000
+
+#define KVMPPC_DEBUG_NOTYPE             0x0
+#define KVMPPC_DEBUG_BREAKPOINT         (1UL << 1)
+#define KVMPPC_DEBUG_WATCH_WRITE        (1UL << 2)
+#define KVMPPC_DEBUG_WATCH_READ         (1UL << 3)
+
 /* for KVM_CAP_SPAPR_TCE */
 struct kvm_create_spapr_tce {
 	__u64 liobn;
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index 7a45194..524af7a 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -458,7 +458,12 @@ struct kvm_vcpu_arch {
 	u32 ccr0;
 	u32 ccr1;
 	u32 dbsr;
+	/* guest debug regiters*/
 	struct kvmppc_booke_debug_reg dbg_reg;
+	/* shadow debug registers */
+	struct kvmppc_booke_debug_reg shadow_dbg_reg;
+	/* host debug regiters*/
+	struct kvmppc_booke_debug_reg host_dbg_reg;
 
 	u64 mmcr[3];
 	u32 pmc[8];
@@ -492,6 +497,7 @@ struct kvm_vcpu_arch {
 	u32 tlbcfg[4];
 	u32 mmucfg;
 	u32 epr;
+	u32 crit_save;
 #endif
 	gpa_t paddr_accessed;
 	gva_t vaddr_accessed;
@@ -533,6 +539,7 @@ struct kvm_vcpu_arch {
 	struct kvm_vcpu_arch_shared *shared;
 	unsigned long magic_page_pa; /* phys addr to map the magic page to */
 	unsigned long magic_page_ea; /* effect. addr to map the magic page to */
+	struct kvm_guest_debug_arch dbg; /* debug arg between kvm and qemu */
 
 #ifdef CONFIG_KVM_BOOK3S_64_HV
 	struct kvm_vcpu_arch_shared shregs;
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index 823d563..c97b234 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -115,6 +115,8 @@ extern int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn,
 				     ulong val);
 extern int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn,
 				     ulong *val);
+extern int kvmppc_core_set_guest_debug(struct kvm_vcpu *vcpu,
+					struct kvm_guest_debug *dbg);
 
 extern int kvmppc_booke_init(void);
 extern void kvmppc_booke_exit(void);
diff --git a/arch/powerpc/include/asm/reg_booke.h b/arch/powerpc/include/asm/reg_booke.h
index e07e6af..b417de3 100644
--- a/arch/powerpc/include/asm/reg_booke.h
+++ b/arch/powerpc/include/asm/reg_booke.h
@@ -56,6 +56,7 @@
 #define SPRN_SPRG7W	0x117	/* Special Purpose Register General 7 Write */
 #define SPRN_EPCR	0x133	/* Embedded Processor Control Register */
 #define SPRN_DBCR2	0x136	/* Debug Control Register 2 */
+#define SPRN_DBCR4	0x233	/* Debug Control Register 4 */
 #define SPRN_MSRP	0x137	/* MSR Protect Register */
 #define SPRN_IAC3	0x13A	/* Instruction Address Compare 3 */
 #define SPRN_IAC4	0x13B	/* Instruction Address Compare 4 */
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index 52c7ad7..1310775 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -116,7 +116,7 @@ int main(void)
 #ifdef CONFIG_KVM_BOOK3S_32_HANDLER
 	DEFINE(THREAD_KVM_SVCPU, offsetof(struct thread_struct, kvm_shadow_vcpu));
 #endif
-#ifdef CONFIG_KVM_BOOKE_HV
+#if defined(CONFIG_KVM_E500V2) || defined(CONFIG_KVM_E500MC)
 	DEFINE(THREAD_KVM_VCPU, offsetof(struct thread_struct, kvm_vcpu));
 #endif
 
@@ -431,6 +431,9 @@ int main(void)
 
 	DEFINE(VCPU_KVM, offsetof(struct kvm_vcpu, kvm));
 	DEFINE(KVM_LPID, offsetof(struct kvm, arch.lpid));
+#ifdef CONFIG_BOOKE
+	DEFINE(VCPU_CRIT_SAVE, offsetof(struct kvm_vcpu, arch.crit_save));
+#endif
 
 	/* book3s */
 #ifdef CONFIG_KVM_BOOK3S_64_HV
@@ -562,6 +565,32 @@ 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_DBSR, offsetof(struct kvm_vcpu, arch.dbsr));
+	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(KVMPPC_DBG_DBCR0, offsetof(struct kvmppc_booke_debug_reg,
+					  dbcr0));
+	DEFINE(KVMPPC_DBG_DBCR1, offsetof(struct kvmppc_booke_debug_reg,
+					  dbcr1));
+	DEFINE(KVMPPC_DBG_DBCR2, offsetof(struct kvmppc_booke_debug_reg,
+					  dbcr2));
+#ifdef CONFIG_KVM_E500MC
+	DEFINE(KVMPPC_DBG_DBCR4, offsetof(struct kvmppc_booke_debug_reg,
+					  dbcr4));
+#endif
+	DEFINE(KVMPPC_DBG_IAC1, offsetof(struct kvmppc_booke_debug_reg,
+					 iac[0]));
+	DEFINE(KVMPPC_DBG_IAC2, offsetof(struct kvmppc_booke_debug_reg,
+					 iac[1]));
+	DEFINE(KVMPPC_DBG_IAC3, offsetof(struct kvmppc_booke_debug_reg,
+					 iac[2]));
+	DEFINE(KVMPPC_DBG_IAC4, offsetof(struct kvmppc_booke_debug_reg,
+					 iac[3]));
+	DEFINE(KVMPPC_DBG_DAC1, offsetof(struct kvmppc_booke_debug_reg,
+					 dac[0]));
+	DEFINE(KVMPPC_DBG_DAC2, offsetof(struct kvmppc_booke_debug_reg,
+					 dac[1]));
+	DEFINE(VCPU_GUEST_DEBUG, offsetof(struct kvm_vcpu, guest_debug));
 #endif /* CONFIG_PPC_BOOK3S */
 #endif /* CONFIG_KVM */
 
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 6fbdcfc..784a6bf 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -130,6 +130,9 @@ void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr)
 
 #ifdef CONFIG_KVM_BOOKE_HV
 	new_msr |= MSR_GS;
+
+	if (vcpu->guest_debug)
+		new_msr |= MSR_DE;
 #endif
 
 	vcpu->arch.shared->msr = new_msr;
@@ -684,10 +687,21 @@ out:
 	return ret;
 }
 
-static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
+static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
+			  int exit_nr)
 {
 	enum emulation_result er;
 
+	if (unlikely(vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) &&
+		     (vcpu->arch.last_inst == KVM_INST_GUESTGDB)) {
+		run->exit_reason = KVM_EXIT_DEBUG;
+		run->debug.arch.pc = vcpu->arch.pc;
+		run->debug.arch.exception = exit_nr;
+		run->debug.arch.status = 0;
+		kvmppc_account_exit(vcpu, DEBUG_EXITS);
+		return RESUME_HOST;
+	}
+
 	er = kvmppc_emulate_instruction(run, vcpu);
 	switch (er) {
 	case EMULATE_DONE:
@@ -714,6 +728,44 @@ static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
 	default:
 		BUG();
 	}
+
+	if (unlikely(vcpu->guest_debug & KVM_GUESTDBG_ENABLE) &&
+	    (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)) {
+		run->exit_reason = KVM_EXIT_DEBUG;
+		return RESUME_HOST;
+	}
+}
+
+static int kvmppc_handle_debug(struct kvm_run *run, struct kvm_vcpu *vcpu)
+{
+	u32 dbsr;
+
+#ifndef CONFIG_KVM_BOOKE_HV
+	if (cpu_has_feature(CPU_FTR_DEBUG_LVL_EXC))
+		vcpu->arch.pc = mfspr(SPRN_DSRR0);
+	else
+		vcpu->arch.pc = mfspr(SPRN_CSRR0);
+#endif
+	dbsr = vcpu->arch.dbsr;
+
+	run->debug.arch.pc = vcpu->arch.pc;
+	run->debug.arch.status = 0;
+	vcpu->arch.dbsr = 0;
+
+	if (dbsr & (DBSR_IAC1 | DBSR_IAC2 | DBSR_IAC3 | DBSR_IAC4)) {
+		run->debug.arch.status |= KVMPPC_DEBUG_BREAKPOINT;
+	} else {
+		if (dbsr & (DBSR_DAC1W | DBSR_DAC2W))
+			run->debug.arch.status |= KVMPPC_DEBUG_WATCH_WRITE;
+		else if (dbsr & (DBSR_DAC1R | DBSR_DAC2R))
+			run->debug.arch.status |= KVMPPC_DEBUG_WATCH_READ;
+		if (dbsr & (DBSR_DAC1R | DBSR_DAC1W))
+			run->debug.arch.pc = vcpu->arch.shadow_dbg_reg.dac[0];
+		else if (dbsr & (DBSR_DAC2R | DBSR_DAC2W))
+			run->debug.arch.pc = vcpu->arch.shadow_dbg_reg.dac[1];
+	}
+
+	return RESUME_HOST;
 }
 
 static void kvmppc_fill_pt_regs(struct pt_regs *regs)
@@ -856,7 +908,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
 		break;
 
 	case BOOKE_INTERRUPT_HV_PRIV:
-		r = emulation_exit(run, vcpu);
+		r = emulation_exit(run, vcpu, exit_nr);
 		break;
 
 	case BOOKE_INTERRUPT_PROGRAM:
@@ -875,7 +927,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
 			break;
 		}
 
-		r = emulation_exit(run, vcpu);
+		r = emulation_exit(run, vcpu, exit_nr);
 		break;
 
 	case BOOKE_INTERRUPT_FP_UNAVAIL:
@@ -1065,18 +1117,12 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
 	}
 
 	case BOOKE_INTERRUPT_DEBUG: {
-		u32 dbsr;
-
-		vcpu->arch.pc = mfspr(SPRN_CSRR0);
-
-		/* clear IAC events in DBSR register */
-		dbsr = mfspr(SPRN_DBSR);
-		dbsr &= DBSR_IAC1 | DBSR_IAC2 | DBSR_IAC3 | DBSR_IAC4;
-		mtspr(SPRN_DBSR, dbsr);
-
-		run->exit_reason = KVM_EXIT_DEBUG;
+		r = kvmppc_handle_debug(run, vcpu);
+		if (r == RESUME_HOST) {
+			run->debug.arch.exception = exit_nr;
+			run->exit_reason = KVM_EXIT_DEBUG;
+		}
 		kvmppc_account_exit(vcpu, DEBUG_EXITS);
-		r = RESUME_HOST;
 		break;
 	}
 
@@ -1107,6 +1153,78 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
 	return r;
 }
 
+#define BP_NUM	KVMPPC_BOOKE_IAC_NUM
+#define WP_NUM	KVMPPC_BOOKE_DAC_NUM
+
+int kvmppc_core_set_guest_debug(struct kvm_vcpu *vcpu,
+				struct kvm_guest_debug *dbg)
+{
+	if (!(dbg->control & KVM_GUESTDBG_ENABLE)) {
+		vcpu->guest_debug = 0;
+		return 0;
+	}
+
+	vcpu->guest_debug = dbg->control;
+	vcpu->arch.shadow_dbg_reg.dbcr0 = 0;
+
+	if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)
+		vcpu->arch.shadow_dbg_reg.dbcr0 |= DBCR0_IDM | DBCR0_IC;
+
+	if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) {
+		struct kvmppc_booke_debug_reg *gdbgr =
+				&(vcpu->arch.shadow_dbg_reg);
+		int n, b = 0, w = 0;
+		const u32 bp_code[] = {
+			DBCR0_IAC1 | DBCR0_IDM,
+			DBCR0_IAC2 | DBCR0_IDM,
+			DBCR0_IAC3 | DBCR0_IDM,
+			DBCR0_IAC4 | DBCR0_IDM
+		};
+		const u32 wp_code[] = {
+			DBCR0_DAC1W | DBCR0_IDM,
+			DBCR0_DAC2W | DBCR0_IDM,
+			DBCR0_DAC1R | DBCR0_IDM,
+			DBCR0_DAC2R | DBCR0_IDM
+		};
+
+#ifndef CONFIG_KVM_BOOKE_HV
+		gdbgr->dbcr1 = DBCR1_IAC1US | DBCR1_IAC2US |
+				DBCR1_IAC3US | DBCR1_IAC4US;
+		gdbgr->dbcr2 = DBCR2_DAC1US | DBCR2_DAC2US;
+#else
+		gdbgr->dbcr1 = 0;
+		gdbgr->dbcr2 = 0;
+#endif
+
+		for (n = 0; n < (BP_NUM + WP_NUM); n++) {
+			u32 type = dbg->arch.bp[n].type;
+
+			if (!type)
+				break;
+
+			if (type & (KVMPPC_DEBUG_WATCH_READ |
+				    KVMPPC_DEBUG_WATCH_WRITE)) {
+				if (w < WP_NUM) {
+					if (type & KVMPPC_DEBUG_WATCH_READ)
+						gdbgr->dbcr0 |= wp_code[w + 2];
+					if (type & KVMPPC_DEBUG_WATCH_WRITE)
+						gdbgr->dbcr0 |= wp_code[w];
+					gdbgr->dac[w] = dbg->arch.bp[n].addr;
+					w++;
+				}
+			} else if (type & KVMPPC_DEBUG_BREAKPOINT) {
+				if (b < BP_NUM) {
+					gdbgr->dbcr0 |= bp_code[b];
+					gdbgr->iac[b] = dbg->arch.bp[n].addr;
+					b++;
+				}
+			}
+		}
+	}
+
+	return 0;
+}
+
 /* Initial guest state: 16MB mapping 0 -> 0, PC = 0, MSR = 0, R1 = 16MB */
 int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
 {
diff --git a/arch/powerpc/kvm/booke_interrupts.S b/arch/powerpc/kvm/booke_interrupts.S
index bcb34ea..fb85606 100644
--- a/arch/powerpc/kvm/booke_interrupts.S
+++ b/arch/powerpc/kvm/booke_interrupts.S
@@ -40,6 +40,8 @@
 #define HOST_MIN_STACK_SIZE (HOST_NV_GPR(31) + 4)
 #define HOST_STACK_SIZE (((HOST_MIN_STACK_SIZE + 15) / 16) * 16) /* Align. */
 #define HOST_STACK_LR   (HOST_STACK_SIZE + 4) /* In caller stack frame. */
+#define DBCR0_AC_BITS	(DBCR0_IAC1 | DBCR0_IAC2 | DBCR0_IAC3 | DBCR0_IAC4 | \
+			 DBCR0_DAC1R | DBCR0_DAC1W | DBCR0_DAC2R | DBCR0_DAC2W)
 
 #define NEED_INST_MASK ((1<<BOOKE_INTERRUPT_PROGRAM) | \
                         (1<<BOOKE_INTERRUPT_DTLB_MISS) | \
@@ -53,11 +55,17 @@
                        (1<<BOOKE_INTERRUPT_PROGRAM) | \
                        (1<<BOOKE_INTERRUPT_DTLB_MISS))
 
+#define NEED_DEBUG_SAVE (1<<BOOKE_INTERRUPT_DEBUG)
+
+#define GET_VCPU_POINT(regd)                 \
+	mfspr   regd, SPRN_SPRG_THREAD;      \
+	lwz	regd, THREAD_KVM_VCPU(regd)
+
 .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_RVCPU
+	GET_VCPU_POINT(r4)
 	stw	r3, VCPU_GPR(r3)(r4)
 	stw	r5, VCPU_GPR(r5)(r4)
 	stw	r6, VCPU_GPR(r6)(r4)
@@ -74,6 +82,48 @@ _GLOBAL(kvmppc_handler_\ivor_nr)
 	bctr
 .endm
 
+.macro KVM_DBG_HANDLER ivor_nr scratch srr0
+_GLOBAL(kvmppc_handler_\ivor_nr)
+	mtspr   \scratch, r4
+	GET_VCPU_POINT(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
+	GET_VCPU_POINT(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
+	GET_VCPU_POINT(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
@@ -94,7 +144,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
@@ -176,6 +226,61 @@ _GLOBAL(kvmppc_resume_host)
 	stw	r9, VCPU_FAULT_ESR(r4)
 ..skip_esr:
 
+	addi	r7, r4, VCPU_HOST_DBG
+	mfspr	r9, SPRN_DBCR0
+	lwz	r8, KVMPPC_DBG_DBCR0(r7)
+	andis.	r9, r9, DBCR0_AC_BITS@h
+	beq	..skip_load_host_debug
+	li	r9, 0
+	mtspr	SPRN_DBCR0, r9		/* disable all debug event */
+	lwz	r9, KVMPPC_DBG_DBCR1(r7)
+	mtspr	SPRN_DBCR1, r9
+	lwz	r9, KVMPPC_DBG_DBCR2(r7)
+	mtspr	SPRN_DBCR2, r9
+	lwz	r9, KVMPPC_DBG_IAC1+4(r7)
+	mtspr	SPRN_IAC1, r9
+	lwz	r9, KVMPPC_DBG_IAC2+4(r7)
+	mtspr	SPRN_IAC2, r9
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	lwz	r9, KVMPPC_DBG_IAC3+4(r7)
+	mtspr	SPRN_IAC3, r9
+	lwz	r9, KVMPPC_DBG_IAC4+4(r7)
+	mtspr	SPRN_IAC4, r9
+#endif
+	lwz	r9, KVMPPC_DBG_DAC1+4(r7)
+	mtspr	SPRN_DAC1, r9
+	lwz	r9, KVMPPC_DBG_DAC2+4(r7)
+	mtspr	SPRN_DAC2, r9
+..skip_load_host_debug:
+	/* Clear h/w DBSR and save current(guest) DBSR */
+	mfspr	r9, SPRN_DBSR
+	mtspr	SPRN_DBSR, r9
+	isync
+	andi.	r7, r6, NEED_DEBUG_SAVE
+	beq	..skip_dbsr_save
+	/*
+	 * If vcpu->guest_debug flag is set then do not check for
+	 * shared->msr.DE as this debugging (say by QEMU) does not
+	 * depends on shared->msr.de. In these scanerios MSR.DE is
+	 * always set using shared_msr and should be handled always.
+	 */
+	lwz	r7, VCPU_GUEST_DEBUG(r4)
+	cmpwi	r7, 0
+	bne	..skip_save_trap_event
+	PPC_LL	r3, VCPU_SHARED(r4)
+#ifndef CONFIG_64BIT
+	lwz	r3, (VCPU_SHARED_MSR + 4)(r3)
+#else
+	ld	r3, (VCPU_SHARED_MSR)(r3)
+#endif
+	andi.	r3, r3, MSR_DE
+	bne	..skip_save_trap_event
+	andis.	r9, r9, DBSR_TIE@h
+..skip_save_trap_event:
+	stw	r9, VCPU_DBSR(r4)
+..skip_dbsr_save:
+	mtspr	SPRN_DBCR0, r8
+
 	/* Save remaining volatile guest register state to vcpu. */
 	stw	r0, VCPU_GPR(r0)(r4)
 	stw	r1, VCPU_GPR(r1)(r4)
@@ -432,6 +537,57 @@ lightweight_exit:
 	PPC_LD(r3, VCPU_SHARED_SPRG7, r5)
 	mtspr	SPRN_SPRG7W, r3
 
+	mfmsr	r7
+	rlwinm	r7, r7, 0, ~MSR_DE
+	mtmsr	r7
+	addi	r5, r4, VCPU_SHADOW_DBG
+	addi	r7, r4, VCPU_HOST_DBG
+	lwz	r6, 0(r5)
+	mfspr	r8, SPRN_DBCR0
+	andis.	r3, r6, DBCR0_AC_BITS@h
+	stw	r8, KVMPPC_DBG_DBCR0(r7)
+	beq	..skip_load_guest_debug
+	mfspr	r8, SPRN_DBCR1
+	stw	r8, KVMPPC_DBG_DBCR1(r7)
+	mfspr	r8, SPRN_DBCR2
+	stw	r8, KVMPPC_DBG_DBCR2(r7)
+	mfspr	r8, SPRN_IAC1
+	stw	r8, KVMPPC_DBG_IAC1+4(r7)
+	mfspr	r8, SPRN_IAC2
+	stw	r8, KVMPPC_DBG_IAC2+4(r7)
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	mfspr	r8, SPRN_IAC3
+	stw	r8, KVMPPC_DBG_IAC3+4(r7)
+	mfspr	r8, SPRN_IAC4
+	stw	r8, KVMPPC_DBG_IAC4+4(r7)
+#endif
+	mfspr	r8, SPRN_DAC1
+	stw	r8, KVMPPC_DBG_DAC1+4(r7)
+	mfspr	r8, SPRN_DAC2
+	stw	r8, KVMPPC_DBG_DAC2+4(r7)
+	li	r8, 0
+	mtspr	SPRN_DBCR0, r8		/* disable all debug event */
+	lwz	r8, KVMPPC_DBG_DBCR1(r5)
+	mtspr	SPRN_DBCR1, r8
+	lwz	r8, KVMPPC_DBG_DBCR2(r5)
+	mtspr	SPRN_DBCR2, r8
+	lwz	r8, KVMPPC_DBG_IAC1+4(r5)
+	mtspr	SPRN_IAC1, r8
+	lwz	r8, KVMPPC_DBG_IAC2+4(r5)
+	mtspr	SPRN_IAC2, r8
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	lwz	r8, KVMPPC_DBG_IAC3+4(r5)
+	mtspr	SPRN_IAC3, r8
+	lwz	r8, KVMPPC_DBG_IAC4+4(r5)
+	mtspr	SPRN_IAC4, r8
+#endif
+	lwz	r8, KVMPPC_DBG_DAC1+4(r5)
+	mtspr	SPRN_DAC1, r8
+	lwz	r8, KVMPPC_DBG_DAC2+4(r5)
+	mtspr	SPRN_DAC2, r8
+..skip_load_guest_debug:
+	mtspr	SPRN_DBCR0, r6
+
 #ifdef CONFIG_KVM_EXIT_TIMING
 	/* save enter time */
 1:
diff --git a/arch/powerpc/kvm/bookehv_interrupts.S b/arch/powerpc/kvm/bookehv_interrupts.S
index 0fa2ef7..32b9a41 100644
--- a/arch/powerpc/kvm/bookehv_interrupts.S
+++ b/arch/powerpc/kvm/bookehv_interrupts.S
@@ -59,6 +59,10 @@
 #define NEED_EMU		0x00000001 /* emulation -- save nv regs */
 #define NEED_DEAR		0x00000002 /* save faulting DEAR */
 #define NEED_ESR		0x00000004 /* save faulting ESR */
+#define NEED_DBSR		0x00000008 /* save DBSR */
+
+#define DBCR0_AC_BITS	(DBCR0_IAC1 | DBCR0_IAC2 | DBCR0_IAC3 | DBCR0_IAC4 | \
+			 DBCR0_DAC1R | DBCR0_DAC1W | DBCR0_DAC2R | DBCR0_DAC2W)
 
 /*
  * On entry:
@@ -202,6 +206,11 @@
 	PPC_STL	r9, VCPU_FAULT_DEAR(r4)
 	.endif
 
+	.if	\flags & NEED_DBSR
+	mfspr	r9, SPRN_DBSR
+	stw	r9, VCPU_DBSR(r4)
+	.endif
+
 	b	kvmppc_resume_host
 .endm
 
@@ -296,9 +305,9 @@ kvm_handler BOOKE_INTERRUPT_GUEST_DBELL, SPRN_GSRR0, SPRN_GSRR1, 0
 kvm_lvl_handler BOOKE_INTERRUPT_GUEST_DBELL_CRIT, \
 	SPRN_SPRG_RSCRATCH_CRIT, SPRN_CSRR0, SPRN_CSRR1, 0
 kvm_lvl_handler BOOKE_INTERRUPT_DEBUG, \
-	SPRN_SPRG_RSCRATCH_CRIT, SPRN_CSRR0, SPRN_CSRR1, 0
+	SPRN_SPRG_RSCRATCH_CRIT, SPRN_CSRR0, SPRN_CSRR1, NEED_DBSR
 kvm_lvl_handler BOOKE_INTERRUPT_DEBUG, \
-	SPRN_SPRG_RSCRATCH_DBG, SPRN_DSRR0, SPRN_DSRR1, 0
+	SPRN_SPRG_RSCRATCH_DBG, SPRN_DSRR0, SPRN_DSRR1, NEED_DBSR
 
 
 /* Registers:
@@ -308,6 +317,56 @@ kvm_lvl_handler BOOKE_INTERRUPT_DEBUG, \
  *  r14: KVM exit number
  */
 _GLOBAL(kvmppc_resume_host)
+	/*
+	 * If guest not used debug facility then hw debug registers
+	 * already have proper host values. If guest used debug
+	 * facility then restore host debug registers.
+	 * No Need to save guest debug registers as they are already intact
+	 * in guest/shadow registers.
+	 */
+	lwz	r9, VCPU_SHADOW_DBG(r4)
+	rlwinm.	r8, r9, 0, ~DBCR0_IDM
+	beq	skip_load_host_debug
+	lwz	r3, VCPU_HOST_DBG(r4)
+	andis.	r9, r9, DBCR0_AC_BITS@h
+	li	r9, 0
+	mtspr	SPRN_DBCR0, r9		/* disable all debug event */
+	beq	..skip_load_hw_bkpts
+	lwz	r7, VCPU_HOST_DBG+KVMPPC_DBG_DBCR1(r4)
+	lwz	r8, VCPU_HOST_DBG+KVMPPC_DBG_DBCR2(r4)
+	lwz	r9, VCPU_HOST_DBG+KVMPPC_DBG_DBCR4(r4)
+	mtspr	SPRN_DBCR1, r7
+	PPC_LD(r6, VCPU_HOST_DBG+KVMPPC_DBG_IAC1, r4)
+	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC2, r4)
+	mtspr	SPRN_DBCR2, r8
+	mtspr	SPRN_DBCR4, r9
+	mtspr	SPRN_IAC1, r6
+	mtspr	SPRN_IAC2, r7
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
+	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
+	mtspr	SPRN_IAC3, r7
+	mtspr	SPRN_IAC4, r8
+#endif
+	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_DAC1, r4)
+	PPC_LD(r9, VCPU_HOST_DBG+KVMPPC_DBG_DAC2, r4)
+	mtspr	SPRN_DAC1, r8
+	mtspr	SPRN_DAC2, r9
+..skip_load_hw_bkpts:
+	isync
+	/* Clear h/w DBSR and save current(guest) DBSR */
+	mfspr	r8, SPRN_DBSR
+	mtspr	SPRN_DBSR, r8
+	isync
+	/* Clear EPCR.DUVD and set host DBCR0 */
+	mfspr	r8, SPRN_EPCR
+	rlwinm	r8, r8, 0, ~SPRN_EPCR_DUVD
+	mtspr	SPRN_EPCR, r8
+	isync
+	mtspr	SPRN_DBCR0, r3
+	isync
+skip_load_host_debug:
+
 	/* Save remaining volatile guest register state to vcpu. */
 	mfspr	r3, SPRN_VRSAVE
 	PPC_STL	r0, VCPU_GPR(r0)(r4)
@@ -547,6 +606,84 @@ lightweight_exit:
 	mtspr	SPRN_SPRG6W, r7
 	mtspr	SPRN_SPRG7W, r8
 
+	mfmsr	r7
+	rlwinm	r7, r7, 0, ~MSR_DE
+	mtmsr	r7
+	/*
+	 * Load hw debug registers with guest(shadow) debug registers
+	 * if guest is using the debug facility and also set EPCR.DUVD
+	 * to not allow debug events in HV mode. Do not change the
+	 * debug registers if guest is not using the debug facility.
+	 */
+	lwz	r6, VCPU_SHADOW_DBG(r4)
+	rlwinm.	r7, r6, 0, ~DBCR0_IDM
+	beq	..skip_load_guest_debug
+	/* Save host DBCR0 */
+	mfspr	r8, SPRN_DBCR0
+	stw	r8, VCPU_HOST_DBG(r4)
+	/*
+	 * Save host DBCR1/2, IACx and DACx and load guest DBCR1/2,
+	 * IACx and DACx if guest using hw breakpoint/watchpoints.
+	 */
+	andis.	r3, r6, DBCR0_AC_BITS@h
+	beq	..skip_hw_bkpts
+	mfspr	r7, SPRN_DBCR1
+	stw	r7, VCPU_HOST_DBG+KVMPPC_DBG_DBCR1(r4)
+	mfspr	r8, SPRN_DBCR2
+	stw	r8, VCPU_HOST_DBG+KVMPPC_DBG_DBCR2(r4)
+	mfspr	r7, SPRN_DBCR4
+	stw	r7, VCPU_HOST_DBG+KVMPPC_DBG_DBCR4(r4)
+	mfspr	r8, SPRN_IAC1
+	PPC_STD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC1, r4)
+	mfspr	r7, SPRN_IAC2
+	PPC_STD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC2, r4)
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	mfspr	r8, SPRN_IAC3
+	PPC_STD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
+	mfspr	r7, SPRN_IAC4
+	PPC_STD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
+#endif
+	mfspr	r8, SPRN_DAC1
+	PPC_STD(r8, VCPU_HOST_DBG+KVMPPC_DBG_DAC1, r4)
+	mfspr	r7, SPRN_DAC2
+	PPC_STD(r7, VCPU_HOST_DBG+KVMPPC_DBG_DAC2, r4)
+	li	r8, 0
+	mtspr	SPRN_DBCR0, r8		/* disable all debug event */
+	lwz	r7, VCPU_SHADOW_DBG+KVMPPC_DBG_DBCR1(r4)
+	lwz	r8, VCPU_SHADOW_DBG+KVMPPC_DBG_DBCR2(r4)
+	lwz	r9, VCPU_SHADOW_DBG+KVMPPC_DBG_DBCR4(r4)
+	mtspr	SPRN_DBCR1, r7
+	PPC_LD(r7, VCPU_SHADOW_DBG+KVMPPC_DBG_IAC1, r4)
+	PPC_LD(r3, VCPU_SHADOW_DBG+KVMPPC_DBG_IAC2, r4)
+	mtspr	SPRN_DBCR2, r8
+	mtspr	SPRN_DBCR4, r9
+	mtspr	SPRN_IAC1, r7
+	mtspr	SPRN_IAC2, r3
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	PPC_LD(r7, VCPU_SHADOW_DBG+KVMPPC_DBG_IAC3, r4)
+	PPC_LD(r8, VCPU_SHADOW_DBG+KVMPPC_DBG_IAC4, r4)
+	mtspr	SPRN_IAC3, r7
+	mtspr	SPRN_IAC4, r8
+#endif
+	PPC_LD(r7, VCPU_SHADOW_DBG+KVMPPC_DBG_DAC1, r4)
+	PPC_LD(r8, VCPU_SHADOW_DBG+KVMPPC_DBG_DAC2, r4)
+	mtspr	SPRN_DAC1, r7
+	mtspr	SPRN_DAC2, r8
+..skip_hw_bkpts:
+	/* Set EPCR.DUVD and guest DBCR0 */
+	mfspr	r7, SPRN_EPCR
+	oris	r7, r7, SPRN_EPCR_DUVD@h
+	mtspr	SPRN_EPCR, r7
+	isync
+	/* Clear if any deferred debug event */
+	mfspr	r8, SPRN_DBSR
+	mtspr	SPRN_DBSR, r8
+	isync
+	/* Restore guest DBCR */
+	mtspr	SPRN_DBCR0, r6
+	isync
+..skip_load_guest_debug:
+
 	/* Load some guest volatiles. */
 	PPC_LL	r3, VCPU_LR(r4)
 	PPC_LL	r5, VCPU_XER(r4)
diff --git a/arch/powerpc/kvm/e500mc.c b/arch/powerpc/kvm/e500mc.c
index 1f89d26..f5fc6f5 100644
--- a/arch/powerpc/kvm/e500mc.c
+++ b/arch/powerpc/kvm/e500mc.c
@@ -182,8 +182,7 @@ int kvmppc_core_vcpu_setup(struct kvm_vcpu *vcpu)
 {
 	struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
 
-	vcpu->arch.shadow_epcr = SPRN_EPCR_DSIGS | SPRN_EPCR_DGTMI | \
-				 SPRN_EPCR_DUVD;
+	vcpu->arch.shadow_epcr = SPRN_EPCR_DSIGS | SPRN_EPCR_DGTMI;
 #ifdef CONFIG_64BIT
 	vcpu->arch.shadow_epcr |= SPRN_EPCR_ICM;
 #endif
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 685829a..38b5d02 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -427,7 +427,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
 int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
                                         struct kvm_guest_debug *dbg)
 {
-	return -EINVAL;
+	return kvmppc_core_set_guest_debug(vcpu, dbg);
 }
 
 static void kvmppc_complete_dcr_load(struct kvm_vcpu *vcpu,
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH 1/2] KVM: PPC: booke: Allow multiple exception types
@ 2012-07-26  5:44 ` Bharat Bhushan
  0 siblings, 0 replies; 26+ messages in thread
From: Bharat Bhushan @ 2012-07-26  5:44 UTC (permalink / raw)
  To: kvm-ppc, kvm, agraf; +Cc: Bharat Bhushan

Current kvmppc_booke_handlers uses the same macro (KVM_HANDLER) and
all handlers are considered to be the same size. This will not be
the case if we want to use different macros for different handlers.

This patch improves the kvmppc_booke_handler so that it can
support different macros for different handlers.

Signed-off-by: Liu Yu <yu.liu@freescale.com>
Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
---
 arch/powerpc/include/asm/kvm_asm.h  |    2 ++
 arch/powerpc/kvm/booke.c            |    9 +++++----
 arch/powerpc/kvm/booke.h            |    1 +
 arch/powerpc/kvm/booke_interrupts.S |   30 ++++++++++++++++++++++++++++++
 arch/powerpc/kvm/e500.c             |   13 ++++++++-----
 5 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_asm.h b/arch/powerpc/include/asm/kvm_asm.h
index 76fdcfe..97afd4a 100644
--- a/arch/powerpc/include/asm/kvm_asm.h
+++ b/arch/powerpc/include/asm/kvm_asm.h
@@ -67,6 +67,8 @@
 #define BOOKE_INTERRUPT_HV_SYSCALL 40
 #define BOOKE_INTERRUPT_HV_PRIV 41
 
+#define BOOKE_INTERRUPT_END 1023
+
 /* book3s */
 
 #define BOOK3S_INTERRUPT_SYSTEM_RESET	0x100
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 47a7925..6fbdcfc 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -1528,6 +1528,7 @@ int __init kvmppc_booke_init(void)
 {
 #ifndef CONFIG_KVM_BOOKE_HV
 	unsigned long ivor[16];
+	unsigned long *handler = kvmppc_booke_handler_addr;
 	unsigned long max_ivor = 0;
 	int i;
 
@@ -1561,14 +1562,14 @@ int __init kvmppc_booke_init(void)
 
 	for (i = 0; i < 16; i++) {
 		if (ivor[i] > max_ivor)
-			max_ivor = ivor[i];
+			max_ivor = i;
 
 		memcpy((void *)kvmppc_booke_handlers + ivor[i],
-		       kvmppc_handlers_start + i * kvmppc_handler_len,
-		       kvmppc_handler_len);
+		       (void *)handler[i], handler[i + 1] - handler[i]);
 	}
 	flush_icache_range(kvmppc_booke_handlers,
-	                   kvmppc_booke_handlers + max_ivor + kvmppc_handler_len);
+	                   kvmppc_booke_handlers + ivor[max_ivor] +
+                               handler[max_ivor + 1] - handler[max_ivor]);
 #endif /* !BOOKE_HV */
 	return 0;
 }
diff --git a/arch/powerpc/kvm/booke.h b/arch/powerpc/kvm/booke.h
index ba61974..de9e526 100644
--- a/arch/powerpc/kvm/booke.h
+++ b/arch/powerpc/kvm/booke.h
@@ -65,6 +65,7 @@
 			  (1 << BOOKE_IRQPRIO_CRITICAL))
 
 extern unsigned long kvmppc_booke_handlers;
+extern unsigned long kvmppc_booke_handler_addr[];
 
 void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr);
 void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr);
diff --git a/arch/powerpc/kvm/booke_interrupts.S b/arch/powerpc/kvm/booke_interrupts.S
index 09456c4..bcb34ea 100644
--- a/arch/powerpc/kvm/booke_interrupts.S
+++ b/arch/powerpc/kvm/booke_interrupts.S
@@ -74,6 +74,10 @@ _GLOBAL(kvmppc_handler_\ivor_nr)
 	bctr
 .endm
 
+.macro KVM_HANDLER_ADDR ivor_nr
+	.long	kvmppc_handler_\ivor_nr
+.endm
+
 _GLOBAL(kvmppc_handlers_start)
 KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
 KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK  SPRN_SPRG_RSCRATCH_MC SPRN_MCSRR0
@@ -94,6 +98,7 @@ KVM_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
+KVM_HANDLER BOOKE_INTERRUPT_END SPRN_SPRG_RSCRATCH0 SPRN_SRR0
 
 _GLOBAL(kvmppc_handler_len)
 	.long kvmppc_handler_1 - kvmppc_handler_0
@@ -464,6 +469,31 @@ lightweight_exit:
 	lwz	r4, VCPU_GPR(r4)(r4)
 	rfi
 
+	.data
+	.align	4
+	.globl	kvmppc_booke_handler_addr
+kvmppc_booke_handler_addr:
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_CRITICAL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_MACHINE_CHECK
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DATA_STORAGE
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_INST_STORAGE
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_EXTERNAL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_ALIGNMENT
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_PROGRAM
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_FP_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SYSCALL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_AP_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DECREMENTER
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_FIT
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_WATCHDOG
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DTLB_MISS
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_ITLB_MISS
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DEBUG
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_DATA
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_ROUND
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_END
+
 #ifdef CONFIG_SPE
 _GLOBAL(kvmppc_save_guest_spe)
 	cmpi	0,r3,0
diff --git a/arch/powerpc/kvm/e500.c b/arch/powerpc/kvm/e500.c
index b479ed7..cb7a5e7 100644
--- a/arch/powerpc/kvm/e500.c
+++ b/arch/powerpc/kvm/e500.c
@@ -491,12 +491,15 @@ static int __init kvmppc_e500_init(void)
 {
 	int r, i;
 	unsigned long ivor[3];
+	unsigned long *handler = kvmppc_booke_handler_addr;
 	unsigned long max_ivor = 0;
 
 	r = kvmppc_core_check_processor_compat();
 	if (r)
 		return r;
 
+	handler += 16;
+
 	r = kvmppc_booke_init();
 	if (r)
 		return r;
@@ -506,15 +509,15 @@ static int __init kvmppc_e500_init(void)
 	ivor[1] = mfspr(SPRN_IVOR33);
 	ivor[2] = mfspr(SPRN_IVOR34);
 	for (i = 0; i < 3; i++) {
-		if (ivor[i] > max_ivor)
-			max_ivor = ivor[i];
+		if (ivor[i] > ivor[max_ivor])
+			max_ivor = i;
 
 		memcpy((void *)kvmppc_booke_handlers + ivor[i],
-		       kvmppc_handlers_start + (i + 16) * kvmppc_handler_len,
-		       kvmppc_handler_len);
+		       (void *)handler[i], handler[i + 1] - handler[i]);
 	}
 	flush_icache_range(kvmppc_booke_handlers,
-			kvmppc_booke_handlers + max_ivor + kvmppc_handler_len);
+	                   kvmppc_booke_handlers + ivor[max_ivor] +
+	                       handler[max_ivor + 1] - handler[max_ivor]);
 
 	return kvm_init(NULL, sizeof(struct kvmppc_vcpu_e500), 0, THIS_MODULE);
 }
-- 
1.7.0.4



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
@ 2012-07-26  5:44   ` Bharat Bhushan
  0 siblings, 0 replies; 26+ messages in thread
From: Bharat Bhushan @ 2012-07-26  5:44 UTC (permalink / raw)
  To: kvm-ppc, kvm, agraf; +Cc: Bharat Bhushan

This patch adds:
 1) KVM debug handler added for e500v2.
 2) Guest debug by qemu gdb stub.

Signed-off-by: Liu Yu <yu.liu@freescale.com>
Signed-off-by: Varun Sethi <Varun.Sethi@freescale.com>
[bharat.bhushan@freescale.com: Substantial changes]
Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
---
 arch/powerpc/include/asm/kvm.h        |   21 +++++
 arch/powerpc/include/asm/kvm_host.h   |    7 ++
 arch/powerpc/include/asm/kvm_ppc.h    |    2 +
 arch/powerpc/include/asm/reg_booke.h  |    1 +
 arch/powerpc/kernel/asm-offsets.c     |   31 ++++++-
 arch/powerpc/kvm/booke.c              |  146 +++++++++++++++++++++++++++---
 arch/powerpc/kvm/booke_interrupts.S   |  160 ++++++++++++++++++++++++++++++++-
 arch/powerpc/kvm/bookehv_interrupts.S |  141 ++++++++++++++++++++++++++++-
 arch/powerpc/kvm/e500mc.c             |    3 +-
 arch/powerpc/kvm/powerpc.c            |    2 +-
 10 files changed, 492 insertions(+), 22 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm.h b/arch/powerpc/include/asm/kvm.h
index 3c14202..da71c84 100644
--- a/arch/powerpc/include/asm/kvm.h
+++ b/arch/powerpc/include/asm/kvm.h
@@ -25,6 +25,7 @@
 /* Select powerpc specific features in <linux/kvm.h> */
 #define __KVM_HAVE_SPAPR_TCE
 #define __KVM_HAVE_PPC_SMT
+#define __KVM_HAVE_GUEST_DEBUG
 
 struct kvm_regs {
 	__u64 pc;
@@ -265,10 +266,19 @@ struct kvm_fpu {
 };
 
 struct kvm_debug_exit_arch {
+	__u32 exception;
+	__u32 pc;
+	__u32 status;
 };
 
 /* for KVM_SET_GUEST_DEBUG */
 struct kvm_guest_debug_arch {
+	struct {
+		__u64 addr;
+		__u32 type;
+		__u32 pad1;
+		__u64 pad2;
+	} bp[16];
 };
 
 /* definition of registers in kvm_run */
@@ -285,6 +295,17 @@ struct kvm_sync_regs {
 #define KVM_CPU_3S_64		4
 #define KVM_CPU_E500MC		5
 
+/* Debug related defines */
+#define KVM_INST_GUESTGDB               0x7C00021C      /* ehpriv OC=0 */
+
+#define KVM_GUESTDBG_USE_SW_BP          0x00010000
+#define KVM_GUESTDBG_USE_HW_BP          0x00020000
+
+#define KVMPPC_DEBUG_NOTYPE             0x0
+#define KVMPPC_DEBUG_BREAKPOINT         (1UL << 1)
+#define KVMPPC_DEBUG_WATCH_WRITE        (1UL << 2)
+#define KVMPPC_DEBUG_WATCH_READ         (1UL << 3)
+
 /* for KVM_CAP_SPAPR_TCE */
 struct kvm_create_spapr_tce {
 	__u64 liobn;
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index 7a45194..524af7a 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -458,7 +458,12 @@ struct kvm_vcpu_arch {
 	u32 ccr0;
 	u32 ccr1;
 	u32 dbsr;
+	/* guest debug regiters*/
 	struct kvmppc_booke_debug_reg dbg_reg;
+	/* shadow debug registers */
+	struct kvmppc_booke_debug_reg shadow_dbg_reg;
+	/* host debug regiters*/
+	struct kvmppc_booke_debug_reg host_dbg_reg;
 
 	u64 mmcr[3];
 	u32 pmc[8];
@@ -492,6 +497,7 @@ struct kvm_vcpu_arch {
 	u32 tlbcfg[4];
 	u32 mmucfg;
 	u32 epr;
+	u32 crit_save;
 #endif
 	gpa_t paddr_accessed;
 	gva_t vaddr_accessed;
@@ -533,6 +539,7 @@ struct kvm_vcpu_arch {
 	struct kvm_vcpu_arch_shared *shared;
 	unsigned long magic_page_pa; /* phys addr to map the magic page to */
 	unsigned long magic_page_ea; /* effect. addr to map the magic page to */
+	struct kvm_guest_debug_arch dbg; /* debug arg between kvm and qemu */
 
 #ifdef CONFIG_KVM_BOOK3S_64_HV
 	struct kvm_vcpu_arch_shared shregs;
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index 823d563..c97b234 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -115,6 +115,8 @@ extern int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn,
 				     ulong val);
 extern int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn,
 				     ulong *val);
+extern int kvmppc_core_set_guest_debug(struct kvm_vcpu *vcpu,
+					struct kvm_guest_debug *dbg);
 
 extern int kvmppc_booke_init(void);
 extern void kvmppc_booke_exit(void);
diff --git a/arch/powerpc/include/asm/reg_booke.h b/arch/powerpc/include/asm/reg_booke.h
index e07e6af..b417de3 100644
--- a/arch/powerpc/include/asm/reg_booke.h
+++ b/arch/powerpc/include/asm/reg_booke.h
@@ -56,6 +56,7 @@
 #define SPRN_SPRG7W	0x117	/* Special Purpose Register General 7 Write */
 #define SPRN_EPCR	0x133	/* Embedded Processor Control Register */
 #define SPRN_DBCR2	0x136	/* Debug Control Register 2 */
+#define SPRN_DBCR4	0x233	/* Debug Control Register 4 */
 #define SPRN_MSRP	0x137	/* MSR Protect Register */
 #define SPRN_IAC3	0x13A	/* Instruction Address Compare 3 */
 #define SPRN_IAC4	0x13B	/* Instruction Address Compare 4 */
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index 52c7ad7..1310775 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -116,7 +116,7 @@ int main(void)
 #ifdef CONFIG_KVM_BOOK3S_32_HANDLER
 	DEFINE(THREAD_KVM_SVCPU, offsetof(struct thread_struct, kvm_shadow_vcpu));
 #endif
-#ifdef CONFIG_KVM_BOOKE_HV
+#if defined(CONFIG_KVM_E500V2) || defined(CONFIG_KVM_E500MC)
 	DEFINE(THREAD_KVM_VCPU, offsetof(struct thread_struct, kvm_vcpu));
 #endif
 
@@ -431,6 +431,9 @@ int main(void)
 
 	DEFINE(VCPU_KVM, offsetof(struct kvm_vcpu, kvm));
 	DEFINE(KVM_LPID, offsetof(struct kvm, arch.lpid));
+#ifdef CONFIG_BOOKE
+	DEFINE(VCPU_CRIT_SAVE, offsetof(struct kvm_vcpu, arch.crit_save));
+#endif
 
 	/* book3s */
 #ifdef CONFIG_KVM_BOOK3S_64_HV
@@ -562,6 +565,32 @@ 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_DBSR, offsetof(struct kvm_vcpu, arch.dbsr));
+	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(KVMPPC_DBG_DBCR0, offsetof(struct kvmppc_booke_debug_reg,
+					  dbcr0));
+	DEFINE(KVMPPC_DBG_DBCR1, offsetof(struct kvmppc_booke_debug_reg,
+					  dbcr1));
+	DEFINE(KVMPPC_DBG_DBCR2, offsetof(struct kvmppc_booke_debug_reg,
+					  dbcr2));
+#ifdef CONFIG_KVM_E500MC
+	DEFINE(KVMPPC_DBG_DBCR4, offsetof(struct kvmppc_booke_debug_reg,
+					  dbcr4));
+#endif
+	DEFINE(KVMPPC_DBG_IAC1, offsetof(struct kvmppc_booke_debug_reg,
+					 iac[0]));
+	DEFINE(KVMPPC_DBG_IAC2, offsetof(struct kvmppc_booke_debug_reg,
+					 iac[1]));
+	DEFINE(KVMPPC_DBG_IAC3, offsetof(struct kvmppc_booke_debug_reg,
+					 iac[2]));
+	DEFINE(KVMPPC_DBG_IAC4, offsetof(struct kvmppc_booke_debug_reg,
+					 iac[3]));
+	DEFINE(KVMPPC_DBG_DAC1, offsetof(struct kvmppc_booke_debug_reg,
+					 dac[0]));
+	DEFINE(KVMPPC_DBG_DAC2, offsetof(struct kvmppc_booke_debug_reg,
+					 dac[1]));
+	DEFINE(VCPU_GUEST_DEBUG, offsetof(struct kvm_vcpu, guest_debug));
 #endif /* CONFIG_PPC_BOOK3S */
 #endif /* CONFIG_KVM */
 
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 6fbdcfc..784a6bf 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -130,6 +130,9 @@ void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr)
 
 #ifdef CONFIG_KVM_BOOKE_HV
 	new_msr |= MSR_GS;
+
+	if (vcpu->guest_debug)
+		new_msr |= MSR_DE;
 #endif
 
 	vcpu->arch.shared->msr = new_msr;
@@ -684,10 +687,21 @@ out:
 	return ret;
 }
 
-static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
+static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
+			  int exit_nr)
 {
 	enum emulation_result er;
 
+	if (unlikely(vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) &&
+		     (vcpu->arch.last_inst = KVM_INST_GUESTGDB)) {
+		run->exit_reason = KVM_EXIT_DEBUG;
+		run->debug.arch.pc = vcpu->arch.pc;
+		run->debug.arch.exception = exit_nr;
+		run->debug.arch.status = 0;
+		kvmppc_account_exit(vcpu, DEBUG_EXITS);
+		return RESUME_HOST;
+	}
+
 	er = kvmppc_emulate_instruction(run, vcpu);
 	switch (er) {
 	case EMULATE_DONE:
@@ -714,6 +728,44 @@ static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
 	default:
 		BUG();
 	}
+
+	if (unlikely(vcpu->guest_debug & KVM_GUESTDBG_ENABLE) &&
+	    (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)) {
+		run->exit_reason = KVM_EXIT_DEBUG;
+		return RESUME_HOST;
+	}
+}
+
+static int kvmppc_handle_debug(struct kvm_run *run, struct kvm_vcpu *vcpu)
+{
+	u32 dbsr;
+
+#ifndef CONFIG_KVM_BOOKE_HV
+	if (cpu_has_feature(CPU_FTR_DEBUG_LVL_EXC))
+		vcpu->arch.pc = mfspr(SPRN_DSRR0);
+	else
+		vcpu->arch.pc = mfspr(SPRN_CSRR0);
+#endif
+	dbsr = vcpu->arch.dbsr;
+
+	run->debug.arch.pc = vcpu->arch.pc;
+	run->debug.arch.status = 0;
+	vcpu->arch.dbsr = 0;
+
+	if (dbsr & (DBSR_IAC1 | DBSR_IAC2 | DBSR_IAC3 | DBSR_IAC4)) {
+		run->debug.arch.status |= KVMPPC_DEBUG_BREAKPOINT;
+	} else {
+		if (dbsr & (DBSR_DAC1W | DBSR_DAC2W))
+			run->debug.arch.status |= KVMPPC_DEBUG_WATCH_WRITE;
+		else if (dbsr & (DBSR_DAC1R | DBSR_DAC2R))
+			run->debug.arch.status |= KVMPPC_DEBUG_WATCH_READ;
+		if (dbsr & (DBSR_DAC1R | DBSR_DAC1W))
+			run->debug.arch.pc = vcpu->arch.shadow_dbg_reg.dac[0];
+		else if (dbsr & (DBSR_DAC2R | DBSR_DAC2W))
+			run->debug.arch.pc = vcpu->arch.shadow_dbg_reg.dac[1];
+	}
+
+	return RESUME_HOST;
 }
 
 static void kvmppc_fill_pt_regs(struct pt_regs *regs)
@@ -856,7 +908,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
 		break;
 
 	case BOOKE_INTERRUPT_HV_PRIV:
-		r = emulation_exit(run, vcpu);
+		r = emulation_exit(run, vcpu, exit_nr);
 		break;
 
 	case BOOKE_INTERRUPT_PROGRAM:
@@ -875,7 +927,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
 			break;
 		}
 
-		r = emulation_exit(run, vcpu);
+		r = emulation_exit(run, vcpu, exit_nr);
 		break;
 
 	case BOOKE_INTERRUPT_FP_UNAVAIL:
@@ -1065,18 +1117,12 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
 	}
 
 	case BOOKE_INTERRUPT_DEBUG: {
-		u32 dbsr;
-
-		vcpu->arch.pc = mfspr(SPRN_CSRR0);
-
-		/* clear IAC events in DBSR register */
-		dbsr = mfspr(SPRN_DBSR);
-		dbsr &= DBSR_IAC1 | DBSR_IAC2 | DBSR_IAC3 | DBSR_IAC4;
-		mtspr(SPRN_DBSR, dbsr);
-
-		run->exit_reason = KVM_EXIT_DEBUG;
+		r = kvmppc_handle_debug(run, vcpu);
+		if (r = RESUME_HOST) {
+			run->debug.arch.exception = exit_nr;
+			run->exit_reason = KVM_EXIT_DEBUG;
+		}
 		kvmppc_account_exit(vcpu, DEBUG_EXITS);
-		r = RESUME_HOST;
 		break;
 	}
 
@@ -1107,6 +1153,78 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
 	return r;
 }
 
+#define BP_NUM	KVMPPC_BOOKE_IAC_NUM
+#define WP_NUM	KVMPPC_BOOKE_DAC_NUM
+
+int kvmppc_core_set_guest_debug(struct kvm_vcpu *vcpu,
+				struct kvm_guest_debug *dbg)
+{
+	if (!(dbg->control & KVM_GUESTDBG_ENABLE)) {
+		vcpu->guest_debug = 0;
+		return 0;
+	}
+
+	vcpu->guest_debug = dbg->control;
+	vcpu->arch.shadow_dbg_reg.dbcr0 = 0;
+
+	if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)
+		vcpu->arch.shadow_dbg_reg.dbcr0 |= DBCR0_IDM | DBCR0_IC;
+
+	if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) {
+		struct kvmppc_booke_debug_reg *gdbgr +				&(vcpu->arch.shadow_dbg_reg);
+		int n, b = 0, w = 0;
+		const u32 bp_code[] = {
+			DBCR0_IAC1 | DBCR0_IDM,
+			DBCR0_IAC2 | DBCR0_IDM,
+			DBCR0_IAC3 | DBCR0_IDM,
+			DBCR0_IAC4 | DBCR0_IDM
+		};
+		const u32 wp_code[] = {
+			DBCR0_DAC1W | DBCR0_IDM,
+			DBCR0_DAC2W | DBCR0_IDM,
+			DBCR0_DAC1R | DBCR0_IDM,
+			DBCR0_DAC2R | DBCR0_IDM
+		};
+
+#ifndef CONFIG_KVM_BOOKE_HV
+		gdbgr->dbcr1 = DBCR1_IAC1US | DBCR1_IAC2US |
+				DBCR1_IAC3US | DBCR1_IAC4US;
+		gdbgr->dbcr2 = DBCR2_DAC1US | DBCR2_DAC2US;
+#else
+		gdbgr->dbcr1 = 0;
+		gdbgr->dbcr2 = 0;
+#endif
+
+		for (n = 0; n < (BP_NUM + WP_NUM); n++) {
+			u32 type = dbg->arch.bp[n].type;
+
+			if (!type)
+				break;
+
+			if (type & (KVMPPC_DEBUG_WATCH_READ |
+				    KVMPPC_DEBUG_WATCH_WRITE)) {
+				if (w < WP_NUM) {
+					if (type & KVMPPC_DEBUG_WATCH_READ)
+						gdbgr->dbcr0 |= wp_code[w + 2];
+					if (type & KVMPPC_DEBUG_WATCH_WRITE)
+						gdbgr->dbcr0 |= wp_code[w];
+					gdbgr->dac[w] = dbg->arch.bp[n].addr;
+					w++;
+				}
+			} else if (type & KVMPPC_DEBUG_BREAKPOINT) {
+				if (b < BP_NUM) {
+					gdbgr->dbcr0 |= bp_code[b];
+					gdbgr->iac[b] = dbg->arch.bp[n].addr;
+					b++;
+				}
+			}
+		}
+	}
+
+	return 0;
+}
+
 /* Initial guest state: 16MB mapping 0 -> 0, PC = 0, MSR = 0, R1 = 16MB */
 int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
 {
diff --git a/arch/powerpc/kvm/booke_interrupts.S b/arch/powerpc/kvm/booke_interrupts.S
index bcb34ea..fb85606 100644
--- a/arch/powerpc/kvm/booke_interrupts.S
+++ b/arch/powerpc/kvm/booke_interrupts.S
@@ -40,6 +40,8 @@
 #define HOST_MIN_STACK_SIZE (HOST_NV_GPR(31) + 4)
 #define HOST_STACK_SIZE (((HOST_MIN_STACK_SIZE + 15) / 16) * 16) /* Align. */
 #define HOST_STACK_LR   (HOST_STACK_SIZE + 4) /* In caller stack frame. */
+#define DBCR0_AC_BITS	(DBCR0_IAC1 | DBCR0_IAC2 | DBCR0_IAC3 | DBCR0_IAC4 | \
+			 DBCR0_DAC1R | DBCR0_DAC1W | DBCR0_DAC2R | DBCR0_DAC2W)
 
 #define NEED_INST_MASK ((1<<BOOKE_INTERRUPT_PROGRAM) | \
                         (1<<BOOKE_INTERRUPT_DTLB_MISS) | \
@@ -53,11 +55,17 @@
                        (1<<BOOKE_INTERRUPT_PROGRAM) | \
                        (1<<BOOKE_INTERRUPT_DTLB_MISS))
 
+#define NEED_DEBUG_SAVE (1<<BOOKE_INTERRUPT_DEBUG)
+
+#define GET_VCPU_POINT(regd)                 \
+	mfspr   regd, SPRN_SPRG_THREAD;      \
+	lwz	regd, THREAD_KVM_VCPU(regd)
+
 .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_RVCPU
+	GET_VCPU_POINT(r4)
 	stw	r3, VCPU_GPR(r3)(r4)
 	stw	r5, VCPU_GPR(r5)(r4)
 	stw	r6, VCPU_GPR(r6)(r4)
@@ -74,6 +82,48 @@ _GLOBAL(kvmppc_handler_\ivor_nr)
 	bctr
 .endm
 
+.macro KVM_DBG_HANDLER ivor_nr scratch srr0
+_GLOBAL(kvmppc_handler_\ivor_nr)
+	mtspr   \scratch, r4
+	GET_VCPU_POINT(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
+	GET_VCPU_POINT(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
+	GET_VCPU_POINT(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
@@ -94,7 +144,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
@@ -176,6 +226,61 @@ _GLOBAL(kvmppc_resume_host)
 	stw	r9, VCPU_FAULT_ESR(r4)
 ..skip_esr:
 
+	addi	r7, r4, VCPU_HOST_DBG
+	mfspr	r9, SPRN_DBCR0
+	lwz	r8, KVMPPC_DBG_DBCR0(r7)
+	andis.	r9, r9, DBCR0_AC_BITS@h
+	beq	..skip_load_host_debug
+	li	r9, 0
+	mtspr	SPRN_DBCR0, r9		/* disable all debug event */
+	lwz	r9, KVMPPC_DBG_DBCR1(r7)
+	mtspr	SPRN_DBCR1, r9
+	lwz	r9, KVMPPC_DBG_DBCR2(r7)
+	mtspr	SPRN_DBCR2, r9
+	lwz	r9, KVMPPC_DBG_IAC1+4(r7)
+	mtspr	SPRN_IAC1, r9
+	lwz	r9, KVMPPC_DBG_IAC2+4(r7)
+	mtspr	SPRN_IAC2, r9
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	lwz	r9, KVMPPC_DBG_IAC3+4(r7)
+	mtspr	SPRN_IAC3, r9
+	lwz	r9, KVMPPC_DBG_IAC4+4(r7)
+	mtspr	SPRN_IAC4, r9
+#endif
+	lwz	r9, KVMPPC_DBG_DAC1+4(r7)
+	mtspr	SPRN_DAC1, r9
+	lwz	r9, KVMPPC_DBG_DAC2+4(r7)
+	mtspr	SPRN_DAC2, r9
+..skip_load_host_debug:
+	/* Clear h/w DBSR and save current(guest) DBSR */
+	mfspr	r9, SPRN_DBSR
+	mtspr	SPRN_DBSR, r9
+	isync
+	andi.	r7, r6, NEED_DEBUG_SAVE
+	beq	..skip_dbsr_save
+	/*
+	 * If vcpu->guest_debug flag is set then do not check for
+	 * shared->msr.DE as this debugging (say by QEMU) does not
+	 * depends on shared->msr.de. In these scanerios MSR.DE is
+	 * always set using shared_msr and should be handled always.
+	 */
+	lwz	r7, VCPU_GUEST_DEBUG(r4)
+	cmpwi	r7, 0
+	bne	..skip_save_trap_event
+	PPC_LL	r3, VCPU_SHARED(r4)
+#ifndef CONFIG_64BIT
+	lwz	r3, (VCPU_SHARED_MSR + 4)(r3)
+#else
+	ld	r3, (VCPU_SHARED_MSR)(r3)
+#endif
+	andi.	r3, r3, MSR_DE
+	bne	..skip_save_trap_event
+	andis.	r9, r9, DBSR_TIE@h
+..skip_save_trap_event:
+	stw	r9, VCPU_DBSR(r4)
+..skip_dbsr_save:
+	mtspr	SPRN_DBCR0, r8
+
 	/* Save remaining volatile guest register state to vcpu. */
 	stw	r0, VCPU_GPR(r0)(r4)
 	stw	r1, VCPU_GPR(r1)(r4)
@@ -432,6 +537,57 @@ lightweight_exit:
 	PPC_LD(r3, VCPU_SHARED_SPRG7, r5)
 	mtspr	SPRN_SPRG7W, r3
 
+	mfmsr	r7
+	rlwinm	r7, r7, 0, ~MSR_DE
+	mtmsr	r7
+	addi	r5, r4, VCPU_SHADOW_DBG
+	addi	r7, r4, VCPU_HOST_DBG
+	lwz	r6, 0(r5)
+	mfspr	r8, SPRN_DBCR0
+	andis.	r3, r6, DBCR0_AC_BITS@h
+	stw	r8, KVMPPC_DBG_DBCR0(r7)
+	beq	..skip_load_guest_debug
+	mfspr	r8, SPRN_DBCR1
+	stw	r8, KVMPPC_DBG_DBCR1(r7)
+	mfspr	r8, SPRN_DBCR2
+	stw	r8, KVMPPC_DBG_DBCR2(r7)
+	mfspr	r8, SPRN_IAC1
+	stw	r8, KVMPPC_DBG_IAC1+4(r7)
+	mfspr	r8, SPRN_IAC2
+	stw	r8, KVMPPC_DBG_IAC2+4(r7)
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	mfspr	r8, SPRN_IAC3
+	stw	r8, KVMPPC_DBG_IAC3+4(r7)
+	mfspr	r8, SPRN_IAC4
+	stw	r8, KVMPPC_DBG_IAC4+4(r7)
+#endif
+	mfspr	r8, SPRN_DAC1
+	stw	r8, KVMPPC_DBG_DAC1+4(r7)
+	mfspr	r8, SPRN_DAC2
+	stw	r8, KVMPPC_DBG_DAC2+4(r7)
+	li	r8, 0
+	mtspr	SPRN_DBCR0, r8		/* disable all debug event */
+	lwz	r8, KVMPPC_DBG_DBCR1(r5)
+	mtspr	SPRN_DBCR1, r8
+	lwz	r8, KVMPPC_DBG_DBCR2(r5)
+	mtspr	SPRN_DBCR2, r8
+	lwz	r8, KVMPPC_DBG_IAC1+4(r5)
+	mtspr	SPRN_IAC1, r8
+	lwz	r8, KVMPPC_DBG_IAC2+4(r5)
+	mtspr	SPRN_IAC2, r8
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	lwz	r8, KVMPPC_DBG_IAC3+4(r5)
+	mtspr	SPRN_IAC3, r8
+	lwz	r8, KVMPPC_DBG_IAC4+4(r5)
+	mtspr	SPRN_IAC4, r8
+#endif
+	lwz	r8, KVMPPC_DBG_DAC1+4(r5)
+	mtspr	SPRN_DAC1, r8
+	lwz	r8, KVMPPC_DBG_DAC2+4(r5)
+	mtspr	SPRN_DAC2, r8
+..skip_load_guest_debug:
+	mtspr	SPRN_DBCR0, r6
+
 #ifdef CONFIG_KVM_EXIT_TIMING
 	/* save enter time */
 1:
diff --git a/arch/powerpc/kvm/bookehv_interrupts.S b/arch/powerpc/kvm/bookehv_interrupts.S
index 0fa2ef7..32b9a41 100644
--- a/arch/powerpc/kvm/bookehv_interrupts.S
+++ b/arch/powerpc/kvm/bookehv_interrupts.S
@@ -59,6 +59,10 @@
 #define NEED_EMU		0x00000001 /* emulation -- save nv regs */
 #define NEED_DEAR		0x00000002 /* save faulting DEAR */
 #define NEED_ESR		0x00000004 /* save faulting ESR */
+#define NEED_DBSR		0x00000008 /* save DBSR */
+
+#define DBCR0_AC_BITS	(DBCR0_IAC1 | DBCR0_IAC2 | DBCR0_IAC3 | DBCR0_IAC4 | \
+			 DBCR0_DAC1R | DBCR0_DAC1W | DBCR0_DAC2R | DBCR0_DAC2W)
 
 /*
  * On entry:
@@ -202,6 +206,11 @@
 	PPC_STL	r9, VCPU_FAULT_DEAR(r4)
 	.endif
 
+	.if	\flags & NEED_DBSR
+	mfspr	r9, SPRN_DBSR
+	stw	r9, VCPU_DBSR(r4)
+	.endif
+
 	b	kvmppc_resume_host
 .endm
 
@@ -296,9 +305,9 @@ kvm_handler BOOKE_INTERRUPT_GUEST_DBELL, SPRN_GSRR0, SPRN_GSRR1, 0
 kvm_lvl_handler BOOKE_INTERRUPT_GUEST_DBELL_CRIT, \
 	SPRN_SPRG_RSCRATCH_CRIT, SPRN_CSRR0, SPRN_CSRR1, 0
 kvm_lvl_handler BOOKE_INTERRUPT_DEBUG, \
-	SPRN_SPRG_RSCRATCH_CRIT, SPRN_CSRR0, SPRN_CSRR1, 0
+	SPRN_SPRG_RSCRATCH_CRIT, SPRN_CSRR0, SPRN_CSRR1, NEED_DBSR
 kvm_lvl_handler BOOKE_INTERRUPT_DEBUG, \
-	SPRN_SPRG_RSCRATCH_DBG, SPRN_DSRR0, SPRN_DSRR1, 0
+	SPRN_SPRG_RSCRATCH_DBG, SPRN_DSRR0, SPRN_DSRR1, NEED_DBSR
 
 
 /* Registers:
@@ -308,6 +317,56 @@ kvm_lvl_handler BOOKE_INTERRUPT_DEBUG, \
  *  r14: KVM exit number
  */
 _GLOBAL(kvmppc_resume_host)
+	/*
+	 * If guest not used debug facility then hw debug registers
+	 * already have proper host values. If guest used debug
+	 * facility then restore host debug registers.
+	 * No Need to save guest debug registers as they are already intact
+	 * in guest/shadow registers.
+	 */
+	lwz	r9, VCPU_SHADOW_DBG(r4)
+	rlwinm.	r8, r9, 0, ~DBCR0_IDM
+	beq	skip_load_host_debug
+	lwz	r3, VCPU_HOST_DBG(r4)
+	andis.	r9, r9, DBCR0_AC_BITS@h
+	li	r9, 0
+	mtspr	SPRN_DBCR0, r9		/* disable all debug event */
+	beq	..skip_load_hw_bkpts
+	lwz	r7, VCPU_HOST_DBG+KVMPPC_DBG_DBCR1(r4)
+	lwz	r8, VCPU_HOST_DBG+KVMPPC_DBG_DBCR2(r4)
+	lwz	r9, VCPU_HOST_DBG+KVMPPC_DBG_DBCR4(r4)
+	mtspr	SPRN_DBCR1, r7
+	PPC_LD(r6, VCPU_HOST_DBG+KVMPPC_DBG_IAC1, r4)
+	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC2, r4)
+	mtspr	SPRN_DBCR2, r8
+	mtspr	SPRN_DBCR4, r9
+	mtspr	SPRN_IAC1, r6
+	mtspr	SPRN_IAC2, r7
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
+	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
+	mtspr	SPRN_IAC3, r7
+	mtspr	SPRN_IAC4, r8
+#endif
+	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_DAC1, r4)
+	PPC_LD(r9, VCPU_HOST_DBG+KVMPPC_DBG_DAC2, r4)
+	mtspr	SPRN_DAC1, r8
+	mtspr	SPRN_DAC2, r9
+..skip_load_hw_bkpts:
+	isync
+	/* Clear h/w DBSR and save current(guest) DBSR */
+	mfspr	r8, SPRN_DBSR
+	mtspr	SPRN_DBSR, r8
+	isync
+	/* Clear EPCR.DUVD and set host DBCR0 */
+	mfspr	r8, SPRN_EPCR
+	rlwinm	r8, r8, 0, ~SPRN_EPCR_DUVD
+	mtspr	SPRN_EPCR, r8
+	isync
+	mtspr	SPRN_DBCR0, r3
+	isync
+skip_load_host_debug:
+
 	/* Save remaining volatile guest register state to vcpu. */
 	mfspr	r3, SPRN_VRSAVE
 	PPC_STL	r0, VCPU_GPR(r0)(r4)
@@ -547,6 +606,84 @@ lightweight_exit:
 	mtspr	SPRN_SPRG6W, r7
 	mtspr	SPRN_SPRG7W, r8
 
+	mfmsr	r7
+	rlwinm	r7, r7, 0, ~MSR_DE
+	mtmsr	r7
+	/*
+	 * Load hw debug registers with guest(shadow) debug registers
+	 * if guest is using the debug facility and also set EPCR.DUVD
+	 * to not allow debug events in HV mode. Do not change the
+	 * debug registers if guest is not using the debug facility.
+	 */
+	lwz	r6, VCPU_SHADOW_DBG(r4)
+	rlwinm.	r7, r6, 0, ~DBCR0_IDM
+	beq	..skip_load_guest_debug
+	/* Save host DBCR0 */
+	mfspr	r8, SPRN_DBCR0
+	stw	r8, VCPU_HOST_DBG(r4)
+	/*
+	 * Save host DBCR1/2, IACx and DACx and load guest DBCR1/2,
+	 * IACx and DACx if guest using hw breakpoint/watchpoints.
+	 */
+	andis.	r3, r6, DBCR0_AC_BITS@h
+	beq	..skip_hw_bkpts
+	mfspr	r7, SPRN_DBCR1
+	stw	r7, VCPU_HOST_DBG+KVMPPC_DBG_DBCR1(r4)
+	mfspr	r8, SPRN_DBCR2
+	stw	r8, VCPU_HOST_DBG+KVMPPC_DBG_DBCR2(r4)
+	mfspr	r7, SPRN_DBCR4
+	stw	r7, VCPU_HOST_DBG+KVMPPC_DBG_DBCR4(r4)
+	mfspr	r8, SPRN_IAC1
+	PPC_STD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC1, r4)
+	mfspr	r7, SPRN_IAC2
+	PPC_STD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC2, r4)
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	mfspr	r8, SPRN_IAC3
+	PPC_STD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
+	mfspr	r7, SPRN_IAC4
+	PPC_STD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
+#endif
+	mfspr	r8, SPRN_DAC1
+	PPC_STD(r8, VCPU_HOST_DBG+KVMPPC_DBG_DAC1, r4)
+	mfspr	r7, SPRN_DAC2
+	PPC_STD(r7, VCPU_HOST_DBG+KVMPPC_DBG_DAC2, r4)
+	li	r8, 0
+	mtspr	SPRN_DBCR0, r8		/* disable all debug event */
+	lwz	r7, VCPU_SHADOW_DBG+KVMPPC_DBG_DBCR1(r4)
+	lwz	r8, VCPU_SHADOW_DBG+KVMPPC_DBG_DBCR2(r4)
+	lwz	r9, VCPU_SHADOW_DBG+KVMPPC_DBG_DBCR4(r4)
+	mtspr	SPRN_DBCR1, r7
+	PPC_LD(r7, VCPU_SHADOW_DBG+KVMPPC_DBG_IAC1, r4)
+	PPC_LD(r3, VCPU_SHADOW_DBG+KVMPPC_DBG_IAC2, r4)
+	mtspr	SPRN_DBCR2, r8
+	mtspr	SPRN_DBCR4, r9
+	mtspr	SPRN_IAC1, r7
+	mtspr	SPRN_IAC2, r3
+#ifndef CONFIG_PPC_FSL_BOOK3E
+	PPC_LD(r7, VCPU_SHADOW_DBG+KVMPPC_DBG_IAC3, r4)
+	PPC_LD(r8, VCPU_SHADOW_DBG+KVMPPC_DBG_IAC4, r4)
+	mtspr	SPRN_IAC3, r7
+	mtspr	SPRN_IAC4, r8
+#endif
+	PPC_LD(r7, VCPU_SHADOW_DBG+KVMPPC_DBG_DAC1, r4)
+	PPC_LD(r8, VCPU_SHADOW_DBG+KVMPPC_DBG_DAC2, r4)
+	mtspr	SPRN_DAC1, r7
+	mtspr	SPRN_DAC2, r8
+..skip_hw_bkpts:
+	/* Set EPCR.DUVD and guest DBCR0 */
+	mfspr	r7, SPRN_EPCR
+	oris	r7, r7, SPRN_EPCR_DUVD@h
+	mtspr	SPRN_EPCR, r7
+	isync
+	/* Clear if any deferred debug event */
+	mfspr	r8, SPRN_DBSR
+	mtspr	SPRN_DBSR, r8
+	isync
+	/* Restore guest DBCR */
+	mtspr	SPRN_DBCR0, r6
+	isync
+..skip_load_guest_debug:
+
 	/* Load some guest volatiles. */
 	PPC_LL	r3, VCPU_LR(r4)
 	PPC_LL	r5, VCPU_XER(r4)
diff --git a/arch/powerpc/kvm/e500mc.c b/arch/powerpc/kvm/e500mc.c
index 1f89d26..f5fc6f5 100644
--- a/arch/powerpc/kvm/e500mc.c
+++ b/arch/powerpc/kvm/e500mc.c
@@ -182,8 +182,7 @@ int kvmppc_core_vcpu_setup(struct kvm_vcpu *vcpu)
 {
 	struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
 
-	vcpu->arch.shadow_epcr = SPRN_EPCR_DSIGS | SPRN_EPCR_DGTMI | \
-				 SPRN_EPCR_DUVD;
+	vcpu->arch.shadow_epcr = SPRN_EPCR_DSIGS | SPRN_EPCR_DGTMI;
 #ifdef CONFIG_64BIT
 	vcpu->arch.shadow_epcr |= SPRN_EPCR_ICM;
 #endif
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 685829a..38b5d02 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -427,7 +427,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
 int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
                                         struct kvm_guest_debug *dbg)
 {
-	return -EINVAL;
+	return kvmppc_core_set_guest_debug(vcpu, dbg);
 }
 
 static void kvmppc_complete_dcr_load(struct kvm_vcpu *vcpu,
-- 
1.7.0.4



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Re: [PATCH 1/2] KVM: PPC: booke: Allow multiple exception types
  2012-07-26  5:44 ` Bharat Bhushan
@ 2012-07-26 23:01   ` Scott Wood
  -1 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-07-26 23:01 UTC (permalink / raw)
  To: Bharat Bhushan; +Cc: kvm-ppc, kvm, agraf, Bharat Bhushan

On 07/26/2012 12:32 AM, Bharat Bhushan wrote:
>  _GLOBAL(kvmppc_handlers_start)
>  KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
>  KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK  SPRN_SPRG_RSCRATCH_MC SPRN_MCSRR0
> @@ -94,6 +98,7 @@ KVM_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
> +KVM_HANDLER BOOKE_INTERRUPT_END SPRN_SPRG_RSCRATCH0 SPRN_SRR0

If you just need a symbol at the end of the last real handler, do
something like _GLOBAL(kvmppc_handlers_end), and reference that in the
table of handlers.  We don't need to instantiate a full handler for it,
or make up a fake interrupt number.

-Scott



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 1/2] KVM: PPC: booke: Allow multiple exception types
@ 2012-07-26 23:01   ` Scott Wood
  0 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-07-26 23:01 UTC (permalink / raw)
  To: Bharat Bhushan; +Cc: kvm-ppc, kvm, agraf, Bharat Bhushan

On 07/26/2012 12:32 AM, Bharat Bhushan wrote:
>  _GLOBAL(kvmppc_handlers_start)
>  KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
>  KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK  SPRN_SPRG_RSCRATCH_MC SPRN_MCSRR0
> @@ -94,6 +98,7 @@ KVM_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
> +KVM_HANDLER BOOKE_INTERRUPT_END SPRN_SPRG_RSCRATCH0 SPRN_SRR0

If you just need a symbol at the end of the last real handler, do
something like _GLOBAL(kvmppc_handlers_end), and reference that in the
table of handlers.  We don't need to instantiate a full handler for it,
or make up a fake interrupt number.

-Scott



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
  2012-07-26  5:44   ` Bharat Bhushan
@ 2012-07-27  1:29     ` Scott Wood
  -1 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-07-27  1:29 UTC (permalink / raw)
  To: Bharat Bhushan; +Cc: kvm-ppc, kvm, agraf, Bharat Bhushan

On 07/26/2012 12:32 AM, Bharat Bhushan wrote:
> This patch adds:
>  1) KVM debug handler added for e500v2.
>  2) Guest debug by qemu gdb stub.

Does it make sense for these to both be in the same patch?  If there's
common code used by both, that could be added first.

> Signed-off-by: Liu Yu <yu.liu@freescale.com>
> Signed-off-by: Varun Sethi <Varun.Sethi@freescale.com>
> [bharat.bhushan@freescale.com: Substantial changes]
> Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
> ---
>  arch/powerpc/include/asm/kvm.h        |   21 +++++
>  arch/powerpc/include/asm/kvm_host.h   |    7 ++
>  arch/powerpc/include/asm/kvm_ppc.h    |    2 +
>  arch/powerpc/include/asm/reg_booke.h  |    1 +
>  arch/powerpc/kernel/asm-offsets.c     |   31 ++++++-
>  arch/powerpc/kvm/booke.c              |  146 +++++++++++++++++++++++++++---
>  arch/powerpc/kvm/booke_interrupts.S   |  160 ++++++++++++++++++++++++++++++++-
>  arch/powerpc/kvm/bookehv_interrupts.S |  141 ++++++++++++++++++++++++++++-
>  arch/powerpc/kvm/e500mc.c             |    3 +-
>  arch/powerpc/kvm/powerpc.c            |    2 +-
>  10 files changed, 492 insertions(+), 22 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/kvm.h b/arch/powerpc/include/asm/kvm.h
> index 3c14202..da71c84 100644
> --- a/arch/powerpc/include/asm/kvm.h
> +++ b/arch/powerpc/include/asm/kvm.h
> @@ -25,6 +25,7 @@
>  /* Select powerpc specific features in <linux/kvm.h> */
>  #define __KVM_HAVE_SPAPR_TCE
>  #define __KVM_HAVE_PPC_SMT
> +#define __KVM_HAVE_GUEST_DEBUG
>  
>  struct kvm_regs {
>  	__u64 pc;
> @@ -265,10 +266,19 @@ struct kvm_fpu {
>  };
>  
>  struct kvm_debug_exit_arch {
> +	__u32 exception;
> +	__u32 pc;
> +	__u32 status;
>  };

PC must be 64-bit.  What goes in "status" and "exception"?

>  /* for KVM_SET_GUEST_DEBUG */
>  struct kvm_guest_debug_arch {
> +	struct {
> +		__u64 addr;
> +		__u32 type;
> +		__u32 pad1;
> +		__u64 pad2;
> +	} bp[16];
>  };

What goes in "type"?

>  /* definition of registers in kvm_run */
> @@ -285,6 +295,17 @@ struct kvm_sync_regs {
>  #define KVM_CPU_3S_64		4
>  #define KVM_CPU_E500MC		5
>  
> +/* Debug related defines */
> +#define KVM_INST_GUESTGDB               0x7C00021C      /* ehpriv OC=0 */

Will this work on all PPC?

It certainly won't work on other architectures, so at a minimum it's
KVM_PPC_INST_GUEST_GDB, but maybe it needs to be determined at runtime.

> +#define KVM_GUESTDBG_USE_SW_BP          0x00010000
> +#define KVM_GUESTDBG_USE_HW_BP          0x00020000

Where do these get used?  Any reason for these particular values?  If
you're trying to create a partition where the upper half is generic and
the lower half is arch-specific, say so.

> diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
> index 7a45194..524af7a 100644
> --- a/arch/powerpc/include/asm/kvm_host.h
> +++ b/arch/powerpc/include/asm/kvm_host.h
> @@ -458,7 +458,12 @@ struct kvm_vcpu_arch {
>  	u32 ccr0;
>  	u32 ccr1;
>  	u32 dbsr;
> +	/* guest debug regiters*/
>  	struct kvmppc_booke_debug_reg dbg_reg;
> +	/* shadow debug registers */
> +	struct kvmppc_booke_debug_reg shadow_dbg_reg;
> +	/* host debug regiters*/
> +	struct kvmppc_booke_debug_reg host_dbg_reg;

s/regiter/register/g

...and put a space before */

> @@ -492,6 +497,7 @@ struct kvm_vcpu_arch {
>  	u32 tlbcfg[4];
>  	u32 mmucfg;
>  	u32 epr;
> +	u32 crit_save;
>  #endif

What is crit_save?

>  	gpa_t paddr_accessed;
>  	gva_t vaddr_accessed;
> @@ -533,6 +539,7 @@ struct kvm_vcpu_arch {
>  	struct kvm_vcpu_arch_shared *shared;
>  	unsigned long magic_page_pa; /* phys addr to map the magic page to */
>  	unsigned long magic_page_ea; /* effect. addr to map the magic page to */
> +	struct kvm_guest_debug_arch dbg; /* debug arg between kvm and qemu */

Is kvm_guest_debug_arch generic or PPC-specific?  If the former, why is
it in a ppc struct?  If the latter, why doesn't it have "ppc" in the name?

Please separate out generic things in one patch, then PPC-wide things,
then booke things (but keep things bisectable by adding stubs along the
way if necessary).

> -#ifdef CONFIG_KVM_BOOKE_HV
> +#if defined(CONFIG_KVM_E500V2) || defined(CONFIG_KVM_E500MC)
>  	DEFINE(THREAD_KVM_VCPU, offsetof(struct thread_struct, kvm_vcpu));
>  #endif

Why not all booke?

> diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
> index 6fbdcfc..784a6bf 100644
> --- a/arch/powerpc/kvm/booke.c
> +++ b/arch/powerpc/kvm/booke.c
> @@ -130,6 +130,9 @@ void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr)
>  
>  #ifdef CONFIG_KVM_BOOKE_HV
>  	new_msr |= MSR_GS;
> +
> +	if (vcpu->guest_debug)
> +		new_msr |= MSR_DE;
>  #endif
>  
>  	vcpu->arch.shared->msr = new_msr;
> @@ -684,10 +687,21 @@ out:
>  	return ret;
>  }
>  
> -static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
> +static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
> +			  int exit_nr)
>  {
>  	enum emulation_result er;
>  
> +	if (unlikely(vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) &&
> +		     (vcpu->arch.last_inst == KVM_INST_GUESTGDB)) {

Unnecessary parens.

> +		run->exit_reason = KVM_EXIT_DEBUG;
> +		run->debug.arch.pc = vcpu->arch.pc;
> +		run->debug.arch.exception = exit_nr;
> +		run->debug.arch.status = 0;
> +		kvmppc_account_exit(vcpu, DEBUG_EXITS);
> +		return RESUME_HOST;

The interface isn't (clearly labelled as) booke specific, but you return
booke-specific exception numbers.  How's userspace supposed to know what
to do with them?  What do you plan on doing with them in QEMU?

> +#define GET_VCPU_POINT(regd)                 \
> +	mfspr   regd, SPRN_SPRG_THREAD;      \
> +	lwz	regd, THREAD_KVM_VCPU(regd)

"Point" is not an idiomatic abbreviation for pointer.  Does this really
need to be macroized, which prevents optimization?  IIRC, the 64-bit
patchset gets rid of that on bookehv (where it was called GET_VCPU).

>  _GLOBAL(kvmppc_resume_host)
> +	/*
> +	 * If guest not used debug facility then hw debug registers
> +	 * already have proper host values. If guest used debug
> +	 * facility then restore host debug registers.
> +	 * No Need to save guest debug registers as they are already intact
> +	 * in guest/shadow registers.
> +	 */
> +	lwz	r9, VCPU_SHADOW_DBG(r4)
> +	rlwinm.	r8, r9, 0, ~DBCR0_IDM
> +	beq	skip_load_host_debug
> +	lwz	r3, VCPU_HOST_DBG(r4)
> +	andis.	r9, r9, DBCR0_AC_BITS@h
> +	li	r9, 0
> +	mtspr	SPRN_DBCR0, r9		/* disable all debug event */
> +	beq	..skip_load_hw_bkpts

We don't currently have that weird leading ".." in the bookehv code --
please don't introduce it.

> +#ifndef CONFIG_PPC_FSL_BOOK3E
> +	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
> +	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
> +	mtspr	SPRN_IAC3, r7
> +	mtspr	SPRN_IAC4, r8
> +#endif

Can you handle this at runtime with a feature section?

> diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
> index 685829a..38b5d02 100644
> --- a/arch/powerpc/kvm/powerpc.c
> +++ b/arch/powerpc/kvm/powerpc.c
> @@ -427,7 +427,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
>  int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
>                                          struct kvm_guest_debug *dbg)
>  {
> -	return -EINVAL;
> +	return kvmppc_core_set_guest_debug(vcpu, dbg);
>  }

I don't see a stub implementation for non-booke.

-Scott

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
@ 2012-07-27  1:29     ` Scott Wood
  0 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-07-27  1:29 UTC (permalink / raw)
  To: Bharat Bhushan; +Cc: kvm-ppc, kvm, agraf, Bharat Bhushan

On 07/26/2012 12:32 AM, Bharat Bhushan wrote:
> This patch adds:
>  1) KVM debug handler added for e500v2.
>  2) Guest debug by qemu gdb stub.

Does it make sense for these to both be in the same patch?  If there's
common code used by both, that could be added first.

> Signed-off-by: Liu Yu <yu.liu@freescale.com>
> Signed-off-by: Varun Sethi <Varun.Sethi@freescale.com>
> [bharat.bhushan@freescale.com: Substantial changes]
> Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
> ---
>  arch/powerpc/include/asm/kvm.h        |   21 +++++
>  arch/powerpc/include/asm/kvm_host.h   |    7 ++
>  arch/powerpc/include/asm/kvm_ppc.h    |    2 +
>  arch/powerpc/include/asm/reg_booke.h  |    1 +
>  arch/powerpc/kernel/asm-offsets.c     |   31 ++++++-
>  arch/powerpc/kvm/booke.c              |  146 +++++++++++++++++++++++++++---
>  arch/powerpc/kvm/booke_interrupts.S   |  160 ++++++++++++++++++++++++++++++++-
>  arch/powerpc/kvm/bookehv_interrupts.S |  141 ++++++++++++++++++++++++++++-
>  arch/powerpc/kvm/e500mc.c             |    3 +-
>  arch/powerpc/kvm/powerpc.c            |    2 +-
>  10 files changed, 492 insertions(+), 22 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/kvm.h b/arch/powerpc/include/asm/kvm.h
> index 3c14202..da71c84 100644
> --- a/arch/powerpc/include/asm/kvm.h
> +++ b/arch/powerpc/include/asm/kvm.h
> @@ -25,6 +25,7 @@
>  /* Select powerpc specific features in <linux/kvm.h> */
>  #define __KVM_HAVE_SPAPR_TCE
>  #define __KVM_HAVE_PPC_SMT
> +#define __KVM_HAVE_GUEST_DEBUG
>  
>  struct kvm_regs {
>  	__u64 pc;
> @@ -265,10 +266,19 @@ struct kvm_fpu {
>  };
>  
>  struct kvm_debug_exit_arch {
> +	__u32 exception;
> +	__u32 pc;
> +	__u32 status;
>  };

PC must be 64-bit.  What goes in "status" and "exception"?

>  /* for KVM_SET_GUEST_DEBUG */
>  struct kvm_guest_debug_arch {
> +	struct {
> +		__u64 addr;
> +		__u32 type;
> +		__u32 pad1;
> +		__u64 pad2;
> +	} bp[16];
>  };

What goes in "type"?

>  /* definition of registers in kvm_run */
> @@ -285,6 +295,17 @@ struct kvm_sync_regs {
>  #define KVM_CPU_3S_64		4
>  #define KVM_CPU_E500MC		5
>  
> +/* Debug related defines */
> +#define KVM_INST_GUESTGDB               0x7C00021C      /* ehpriv OC=0 */

Will this work on all PPC?

It certainly won't work on other architectures, so at a minimum it's
KVM_PPC_INST_GUEST_GDB, but maybe it needs to be determined at runtime.

> +#define KVM_GUESTDBG_USE_SW_BP          0x00010000
> +#define KVM_GUESTDBG_USE_HW_BP          0x00020000

Where do these get used?  Any reason for these particular values?  If
you're trying to create a partition where the upper half is generic and
the lower half is arch-specific, say so.

> diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
> index 7a45194..524af7a 100644
> --- a/arch/powerpc/include/asm/kvm_host.h
> +++ b/arch/powerpc/include/asm/kvm_host.h
> @@ -458,7 +458,12 @@ struct kvm_vcpu_arch {
>  	u32 ccr0;
>  	u32 ccr1;
>  	u32 dbsr;
> +	/* guest debug regiters*/
>  	struct kvmppc_booke_debug_reg dbg_reg;
> +	/* shadow debug registers */
> +	struct kvmppc_booke_debug_reg shadow_dbg_reg;
> +	/* host debug regiters*/
> +	struct kvmppc_booke_debug_reg host_dbg_reg;

s/regiter/register/g

...and put a space before */

> @@ -492,6 +497,7 @@ struct kvm_vcpu_arch {
>  	u32 tlbcfg[4];
>  	u32 mmucfg;
>  	u32 epr;
> +	u32 crit_save;
>  #endif

What is crit_save?

>  	gpa_t paddr_accessed;
>  	gva_t vaddr_accessed;
> @@ -533,6 +539,7 @@ struct kvm_vcpu_arch {
>  	struct kvm_vcpu_arch_shared *shared;
>  	unsigned long magic_page_pa; /* phys addr to map the magic page to */
>  	unsigned long magic_page_ea; /* effect. addr to map the magic page to */
> +	struct kvm_guest_debug_arch dbg; /* debug arg between kvm and qemu */

Is kvm_guest_debug_arch generic or PPC-specific?  If the former, why is
it in a ppc struct?  If the latter, why doesn't it have "ppc" in the name?

Please separate out generic things in one patch, then PPC-wide things,
then booke things (but keep things bisectable by adding stubs along the
way if necessary).

> -#ifdef CONFIG_KVM_BOOKE_HV
> +#if defined(CONFIG_KVM_E500V2) || defined(CONFIG_KVM_E500MC)
>  	DEFINE(THREAD_KVM_VCPU, offsetof(struct thread_struct, kvm_vcpu));
>  #endif

Why not all booke?

> diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
> index 6fbdcfc..784a6bf 100644
> --- a/arch/powerpc/kvm/booke.c
> +++ b/arch/powerpc/kvm/booke.c
> @@ -130,6 +130,9 @@ void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr)
>  
>  #ifdef CONFIG_KVM_BOOKE_HV
>  	new_msr |= MSR_GS;
> +
> +	if (vcpu->guest_debug)
> +		new_msr |= MSR_DE;
>  #endif
>  
>  	vcpu->arch.shared->msr = new_msr;
> @@ -684,10 +687,21 @@ out:
>  	return ret;
>  }
>  
> -static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
> +static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
> +			  int exit_nr)
>  {
>  	enum emulation_result er;
>  
> +	if (unlikely(vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) &&
> +		     (vcpu->arch.last_inst = KVM_INST_GUESTGDB)) {

Unnecessary parens.

> +		run->exit_reason = KVM_EXIT_DEBUG;
> +		run->debug.arch.pc = vcpu->arch.pc;
> +		run->debug.arch.exception = exit_nr;
> +		run->debug.arch.status = 0;
> +		kvmppc_account_exit(vcpu, DEBUG_EXITS);
> +		return RESUME_HOST;

The interface isn't (clearly labelled as) booke specific, but you return
booke-specific exception numbers.  How's userspace supposed to know what
to do with them?  What do you plan on doing with them in QEMU?

> +#define GET_VCPU_POINT(regd)                 \
> +	mfspr   regd, SPRN_SPRG_THREAD;      \
> +	lwz	regd, THREAD_KVM_VCPU(regd)

"Point" is not an idiomatic abbreviation for pointer.  Does this really
need to be macroized, which prevents optimization?  IIRC, the 64-bit
patchset gets rid of that on bookehv (where it was called GET_VCPU).

>  _GLOBAL(kvmppc_resume_host)
> +	/*
> +	 * If guest not used debug facility then hw debug registers
> +	 * already have proper host values. If guest used debug
> +	 * facility then restore host debug registers.
> +	 * No Need to save guest debug registers as they are already intact
> +	 * in guest/shadow registers.
> +	 */
> +	lwz	r9, VCPU_SHADOW_DBG(r4)
> +	rlwinm.	r8, r9, 0, ~DBCR0_IDM
> +	beq	skip_load_host_debug
> +	lwz	r3, VCPU_HOST_DBG(r4)
> +	andis.	r9, r9, DBCR0_AC_BITS@h
> +	li	r9, 0
> +	mtspr	SPRN_DBCR0, r9		/* disable all debug event */
> +	beq	..skip_load_hw_bkpts

We don't currently have that weird leading ".." in the bookehv code --
please don't introduce it.

> +#ifndef CONFIG_PPC_FSL_BOOK3E
> +	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
> +	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
> +	mtspr	SPRN_IAC3, r7
> +	mtspr	SPRN_IAC4, r8
> +#endif

Can you handle this at runtime with a feature section?

> diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
> index 685829a..38b5d02 100644
> --- a/arch/powerpc/kvm/powerpc.c
> +++ b/arch/powerpc/kvm/powerpc.c
> @@ -427,7 +427,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
>  int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
>                                          struct kvm_guest_debug *dbg)
>  {
> -	return -EINVAL;
> +	return kvmppc_core_set_guest_debug(vcpu, dbg);
>  }

I don't see a stub implementation for non-booke.

-Scott



^ permalink raw reply	[flat|nested] 26+ messages in thread

* RE: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
  2012-07-27  1:29     ` Scott Wood
@ 2012-07-30  7:37       ` Bhushan Bharat-R65777
  -1 siblings, 0 replies; 26+ messages in thread
From: Bhushan Bharat-R65777 @ 2012-07-30  7:37 UTC (permalink / raw)
  To: Wood Scott-B07421; +Cc: kvm-ppc, kvm, agraf



> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Friday, July 27, 2012 7:00 AM
> To: Bhushan Bharat-R65777
> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org; agraf@suse.de; Bhushan Bharat-
> R65777
> Subject: Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
> 
> On 07/26/2012 12:32 AM, Bharat Bhushan wrote:
> > This patch adds:
> >  1) KVM debug handler added for e500v2.
> >  2) Guest debug by qemu gdb stub.
> 
> Does it make sense for these to both be in the same patch?  If there's common
> code used by both, that could be added first.

ok

> 
> > Signed-off-by: Liu Yu <yu.liu@freescale.com>
> > Signed-off-by: Varun Sethi <Varun.Sethi@freescale.com>
> > [bharat.bhushan@freescale.com: Substantial changes]
> > Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
> > ---
> >  arch/powerpc/include/asm/kvm.h        |   21 +++++
> >  arch/powerpc/include/asm/kvm_host.h   |    7 ++
> >  arch/powerpc/include/asm/kvm_ppc.h    |    2 +
> >  arch/powerpc/include/asm/reg_booke.h  |    1 +
> >  arch/powerpc/kernel/asm-offsets.c     |   31 ++++++-
> >  arch/powerpc/kvm/booke.c              |  146 +++++++++++++++++++++++++++---
> >  arch/powerpc/kvm/booke_interrupts.S   |  160
> ++++++++++++++++++++++++++++++++-
> >  arch/powerpc/kvm/bookehv_interrupts.S |  141 ++++++++++++++++++++++++++++-
> >  arch/powerpc/kvm/e500mc.c             |    3 +-
> >  arch/powerpc/kvm/powerpc.c            |    2 +-
> >  10 files changed, 492 insertions(+), 22 deletions(-)
> >
> > diff --git a/arch/powerpc/include/asm/kvm.h
> > b/arch/powerpc/include/asm/kvm.h index 3c14202..da71c84 100644
> > --- a/arch/powerpc/include/asm/kvm.h
> > +++ b/arch/powerpc/include/asm/kvm.h
> > @@ -25,6 +25,7 @@
> >  /* Select powerpc specific features in <linux/kvm.h> */  #define
> > __KVM_HAVE_SPAPR_TCE  #define __KVM_HAVE_PPC_SMT
> > +#define __KVM_HAVE_GUEST_DEBUG
> >
> >  struct kvm_regs {
> >  	__u64 pc;
> > @@ -265,10 +266,19 @@ struct kvm_fpu {  };
> >
> >  struct kvm_debug_exit_arch {
> > +	__u32 exception;
> > +	__u32 pc;
> > +	__u32 status;
> >  };
> 
> PC must be 64-bit.  What goes in "status" and "exception"?

ok

> 
> >  /* for KVM_SET_GUEST_DEBUG */
> >  struct kvm_guest_debug_arch {
> > +	struct {
> > +		__u64 addr;
> > +		__u32 type;
> > +		__u32 pad1;
> > +		__u64 pad2;
> > +	} bp[16];
> >  };
> 
> What goes in "type"?

Type denote breakpoint, read watchpoint, write watchpoint or watchpoint (both read and write). Will adding a comment to describe this is ok?

> 
> >  /* definition of registers in kvm_run */ @@ -285,6 +295,17 @@ struct
> > kvm_sync_regs {
> >  #define KVM_CPU_3S_64		4
> >  #define KVM_CPU_E500MC		5
> >
> > +/* Debug related defines */
> > +#define KVM_INST_GUESTGDB               0x7C00021C      /* ehpriv OC=0 */
> 
> Will this work on all PPC?
> 
> It certainly won't work on other architectures, so at a minimum it's
> KVM_PPC_INST_GUEST_GDB, but maybe it needs to be determined at runtime.

How to determine at run time? adding another ioctl ?

> 
> > +#define KVM_GUESTDBG_USE_SW_BP          0x00010000
> > +#define KVM_GUESTDBG_USE_HW_BP          0x00020000
> 
> Where do these get used?  Any reason for these particular values?  If you're
> trying to create a partition where the upper half is generic and the lower half
> is arch-specific, say so.

KVM_SET_GUEST_DEBUG ioctl used to set/unset debug interrupts, which have a "u32 control" element. We have inherited this mechanism from x86 implementation and it looks like lower 16 bits are generic (like KVM_GUESTDBG_ENBLE, KVM_GUESTDBG_SINGLESTEP etc and upper 16 bits are Architecture specific.

I will add a comment to describe this.

> 
> > diff --git a/arch/powerpc/include/asm/kvm_host.h
> > b/arch/powerpc/include/asm/kvm_host.h
> > index 7a45194..524af7a 100644
> > --- a/arch/powerpc/include/asm/kvm_host.h
> > +++ b/arch/powerpc/include/asm/kvm_host.h
> > @@ -458,7 +458,12 @@ struct kvm_vcpu_arch {
> >  	u32 ccr0;
> >  	u32 ccr1;
> >  	u32 dbsr;
> > +	/* guest debug regiters*/
> >  	struct kvmppc_booke_debug_reg dbg_reg;
> > +	/* shadow debug registers */
> > +	struct kvmppc_booke_debug_reg shadow_dbg_reg;
> > +	/* host debug regiters*/
> > +	struct kvmppc_booke_debug_reg host_dbg_reg;
> 
> s/regiter/register/g
> 
> ...and put a space before */

> 
> > @@ -492,6 +497,7 @@ struct kvm_vcpu_arch {
> >  	u32 tlbcfg[4];
> >  	u32 mmucfg;
> >  	u32 epr;
> > +	u32 crit_save;
> >  #endif
> 
> What is crit_save?
> 
> >  	gpa_t paddr_accessed;
> >  	gva_t vaddr_accessed;
> > @@ -533,6 +539,7 @@ struct kvm_vcpu_arch {
> >  	struct kvm_vcpu_arch_shared *shared;
> >  	unsigned long magic_page_pa; /* phys addr to map the magic page to */
> >  	unsigned long magic_page_ea; /* effect. addr to map the magic page
> > to */
> > +	struct kvm_guest_debug_arch dbg; /* debug arg between kvm and qemu
> > +*/
> 
> Is kvm_guest_debug_arch generic or PPC-specific?  If the former, why is it in a
> ppc struct?  If the latter, why doesn't it have "ppc" in the name?
> 
> Please separate out generic things in one patch, then PPC-wide things, then
> booke things (but keep things bisectable by adding stubs along the way if
> necessary).

ok

> 
> > -#ifdef CONFIG_KVM_BOOKE_HV
> > +#if defined(CONFIG_KVM_E500V2) || defined(CONFIG_KVM_E500MC)
> >  	DEFINE(THREAD_KVM_VCPU, offsetof(struct thread_struct, kvm_vcpu));
> > #endif
> 
> Why not all booke?

Yes, will make is all booke.

> 
> > diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index
> > 6fbdcfc..784a6bf 100644
> > --- a/arch/powerpc/kvm/booke.c
> > +++ b/arch/powerpc/kvm/booke.c
> > @@ -130,6 +130,9 @@ void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32
> > new_msr)
> >
> >  #ifdef CONFIG_KVM_BOOKE_HV
> >  	new_msr |= MSR_GS;
> > +
> > +	if (vcpu->guest_debug)
> > +		new_msr |= MSR_DE;
> >  #endif
> >
> >  	vcpu->arch.shared->msr = new_msr;
> > @@ -684,10 +687,21 @@ out:
> >  	return ret;
> >  }
> >
> > -static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
> > +static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
> > +			  int exit_nr)
> >  {
> >  	enum emulation_result er;
> >
> > +	if (unlikely(vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) &&
> > +		     (vcpu->arch.last_inst == KVM_INST_GUESTGDB)) {
> 
> Unnecessary parens.
> 
> > +		run->exit_reason = KVM_EXIT_DEBUG;
> > +		run->debug.arch.pc = vcpu->arch.pc;
> > +		run->debug.arch.exception = exit_nr;
> > +		run->debug.arch.status = 0;
> > +		kvmppc_account_exit(vcpu, DEBUG_EXITS);
> > +		return RESUME_HOST;
> 
> The interface isn't (clearly labelled as) booke specific, but you return booke-
> specific exception numbers.  How's userspace supposed to know what to do with
> them?  What do you plan on doing with them in QEMU?

This is booke specific.

> 
> > +#define GET_VCPU_POINT(regd)                 \
> > +	mfspr   regd, SPRN_SPRG_THREAD;      \
> > +	lwz	regd, THREAD_KVM_VCPU(regd)
> 
> "Point" is not an idiomatic abbreviation for pointer.  Does this really need to
> be macroized, which prevents optimization?  IIRC, the 64-bit patchset gets rid
> of that on bookehv (where it was called GET_VCPU).


ok

> 
> >  _GLOBAL(kvmppc_resume_host)
> > +	/*
> > +	 * If guest not used debug facility then hw debug registers
> > +	 * already have proper host values. If guest used debug
> > +	 * facility then restore host debug registers.
> > +	 * No Need to save guest debug registers as they are already intact
> > +	 * in guest/shadow registers.
> > +	 */
> > +	lwz	r9, VCPU_SHADOW_DBG(r4)
> > +	rlwinm.	r8, r9, 0, ~DBCR0_IDM
> > +	beq	skip_load_host_debug
> > +	lwz	r3, VCPU_HOST_DBG(r4)
> > +	andis.	r9, r9, DBCR0_AC_BITS@h
> > +	li	r9, 0
> > +	mtspr	SPRN_DBCR0, r9		/* disable all debug event */
> > +	beq	..skip_load_hw_bkpts
> 
> We don't currently have that weird leading ".." in the bookehv code -- please
> don't introduce it.
> 
> > +#ifndef CONFIG_PPC_FSL_BOOK3E
> > +	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
> > +	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
> > +	mtspr	SPRN_IAC3, r7
> > +	mtspr	SPRN_IAC4, r8
> > +#endif
> 
> Can you handle this at runtime with a feature section?

Why you want this to make run time? Removing config_ ?

> 
> > diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
> > index 685829a..38b5d02 100644
> > --- a/arch/powerpc/kvm/powerpc.c
> > +++ b/arch/powerpc/kvm/powerpc.c
> > @@ -427,7 +427,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)  int
> > kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
> >                                          struct kvm_guest_debug *dbg)
> > {
> > -	return -EINVAL;
> > +	return kvmppc_core_set_guest_debug(vcpu, dbg);
> >  }
> 
> I don't see a stub implementation for non-booke.

Yes, There is nothing non-booke in this patch, will make this under CONFIG_BOOKE.

Thanks
-Bharat

> 
> -Scott


^ permalink raw reply	[flat|nested] 26+ messages in thread

* RE: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
@ 2012-07-30  7:37       ` Bhushan Bharat-R65777
  0 siblings, 0 replies; 26+ messages in thread
From: Bhushan Bharat-R65777 @ 2012-07-30  7:37 UTC (permalink / raw)
  To: Wood Scott-B07421; +Cc: kvm-ppc, kvm, agraf

DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogV29vZCBTY290dC1CMDc0
MjENCj4gU2VudDogRnJpZGF5LCBKdWx5IDI3LCAyMDEyIDc6MDAgQU0NCj4gVG86IEJodXNoYW4g
QmhhcmF0LVI2NTc3Nw0KPiBDYzoga3ZtLXBwY0B2Z2VyLmtlcm5lbC5vcmc7IGt2bUB2Z2VyLmtl
cm5lbC5vcmc7IGFncmFmQHN1c2UuZGU7IEJodXNoYW4gQmhhcmF0LQ0KPiBSNjU3NzcNCj4gU3Vi
amVjdDogUmU6IFtQQVRDSCAyLzJdIEtWTTogUFBDOiBib29rZS9ib29rZWh2OiBBZGQgZ3Vlc3Qg
ZGVidWcgc3VwcG9ydA0KPiANCj4gT24gMDcvMjYvMjAxMiAxMjozMiBBTSwgQmhhcmF0IEJodXNo
YW4gd3JvdGU6DQo+ID4gVGhpcyBwYXRjaCBhZGRzOg0KPiA+ICAxKSBLVk0gZGVidWcgaGFuZGxl
ciBhZGRlZCBmb3IgZTUwMHYyLg0KPiA+ICAyKSBHdWVzdCBkZWJ1ZyBieSBxZW11IGdkYiBzdHVi
Lg0KPiANCj4gRG9lcyBpdCBtYWtlIHNlbnNlIGZvciB0aGVzZSB0byBib3RoIGJlIGluIHRoZSBz
YW1lIHBhdGNoPyAgSWYgdGhlcmUncyBjb21tb24NCj4gY29kZSB1c2VkIGJ5IGJvdGgsIHRoYXQg
Y291bGQgYmUgYWRkZWQgZmlyc3QuDQoNCm9rDQoNCj4gDQo+ID4gU2lnbmVkLW9mZi1ieTogTGl1
IFl1IDx5dS5saXVAZnJlZXNjYWxlLmNvbT4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBWYXJ1biBTZXRo
aSA8VmFydW4uU2V0aGlAZnJlZXNjYWxlLmNvbT4NCj4gPiBbYmhhcmF0LmJodXNoYW5AZnJlZXNj
YWxlLmNvbTogU3Vic3RhbnRpYWwgY2hhbmdlc10NCj4gPiBTaWduZWQtb2ZmLWJ5OiBCaGFyYXQg
Qmh1c2hhbiA8YmhhcmF0LmJodXNoYW5AZnJlZXNjYWxlLmNvbT4NCj4gPiAtLS0NCj4gPiAgYXJj
aC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bS5oICAgICAgICB8ICAgMjEgKysrKysNCj4gPiAgYXJj
aC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmggICB8ICAgIDcgKysNCj4gPiAgYXJjaC9w
b3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wcGMuaCAgICB8ICAgIDIgKw0KPiA+ICBhcmNoL3Bvd2Vy
cGMvaW5jbHVkZS9hc20vcmVnX2Jvb2tlLmggIHwgICAgMSArDQo+ID4gIGFyY2gvcG93ZXJwYy9r
ZXJuZWwvYXNtLW9mZnNldHMuYyAgICAgfCAgIDMxICsrKysrKy0NCj4gPiAgYXJjaC9wb3dlcnBj
L2t2bS9ib29rZS5jICAgICAgICAgICAgICB8ICAxNDYgKysrKysrKysrKysrKysrKysrKysrKysr
KysrLS0tDQo+ID4gIGFyY2gvcG93ZXJwYy9rdm0vYm9va2VfaW50ZXJydXB0cy5TICAgfCAgMTYw
DQo+ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQ0KPiA+ICBhcmNoL3Bvd2VycGMv
a3ZtL2Jvb2tlaHZfaW50ZXJydXB0cy5TIHwgIDE0MSArKysrKysrKysrKysrKysrKysrKysrKysr
KysrLQ0KPiA+ICBhcmNoL3Bvd2VycGMva3ZtL2U1MDBtYy5jICAgICAgICAgICAgIHwgICAgMyAr
LQ0KPiA+ICBhcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYyAgICAgICAgICAgIHwgICAgMiArLQ0K
PiA+ICAxMCBmaWxlcyBjaGFuZ2VkLCA0OTIgaW5zZXJ0aW9ucygrKSwgMjIgZGVsZXRpb25zKC0p
DQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bS5oDQo+
ID4gYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtLmggaW5kZXggM2MxNDIwMi4uZGE3MWM4
NCAxMDA2NDQNCj4gPiAtLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtLmgNCj4gPiAr
KysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtLmgNCj4gPiBAQCAtMjUsNiArMjUsNyBA
QA0KPiA+ICAvKiBTZWxlY3QgcG93ZXJwYyBzcGVjaWZpYyBmZWF0dXJlcyBpbiA8bGludXgva3Zt
Lmg+ICovICAjZGVmaW5lDQo+ID4gX19LVk1fSEFWRV9TUEFQUl9UQ0UgICNkZWZpbmUgX19LVk1f
SEFWRV9QUENfU01UDQo+ID4gKyNkZWZpbmUgX19LVk1fSEFWRV9HVUVTVF9ERUJVRw0KPiA+DQo+
ID4gIHN0cnVjdCBrdm1fcmVncyB7DQo+ID4gIAlfX3U2NCBwYzsNCj4gPiBAQCAtMjY1LDEwICsy
NjYsMTkgQEAgc3RydWN0IGt2bV9mcHUgeyAgfTsNCj4gPg0KPiA+ICBzdHJ1Y3Qga3ZtX2RlYnVn
X2V4aXRfYXJjaCB7DQo+ID4gKwlfX3UzMiBleGNlcHRpb247DQo+ID4gKwlfX3UzMiBwYzsNCj4g
PiArCV9fdTMyIHN0YXR1czsNCj4gPiAgfTsNCj4gDQo+IFBDIG11c3QgYmUgNjQtYml0LiAgV2hh
dCBnb2VzIGluICJzdGF0dXMiIGFuZCAiZXhjZXB0aW9uIj8NCg0Kb2sNCg0KPiANCj4gPiAgLyog
Zm9yIEtWTV9TRVRfR1VFU1RfREVCVUcgKi8NCj4gPiAgc3RydWN0IGt2bV9ndWVzdF9kZWJ1Z19h
cmNoIHsNCj4gPiArCXN0cnVjdCB7DQo+ID4gKwkJX191NjQgYWRkcjsNCj4gPiArCQlfX3UzMiB0
eXBlOw0KPiA+ICsJCV9fdTMyIHBhZDE7DQo+ID4gKwkJX191NjQgcGFkMjsNCj4gPiArCX0gYnBb
MTZdOw0KPiA+ICB9Ow0KPiANCj4gV2hhdCBnb2VzIGluICJ0eXBlIj8NCg0KVHlwZSBkZW5vdGUg
YnJlYWtwb2ludCwgcmVhZCB3YXRjaHBvaW50LCB3cml0ZSB3YXRjaHBvaW50IG9yIHdhdGNocG9p
bnQgKGJvdGggcmVhZCBhbmQgd3JpdGUpLiBXaWxsIGFkZGluZyBhIGNvbW1lbnQgdG8gZGVzY3Jp
YmUgdGhpcyBpcyBvaz8NCg0KPiANCj4gPiAgLyogZGVmaW5pdGlvbiBvZiByZWdpc3RlcnMgaW4g
a3ZtX3J1biAqLyBAQCAtMjg1LDYgKzI5NSwxNyBAQCBzdHJ1Y3QNCj4gPiBrdm1fc3luY19yZWdz
IHsNCj4gPiAgI2RlZmluZSBLVk1fQ1BVXzNTXzY0CQk0DQo+ID4gICNkZWZpbmUgS1ZNX0NQVV9F
NTAwTUMJCTUNCj4gPg0KPiA+ICsvKiBEZWJ1ZyByZWxhdGVkIGRlZmluZXMgKi8NCj4gPiArI2Rl
ZmluZSBLVk1fSU5TVF9HVUVTVEdEQiAgICAgICAgICAgICAgIDB4N0MwMDAyMUMgICAgICAvKiBl
aHByaXYgT0M9MCAqLw0KPiANCj4gV2lsbCB0aGlzIHdvcmsgb24gYWxsIFBQQz8NCj4gDQo+IEl0
IGNlcnRhaW5seSB3b24ndCB3b3JrIG9uIG90aGVyIGFyY2hpdGVjdHVyZXMsIHNvIGF0IGEgbWlu
aW11bSBpdCdzDQo+IEtWTV9QUENfSU5TVF9HVUVTVF9HREIsIGJ1dCBtYXliZSBpdCBuZWVkcyB0
byBiZSBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUuDQoNCkhvdyB0byBkZXRlcm1pbmUgYXQgcnVuIHRp
bWU/IGFkZGluZyBhbm90aGVyIGlvY3RsID8NCg0KPiANCj4gPiArI2RlZmluZSBLVk1fR1VFU1RE
QkdfVVNFX1NXX0JQICAgICAgICAgIDB4MDAwMTAwMDANCj4gPiArI2RlZmluZSBLVk1fR1VFU1RE
QkdfVVNFX0hXX0JQICAgICAgICAgIDB4MDAwMjAwMDANCj4gDQo+IFdoZXJlIGRvIHRoZXNlIGdl
dCB1c2VkPyAgQW55IHJlYXNvbiBmb3IgdGhlc2UgcGFydGljdWxhciB2YWx1ZXM/ICBJZiB5b3Un
cmUNCj4gdHJ5aW5nIHRvIGNyZWF0ZSBhIHBhcnRpdGlvbiB3aGVyZSB0aGUgdXBwZXIgaGFsZiBp
cyBnZW5lcmljIGFuZCB0aGUgbG93ZXIgaGFsZg0KPiBpcyBhcmNoLXNwZWNpZmljLCBzYXkgc28u
DQoNCktWTV9TRVRfR1VFU1RfREVCVUcgaW9jdGwgdXNlZCB0byBzZXQvdW5zZXQgZGVidWcgaW50
ZXJydXB0cywgd2hpY2ggaGF2ZSBhICJ1MzIgY29udHJvbCIgZWxlbWVudC4gV2UgaGF2ZSBpbmhl
cml0ZWQgdGhpcyBtZWNoYW5pc20gZnJvbSB4ODYgaW1wbGVtZW50YXRpb24gYW5kIGl0IGxvb2tz
IGxpa2UgbG93ZXIgMTYgYml0cyBhcmUgZ2VuZXJpYyAobGlrZSBLVk1fR1VFU1REQkdfRU5CTEUs
IEtWTV9HVUVTVERCR19TSU5HTEVTVEVQIGV0YyBhbmQgdXBwZXIgMTYgYml0cyBhcmUgQXJjaGl0
ZWN0dXJlIHNwZWNpZmljLg0KDQpJIHdpbGwgYWRkIGEgY29tbWVudCB0byBkZXNjcmliZSB0aGlz
Lg0KDQo+IA0KPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2hv
c3QuaA0KPiA+IGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgNCj4gPiBpbmRl
eCA3YTQ1MTk0Li41MjRhZjdhIDEwMDY0NA0KPiA+IC0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRl
L2FzbS9rdm1faG9zdC5oDQo+ID4gKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9o
b3N0LmgNCj4gPiBAQCAtNDU4LDcgKzQ1OCwxMiBAQCBzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCB7DQo+
ID4gIAl1MzIgY2NyMDsNCj4gPiAgCXUzMiBjY3IxOw0KPiA+ICAJdTMyIGRic3I7DQo+ID4gKwkv
KiBndWVzdCBkZWJ1ZyByZWdpdGVycyovDQo+ID4gIAlzdHJ1Y3Qga3ZtcHBjX2Jvb2tlX2RlYnVn
X3JlZyBkYmdfcmVnOw0KPiA+ICsJLyogc2hhZG93IGRlYnVnIHJlZ2lzdGVycyAqLw0KPiA+ICsJ
c3RydWN0IGt2bXBwY19ib29rZV9kZWJ1Z19yZWcgc2hhZG93X2RiZ19yZWc7DQo+ID4gKwkvKiBo
b3N0IGRlYnVnIHJlZ2l0ZXJzKi8NCj4gPiArCXN0cnVjdCBrdm1wcGNfYm9va2VfZGVidWdfcmVn
IGhvc3RfZGJnX3JlZzsNCj4gDQo+IHMvcmVnaXRlci9yZWdpc3Rlci9nDQo+IA0KPiAuLi5hbmQg
cHV0IGEgc3BhY2UgYmVmb3JlICovDQoNCj4gDQo+ID4gQEAgLTQ5Miw2ICs0OTcsNyBAQCBzdHJ1
Y3Qga3ZtX3ZjcHVfYXJjaCB7DQo+ID4gIAl1MzIgdGxiY2ZnWzRdOw0KPiA+ICAJdTMyIG1tdWNm
ZzsNCj4gPiAgCXUzMiBlcHI7DQo+ID4gKwl1MzIgY3JpdF9zYXZlOw0KPiA+ICAjZW5kaWYNCj4g
DQo+IFdoYXQgaXMgY3JpdF9zYXZlPw0KPiANCj4gPiAgCWdwYV90IHBhZGRyX2FjY2Vzc2VkOw0K
PiA+ICAJZ3ZhX3QgdmFkZHJfYWNjZXNzZWQ7DQo+ID4gQEAgLTUzMyw2ICs1MzksNyBAQCBzdHJ1
Y3Qga3ZtX3ZjcHVfYXJjaCB7DQo+ID4gIAlzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaF9zaGFyZWQgKnNo
YXJlZDsNCj4gPiAgCXVuc2lnbmVkIGxvbmcgbWFnaWNfcGFnZV9wYTsgLyogcGh5cyBhZGRyIHRv
IG1hcCB0aGUgbWFnaWMgcGFnZSB0byAqLw0KPiA+ICAJdW5zaWduZWQgbG9uZyBtYWdpY19wYWdl
X2VhOyAvKiBlZmZlY3QuIGFkZHIgdG8gbWFwIHRoZSBtYWdpYyBwYWdlDQo+ID4gdG8gKi8NCj4g
PiArCXN0cnVjdCBrdm1fZ3Vlc3RfZGVidWdfYXJjaCBkYmc7IC8qIGRlYnVnIGFyZyBiZXR3ZWVu
IGt2bSBhbmQgcWVtdQ0KPiA+ICsqLw0KPiANCj4gSXMga3ZtX2d1ZXN0X2RlYnVnX2FyY2ggZ2Vu
ZXJpYyBvciBQUEMtc3BlY2lmaWM/ICBJZiB0aGUgZm9ybWVyLCB3aHkgaXMgaXQgaW4gYQ0KPiBw
cGMgc3RydWN0PyAgSWYgdGhlIGxhdHRlciwgd2h5IGRvZXNuJ3QgaXQgaGF2ZSAicHBjIiBpbiB0
aGUgbmFtZT8NCj4gDQo+IFBsZWFzZSBzZXBhcmF0ZSBvdXQgZ2VuZXJpYyB0aGluZ3MgaW4gb25l
IHBhdGNoLCB0aGVuIFBQQy13aWRlIHRoaW5ncywgdGhlbg0KPiBib29rZSB0aGluZ3MgKGJ1dCBr
ZWVwIHRoaW5ncyBiaXNlY3RhYmxlIGJ5IGFkZGluZyBzdHVicyBhbG9uZyB0aGUgd2F5IGlmDQo+
IG5lY2Vzc2FyeSkuDQoNCm9rDQoNCj4gDQo+ID4gLSNpZmRlZiBDT05GSUdfS1ZNX0JPT0tFX0hW
DQo+ID4gKyNpZiBkZWZpbmVkKENPTkZJR19LVk1fRTUwMFYyKSB8fCBkZWZpbmVkKENPTkZJR19L
Vk1fRTUwME1DKQ0KPiA+ICAJREVGSU5FKFRIUkVBRF9LVk1fVkNQVSwgb2Zmc2V0b2Yoc3RydWN0
IHRocmVhZF9zdHJ1Y3QsIGt2bV92Y3B1KSk7DQo+ID4gI2VuZGlmDQo+IA0KPiBXaHkgbm90IGFs
bCBib29rZT8NCg0KWWVzLCB3aWxsIG1ha2UgaXMgYWxsIGJvb2tlLg0KDQo+IA0KPiA+IGRpZmYg
LS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tl
LmMgaW5kZXgNCj4gPiA2ZmJkY2ZjLi43ODRhNmJmIDEwMDY0NA0KPiA+IC0tLSBhL2FyY2gvcG93
ZXJwYy9rdm0vYm9va2UuYw0KPiA+ICsrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYw0KPiA+
IEBAIC0xMzAsNiArMTMwLDkgQEAgdm9pZCBrdm1wcGNfc2V0X21zcihzdHJ1Y3Qga3ZtX3ZjcHUg
KnZjcHUsIHUzMg0KPiA+IG5ld19tc3IpDQo+ID4NCj4gPiAgI2lmZGVmIENPTkZJR19LVk1fQk9P
S0VfSFYNCj4gPiAgCW5ld19tc3IgfD0gTVNSX0dTOw0KPiA+ICsNCj4gPiArCWlmICh2Y3B1LT5n
dWVzdF9kZWJ1ZykNCj4gPiArCQluZXdfbXNyIHw9IE1TUl9ERTsNCj4gPiAgI2VuZGlmDQo+ID4N
Cj4gPiAgCXZjcHUtPmFyY2guc2hhcmVkLT5tc3IgPSBuZXdfbXNyOw0KPiA+IEBAIC02ODQsMTAg
KzY4NywyMSBAQCBvdXQ6DQo+ID4gIAlyZXR1cm4gcmV0Ow0KPiA+ICB9DQo+ID4NCj4gPiAtc3Rh
dGljIGludCBlbXVsYXRpb25fZXhpdChzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3Zj
cHUgKnZjcHUpDQo+ID4gK3N0YXRpYyBpbnQgZW11bGF0aW9uX2V4aXQoc3RydWN0IGt2bV9ydW4g
KnJ1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LA0KPiA+ICsJCQkgIGludCBleGl0X25yKQ0KPiA+
ICB7DQo+ID4gIAllbnVtIGVtdWxhdGlvbl9yZXN1bHQgZXI7DQo+ID4NCj4gPiArCWlmICh1bmxp
a2VseSh2Y3B1LT5ndWVzdF9kZWJ1ZyAmIEtWTV9HVUVTVERCR19VU0VfU1dfQlApICYmDQo+ID4g
KwkJICAgICAodmNwdS0+YXJjaC5sYXN0X2luc3QgPT0gS1ZNX0lOU1RfR1VFU1RHREIpKSB7DQo+
IA0KPiBVbm5lY2Vzc2FyeSBwYXJlbnMuDQo+IA0KPiA+ICsJCXJ1bi0+ZXhpdF9yZWFzb24gPSBL
Vk1fRVhJVF9ERUJVRzsNCj4gPiArCQlydW4tPmRlYnVnLmFyY2gucGMgPSB2Y3B1LT5hcmNoLnBj
Ow0KPiA+ICsJCXJ1bi0+ZGVidWcuYXJjaC5leGNlcHRpb24gPSBleGl0X25yOw0KPiA+ICsJCXJ1
bi0+ZGVidWcuYXJjaC5zdGF0dXMgPSAwOw0KPiA+ICsJCWt2bXBwY19hY2NvdW50X2V4aXQodmNw
dSwgREVCVUdfRVhJVFMpOw0KPiA+ICsJCXJldHVybiBSRVNVTUVfSE9TVDsNCj4gDQo+IFRoZSBp
bnRlcmZhY2UgaXNuJ3QgKGNsZWFybHkgbGFiZWxsZWQgYXMpIGJvb2tlIHNwZWNpZmljLCBidXQg
eW91IHJldHVybiBib29rZS0NCj4gc3BlY2lmaWMgZXhjZXB0aW9uIG51bWJlcnMuICBIb3cncyB1
c2Vyc3BhY2Ugc3VwcG9zZWQgdG8ga25vdyB3aGF0IHRvIGRvIHdpdGgNCj4gdGhlbT8gIFdoYXQg
ZG8geW91IHBsYW4gb24gZG9pbmcgd2l0aCB0aGVtIGluIFFFTVU/DQoNClRoaXMgaXMgYm9va2Ug
c3BlY2lmaWMuDQoNCj4gDQo+ID4gKyNkZWZpbmUgR0VUX1ZDUFVfUE9JTlQocmVnZCkgICAgICAg
ICAgICAgICAgIFwNCj4gPiArCW1mc3ByICAgcmVnZCwgU1BSTl9TUFJHX1RIUkVBRDsgICAgICBc
DQo+ID4gKwlsd3oJcmVnZCwgVEhSRUFEX0tWTV9WQ1BVKHJlZ2QpDQo+IA0KPiAiUG9pbnQiIGlz
IG5vdCBhbiBpZGlvbWF0aWMgYWJicmV2aWF0aW9uIGZvciBwb2ludGVyLiAgRG9lcyB0aGlzIHJl
YWxseSBuZWVkIHRvDQo+IGJlIG1hY3JvaXplZCwgd2hpY2ggcHJldmVudHMgb3B0aW1pemF0aW9u
PyAgSUlSQywgdGhlIDY0LWJpdCBwYXRjaHNldCBnZXRzIHJpZA0KPiBvZiB0aGF0IG9uIGJvb2tl
aHYgKHdoZXJlIGl0IHdhcyBjYWxsZWQgR0VUX1ZDUFUpLg0KDQoNCm9rDQoNCj4gDQo+ID4gIF9H
TE9CQUwoa3ZtcHBjX3Jlc3VtZV9ob3N0KQ0KPiA+ICsJLyoNCj4gPiArCSAqIElmIGd1ZXN0IG5v
dCB1c2VkIGRlYnVnIGZhY2lsaXR5IHRoZW4gaHcgZGVidWcgcmVnaXN0ZXJzDQo+ID4gKwkgKiBh
bHJlYWR5IGhhdmUgcHJvcGVyIGhvc3QgdmFsdWVzLiBJZiBndWVzdCB1c2VkIGRlYnVnDQo+ID4g
KwkgKiBmYWNpbGl0eSB0aGVuIHJlc3RvcmUgaG9zdCBkZWJ1ZyByZWdpc3RlcnMuDQo+ID4gKwkg
KiBObyBOZWVkIHRvIHNhdmUgZ3Vlc3QgZGVidWcgcmVnaXN0ZXJzIGFzIHRoZXkgYXJlIGFscmVh
ZHkgaW50YWN0DQo+ID4gKwkgKiBpbiBndWVzdC9zaGFkb3cgcmVnaXN0ZXJzLg0KPiA+ICsJICov
DQo+ID4gKwlsd3oJcjksIFZDUFVfU0hBRE9XX0RCRyhyNCkNCj4gPiArCXJsd2lubS4JcjgsIHI5
LCAwLCB+REJDUjBfSURNDQo+ID4gKwliZXEJc2tpcF9sb2FkX2hvc3RfZGVidWcNCj4gPiArCWx3
eglyMywgVkNQVV9IT1NUX0RCRyhyNCkNCj4gPiArCWFuZGlzLglyOSwgcjksIERCQ1IwX0FDX0JJ
VFNAaA0KPiA+ICsJbGkJcjksIDANCj4gPiArCW10c3ByCVNQUk5fREJDUjAsIHI5CQkvKiBkaXNh
YmxlIGFsbCBkZWJ1ZyBldmVudCAqLw0KPiA+ICsJYmVxCS4uc2tpcF9sb2FkX2h3X2JrcHRzDQo+
IA0KPiBXZSBkb24ndCBjdXJyZW50bHkgaGF2ZSB0aGF0IHdlaXJkIGxlYWRpbmcgIi4uIiBpbiB0
aGUgYm9va2VodiBjb2RlIC0tIHBsZWFzZQ0KPiBkb24ndCBpbnRyb2R1Y2UgaXQuDQo+IA0KPiA+
ICsjaWZuZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQ0KPiA+ICsJUFBDX0xEKHI3LCBWQ1BVX0hP
U1RfREJHK0tWTVBQQ19EQkdfSUFDMywgcjQpDQo+ID4gKwlQUENfTEQocjgsIFZDUFVfSE9TVF9E
QkcrS1ZNUFBDX0RCR19JQUM0LCByNCkNCj4gPiArCW10c3ByCVNQUk5fSUFDMywgcjcNCj4gPiAr
CW10c3ByCVNQUk5fSUFDNCwgcjgNCj4gPiArI2VuZGlmDQo+IA0KPiBDYW4geW91IGhhbmRsZSB0
aGlzIGF0IHJ1bnRpbWUgd2l0aCBhIGZlYXR1cmUgc2VjdGlvbj8NCg0KV2h5IHlvdSB3YW50IHRo
aXMgdG8gbWFrZSBydW4gdGltZT8gUmVtb3ZpbmcgY29uZmlnXyA/DQoNCj4gDQo+ID4gZGlmZiAt
LWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dl
cnBjLmMNCj4gPiBpbmRleCA2ODU4MjlhLi4zOGI1ZDAyIDEwMDY0NA0KPiA+IC0tLSBhL2FyY2gv
cG93ZXJwYy9rdm0vcG93ZXJwYy5jDQo+ID4gKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBj
LmMNCj4gPiBAQCAtNDI3LDcgKzQyNyw3IEBAIHZvaWQga3ZtX2FyY2hfdmNwdV9wdXQoc3RydWN0
IGt2bV92Y3B1ICp2Y3B1KSAgaW50DQo+ID4ga3ZtX2FyY2hfdmNwdV9pb2N0bF9zZXRfZ3Vlc3Rf
ZGVidWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RydWN0IGt2bV9ndWVzdF9kZWJ1ZyAqZGJnKQ0KPiA+IHsNCj4g
PiAtCXJldHVybiAtRUlOVkFMOw0KPiA+ICsJcmV0dXJuIGt2bXBwY19jb3JlX3NldF9ndWVzdF9k
ZWJ1Zyh2Y3B1LCBkYmcpOw0KPiA+ICB9DQo+IA0KPiBJIGRvbid0IHNlZSBhIHN0dWIgaW1wbGVt
ZW50YXRpb24gZm9yIG5vbi1ib29rZS4NCg0KWWVzLCBUaGVyZSBpcyBub3RoaW5nIG5vbi1ib29r
ZSBpbiB0aGlzIHBhdGNoLCB3aWxsIG1ha2UgdGhpcyB1bmRlciBDT05GSUdfQk9PS0UuDQoNClRo
YW5rcw0KLUJoYXJhdA0KDQo+IA0KPiAtU2NvdHQNCg0K


^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 1/2] KVM: PPC: booke: Allow multiple exception types
  2012-07-26  5:44 ` Bharat Bhushan
@ 2012-07-30 11:23 ` Bharat Bhushan
  -1 siblings, 0 replies; 26+ messages in thread
From: Bharat Bhushan @ 2012-07-30 11:11 UTC (permalink / raw)
  To: kvm-ppc, kvm, agraf; +Cc: Bharat Bhushan

Current kvmppc_booke_handlers uses the same macro (KVM_HANDLER) and
all handlers are considered to be the same size. This will not be
the case if we want to use different macros for different handlers.

This patch improves the kvmppc_booke_handler so that it can
support different macros for different handlers.

Signed-off-by: Liu Yu <yu.liu@freescale.com>
[bharat.bhushan@freescale.com: Substantial changes]
Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
---
 arch/powerpc/include/asm/kvm_ppc.h  |    2 -
 arch/powerpc/kvm/booke.c            |    9 ++++---
 arch/powerpc/kvm/booke.h            |    1 +
 arch/powerpc/kvm/booke_interrupts.S |   37 ++++++++++++++++++++++++++++++++--
 arch/powerpc/kvm/e500.c             |   13 +++++++----
 5 files changed, 48 insertions(+), 14 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index 823d563..6d3e665 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -47,8 +47,6 @@ enum emulation_result {
 
 extern int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu);
 extern int __kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu);
-extern char kvmppc_handlers_start[];
-extern unsigned long kvmppc_handler_len;
 extern void kvmppc_handler_highmem(void);
 
 extern void kvmppc_dump_vcpu(struct kvm_vcpu *vcpu);
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 47a7925..6fbdcfc 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -1528,6 +1528,7 @@ int __init kvmppc_booke_init(void)
 {
 #ifndef CONFIG_KVM_BOOKE_HV
 	unsigned long ivor[16];
+	unsigned long *handler = kvmppc_booke_handler_addr;
 	unsigned long max_ivor = 0;
 	int i;
 
@@ -1561,14 +1562,14 @@ int __init kvmppc_booke_init(void)
 
 	for (i = 0; i < 16; i++) {
 		if (ivor[i] > max_ivor)
-			max_ivor = ivor[i];
+			max_ivor = i;
 
 		memcpy((void *)kvmppc_booke_handlers + ivor[i],
-		       kvmppc_handlers_start + i * kvmppc_handler_len,
-		       kvmppc_handler_len);
+		       (void *)handler[i], handler[i + 1] - handler[i]);
 	}
 	flush_icache_range(kvmppc_booke_handlers,
-	                   kvmppc_booke_handlers + max_ivor + kvmppc_handler_len);
+	                   kvmppc_booke_handlers + ivor[max_ivor] +
+                               handler[max_ivor + 1] - handler[max_ivor]);
 #endif /* !BOOKE_HV */
 	return 0;
 }
diff --git a/arch/powerpc/kvm/booke.h b/arch/powerpc/kvm/booke.h
index ba61974..de9e526 100644
--- a/arch/powerpc/kvm/booke.h
+++ b/arch/powerpc/kvm/booke.h
@@ -65,6 +65,7 @@
 			  (1 << BOOKE_IRQPRIO_CRITICAL))
 
 extern unsigned long kvmppc_booke_handlers;
+extern unsigned long kvmppc_booke_handler_addr[];
 
 void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr);
 void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr);
diff --git a/arch/powerpc/kvm/booke_interrupts.S b/arch/powerpc/kvm/booke_interrupts.S
index 09456c4..c7aebc5 100644
--- a/arch/powerpc/kvm/booke_interrupts.S
+++ b/arch/powerpc/kvm/booke_interrupts.S
@@ -74,6 +74,14 @@ _GLOBAL(kvmppc_handler_\ivor_nr)
 	bctr
 .endm
 
+.macro KVM_HANDLER_ADDR ivor_nr
+	.long	kvmppc_handler_\ivor_nr
+.endm
+
+.macro KVM_HANDLER_END
+	.long	kvmppc_handlers_end
+.endm
+
 _GLOBAL(kvmppc_handlers_start)
 KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
 KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK  SPRN_SPRG_RSCRATCH_MC SPRN_MCSRR0
@@ -94,9 +102,7 @@ KVM_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
-
-_GLOBAL(kvmppc_handler_len)
-	.long kvmppc_handler_1 - kvmppc_handler_0
+_GLOBAL(kvmppc_handlers_end)
 
 /* Registers:
  *  SPRG_SCRATCH0: guest r4
@@ -464,6 +470,31 @@ lightweight_exit:
 	lwz	r4, VCPU_GPR(r4)(r4)
 	rfi
 
+	.data
+	.align	4
+	.globl	kvmppc_booke_handler_addr
+kvmppc_booke_handler_addr:
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_CRITICAL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_MACHINE_CHECK
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DATA_STORAGE
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_INST_STORAGE
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_EXTERNAL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_ALIGNMENT
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_PROGRAM
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_FP_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SYSCALL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_AP_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DECREMENTER
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_FIT
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_WATCHDOG
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DTLB_MISS
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_ITLB_MISS
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DEBUG
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_DATA
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_ROUND
+KVM_HANDLER_END /*Always keep this in end*/
+
 #ifdef CONFIG_SPE
 _GLOBAL(kvmppc_save_guest_spe)
 	cmpi	0,r3,0
diff --git a/arch/powerpc/kvm/e500.c b/arch/powerpc/kvm/e500.c
index b479ed7..cb7a5e7 100644
--- a/arch/powerpc/kvm/e500.c
+++ b/arch/powerpc/kvm/e500.c
@@ -491,12 +491,15 @@ static int __init kvmppc_e500_init(void)
 {
 	int r, i;
 	unsigned long ivor[3];
+	unsigned long *handler = kvmppc_booke_handler_addr;
 	unsigned long max_ivor = 0;
 
 	r = kvmppc_core_check_processor_compat();
 	if (r)
 		return r;
 
+	handler += 16;
+
 	r = kvmppc_booke_init();
 	if (r)
 		return r;
@@ -506,15 +509,15 @@ static int __init kvmppc_e500_init(void)
 	ivor[1] = mfspr(SPRN_IVOR33);
 	ivor[2] = mfspr(SPRN_IVOR34);
 	for (i = 0; i < 3; i++) {
-		if (ivor[i] > max_ivor)
-			max_ivor = ivor[i];
+		if (ivor[i] > ivor[max_ivor])
+			max_ivor = i;
 
 		memcpy((void *)kvmppc_booke_handlers + ivor[i],
-		       kvmppc_handlers_start + (i + 16) * kvmppc_handler_len,
-		       kvmppc_handler_len);
+		       (void *)handler[i], handler[i + 1] - handler[i]);
 	}
 	flush_icache_range(kvmppc_booke_handlers,
-			kvmppc_booke_handlers + max_ivor + kvmppc_handler_len);
+	                   kvmppc_booke_handlers + ivor[max_ivor] +
+	                       handler[max_ivor + 1] - handler[max_ivor]);
 
 	return kvm_init(NULL, sizeof(struct kvmppc_vcpu_e500), 0, THIS_MODULE);
 }
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH 2/2] KVM: PPC: booke: Added debug handler
  2012-07-30 11:23 ` Bharat Bhushan
@ 2012-07-30 11:23   ` Bharat Bhushan
  -1 siblings, 0 replies; 26+ messages in thread
From: Bharat Bhushan @ 2012-07-30 11:11 UTC (permalink / raw)
  To: kvm-ppc, kvm, agraf; +Cc: Bharat Bhushan

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@freescale.com>
[bharat.bhushan@freescale.com: Substantial changes]
Signed-off-by: Bharat Bhushan <bharat.bhushan@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 7a45194..daa2222 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -492,6 +492,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 52c7ad7..6f7c1c9 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 c7aebc5..e002c34 100644
--- a/arch/powerpc/kvm/booke_interrupts.S
+++ b/arch/powerpc/kvm/booke_interrupts.S
@@ -74,6 +74,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



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH 1/2] KVM: PPC: booke: Allow multiple exception types
@ 2012-07-30 11:23 ` Bharat Bhushan
  0 siblings, 0 replies; 26+ messages in thread
From: Bharat Bhushan @ 2012-07-30 11:23 UTC (permalink / raw)
  To: kvm-ppc, kvm, agraf; +Cc: Bharat Bhushan

Current kvmppc_booke_handlers uses the same macro (KVM_HANDLER) and
all handlers are considered to be the same size. This will not be
the case if we want to use different macros for different handlers.

This patch improves the kvmppc_booke_handler so that it can
support different macros for different handlers.

Signed-off-by: Liu Yu <yu.liu@freescale.com>
[bharat.bhushan@freescale.com: Substantial changes]
Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
---
 arch/powerpc/include/asm/kvm_ppc.h  |    2 -
 arch/powerpc/kvm/booke.c            |    9 ++++---
 arch/powerpc/kvm/booke.h            |    1 +
 arch/powerpc/kvm/booke_interrupts.S |   37 ++++++++++++++++++++++++++++++++--
 arch/powerpc/kvm/e500.c             |   13 +++++++----
 5 files changed, 48 insertions(+), 14 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index 823d563..6d3e665 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -47,8 +47,6 @@ enum emulation_result {
 
 extern int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu);
 extern int __kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu);
-extern char kvmppc_handlers_start[];
-extern unsigned long kvmppc_handler_len;
 extern void kvmppc_handler_highmem(void);
 
 extern void kvmppc_dump_vcpu(struct kvm_vcpu *vcpu);
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 47a7925..6fbdcfc 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -1528,6 +1528,7 @@ int __init kvmppc_booke_init(void)
 {
 #ifndef CONFIG_KVM_BOOKE_HV
 	unsigned long ivor[16];
+	unsigned long *handler = kvmppc_booke_handler_addr;
 	unsigned long max_ivor = 0;
 	int i;
 
@@ -1561,14 +1562,14 @@ int __init kvmppc_booke_init(void)
 
 	for (i = 0; i < 16; i++) {
 		if (ivor[i] > max_ivor)
-			max_ivor = ivor[i];
+			max_ivor = i;
 
 		memcpy((void *)kvmppc_booke_handlers + ivor[i],
-		       kvmppc_handlers_start + i * kvmppc_handler_len,
-		       kvmppc_handler_len);
+		       (void *)handler[i], handler[i + 1] - handler[i]);
 	}
 	flush_icache_range(kvmppc_booke_handlers,
-	                   kvmppc_booke_handlers + max_ivor + kvmppc_handler_len);
+	                   kvmppc_booke_handlers + ivor[max_ivor] +
+                               handler[max_ivor + 1] - handler[max_ivor]);
 #endif /* !BOOKE_HV */
 	return 0;
 }
diff --git a/arch/powerpc/kvm/booke.h b/arch/powerpc/kvm/booke.h
index ba61974..de9e526 100644
--- a/arch/powerpc/kvm/booke.h
+++ b/arch/powerpc/kvm/booke.h
@@ -65,6 +65,7 @@
 			  (1 << BOOKE_IRQPRIO_CRITICAL))
 
 extern unsigned long kvmppc_booke_handlers;
+extern unsigned long kvmppc_booke_handler_addr[];
 
 void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr);
 void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr);
diff --git a/arch/powerpc/kvm/booke_interrupts.S b/arch/powerpc/kvm/booke_interrupts.S
index 09456c4..c7aebc5 100644
--- a/arch/powerpc/kvm/booke_interrupts.S
+++ b/arch/powerpc/kvm/booke_interrupts.S
@@ -74,6 +74,14 @@ _GLOBAL(kvmppc_handler_\ivor_nr)
 	bctr
 .endm
 
+.macro KVM_HANDLER_ADDR ivor_nr
+	.long	kvmppc_handler_\ivor_nr
+.endm
+
+.macro KVM_HANDLER_END
+	.long	kvmppc_handlers_end
+.endm
+
 _GLOBAL(kvmppc_handlers_start)
 KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
 KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK  SPRN_SPRG_RSCRATCH_MC SPRN_MCSRR0
@@ -94,9 +102,7 @@ KVM_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
-
-_GLOBAL(kvmppc_handler_len)
-	.long kvmppc_handler_1 - kvmppc_handler_0
+_GLOBAL(kvmppc_handlers_end)
 
 /* Registers:
  *  SPRG_SCRATCH0: guest r4
@@ -464,6 +470,31 @@ lightweight_exit:
 	lwz	r4, VCPU_GPR(r4)(r4)
 	rfi
 
+	.data
+	.align	4
+	.globl	kvmppc_booke_handler_addr
+kvmppc_booke_handler_addr:
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_CRITICAL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_MACHINE_CHECK
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DATA_STORAGE
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_INST_STORAGE
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_EXTERNAL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_ALIGNMENT
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_PROGRAM
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_FP_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SYSCALL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_AP_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DECREMENTER
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_FIT
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_WATCHDOG
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DTLB_MISS
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_ITLB_MISS
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_DEBUG
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_UNAVAIL
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_DATA
+KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_ROUND
+KVM_HANDLER_END /*Always keep this in end*/
+
 #ifdef CONFIG_SPE
 _GLOBAL(kvmppc_save_guest_spe)
 	cmpi	0,r3,0
diff --git a/arch/powerpc/kvm/e500.c b/arch/powerpc/kvm/e500.c
index b479ed7..cb7a5e7 100644
--- a/arch/powerpc/kvm/e500.c
+++ b/arch/powerpc/kvm/e500.c
@@ -491,12 +491,15 @@ static int __init kvmppc_e500_init(void)
 {
 	int r, i;
 	unsigned long ivor[3];
+	unsigned long *handler = kvmppc_booke_handler_addr;
 	unsigned long max_ivor = 0;
 
 	r = kvmppc_core_check_processor_compat();
 	if (r)
 		return r;
 
+	handler += 16;
+
 	r = kvmppc_booke_init();
 	if (r)
 		return r;
@@ -506,15 +509,15 @@ static int __init kvmppc_e500_init(void)
 	ivor[1] = mfspr(SPRN_IVOR33);
 	ivor[2] = mfspr(SPRN_IVOR34);
 	for (i = 0; i < 3; i++) {
-		if (ivor[i] > max_ivor)
-			max_ivor = ivor[i];
+		if (ivor[i] > ivor[max_ivor])
+			max_ivor = i;
 
 		memcpy((void *)kvmppc_booke_handlers + ivor[i],
-		       kvmppc_handlers_start + (i + 16) * kvmppc_handler_len,
-		       kvmppc_handler_len);
+		       (void *)handler[i], handler[i + 1] - handler[i]);
 	}
 	flush_icache_range(kvmppc_booke_handlers,
-			kvmppc_booke_handlers + max_ivor + kvmppc_handler_len);
+	                   kvmppc_booke_handlers + ivor[max_ivor] +
+	                       handler[max_ivor + 1] - handler[max_ivor]);
 
 	return kvm_init(NULL, sizeof(struct kvmppc_vcpu_e500), 0, THIS_MODULE);
 }
-- 
1.7.0.4



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH 2/2] KVM: PPC: booke: Added debug handler
@ 2012-07-30 11:23   ` Bharat Bhushan
  0 siblings, 0 replies; 26+ messages in thread
From: Bharat Bhushan @ 2012-07-30 11:23 UTC (permalink / raw)
  To: kvm-ppc, kvm, agraf; +Cc: Bharat Bhushan

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@freescale.com>
[bharat.bhushan@freescale.com: Substantial changes]
Signed-off-by: Bharat Bhushan <bharat.bhushan@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 7a45194..daa2222 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -492,6 +492,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 52c7ad7..6f7c1c9 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 c7aebc5..e002c34 100644
--- a/arch/powerpc/kvm/booke_interrupts.S
+++ b/arch/powerpc/kvm/booke_interrupts.S
@@ -74,6 +74,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



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
  2012-07-30  7:37       ` Bhushan Bharat-R65777
@ 2012-07-30 22:00         ` Scott Wood
  -1 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-07-30 22:00 UTC (permalink / raw)
  To: Bhushan Bharat-R65777; +Cc: Wood Scott-B07421, kvm-ppc, kvm, agraf

On 07/30/2012 02:37 AM, Bhushan Bharat-R65777 wrote:
> 
> 
>> -----Original Message-----
>> From: Wood Scott-B07421
>> Sent: Friday, July 27, 2012 7:00 AM
>> To: Bhushan Bharat-R65777
>> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org; agraf@suse.de; Bhushan Bharat-
>> R65777
>> Subject: Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
>>
>> On 07/26/2012 12:32 AM, Bharat Bhushan wrote:
>>> This patch adds:
>>>  1) KVM debug handler added for e500v2.
>>>  2) Guest debug by qemu gdb stub.
>>
>> Does it make sense for these to both be in the same patch?  If there's common
>> code used by both, that could be added first.
> 
> ok
> 
>>
>>> Signed-off-by: Liu Yu <yu.liu@freescale.com>
>>> Signed-off-by: Varun Sethi <Varun.Sethi@freescale.com>
>>> [bharat.bhushan@freescale.com: Substantial changes]
>>> Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
>>> ---
>>>  arch/powerpc/include/asm/kvm.h        |   21 +++++
>>>  arch/powerpc/include/asm/kvm_host.h   |    7 ++
>>>  arch/powerpc/include/asm/kvm_ppc.h    |    2 +
>>>  arch/powerpc/include/asm/reg_booke.h  |    1 +
>>>  arch/powerpc/kernel/asm-offsets.c     |   31 ++++++-
>>>  arch/powerpc/kvm/booke.c              |  146 +++++++++++++++++++++++++++---
>>>  arch/powerpc/kvm/booke_interrupts.S   |  160
>> ++++++++++++++++++++++++++++++++-
>>>  arch/powerpc/kvm/bookehv_interrupts.S |  141 ++++++++++++++++++++++++++++-
>>>  arch/powerpc/kvm/e500mc.c             |    3 +-
>>>  arch/powerpc/kvm/powerpc.c            |    2 +-
>>>  10 files changed, 492 insertions(+), 22 deletions(-)
>>>
>>> diff --git a/arch/powerpc/include/asm/kvm.h
>>> b/arch/powerpc/include/asm/kvm.h index 3c14202..da71c84 100644
>>> --- a/arch/powerpc/include/asm/kvm.h
>>> +++ b/arch/powerpc/include/asm/kvm.h
>>> @@ -25,6 +25,7 @@
>>>  /* Select powerpc specific features in <linux/kvm.h> */  #define
>>> __KVM_HAVE_SPAPR_TCE  #define __KVM_HAVE_PPC_SMT
>>> +#define __KVM_HAVE_GUEST_DEBUG
>>>
>>>  struct kvm_regs {
>>>  	__u64 pc;
>>> @@ -265,10 +266,19 @@ struct kvm_fpu {  };
>>>
>>>  struct kvm_debug_exit_arch {
>>> +	__u32 exception;
>>> +	__u32 pc;
>>> +	__u32 status;
>>>  };
>>
>> PC must be 64-bit.  What goes in "status" and "exception"?
> 
> ok
> 
>>
>>>  /* for KVM_SET_GUEST_DEBUG */
>>>  struct kvm_guest_debug_arch {
>>> +	struct {
>>> +		__u64 addr;
>>> +		__u32 type;
>>> +		__u32 pad1;
>>> +		__u64 pad2;
>>> +	} bp[16];
>>>  };
>>
>> What goes in "type"?
> 
> Type denote breakpoint, read watchpoint, write watchpoint or watchpoint (both read and write). Will adding a comment to describe this is ok?

Yes, please make sure all of this is well documented.

>>>  /* definition of registers in kvm_run */ @@ -285,6 +295,17 @@ struct
>>> kvm_sync_regs {
>>>  #define KVM_CPU_3S_64		4
>>>  #define KVM_CPU_E500MC		5
>>>
>>> +/* Debug related defines */
>>> +#define KVM_INST_GUESTGDB               0x7C00021C      /* ehpriv OC=0 */
>>
>> Will this work on all PPC?
>>
>> It certainly won't work on other architectures, so at a minimum it's
>> KVM_PPC_INST_GUEST_GDB, but maybe it needs to be determined at runtime.
> 
> How to determine at run time? adding another ioctl ?

Or extend an existing one.  Is there any other information about debug
capabilities that you expose -- number of hardware breakpoints
supported, etc?

>>> +#define KVM_GUESTDBG_USE_SW_BP          0x00010000
>>> +#define KVM_GUESTDBG_USE_HW_BP          0x00020000
>>
>> Where do these get used?  Any reason for these particular values?  If you're
>> trying to create a partition where the upper half is generic and the lower half
>> is arch-specific, say so.
> 
> KVM_SET_GUEST_DEBUG ioctl used to set/unset debug interrupts, which
> have a "u32 control" element. We have inherited this mechanism from
> x86 implementation and it looks like lower 16 bits are generic (like
> KVM_GUESTDBG_ENBLE, KVM_GUESTDBG_SINGLESTEP etc and upper 16 bits are
> Architecture specific.
> 
> I will add a comment to describe this.

I don't think the sw/hw distinction belongs here -- it should be per
breakpoint.

>>> +		run->exit_reason = KVM_EXIT_DEBUG;
>>> +		run->debug.arch.pc = vcpu->arch.pc;
>>> +		run->debug.arch.exception = exit_nr;
>>> +		run->debug.arch.status = 0;
>>> +		kvmppc_account_exit(vcpu, DEBUG_EXITS);
>>> +		return RESUME_HOST;
>>
>> The interface isn't (clearly labelled as) booke specific, but you return booke-
>> specific exception numbers.  How's userspace supposed to know what to do with
>> them?  What do you plan on doing with them in QEMU?
> 
> This is booke specific.

Then put booke in the name, but what about it really needs to be booke
specific?  Why does QEMU care about the exception type?

>>> +#ifndef CONFIG_PPC_FSL_BOOK3E
>>> +	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
>>> +	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
>>> +	mtspr	SPRN_IAC3, r7
>>> +	mtspr	SPRN_IAC4, r8
>>> +#endif
>>
>> Can you handle this at runtime with a feature section?
> 
> Why you want this to make run time? Removing config_ ?

Currently KVM hardcodes the target hardware in a way that is
unacceptable in much of the rest of the kernel.  We have a long term
goal to stop doing that, and we should avoid making it worse by adding
random ifdefs for specific CPUs.

-Scott

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
@ 2012-07-30 22:00         ` Scott Wood
  0 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-07-30 22:00 UTC (permalink / raw)
  To: Bhushan Bharat-R65777; +Cc: Wood Scott-B07421, kvm-ppc, kvm, agraf

On 07/30/2012 02:37 AM, Bhushan Bharat-R65777 wrote:
> 
> 
>> -----Original Message-----
>> From: Wood Scott-B07421
>> Sent: Friday, July 27, 2012 7:00 AM
>> To: Bhushan Bharat-R65777
>> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org; agraf@suse.de; Bhushan Bharat-
>> R65777
>> Subject: Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
>>
>> On 07/26/2012 12:32 AM, Bharat Bhushan wrote:
>>> This patch adds:
>>>  1) KVM debug handler added for e500v2.
>>>  2) Guest debug by qemu gdb stub.
>>
>> Does it make sense for these to both be in the same patch?  If there's common
>> code used by both, that could be added first.
> 
> ok
> 
>>
>>> Signed-off-by: Liu Yu <yu.liu@freescale.com>
>>> Signed-off-by: Varun Sethi <Varun.Sethi@freescale.com>
>>> [bharat.bhushan@freescale.com: Substantial changes]
>>> Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
>>> ---
>>>  arch/powerpc/include/asm/kvm.h        |   21 +++++
>>>  arch/powerpc/include/asm/kvm_host.h   |    7 ++
>>>  arch/powerpc/include/asm/kvm_ppc.h    |    2 +
>>>  arch/powerpc/include/asm/reg_booke.h  |    1 +
>>>  arch/powerpc/kernel/asm-offsets.c     |   31 ++++++-
>>>  arch/powerpc/kvm/booke.c              |  146 +++++++++++++++++++++++++++---
>>>  arch/powerpc/kvm/booke_interrupts.S   |  160
>> ++++++++++++++++++++++++++++++++-
>>>  arch/powerpc/kvm/bookehv_interrupts.S |  141 ++++++++++++++++++++++++++++-
>>>  arch/powerpc/kvm/e500mc.c             |    3 +-
>>>  arch/powerpc/kvm/powerpc.c            |    2 +-
>>>  10 files changed, 492 insertions(+), 22 deletions(-)
>>>
>>> diff --git a/arch/powerpc/include/asm/kvm.h
>>> b/arch/powerpc/include/asm/kvm.h index 3c14202..da71c84 100644
>>> --- a/arch/powerpc/include/asm/kvm.h
>>> +++ b/arch/powerpc/include/asm/kvm.h
>>> @@ -25,6 +25,7 @@
>>>  /* Select powerpc specific features in <linux/kvm.h> */  #define
>>> __KVM_HAVE_SPAPR_TCE  #define __KVM_HAVE_PPC_SMT
>>> +#define __KVM_HAVE_GUEST_DEBUG
>>>
>>>  struct kvm_regs {
>>>  	__u64 pc;
>>> @@ -265,10 +266,19 @@ struct kvm_fpu {  };
>>>
>>>  struct kvm_debug_exit_arch {
>>> +	__u32 exception;
>>> +	__u32 pc;
>>> +	__u32 status;
>>>  };
>>
>> PC must be 64-bit.  What goes in "status" and "exception"?
> 
> ok
> 
>>
>>>  /* for KVM_SET_GUEST_DEBUG */
>>>  struct kvm_guest_debug_arch {
>>> +	struct {
>>> +		__u64 addr;
>>> +		__u32 type;
>>> +		__u32 pad1;
>>> +		__u64 pad2;
>>> +	} bp[16];
>>>  };
>>
>> What goes in "type"?
> 
> Type denote breakpoint, read watchpoint, write watchpoint or watchpoint (both read and write). Will adding a comment to describe this is ok?

Yes, please make sure all of this is well documented.

>>>  /* definition of registers in kvm_run */ @@ -285,6 +295,17 @@ struct
>>> kvm_sync_regs {
>>>  #define KVM_CPU_3S_64		4
>>>  #define KVM_CPU_E500MC		5
>>>
>>> +/* Debug related defines */
>>> +#define KVM_INST_GUESTGDB               0x7C00021C      /* ehpriv OC=0 */
>>
>> Will this work on all PPC?
>>
>> It certainly won't work on other architectures, so at a minimum it's
>> KVM_PPC_INST_GUEST_GDB, but maybe it needs to be determined at runtime.
> 
> How to determine at run time? adding another ioctl ?

Or extend an existing one.  Is there any other information about debug
capabilities that you expose -- number of hardware breakpoints
supported, etc?

>>> +#define KVM_GUESTDBG_USE_SW_BP          0x00010000
>>> +#define KVM_GUESTDBG_USE_HW_BP          0x00020000
>>
>> Where do these get used?  Any reason for these particular values?  If you're
>> trying to create a partition where the upper half is generic and the lower half
>> is arch-specific, say so.
> 
> KVM_SET_GUEST_DEBUG ioctl used to set/unset debug interrupts, which
> have a "u32 control" element. We have inherited this mechanism from
> x86 implementation and it looks like lower 16 bits are generic (like
> KVM_GUESTDBG_ENBLE, KVM_GUESTDBG_SINGLESTEP etc and upper 16 bits are
> Architecture specific.
> 
> I will add a comment to describe this.

I don't think the sw/hw distinction belongs here -- it should be per
breakpoint.

>>> +		run->exit_reason = KVM_EXIT_DEBUG;
>>> +		run->debug.arch.pc = vcpu->arch.pc;
>>> +		run->debug.arch.exception = exit_nr;
>>> +		run->debug.arch.status = 0;
>>> +		kvmppc_account_exit(vcpu, DEBUG_EXITS);
>>> +		return RESUME_HOST;
>>
>> The interface isn't (clearly labelled as) booke specific, but you return booke-
>> specific exception numbers.  How's userspace supposed to know what to do with
>> them?  What do you plan on doing with them in QEMU?
> 
> This is booke specific.

Then put booke in the name, but what about it really needs to be booke
specific?  Why does QEMU care about the exception type?

>>> +#ifndef CONFIG_PPC_FSL_BOOK3E
>>> +	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
>>> +	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
>>> +	mtspr	SPRN_IAC3, r7
>>> +	mtspr	SPRN_IAC4, r8
>>> +#endif
>>
>> Can you handle this at runtime with a feature section?
> 
> Why you want this to make run time? Removing config_ ?

Currently KVM hardcodes the target hardware in a way that is
unacceptable in much of the rest of the kernel.  We have a long term
goal to stop doing that, and we should avoid making it worse by adding
random ifdefs for specific CPUs.

-Scott



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 2/2] KVM: PPC: booke: Added debug handler
  2012-07-30 11:23   ` Bharat Bhushan
@ 2012-07-31  0:55     ` Scott Wood
  -1 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-07-31  0:55 UTC (permalink / raw)
  To: Bharat Bhushan; +Cc: kvm-ppc, kvm, agraf, Bharat Bhushan

On 07/30/2012 06:11 AM, Bharat Bhushan wrote:
> +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)

You're not working on the latest tree -- all this stuff is
"VCPU_GPR(R6)(r4)" now.

-Scott

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 2/2] KVM: PPC: booke: Added debug handler
@ 2012-07-31  0:55     ` Scott Wood
  0 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-07-31  0:55 UTC (permalink / raw)
  To: Bharat Bhushan; +Cc: kvm-ppc, kvm, agraf, Bharat Bhushan

On 07/30/2012 06:11 AM, Bharat Bhushan wrote:
> +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)

You're not working on the latest tree -- all this stuff is
"VCPU_GPR(R6)(r4)" now.

-Scott



^ permalink raw reply	[flat|nested] 26+ messages in thread

* RE: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
  2012-07-30 22:00         ` Scott Wood
@ 2012-08-16  8:48           ` Bhushan Bharat-R65777
  -1 siblings, 0 replies; 26+ messages in thread
From: Bhushan Bharat-R65777 @ 2012-08-16  8:48 UTC (permalink / raw)
  To: Wood Scott-B07421; +Cc: kvm-ppc, kvm, agraf

> >>> diff --git a/arch/powerpc/include/asm/kvm.h
> >>> b/arch/powerpc/include/asm/kvm.h index 3c14202..da71c84 100644
> >>> --- a/arch/powerpc/include/asm/kvm.h
> >>> +++ b/arch/powerpc/include/asm/kvm.h
> >>> @@ -25,6 +25,7 @@
> >>>  /* Select powerpc specific features in <linux/kvm.h> */  #define
> >>> __KVM_HAVE_SPAPR_TCE  #define __KVM_HAVE_PPC_SMT
> >>> +#define __KVM_HAVE_GUEST_DEBUG
> >>>
> >>>  struct kvm_regs {
> >>>  	__u64 pc;
> >>> @@ -265,10 +266,19 @@ struct kvm_fpu {  };
> >>>
> >>>  struct kvm_debug_exit_arch {
> >>> +	__u32 exception;
> >>> +	__u32 pc;
> >>> +	__u32 status;
> >>>  };
> >>
> >> PC must be 64-bit.  What goes in "status" and "exception"?

status ->  exit because of h/w breakpoint, watchpoint (read, write or both) and software breakpoint.
exception -> returns the exception number. If the exit is not handled (say not h/w breakpoint or software breakpoint set for this address) by qemu then it is supposed to inject the exception to guest. This is how it is implemented for x86.

> >
> > ok
> >
> >>
> >>>  /* for KVM_SET_GUEST_DEBUG */
> >>>  struct kvm_guest_debug_arch {
> >>> +	struct {
> >>> +		__u64 addr;
> >>> +		__u32 type;
> >>> +		__u32 pad1;
> >>> +		__u64 pad2;
> >>> +	} bp[16];
> >>>  };
> >>
> >> What goes in "type"?
> >
> > Type denote breakpoint, read watchpoint, write watchpoint or watchpoint (both
> read and write). Will adding a comment to describe this is ok?
> 
> Yes, please make sure all of this is well documented.
> 
> >>>  /* definition of registers in kvm_run */ @@ -285,6 +295,17 @@
> >>> struct kvm_sync_regs {
> >>>  #define KVM_CPU_3S_64		4
> >>>  #define KVM_CPU_E500MC		5
> >>>
> >>> +/* Debug related defines */
> >>> +#define KVM_INST_GUESTGDB               0x7C00021C      /* ehpriv OC=0 */
> >>
> >> Will this work on all PPC?
> >>
> >> It certainly won't work on other architectures, so at a minimum it's
> >> KVM_PPC_INST_GUEST_GDB, but maybe it needs to be determined at runtime.
> >
> > How to determine at run time? adding another ioctl ?
> 
> Or extend an existing one.  Is there any other information about debug
> capabilities that you expose -- number of hardware breakpoints supported, etc
> 
> >>> +#define KVM_GUESTDBG_USE_SW_BP          0x00010000
> >>> +#define KVM_GUESTDBG_USE_HW_BP          0x00020000
> >>
> >> Where do these get used?  Any reason for these particular values?  If
> >> you're trying to create a partition where the upper half is generic
> >> and the lower half is arch-specific, say so.
> >
> > KVM_SET_GUEST_DEBUG ioctl used to set/unset debug interrupts, which
> > have a "u32 control" element. We have inherited this mechanism from
> > x86 implementation and it looks like lower 16 bits are generic (like
> > KVM_GUESTDBG_ENBLE, KVM_GUESTDBG_SINGLESTEP etc and upper 16 bits are
> > Architecture specific.
> >
> > I will add a comment to describe this.
> 
> I don't think the sw/hw distinction belongs here -- it should be per breakpoint.

KVM does not track the software breakpoint, so it is not per breakpoint.
In KVM, when KVM_GUESTDBG_USE_SW_BP flag is set and special trap instruction is executed by guest then exit to userspace.

> 
> >>> +		run->exit_reason = KVM_EXIT_DEBUG;
> >>> +		run->debug.arch.pc = vcpu->arch.pc;
> >>> +		run->debug.arch.exception = exit_nr;
> >>> +		run->debug.arch.status = 0;
> >>> +		kvmppc_account_exit(vcpu, DEBUG_EXITS);
> >>> +		return RESUME_HOST;
> >>
> >> The interface isn't (clearly labelled as) booke specific, but you
> >> return booke- specific exception numbers.  How's userspace supposed
> >> to know what to do with them?  What do you plan on doing with them in QEMU?
> >
> > This is booke specific.
> 
> Then put booke in the name,

Which data structure name should have booke?

> but what about it really needs to be booke specific?
> Why does QEMU care about the exception type?

Explained above.

Thanks
-Bharat

> 
> >>> +#ifndef CONFIG_PPC_FSL_BOOK3E
> >>> +	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
> >>> +	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
> >>> +	mtspr	SPRN_IAC3, r7
> >>> +	mtspr	SPRN_IAC4, r8
> >>> +#endif
> >>
> >> Can you handle this at runtime with a feature section?
> >
> > Why you want this to make run time? Removing config_ ?
> 
> Currently KVM hardcodes the target hardware in a way that is unacceptable in
> much of the rest of the kernel.  We have a long term goal to stop doing that,
> and we should avoid making it worse by adding random ifdefs for specific CPUs.
> 
> -Scott


^ permalink raw reply	[flat|nested] 26+ messages in thread

* RE: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
@ 2012-08-16  8:48           ` Bhushan Bharat-R65777
  0 siblings, 0 replies; 26+ messages in thread
From: Bhushan Bharat-R65777 @ 2012-08-16  8:48 UTC (permalink / raw)
  To: Wood Scott-B07421; +Cc: kvm-ppc, kvm, agraf

PiA+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm0uaA0KPiA+Pj4g
Yi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtLmggaW5kZXggM2MxNDIwMi4uZGE3MWM4NCAx
MDA2NDQNCj4gPj4+IC0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm0uaA0KPiA+Pj4g
KysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bS5oDQo+ID4+PiBAQCAtMjUsNiArMjUs
NyBAQA0KPiA+Pj4gIC8qIFNlbGVjdCBwb3dlcnBjIHNwZWNpZmljIGZlYXR1cmVzIGluIDxsaW51
eC9rdm0uaD4gKi8gICNkZWZpbmUNCj4gPj4+IF9fS1ZNX0hBVkVfU1BBUFJfVENFICAjZGVmaW5l
IF9fS1ZNX0hBVkVfUFBDX1NNVA0KPiA+Pj4gKyNkZWZpbmUgX19LVk1fSEFWRV9HVUVTVF9ERUJV
Rw0KPiA+Pj4NCj4gPj4+ICBzdHJ1Y3Qga3ZtX3JlZ3Mgew0KPiA+Pj4gIAlfX3U2NCBwYzsNCj4g
Pj4+IEBAIC0yNjUsMTAgKzI2NiwxOSBAQCBzdHJ1Y3Qga3ZtX2ZwdSB7ICB9Ow0KPiA+Pj4NCj4g
Pj4+ICBzdHJ1Y3Qga3ZtX2RlYnVnX2V4aXRfYXJjaCB7DQo+ID4+PiArCV9fdTMyIGV4Y2VwdGlv
bjsNCj4gPj4+ICsJX191MzIgcGM7DQo+ID4+PiArCV9fdTMyIHN0YXR1czsNCj4gPj4+ICB9Ow0K
PiA+Pg0KPiA+PiBQQyBtdXN0IGJlIDY0LWJpdC4gIFdoYXQgZ29lcyBpbiAic3RhdHVzIiBhbmQg
ImV4Y2VwdGlvbiI/DQoNCnN0YXR1cyAtPiAgZXhpdCBiZWNhdXNlIG9mIGgvdyBicmVha3BvaW50
LCB3YXRjaHBvaW50IChyZWFkLCB3cml0ZSBvciBib3RoKSBhbmQgc29mdHdhcmUgYnJlYWtwb2lu
dC4NCmV4Y2VwdGlvbiAtPiByZXR1cm5zIHRoZSBleGNlcHRpb24gbnVtYmVyLiBJZiB0aGUgZXhp
dCBpcyBub3QgaGFuZGxlZCAoc2F5IG5vdCBoL3cgYnJlYWtwb2ludCBvciBzb2Z0d2FyZSBicmVh
a3BvaW50IHNldCBmb3IgdGhpcyBhZGRyZXNzKSBieSBxZW11IHRoZW4gaXQgaXMgc3VwcG9zZWQg
dG8gaW5qZWN0IHRoZSBleGNlcHRpb24gdG8gZ3Vlc3QuIFRoaXMgaXMgaG93IGl0IGlzIGltcGxl
bWVudGVkIGZvciB4ODYuDQoNCj4gPg0KPiA+IG9rDQo+ID4NCj4gPj4NCj4gPj4+ICAvKiBmb3Ig
S1ZNX1NFVF9HVUVTVF9ERUJVRyAqLw0KPiA+Pj4gIHN0cnVjdCBrdm1fZ3Vlc3RfZGVidWdfYXJj
aCB7DQo+ID4+PiArCXN0cnVjdCB7DQo+ID4+PiArCQlfX3U2NCBhZGRyOw0KPiA+Pj4gKwkJX191
MzIgdHlwZTsNCj4gPj4+ICsJCV9fdTMyIHBhZDE7DQo+ID4+PiArCQlfX3U2NCBwYWQyOw0KPiA+
Pj4gKwl9IGJwWzE2XTsNCj4gPj4+ICB9Ow0KPiA+Pg0KPiA+PiBXaGF0IGdvZXMgaW4gInR5cGUi
Pw0KPiA+DQo+ID4gVHlwZSBkZW5vdGUgYnJlYWtwb2ludCwgcmVhZCB3YXRjaHBvaW50LCB3cml0
ZSB3YXRjaHBvaW50IG9yIHdhdGNocG9pbnQgKGJvdGgNCj4gcmVhZCBhbmQgd3JpdGUpLiBXaWxs
IGFkZGluZyBhIGNvbW1lbnQgdG8gZGVzY3JpYmUgdGhpcyBpcyBvaz8NCj4gDQo+IFllcywgcGxl
YXNlIG1ha2Ugc3VyZSBhbGwgb2YgdGhpcyBpcyB3ZWxsIGRvY3VtZW50ZWQuDQo+IA0KPiA+Pj4g
IC8qIGRlZmluaXRpb24gb2YgcmVnaXN0ZXJzIGluIGt2bV9ydW4gKi8gQEAgLTI4NSw2ICsyOTUs
MTcgQEANCj4gPj4+IHN0cnVjdCBrdm1fc3luY19yZWdzIHsNCj4gPj4+ICAjZGVmaW5lIEtWTV9D
UFVfM1NfNjQJCTQNCj4gPj4+ICAjZGVmaW5lIEtWTV9DUFVfRTUwME1DCQk1DQo+ID4+Pg0KPiA+
Pj4gKy8qIERlYnVnIHJlbGF0ZWQgZGVmaW5lcyAqLw0KPiA+Pj4gKyNkZWZpbmUgS1ZNX0lOU1Rf
R1VFU1RHREIgICAgICAgICAgICAgICAweDdDMDAwMjFDICAgICAgLyogZWhwcml2IE9DPTAgKi8N
Cj4gPj4NCj4gPj4gV2lsbCB0aGlzIHdvcmsgb24gYWxsIFBQQz8NCj4gPj4NCj4gPj4gSXQgY2Vy
dGFpbmx5IHdvbid0IHdvcmsgb24gb3RoZXIgYXJjaGl0ZWN0dXJlcywgc28gYXQgYSBtaW5pbXVt
IGl0J3MNCj4gPj4gS1ZNX1BQQ19JTlNUX0dVRVNUX0dEQiwgYnV0IG1heWJlIGl0IG5lZWRzIHRv
IGJlIGRldGVybWluZWQgYXQgcnVudGltZS4NCj4gPg0KPiA+IEhvdyB0byBkZXRlcm1pbmUgYXQg
cnVuIHRpbWU/IGFkZGluZyBhbm90aGVyIGlvY3RsID8NCj4gDQo+IE9yIGV4dGVuZCBhbiBleGlz
dGluZyBvbmUuICBJcyB0aGVyZSBhbnkgb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgZGVidWcNCj4g
Y2FwYWJpbGl0aWVzIHRoYXQgeW91IGV4cG9zZSAtLSBudW1iZXIgb2YgaGFyZHdhcmUgYnJlYWtw
b2ludHMgc3VwcG9ydGVkLCBldGMNCj4gDQo+ID4+PiArI2RlZmluZSBLVk1fR1VFU1REQkdfVVNF
X1NXX0JQICAgICAgICAgIDB4MDAwMTAwMDANCj4gPj4+ICsjZGVmaW5lIEtWTV9HVUVTVERCR19V
U0VfSFdfQlAgICAgICAgICAgMHgwMDAyMDAwMA0KPiA+Pg0KPiA+PiBXaGVyZSBkbyB0aGVzZSBn
ZXQgdXNlZD8gIEFueSByZWFzb24gZm9yIHRoZXNlIHBhcnRpY3VsYXIgdmFsdWVzPyAgSWYNCj4g
Pj4geW91J3JlIHRyeWluZyB0byBjcmVhdGUgYSBwYXJ0aXRpb24gd2hlcmUgdGhlIHVwcGVyIGhh
bGYgaXMgZ2VuZXJpYw0KPiA+PiBhbmQgdGhlIGxvd2VyIGhhbGYgaXMgYXJjaC1zcGVjaWZpYywg
c2F5IHNvLg0KPiA+DQo+ID4gS1ZNX1NFVF9HVUVTVF9ERUJVRyBpb2N0bCB1c2VkIHRvIHNldC91
bnNldCBkZWJ1ZyBpbnRlcnJ1cHRzLCB3aGljaA0KPiA+IGhhdmUgYSAidTMyIGNvbnRyb2wiIGVs
ZW1lbnQuIFdlIGhhdmUgaW5oZXJpdGVkIHRoaXMgbWVjaGFuaXNtIGZyb20NCj4gPiB4ODYgaW1w
bGVtZW50YXRpb24gYW5kIGl0IGxvb2tzIGxpa2UgbG93ZXIgMTYgYml0cyBhcmUgZ2VuZXJpYyAo
bGlrZQ0KPiA+IEtWTV9HVUVTVERCR19FTkJMRSwgS1ZNX0dVRVNUREJHX1NJTkdMRVNURVAgZXRj
IGFuZCB1cHBlciAxNiBiaXRzIGFyZQ0KPiA+IEFyY2hpdGVjdHVyZSBzcGVjaWZpYy4NCj4gPg0K
PiA+IEkgd2lsbCBhZGQgYSBjb21tZW50IHRvIGRlc2NyaWJlIHRoaXMuDQo+IA0KPiBJIGRvbid0
IHRoaW5rIHRoZSBzdy9odyBkaXN0aW5jdGlvbiBiZWxvbmdzIGhlcmUgLS0gaXQgc2hvdWxkIGJl
IHBlciBicmVha3BvaW50Lg0KDQpLVk0gZG9lcyBub3QgdHJhY2sgdGhlIHNvZnR3YXJlIGJyZWFr
cG9pbnQsIHNvIGl0IGlzIG5vdCBwZXIgYnJlYWtwb2ludC4NCkluIEtWTSwgd2hlbiBLVk1fR1VF
U1REQkdfVVNFX1NXX0JQIGZsYWcgaXMgc2V0IGFuZCBzcGVjaWFsIHRyYXAgaW5zdHJ1Y3Rpb24g
aXMgZXhlY3V0ZWQgYnkgZ3Vlc3QgdGhlbiBleGl0IHRvIHVzZXJzcGFjZS4NCg0KPiANCj4gPj4+
ICsJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9ERUJVRzsNCj4gPj4+ICsJCXJ1bi0+ZGVi
dWcuYXJjaC5wYyA9IHZjcHUtPmFyY2gucGM7DQo+ID4+PiArCQlydW4tPmRlYnVnLmFyY2guZXhj
ZXB0aW9uID0gZXhpdF9ucjsNCj4gPj4+ICsJCXJ1bi0+ZGVidWcuYXJjaC5zdGF0dXMgPSAwOw0K
PiA+Pj4gKwkJa3ZtcHBjX2FjY291bnRfZXhpdCh2Y3B1LCBERUJVR19FWElUUyk7DQo+ID4+PiAr
CQlyZXR1cm4gUkVTVU1FX0hPU1Q7DQo+ID4+DQo+ID4+IFRoZSBpbnRlcmZhY2UgaXNuJ3QgKGNs
ZWFybHkgbGFiZWxsZWQgYXMpIGJvb2tlIHNwZWNpZmljLCBidXQgeW91DQo+ID4+IHJldHVybiBi
b29rZS0gc3BlY2lmaWMgZXhjZXB0aW9uIG51bWJlcnMuICBIb3cncyB1c2Vyc3BhY2Ugc3VwcG9z
ZWQNCj4gPj4gdG8ga25vdyB3aGF0IHRvIGRvIHdpdGggdGhlbT8gIFdoYXQgZG8geW91IHBsYW4g
b24gZG9pbmcgd2l0aCB0aGVtIGluIFFFTVU/DQo+ID4NCj4gPiBUaGlzIGlzIGJvb2tlIHNwZWNp
ZmljLg0KPiANCj4gVGhlbiBwdXQgYm9va2UgaW4gdGhlIG5hbWUsDQoNCldoaWNoIGRhdGEgc3Ry
dWN0dXJlIG5hbWUgc2hvdWxkIGhhdmUgYm9va2U/DQoNCj4gYnV0IHdoYXQgYWJvdXQgaXQgcmVh
bGx5IG5lZWRzIHRvIGJlIGJvb2tlIHNwZWNpZmljPw0KPiBXaHkgZG9lcyBRRU1VIGNhcmUgYWJv
dXQgdGhlIGV4Y2VwdGlvbiB0eXBlPw0KDQpFeHBsYWluZWQgYWJvdmUuDQoNClRoYW5rcw0KLUJo
YXJhdA0KDQo+IA0KPiA+Pj4gKyNpZm5kZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFDQo+ID4+PiAr
CVBQQ19MRChyNywgVkNQVV9IT1NUX0RCRytLVk1QUENfREJHX0lBQzMsIHI0KQ0KPiA+Pj4gKwlQ
UENfTEQocjgsIFZDUFVfSE9TVF9EQkcrS1ZNUFBDX0RCR19JQUM0LCByNCkNCj4gPj4+ICsJbXRz
cHIJU1BSTl9JQUMzLCByNw0KPiA+Pj4gKwltdHNwcglTUFJOX0lBQzQsIHI4DQo+ID4+PiArI2Vu
ZGlmDQo+ID4+DQo+ID4+IENhbiB5b3UgaGFuZGxlIHRoaXMgYXQgcnVudGltZSB3aXRoIGEgZmVh
dHVyZSBzZWN0aW9uPw0KPiA+DQo+ID4gV2h5IHlvdSB3YW50IHRoaXMgdG8gbWFrZSBydW4gdGlt
ZT8gUmVtb3ZpbmcgY29uZmlnXyA/DQo+IA0KPiBDdXJyZW50bHkgS1ZNIGhhcmRjb2RlcyB0aGUg
dGFyZ2V0IGhhcmR3YXJlIGluIGEgd2F5IHRoYXQgaXMgdW5hY2NlcHRhYmxlIGluDQo+IG11Y2gg
b2YgdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbC4gIFdlIGhhdmUgYSBsb25nIHRlcm0gZ29hbCB0byBz
dG9wIGRvaW5nIHRoYXQsDQo+IGFuZCB3ZSBzaG91bGQgYXZvaWQgbWFraW5nIGl0IHdvcnNlIGJ5
IGFkZGluZyByYW5kb20gaWZkZWZzIGZvciBzcGVjaWZpYyBDUFVzLg0KPiANCj4gLVNjb3R0DQoN
Cg=


^ permalink raw reply	[flat|nested] 26+ messages in thread

* RE: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
  2012-07-30 22:00         ` Scott Wood
@ 2012-08-16 15:12           ` Bhushan Bharat-R65777
  -1 siblings, 0 replies; 26+ messages in thread
From: Bhushan Bharat-R65777 @ 2012-08-16 15:12 UTC (permalink / raw)
  To: Wood Scott-B07421; +Cc: kvm-ppc, kvm, agraf



> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Tuesday, July 31, 2012 3:31 AM
> To: Bhushan Bharat-R65777
> Cc: Wood Scott-B07421; kvm-ppc@vger.kernel.org; kvm@vger.kernel.org;
> agraf@suse.de
> Subject: Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
> 
> On 07/30/2012 02:37 AM, Bhushan Bharat-R65777 wrote:
> >
> >
> >> -----Original Message-----
> >> From: Wood Scott-B07421
> >> Sent: Friday, July 27, 2012 7:00 AM
> >> To: Bhushan Bharat-R65777
> >> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org; agraf@suse.de;
> >> Bhushan Bharat-
> >> R65777
> >> Subject: Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug
> >> support
> >>
> >> On 07/26/2012 12:32 AM, Bharat Bhushan wrote:
> >>> This patch adds:
> >>>  1) KVM debug handler added for e500v2.
> >>>  2) Guest debug by qemu gdb stub.
> >>
> >> Does it make sense for these to both be in the same patch?  If
> >> there's common code used by both, that could be added first.
> >
> > ok
> >
> >>
> >>> Signed-off-by: Liu Yu <yu.liu@freescale.com>
> >>> Signed-off-by: Varun Sethi <Varun.Sethi@freescale.com>
> >>> [bharat.bhushan@freescale.com: Substantial changes]
> >>> Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
> >>> ---
> >>>  arch/powerpc/include/asm/kvm.h        |   21 +++++
> >>>  arch/powerpc/include/asm/kvm_host.h   |    7 ++
> >>>  arch/powerpc/include/asm/kvm_ppc.h    |    2 +
> >>>  arch/powerpc/include/asm/reg_booke.h  |    1 +
> >>>  arch/powerpc/kernel/asm-offsets.c     |   31 ++++++-
> >>>  arch/powerpc/kvm/booke.c              |  146 +++++++++++++++++++++++++++---
> >>>  arch/powerpc/kvm/booke_interrupts.S   |  160
> >> ++++++++++++++++++++++++++++++++-
> >>>  arch/powerpc/kvm/bookehv_interrupts.S |  141 ++++++++++++++++++++++++++++-
> >>>  arch/powerpc/kvm/e500mc.c             |    3 +-
> >>>  arch/powerpc/kvm/powerpc.c            |    2 +-
> >>>  10 files changed, 492 insertions(+), 22 deletions(-)
> >>>
> >>> diff --git a/arch/powerpc/include/asm/kvm.h
> >>> b/arch/powerpc/include/asm/kvm.h index 3c14202..da71c84 100644
> >>> --- a/arch/powerpc/include/asm/kvm.h
> >>> +++ b/arch/powerpc/include/asm/kvm.h
> >>> @@ -25,6 +25,7 @@
> >>>  /* Select powerpc specific features in <linux/kvm.h> */  #define
> >>> __KVM_HAVE_SPAPR_TCE  #define __KVM_HAVE_PPC_SMT
> >>> +#define __KVM_HAVE_GUEST_DEBUG
> >>>
> >>>  struct kvm_regs {
> >>>  	__u64 pc;
> >>> @@ -265,10 +266,19 @@ struct kvm_fpu {  };
> >>>
> >>>  struct kvm_debug_exit_arch {
> >>> +	__u32 exception;
> >>> +	__u32 pc;
> >>> +	__u32 status;
> >>>  };
> >>
> >> PC must be 64-bit.  What goes in "status" and "exception"?
> >
> > ok
> >
> >>
> >>>  /* for KVM_SET_GUEST_DEBUG */
> >>>  struct kvm_guest_debug_arch {
> >>> +	struct {
> >>> +		__u64 addr;
> >>> +		__u32 type;
> >>> +		__u32 pad1;
> >>> +		__u64 pad2;
> >>> +	} bp[16];
> >>>  };
> >>
> >> What goes in "type"?
> >
> > Type denote breakpoint, read watchpoint, write watchpoint or watchpoint (both
> read and write). Will adding a comment to describe this is ok?
> 
> Yes, please make sure all of this is well documented.
> 
> >>>  /* definition of registers in kvm_run */ @@ -285,6 +295,17 @@
> >>> struct kvm_sync_regs {
> >>>  #define KVM_CPU_3S_64		4
> >>>  #define KVM_CPU_E500MC		5
> >>>
> >>> +/* Debug related defines */
> >>> +#define KVM_INST_GUESTGDB               0x7C00021C      /* ehpriv OC=0 */
> >>
> >> Will this work on all PPC?
> >>
> >> It certainly won't work on other architectures, so at a minimum it's
> >> KVM_PPC_INST_GUEST_GDB, but maybe it needs to be determined at runtime.
> >
> > How to determine at run time? adding another ioctl ?
> 
> Or extend an existing one.  Is there any other information about debug
> capabilities that you expose -- number of hardware breakpoints supported, etc?
> 
> >>> +#define KVM_GUESTDBG_USE_SW_BP          0x00010000
> >>> +#define KVM_GUESTDBG_USE_HW_BP          0x00020000
> >>
> >> Where do these get used?  Any reason for these particular values?  If
> >> you're trying to create a partition where the upper half is generic
> >> and the lower half is arch-specific, say so.
> >
> > KVM_SET_GUEST_DEBUG ioctl used to set/unset debug interrupts, which
> > have a "u32 control" element. We have inherited this mechanism from
> > x86 implementation and it looks like lower 16 bits are generic (like
> > KVM_GUESTDBG_ENBLE, KVM_GUESTDBG_SINGLESTEP etc and upper 16 bits are
> > Architecture specific.
> >
> > I will add a comment to describe this.
> 
> I don't think the sw/hw distinction belongs here -- it should be per breakpoint.
> 
> >>> +		run->exit_reason = KVM_EXIT_DEBUG;
> >>> +		run->debug.arch.pc = vcpu->arch.pc;
> >>> +		run->debug.arch.exception = exit_nr;
> >>> +		run->debug.arch.status = 0;
> >>> +		kvmppc_account_exit(vcpu, DEBUG_EXITS);
> >>> +		return RESUME_HOST;
> >>
> >> The interface isn't (clearly labelled as) booke specific, but you
> >> return booke- specific exception numbers.  How's userspace supposed
> >> to know what to do with them?  What do you plan on doing with them in QEMU?
> >
> > This is booke specific.
> 
> Then put booke in the name, but what about it really needs to be booke specific?
> Why does QEMU care about the exception type?
> 
> >>> +#ifndef CONFIG_PPC_FSL_BOOK3E
> >>> +	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
> >>> +	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
> >>> +	mtspr	SPRN_IAC3, r7
> >>> +	mtspr	SPRN_IAC4, r8
> >>> +#endif
> >>
> >> Can you handle this at runtime with a feature section?
> >
> > Why you want this to make run time? Removing config_ ?
> 
> Currently KVM hardcodes the target hardware in a way that is unacceptable in
> much of the rest of the kernel.  We have a long term goal to stop doing that,
> and we should avoid making it worse by adding random ifdefs for specific CPUs.

I do not see any CPU_FTR_* which I can use directly. Should I define a new FTR, something like:

#define CPU_FTR_DEBUG_E500  LONG_ASM_CONST(0x4000000000000000)

Use this in: CPU_FTRS_E500_2, CPU_FTRS_E500MC, CPU_FTRS_E5500 etc

BEGIN_FTR_SECTION
	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
	mtspr	SPRN_IAC3, r7
	mtspr	SPRN_IAC4, r8
END_FTR_SECTION_IFCLR(CPU_FTR_DEBUG_E500)

Thanks
-Bharat

> 
> -Scott


^ permalink raw reply	[flat|nested] 26+ messages in thread

* RE: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
@ 2012-08-16 15:12           ` Bhushan Bharat-R65777
  0 siblings, 0 replies; 26+ messages in thread
From: Bhushan Bharat-R65777 @ 2012-08-16 15:12 UTC (permalink / raw)
  To: Wood Scott-B07421; +Cc: kvm-ppc, kvm, agraf

DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogV29vZCBTY290dC1CMDc0
MjENCj4gU2VudDogVHVlc2RheSwgSnVseSAzMSwgMjAxMiAzOjMxIEFNDQo+IFRvOiBCaHVzaGFu
IEJoYXJhdC1SNjU3NzcNCj4gQ2M6IFdvb2QgU2NvdHQtQjA3NDIxOyBrdm0tcHBjQHZnZXIua2Vy
bmVsLm9yZzsga3ZtQHZnZXIua2VybmVsLm9yZzsNCj4gYWdyYWZAc3VzZS5kZQ0KPiBTdWJqZWN0
OiBSZTogW1BBVENIIDIvMl0gS1ZNOiBQUEM6IGJvb2tlL2Jvb2tlaHY6IEFkZCBndWVzdCBkZWJ1
ZyBzdXBwb3J0DQo+IA0KPiBPbiAwNy8zMC8yMDEyIDAyOjM3IEFNLCBCaHVzaGFuIEJoYXJhdC1S
NjU3Nzcgd3JvdGU6DQo+ID4NCj4gPg0KPiA+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0K
PiA+PiBGcm9tOiBXb29kIFNjb3R0LUIwNzQyMQ0KPiA+PiBTZW50OiBGcmlkYXksIEp1bHkgMjcs
IDIwMTIgNzowMCBBTQ0KPiA+PiBUbzogQmh1c2hhbiBCaGFyYXQtUjY1Nzc3DQo+ID4+IENjOiBr
dm0tcHBjQHZnZXIua2VybmVsLm9yZzsga3ZtQHZnZXIua2VybmVsLm9yZzsgYWdyYWZAc3VzZS5k
ZTsNCj4gPj4gQmh1c2hhbiBCaGFyYXQtDQo+ID4+IFI2NTc3Nw0KPiA+PiBTdWJqZWN0OiBSZTog
W1BBVENIIDIvMl0gS1ZNOiBQUEM6IGJvb2tlL2Jvb2tlaHY6IEFkZCBndWVzdCBkZWJ1Zw0KPiA+
PiBzdXBwb3J0DQo+ID4+DQo+ID4+IE9uIDA3LzI2LzIwMTIgMTI6MzIgQU0sIEJoYXJhdCBCaHVz
aGFuIHdyb3RlOg0KPiA+Pj4gVGhpcyBwYXRjaCBhZGRzOg0KPiA+Pj4gIDEpIEtWTSBkZWJ1ZyBo
YW5kbGVyIGFkZGVkIGZvciBlNTAwdjIuDQo+ID4+PiAgMikgR3Vlc3QgZGVidWcgYnkgcWVtdSBn
ZGIgc3R1Yi4NCj4gPj4NCj4gPj4gRG9lcyBpdCBtYWtlIHNlbnNlIGZvciB0aGVzZSB0byBib3Ro
IGJlIGluIHRoZSBzYW1lIHBhdGNoPyAgSWYNCj4gPj4gdGhlcmUncyBjb21tb24gY29kZSB1c2Vk
IGJ5IGJvdGgsIHRoYXQgY291bGQgYmUgYWRkZWQgZmlyc3QuDQo+ID4NCj4gPiBvaw0KPiA+DQo+
ID4+DQo+ID4+PiBTaWduZWQtb2ZmLWJ5OiBMaXUgWXUgPHl1LmxpdUBmcmVlc2NhbGUuY29tPg0K
PiA+Pj4gU2lnbmVkLW9mZi1ieTogVmFydW4gU2V0aGkgPFZhcnVuLlNldGhpQGZyZWVzY2FsZS5j
b20+DQo+ID4+PiBbYmhhcmF0LmJodXNoYW5AZnJlZXNjYWxlLmNvbTogU3Vic3RhbnRpYWwgY2hh
bmdlc10NCj4gPj4+IFNpZ25lZC1vZmYtYnk6IEJoYXJhdCBCaHVzaGFuIDxiaGFyYXQuYmh1c2hh
bkBmcmVlc2NhbGUuY29tPg0KPiA+Pj4gLS0tDQo+ID4+PiAgYXJjaC9wb3dlcnBjL2luY2x1ZGUv
YXNtL2t2bS5oICAgICAgICB8ICAgMjEgKysrKysNCj4gPj4+ICBhcmNoL3Bvd2VycGMvaW5jbHVk
ZS9hc20va3ZtX2hvc3QuaCAgIHwgICAgNyArKw0KPiA+Pj4gIGFyY2gvcG93ZXJwYy9pbmNsdWRl
L2FzbS9rdm1fcHBjLmggICAgfCAgICAyICsNCj4gPj4+ICBhcmNoL3Bvd2VycGMvaW5jbHVkZS9h
c20vcmVnX2Jvb2tlLmggIHwgICAgMSArDQo+ID4+PiAgYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20t
b2Zmc2V0cy5jICAgICB8ICAgMzEgKysrKysrLQ0KPiA+Pj4gIGFyY2gvcG93ZXJwYy9rdm0vYm9v
a2UuYyAgICAgICAgICAgICAgfCAgMTQ2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLQ0K
PiA+Pj4gIGFyY2gvcG93ZXJwYy9rdm0vYm9va2VfaW50ZXJydXB0cy5TICAgfCAgMTYwDQo+ID4+
ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQ0KPiA+Pj4gIGFyY2gvcG93ZXJwYy9r
dm0vYm9va2Vodl9pbnRlcnJ1cHRzLlMgfCAgMTQxICsrKysrKysrKysrKysrKysrKysrKysrKysr
KystDQo+ID4+PiAgYXJjaC9wb3dlcnBjL2t2bS9lNTAwbWMuYyAgICAgICAgICAgICB8ICAgIDMg
Ky0NCj4gPj4+ICBhcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYyAgICAgICAgICAgIHwgICAgMiAr
LQ0KPiA+Pj4gIDEwIGZpbGVzIGNoYW5nZWQsIDQ5MiBpbnNlcnRpb25zKCspLCAyMiBkZWxldGlv
bnMoLSkNCj4gPj4+DQo+ID4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNt
L2t2bS5oDQo+ID4+PiBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm0uaCBpbmRleCAzYzE0
MjAyLi5kYTcxYzg0IDEwMDY0NA0KPiA+Pj4gLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNt
L2t2bS5oDQo+ID4+PiArKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtLmgNCj4gPj4+
IEBAIC0yNSw2ICsyNSw3IEBADQo+ID4+PiAgLyogU2VsZWN0IHBvd2VycGMgc3BlY2lmaWMgZmVh
dHVyZXMgaW4gPGxpbnV4L2t2bS5oPiAqLyAgI2RlZmluZQ0KPiA+Pj4gX19LVk1fSEFWRV9TUEFQ
Ul9UQ0UgICNkZWZpbmUgX19LVk1fSEFWRV9QUENfU01UDQo+ID4+PiArI2RlZmluZSBfX0tWTV9I
QVZFX0dVRVNUX0RFQlVHDQo+ID4+Pg0KPiA+Pj4gIHN0cnVjdCBrdm1fcmVncyB7DQo+ID4+PiAg
CV9fdTY0IHBjOw0KPiA+Pj4gQEAgLTI2NSwxMCArMjY2LDE5IEBAIHN0cnVjdCBrdm1fZnB1IHsg
IH07DQo+ID4+Pg0KPiA+Pj4gIHN0cnVjdCBrdm1fZGVidWdfZXhpdF9hcmNoIHsNCj4gPj4+ICsJ
X191MzIgZXhjZXB0aW9uOw0KPiA+Pj4gKwlfX3UzMiBwYzsNCj4gPj4+ICsJX191MzIgc3RhdHVz
Ow0KPiA+Pj4gIH07DQo+ID4+DQo+ID4+IFBDIG11c3QgYmUgNjQtYml0LiAgV2hhdCBnb2VzIGlu
ICJzdGF0dXMiIGFuZCAiZXhjZXB0aW9uIj8NCj4gPg0KPiA+IG9rDQo+ID4NCj4gPj4NCj4gPj4+
ICAvKiBmb3IgS1ZNX1NFVF9HVUVTVF9ERUJVRyAqLw0KPiA+Pj4gIHN0cnVjdCBrdm1fZ3Vlc3Rf
ZGVidWdfYXJjaCB7DQo+ID4+PiArCXN0cnVjdCB7DQo+ID4+PiArCQlfX3U2NCBhZGRyOw0KPiA+
Pj4gKwkJX191MzIgdHlwZTsNCj4gPj4+ICsJCV9fdTMyIHBhZDE7DQo+ID4+PiArCQlfX3U2NCBw
YWQyOw0KPiA+Pj4gKwl9IGJwWzE2XTsNCj4gPj4+ICB9Ow0KPiA+Pg0KPiA+PiBXaGF0IGdvZXMg
aW4gInR5cGUiPw0KPiA+DQo+ID4gVHlwZSBkZW5vdGUgYnJlYWtwb2ludCwgcmVhZCB3YXRjaHBv
aW50LCB3cml0ZSB3YXRjaHBvaW50IG9yIHdhdGNocG9pbnQgKGJvdGgNCj4gcmVhZCBhbmQgd3Jp
dGUpLiBXaWxsIGFkZGluZyBhIGNvbW1lbnQgdG8gZGVzY3JpYmUgdGhpcyBpcyBvaz8NCj4gDQo+
IFllcywgcGxlYXNlIG1ha2Ugc3VyZSBhbGwgb2YgdGhpcyBpcyB3ZWxsIGRvY3VtZW50ZWQuDQo+
IA0KPiA+Pj4gIC8qIGRlZmluaXRpb24gb2YgcmVnaXN0ZXJzIGluIGt2bV9ydW4gKi8gQEAgLTI4
NSw2ICsyOTUsMTcgQEANCj4gPj4+IHN0cnVjdCBrdm1fc3luY19yZWdzIHsNCj4gPj4+ICAjZGVm
aW5lIEtWTV9DUFVfM1NfNjQJCTQNCj4gPj4+ICAjZGVmaW5lIEtWTV9DUFVfRTUwME1DCQk1DQo+
ID4+Pg0KPiA+Pj4gKy8qIERlYnVnIHJlbGF0ZWQgZGVmaW5lcyAqLw0KPiA+Pj4gKyNkZWZpbmUg
S1ZNX0lOU1RfR1VFU1RHREIgICAgICAgICAgICAgICAweDdDMDAwMjFDICAgICAgLyogZWhwcml2
IE9DPTAgKi8NCj4gPj4NCj4gPj4gV2lsbCB0aGlzIHdvcmsgb24gYWxsIFBQQz8NCj4gPj4NCj4g
Pj4gSXQgY2VydGFpbmx5IHdvbid0IHdvcmsgb24gb3RoZXIgYXJjaGl0ZWN0dXJlcywgc28gYXQg
YSBtaW5pbXVtIGl0J3MNCj4gPj4gS1ZNX1BQQ19JTlNUX0dVRVNUX0dEQiwgYnV0IG1heWJlIGl0
IG5lZWRzIHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZS4NCj4gPg0KPiA+IEhvdyB0byBkZXRl
cm1pbmUgYXQgcnVuIHRpbWU/IGFkZGluZyBhbm90aGVyIGlvY3RsID8NCj4gDQo+IE9yIGV4dGVu
ZCBhbiBleGlzdGluZyBvbmUuICBJcyB0aGVyZSBhbnkgb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQg
ZGVidWcNCj4gY2FwYWJpbGl0aWVzIHRoYXQgeW91IGV4cG9zZSAtLSBudW1iZXIgb2YgaGFyZHdh
cmUgYnJlYWtwb2ludHMgc3VwcG9ydGVkLCBldGM/DQo+IA0KPiA+Pj4gKyNkZWZpbmUgS1ZNX0dV
RVNUREJHX1VTRV9TV19CUCAgICAgICAgICAweDAwMDEwMDAwDQo+ID4+PiArI2RlZmluZSBLVk1f
R1VFU1REQkdfVVNFX0hXX0JQICAgICAgICAgIDB4MDAwMjAwMDANCj4gPj4NCj4gPj4gV2hlcmUg
ZG8gdGhlc2UgZ2V0IHVzZWQ/ICBBbnkgcmVhc29uIGZvciB0aGVzZSBwYXJ0aWN1bGFyIHZhbHVl
cz8gIElmDQo+ID4+IHlvdSdyZSB0cnlpbmcgdG8gY3JlYXRlIGEgcGFydGl0aW9uIHdoZXJlIHRo
ZSB1cHBlciBoYWxmIGlzIGdlbmVyaWMNCj4gPj4gYW5kIHRoZSBsb3dlciBoYWxmIGlzIGFyY2gt
c3BlY2lmaWMsIHNheSBzby4NCj4gPg0KPiA+IEtWTV9TRVRfR1VFU1RfREVCVUcgaW9jdGwgdXNl
ZCB0byBzZXQvdW5zZXQgZGVidWcgaW50ZXJydXB0cywgd2hpY2gNCj4gPiBoYXZlIGEgInUzMiBj
b250cm9sIiBlbGVtZW50LiBXZSBoYXZlIGluaGVyaXRlZCB0aGlzIG1lY2hhbmlzbSBmcm9tDQo+
ID4geDg2IGltcGxlbWVudGF0aW9uIGFuZCBpdCBsb29rcyBsaWtlIGxvd2VyIDE2IGJpdHMgYXJl
IGdlbmVyaWMgKGxpa2UNCj4gPiBLVk1fR1VFU1REQkdfRU5CTEUsIEtWTV9HVUVTVERCR19TSU5H
TEVTVEVQIGV0YyBhbmQgdXBwZXIgMTYgYml0cyBhcmUNCj4gPiBBcmNoaXRlY3R1cmUgc3BlY2lm
aWMuDQo+ID4NCj4gPiBJIHdpbGwgYWRkIGEgY29tbWVudCB0byBkZXNjcmliZSB0aGlzLg0KPiAN
Cj4gSSBkb24ndCB0aGluayB0aGUgc3cvaHcgZGlzdGluY3Rpb24gYmVsb25ncyBoZXJlIC0tIGl0
IHNob3VsZCBiZSBwZXIgYnJlYWtwb2ludC4NCj4gDQo+ID4+PiArCQlydW4tPmV4aXRfcmVhc29u
ID0gS1ZNX0VYSVRfREVCVUc7DQo+ID4+PiArCQlydW4tPmRlYnVnLmFyY2gucGMgPSB2Y3B1LT5h
cmNoLnBjOw0KPiA+Pj4gKwkJcnVuLT5kZWJ1Zy5hcmNoLmV4Y2VwdGlvbiA9IGV4aXRfbnI7DQo+
ID4+PiArCQlydW4tPmRlYnVnLmFyY2guc3RhdHVzID0gMDsNCj4gPj4+ICsJCWt2bXBwY19hY2Nv
dW50X2V4aXQodmNwdSwgREVCVUdfRVhJVFMpOw0KPiA+Pj4gKwkJcmV0dXJuIFJFU1VNRV9IT1NU
Ow0KPiA+Pg0KPiA+PiBUaGUgaW50ZXJmYWNlIGlzbid0IChjbGVhcmx5IGxhYmVsbGVkIGFzKSBi
b29rZSBzcGVjaWZpYywgYnV0IHlvdQ0KPiA+PiByZXR1cm4gYm9va2UtIHNwZWNpZmljIGV4Y2Vw
dGlvbiBudW1iZXJzLiAgSG93J3MgdXNlcnNwYWNlIHN1cHBvc2VkDQo+ID4+IHRvIGtub3cgd2hh
dCB0byBkbyB3aXRoIHRoZW0/ICBXaGF0IGRvIHlvdSBwbGFuIG9uIGRvaW5nIHdpdGggdGhlbSBp
biBRRU1VPw0KPiA+DQo+ID4gVGhpcyBpcyBib29rZSBzcGVjaWZpYy4NCj4gDQo+IFRoZW4gcHV0
IGJvb2tlIGluIHRoZSBuYW1lLCBidXQgd2hhdCBhYm91dCBpdCByZWFsbHkgbmVlZHMgdG8gYmUg
Ym9va2Ugc3BlY2lmaWM/DQo+IFdoeSBkb2VzIFFFTVUgY2FyZSBhYm91dCB0aGUgZXhjZXB0aW9u
IHR5cGU/DQo+IA0KPiA+Pj4gKyNpZm5kZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFDQo+ID4+PiAr
CVBQQ19MRChyNywgVkNQVV9IT1NUX0RCRytLVk1QUENfREJHX0lBQzMsIHI0KQ0KPiA+Pj4gKwlQ
UENfTEQocjgsIFZDUFVfSE9TVF9EQkcrS1ZNUFBDX0RCR19JQUM0LCByNCkNCj4gPj4+ICsJbXRz
cHIJU1BSTl9JQUMzLCByNw0KPiA+Pj4gKwltdHNwcglTUFJOX0lBQzQsIHI4DQo+ID4+PiArI2Vu
ZGlmDQo+ID4+DQo+ID4+IENhbiB5b3UgaGFuZGxlIHRoaXMgYXQgcnVudGltZSB3aXRoIGEgZmVh
dHVyZSBzZWN0aW9uPw0KPiA+DQo+ID4gV2h5IHlvdSB3YW50IHRoaXMgdG8gbWFrZSBydW4gdGlt
ZT8gUmVtb3ZpbmcgY29uZmlnXyA/DQo+IA0KPiBDdXJyZW50bHkgS1ZNIGhhcmRjb2RlcyB0aGUg
dGFyZ2V0IGhhcmR3YXJlIGluIGEgd2F5IHRoYXQgaXMgdW5hY2NlcHRhYmxlIGluDQo+IG11Y2gg
b2YgdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbC4gIFdlIGhhdmUgYSBsb25nIHRlcm0gZ29hbCB0byBz
dG9wIGRvaW5nIHRoYXQsDQo+IGFuZCB3ZSBzaG91bGQgYXZvaWQgbWFraW5nIGl0IHdvcnNlIGJ5
IGFkZGluZyByYW5kb20gaWZkZWZzIGZvciBzcGVjaWZpYyBDUFVzLg0KDQpJIGRvIG5vdCBzZWUg
YW55IENQVV9GVFJfKiB3aGljaCBJIGNhbiB1c2UgZGlyZWN0bHkuIFNob3VsZCBJIGRlZmluZSBh
IG5ldyBGVFIsIHNvbWV0aGluZyBsaWtlOg0KDQojZGVmaW5lIENQVV9GVFJfREVCVUdfRTUwMCAg
TE9OR19BU01fQ09OU1QoMHg0MDAwMDAwMDAwMDAwMDAwKQ0KDQpVc2UgdGhpcyBpbjogQ1BVX0ZU
UlNfRTUwMF8yLCBDUFVfRlRSU19FNTAwTUMsIENQVV9GVFJTX0U1NTAwIGV0Yw0KDQpCRUdJTl9G
VFJfU0VDVElPTg0KCVBQQ19MRChyNywgVkNQVV9IT1NUX0RCRytLVk1QUENfREJHX0lBQzMsIHI0
KQ0KCVBQQ19MRChyOCwgVkNQVV9IT1NUX0RCRytLVk1QUENfREJHX0lBQzQsIHI0KQ0KCW10c3By
CVNQUk5fSUFDMywgcjcNCgltdHNwcglTUFJOX0lBQzQsIHI4DQpFTkRfRlRSX1NFQ1RJT05fSUZD
TFIoQ1BVX0ZUUl9ERUJVR19FNTAwKQ0KDQpUaGFua3MNCi1CaGFyYXQNCg0KPiANCj4gLVNjb3R0
DQoNCg=


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
  2012-08-16  8:48           ` Bhushan Bharat-R65777
@ 2012-08-20 23:53             ` Scott Wood
  -1 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-08-20 23:53 UTC (permalink / raw)
  To: Bhushan Bharat-R65777; +Cc: Wood Scott-B07421, kvm-ppc, kvm, agraf

On 08/16/2012 03:48 AM, Bhushan Bharat-R65777 wrote:
>>>>> diff --git a/arch/powerpc/include/asm/kvm.h
>>>>> b/arch/powerpc/include/asm/kvm.h index 3c14202..da71c84 100644
>>>>> --- a/arch/powerpc/include/asm/kvm.h
>>>>> +++ b/arch/powerpc/include/asm/kvm.h
>>>>> @@ -25,6 +25,7 @@
>>>>>  /* Select powerpc specific features in <linux/kvm.h> */  #define
>>>>> __KVM_HAVE_SPAPR_TCE  #define __KVM_HAVE_PPC_SMT
>>>>> +#define __KVM_HAVE_GUEST_DEBUG
>>>>>
>>>>>  struct kvm_regs {
>>>>>  	__u64 pc;
>>>>> @@ -265,10 +266,19 @@ struct kvm_fpu {  };
>>>>>
>>>>>  struct kvm_debug_exit_arch {
>>>>> +	__u32 exception;
>>>>> +	__u32 pc;
>>>>> +	__u32 status;
>>>>>  };
>>>>
>>>> PC must be 64-bit.  What goes in "status" and "exception"?
> 
> status ->  exit because of h/w breakpoint, watchpoint (read, write or
> both) and software breakpoint.
>
> exception -> returns the exception number. If the exit is not handled
> (say not h/w breakpoint or software breakpoint set for this address)
> by qemu then it is supposed to inject the exception to guest. This is
> how it is implemented for x86.

Where is this documented (including the specific values that are possible)?

>>>>> +#define KVM_GUESTDBG_USE_SW_BP          0x00010000
>>>>> +#define KVM_GUESTDBG_USE_HW_BP          0x00020000
>>>>
>>>> Where do these get used?  Any reason for these particular values?  If
>>>> you're trying to create a partition where the upper half is generic
>>>> and the lower half is arch-specific, say so.
>>>
>>> KVM_SET_GUEST_DEBUG ioctl used to set/unset debug interrupts, which
>>> have a "u32 control" element. We have inherited this mechanism from
>>> x86 implementation and it looks like lower 16 bits are generic (like
>>> KVM_GUESTDBG_ENBLE, KVM_GUESTDBG_SINGLESTEP etc and upper 16 bits are
>>> Architecture specific.
>>>
>>> I will add a comment to describe this.
>>
>> I don't think the sw/hw distinction belongs here -- it should be per breakpoint.
> 
> KVM does not track the software breakpoint, so it is not per breakpoint.
> In KVM, when KVM_GUESTDBG_USE_SW_BP flag is set and special trap instruction is executed by guest then exit to userspace.

Can both types of breakpoint be set at the same time?

>>>>> +		run->exit_reason = KVM_EXIT_DEBUG;
>>>>> +		run->debug.arch.pc = vcpu->arch.pc;
>>>>> +		run->debug.arch.exception = exit_nr;
>>>>> +		run->debug.arch.status = 0;
>>>>> +		kvmppc_account_exit(vcpu, DEBUG_EXITS);
>>>>> +		return RESUME_HOST;
>>>>
>>>> The interface isn't (clearly labelled as) booke specific, but you
>>>> return booke- specific exception numbers.  How's userspace supposed
>>>> to know what to do with them?  What do you plan on doing with them in QEMU?
>>>
>>> This is booke specific.
>>
>> Then put booke in the name,
> 
> Which data structure name should have booke?

Anything that's booke specific.

-Scott

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
@ 2012-08-20 23:53             ` Scott Wood
  0 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-08-20 23:53 UTC (permalink / raw)
  To: Bhushan Bharat-R65777; +Cc: Wood Scott-B07421, kvm-ppc, kvm, agraf

On 08/16/2012 03:48 AM, Bhushan Bharat-R65777 wrote:
>>>>> diff --git a/arch/powerpc/include/asm/kvm.h
>>>>> b/arch/powerpc/include/asm/kvm.h index 3c14202..da71c84 100644
>>>>> --- a/arch/powerpc/include/asm/kvm.h
>>>>> +++ b/arch/powerpc/include/asm/kvm.h
>>>>> @@ -25,6 +25,7 @@
>>>>>  /* Select powerpc specific features in <linux/kvm.h> */  #define
>>>>> __KVM_HAVE_SPAPR_TCE  #define __KVM_HAVE_PPC_SMT
>>>>> +#define __KVM_HAVE_GUEST_DEBUG
>>>>>
>>>>>  struct kvm_regs {
>>>>>  	__u64 pc;
>>>>> @@ -265,10 +266,19 @@ struct kvm_fpu {  };
>>>>>
>>>>>  struct kvm_debug_exit_arch {
>>>>> +	__u32 exception;
>>>>> +	__u32 pc;
>>>>> +	__u32 status;
>>>>>  };
>>>>
>>>> PC must be 64-bit.  What goes in "status" and "exception"?
> 
> status ->  exit because of h/w breakpoint, watchpoint (read, write or
> both) and software breakpoint.
>
> exception -> returns the exception number. If the exit is not handled
> (say not h/w breakpoint or software breakpoint set for this address)
> by qemu then it is supposed to inject the exception to guest. This is
> how it is implemented for x86.

Where is this documented (including the specific values that are possible)?

>>>>> +#define KVM_GUESTDBG_USE_SW_BP          0x00010000
>>>>> +#define KVM_GUESTDBG_USE_HW_BP          0x00020000
>>>>
>>>> Where do these get used?  Any reason for these particular values?  If
>>>> you're trying to create a partition where the upper half is generic
>>>> and the lower half is arch-specific, say so.
>>>
>>> KVM_SET_GUEST_DEBUG ioctl used to set/unset debug interrupts, which
>>> have a "u32 control" element. We have inherited this mechanism from
>>> x86 implementation and it looks like lower 16 bits are generic (like
>>> KVM_GUESTDBG_ENBLE, KVM_GUESTDBG_SINGLESTEP etc and upper 16 bits are
>>> Architecture specific.
>>>
>>> I will add a comment to describe this.
>>
>> I don't think the sw/hw distinction belongs here -- it should be per breakpoint.
> 
> KVM does not track the software breakpoint, so it is not per breakpoint.
> In KVM, when KVM_GUESTDBG_USE_SW_BP flag is set and special trap instruction is executed by guest then exit to userspace.

Can both types of breakpoint be set at the same time?

>>>>> +		run->exit_reason = KVM_EXIT_DEBUG;
>>>>> +		run->debug.arch.pc = vcpu->arch.pc;
>>>>> +		run->debug.arch.exception = exit_nr;
>>>>> +		run->debug.arch.status = 0;
>>>>> +		kvmppc_account_exit(vcpu, DEBUG_EXITS);
>>>>> +		return RESUME_HOST;
>>>>
>>>> The interface isn't (clearly labelled as) booke specific, but you
>>>> return booke- specific exception numbers.  How's userspace supposed
>>>> to know what to do with them?  What do you plan on doing with them in QEMU?
>>>
>>> This is booke specific.
>>
>> Then put booke in the name,
> 
> Which data structure name should have booke?

Anything that's booke specific.

-Scott



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
  2012-08-16 15:12           ` Bhushan Bharat-R65777
@ 2012-08-20 23:55             ` Scott Wood
  -1 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-08-20 23:55 UTC (permalink / raw)
  To: Bhushan Bharat-R65777; +Cc: Wood Scott-B07421, kvm-ppc, kvm, agraf

On 08/16/2012 10:12 AM, Bhushan Bharat-R65777 wrote:
> 
> 
>> -----Original Message-----
>> From: Wood Scott-B07421
>> Sent: Tuesday, July 31, 2012 3:31 AM
>> To: Bhushan Bharat-R65777
>> Cc: Wood Scott-B07421; kvm-ppc@vger.kernel.org; kvm@vger.kernel.org;
>> agraf@suse.de
>> Subject: Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
>>
>> On 07/30/2012 02:37 AM, Bhushan Bharat-R65777 wrote:
>>>
>>>
>>>> -----Original Message-----
>>>> From: Wood Scott-B07421
>>>> Sent: Friday, July 27, 2012 7:00 AM
>>>> To: Bhushan Bharat-R65777
>>>> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org; agraf@suse.de;
>>>> Bhushan Bharat-
>>>> R65777
>>>> Subject: Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug
>>>> support
>>>>
>>>>> +#ifndef CONFIG_PPC_FSL_BOOK3E
>>>>> +	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
>>>>> +	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
>>>>> +	mtspr	SPRN_IAC3, r7
>>>>> +	mtspr	SPRN_IAC4, r8
>>>>> +#endif
>>>>
>>>> Can you handle this at runtime with a feature section?
>>>
>>> Why you want this to make run time? Removing config_ ?
>>
>> Currently KVM hardcodes the target hardware in a way that is unacceptable in
>> much of the rest of the kernel.  We have a long term goal to stop doing that,
>> and we should avoid making it worse by adding random ifdefs for specific CPUs.
> 
> I do not see any CPU_FTR_* which I can use directly. Should I define a new FTR, something like:
> 
> #define CPU_FTR_DEBUG_E500  LONG_ASM_CONST(0x4000000000000000)
> 
> Use this in: CPU_FTRS_E500_2, CPU_FTRS_E500MC, CPU_FTRS_E5500 etc
> 
> BEGIN_FTR_SECTION
> 	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
> 	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
> 	mtspr	SPRN_IAC3, r7
> 	mtspr	SPRN_IAC4, r8
> END_FTR_SECTION_IFCLR(CPU_FTR_DEBUG_E500)

It looks like other parts of the kernel use CONFIG_PPC_ADV_DEBUG_IACS
for this, though ideally it would be made runtime in the future.

-Scott

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
@ 2012-08-20 23:55             ` Scott Wood
  0 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2012-08-20 23:55 UTC (permalink / raw)
  To: Bhushan Bharat-R65777; +Cc: Wood Scott-B07421, kvm-ppc, kvm, agraf

On 08/16/2012 10:12 AM, Bhushan Bharat-R65777 wrote:
> 
> 
>> -----Original Message-----
>> From: Wood Scott-B07421
>> Sent: Tuesday, July 31, 2012 3:31 AM
>> To: Bhushan Bharat-R65777
>> Cc: Wood Scott-B07421; kvm-ppc@vger.kernel.org; kvm@vger.kernel.org;
>> agraf@suse.de
>> Subject: Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support
>>
>> On 07/30/2012 02:37 AM, Bhushan Bharat-R65777 wrote:
>>>
>>>
>>>> -----Original Message-----
>>>> From: Wood Scott-B07421
>>>> Sent: Friday, July 27, 2012 7:00 AM
>>>> To: Bhushan Bharat-R65777
>>>> Cc: kvm-ppc@vger.kernel.org; kvm@vger.kernel.org; agraf@suse.de;
>>>> Bhushan Bharat-
>>>> R65777
>>>> Subject: Re: [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug
>>>> support
>>>>
>>>>> +#ifndef CONFIG_PPC_FSL_BOOK3E
>>>>> +	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
>>>>> +	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
>>>>> +	mtspr	SPRN_IAC3, r7
>>>>> +	mtspr	SPRN_IAC4, r8
>>>>> +#endif
>>>>
>>>> Can you handle this at runtime with a feature section?
>>>
>>> Why you want this to make run time? Removing config_ ?
>>
>> Currently KVM hardcodes the target hardware in a way that is unacceptable in
>> much of the rest of the kernel.  We have a long term goal to stop doing that,
>> and we should avoid making it worse by adding random ifdefs for specific CPUs.
> 
> I do not see any CPU_FTR_* which I can use directly. Should I define a new FTR, something like:
> 
> #define CPU_FTR_DEBUG_E500  LONG_ASM_CONST(0x4000000000000000)
> 
> Use this in: CPU_FTRS_E500_2, CPU_FTRS_E500MC, CPU_FTRS_E5500 etc
> 
> BEGIN_FTR_SECTION
> 	PPC_LD(r7, VCPU_HOST_DBG+KVMPPC_DBG_IAC3, r4)
> 	PPC_LD(r8, VCPU_HOST_DBG+KVMPPC_DBG_IAC4, r4)
> 	mtspr	SPRN_IAC3, r7
> 	mtspr	SPRN_IAC4, r8
> END_FTR_SECTION_IFCLR(CPU_FTR_DEBUG_E500)

It looks like other parts of the kernel use CONFIG_PPC_ADV_DEBUG_IACS
for this, though ideally it would be made runtime in the future.

-Scott



^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2012-08-20 23:55 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-26  5:32 [PATCH 1/2] KVM: PPC: booke: Allow multiple exception types Bharat Bhushan
2012-07-26  5:44 ` Bharat Bhushan
2012-07-26  5:32 ` [PATCH 2/2] KVM: PPC: booke/bookehv: Add guest debug support Bharat Bhushan
2012-07-26  5:44   ` Bharat Bhushan
2012-07-27  1:29   ` Scott Wood
2012-07-27  1:29     ` Scott Wood
2012-07-30  7:37     ` Bhushan Bharat-R65777
2012-07-30  7:37       ` Bhushan Bharat-R65777
2012-07-30 22:00       ` Scott Wood
2012-07-30 22:00         ` Scott Wood
2012-08-16  8:48         ` Bhushan Bharat-R65777
2012-08-16  8:48           ` Bhushan Bharat-R65777
2012-08-20 23:53           ` Scott Wood
2012-08-20 23:53             ` Scott Wood
2012-08-16 15:12         ` Bhushan Bharat-R65777
2012-08-16 15:12           ` Bhushan Bharat-R65777
2012-08-20 23:55           ` Scott Wood
2012-08-20 23:55             ` Scott Wood
2012-07-26 23:01 ` [PATCH 1/2] KVM: PPC: booke: Allow multiple exception types Scott Wood
2012-07-26 23:01   ` Scott Wood
2012-07-30 11:11 Bharat Bhushan
2012-07-30 11:23 ` Bharat Bhushan
2012-07-30 11:11 ` [PATCH 2/2] KVM: PPC: booke: Added debug handler Bharat Bhushan
2012-07-30 11:23   ` Bharat Bhushan
2012-07-31  0:55   ` Scott Wood
2012-07-31  0:55     ` Scott Wood

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.