Re: [PATCH 7/8] KVM: PPC: booke/bookehv: Add debug stub support
On 01.02.2013, at 07:31, Bhushan Bharat-R65777 wrote: > > >> -Original Message- >> From: Alexander Graf [mailto:ag...@suse.de] >> Sent: Friday, January 25, 2013 5:37 PM >> To: Bhushan Bharat-R65777 >> Cc: kvm-ppc@vger.kernel.org; k...@vger.kernel.org; Bhushan Bharat-R65777 >> Subject: Re: [PATCH 7/8] KVM: PPC: booke/bookehv: Add debug stub support >> >> >> On 16.01.2013, at 09:24, Bharat Bhushan wrote: >> >>> This patch adds the debug stub support on booke/bookehv. >>> Now QEMU debug stub can use hw breakpoint, watchpoint and software >>> breakpoint to debug guest. >>> >>> Signed-off-by: Bharat Bhushan >>> --- >>> arch/powerpc/include/asm/kvm_host.h |5 + >>> arch/powerpc/include/asm/kvm_ppc.h|2 + >>> arch/powerpc/include/uapi/asm/kvm.h | 22 - >>> arch/powerpc/kernel/asm-offsets.c | 26 ++ >>> arch/powerpc/kvm/booke.c | 124 + >>> arch/powerpc/kvm/booke_interrupts.S | 114 ++ >>> arch/powerpc/kvm/bookehv_interrupts.S | 145 >>> - >>> arch/powerpc/kvm/e500_emulate.c |6 ++ >>> arch/powerpc/kvm/e500mc.c |3 +- >>> 9 files changed, 422 insertions(+), 25 deletions(-) >>> >>> diff --git a/arch/powerpc/include/asm/kvm_host.h >>> b/arch/powerpc/include/asm/kvm_host.h >>> index f4ba881..a9feeb0 100644 >>> --- a/arch/powerpc/include/asm/kvm_host.h >>> +++ b/arch/powerpc/include/asm/kvm_host.h >>> @@ -504,7 +504,12 @@ struct kvm_vcpu_arch { >>> u32 mmucfg; >>> u32 epr; >>> u32 crit_save; >>> + /* guest debug registers*/ >>> struct kvmppc_booke_debug_reg dbg_reg; >>> + /* shadow debug registers */ >>> + struct kvmppc_booke_debug_reg shadow_dbg_reg; >>> + /* host debug registers*/ >>> + struct kvmppc_booke_debug_reg host_dbg_reg; >>> #endif >>> gpa_t paddr_accessed; >>> gva_t vaddr_accessed; >>> diff --git a/arch/powerpc/include/asm/kvm_ppc.h >>> b/arch/powerpc/include/asm/kvm_ppc.h >>> index b3c481e..e4b3398 100644 >>> --- a/arch/powerpc/include/asm/kvm_ppc.h >>> +++ b/arch/powerpc/include/asm/kvm_ppc.h >>> @@ -45,6 +45,8 @@ enum emulation_result { >>> EMULATE_FAIL, /* can't emulate this instruction */ >>> EMULATE_AGAIN,/* something went wrong. go again */ >>> EMULATE_DO_PAPR, /* kvm_run filled with PAPR request */ >>> + EMULATE_DEBUG_INST, /* debug instruction for software >>> +breakpoint, exit to userspace */ >> >> Does this do something different from DO_PAPR? Maybe it makes sense to have >> an >> exit code EMULATE_EXIT_USER? > > I think EMULATE_DO_PAPR does something similar but the name is confusing. May > be we can rename EMULATE_DO_PAPR to > EMULATE_EXIT_USER. Yeah, please check that it actually does the right thing still for PAPR exits then :). Alex -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH 7/8] KVM: PPC: booke/bookehv: Add debug stub support
> -Original Message- > From: Alexander Graf [mailto:ag...@suse.de] > Sent: Friday, January 25, 2013 5:37 PM > To: Bhushan Bharat-R65777 > Cc: kvm-ppc@vger.kernel.org; k...@vger.kernel.org; Bhushan Bharat-R65777 > Subject: Re: [PATCH 7/8] KVM: PPC: booke/bookehv: Add debug stub support > > > On 16.01.2013, at 09:24, Bharat Bhushan wrote: > > > This patch adds the debug stub support on booke/bookehv. > > Now QEMU debug stub can use hw breakpoint, watchpoint and software > > breakpoint to debug guest. > > > > Signed-off-by: Bharat Bhushan > > --- > > arch/powerpc/include/asm/kvm_host.h |5 + > > arch/powerpc/include/asm/kvm_ppc.h|2 + > > arch/powerpc/include/uapi/asm/kvm.h | 22 - > > arch/powerpc/kernel/asm-offsets.c | 26 ++ > > arch/powerpc/kvm/booke.c | 124 + > > arch/powerpc/kvm/booke_interrupts.S | 114 ++ > > arch/powerpc/kvm/bookehv_interrupts.S | 145 > > - > > arch/powerpc/kvm/e500_emulate.c |6 ++ > > arch/powerpc/kvm/e500mc.c |3 +- > > 9 files changed, 422 insertions(+), 25 deletions(-) > > > > diff --git a/arch/powerpc/include/asm/kvm_host.h > > b/arch/powerpc/include/asm/kvm_host.h > > index f4ba881..a9feeb0 100644 > > --- a/arch/powerpc/include/asm/kvm_host.h > > +++ b/arch/powerpc/include/asm/kvm_host.h > > @@ -504,7 +504,12 @@ struct kvm_vcpu_arch { > > u32 mmucfg; > > u32 epr; > > u32 crit_save; > > + /* guest debug registers*/ > > struct kvmppc_booke_debug_reg dbg_reg; > > + /* shadow debug registers */ > > + struct kvmppc_booke_debug_reg shadow_dbg_reg; > > + /* host debug registers*/ > > + struct kvmppc_booke_debug_reg host_dbg_reg; > > #endif > > gpa_t paddr_accessed; > > gva_t vaddr_accessed; > > diff --git a/arch/powerpc/include/asm/kvm_ppc.h > > b/arch/powerpc/include/asm/kvm_ppc.h > > index b3c481e..e4b3398 100644 > > --- a/arch/powerpc/include/asm/kvm_ppc.h > > +++ b/arch/powerpc/include/asm/kvm_ppc.h > > @@ -45,6 +45,8 @@ enum emulation_result { > > EMULATE_FAIL, /* can't emulate this instruction */ > > EMULATE_AGAIN,/* something went wrong. go again */ > > EMULATE_DO_PAPR, /* kvm_run filled with PAPR request */ > > + EMULATE_DEBUG_INST, /* debug instruction for software > > +breakpoint, exit to userspace */ > > Does this do something different from DO_PAPR? Maybe it makes sense to have an > exit code EMULATE_EXIT_USER? I think EMULATE_DO_PAPR does something similar but the name is confusing. May be we can rename EMULATE_DO_PAPR to EMULATE_EXIT_USER. Thanks -Bharat > > > }; > > > > extern int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu > > *vcpu); diff --git a/arch/powerpc/include/uapi/asm/kvm.h > > b/arch/powerpc/include/uapi/asm/kvm.h > > index e8842ed..a81ab29 100644 > > --- a/arch/powerpc/include/uapi/asm/kvm.h > > +++ b/arch/powerpc/include/uapi/asm/kvm.h > > @@ -25,6 +25,7 @@ > > /* Select powerpc specific features in */ #define > > __KVM_HAVE_SPAPR_TCE #define __KVM_HAVE_PPC_SMT > > +#define __KVM_HAVE_GUEST_DEBUG > > > > struct kvm_regs { > > __u64 pc; > > @@ -267,7 +268,24 @@ struct kvm_fpu { > > __u64 fpr[32]; > > }; > > > > +/* > > + * Defines for h/w breakpoint, watchpoint (read, write or both) and > > + * software breakpoint. > > + * These are used as "type" in KVM_SET_GUEST_DEBUG ioctl and "status" > > + * for KVM_DEBUG_EXIT. > > + */ > > +#define KVMPPC_DEBUG_NONE 0x0 > > +#define KVMPPC_DEBUG_BREAKPOINT(1UL << 1) > > +#define KVMPPC_DEBUG_WATCH_WRITE (1UL << 2) > > +#define KVMPPC_DEBUG_WATCH_READ(1UL << 3) > > struct kvm_debug_exit_arch { > > + __u64 address; > > + /* > > +* exiting to userspace because of h/w breakpoint, watchpoint > > +* (read, write or both) and software breakpoint. > > +*/ > > + __u32 status; > > + __u32 reserved; > > }; > > > > /* for KVM_SET_GUEST_DEBUG */ > > @@ -279,10 +297,6 @@ struct kvm_guest_debug_arch { > > * Type denotes h/w breakpoint, read watchpoint, write > > * watchpoint or watchpoint (both read and write). > > */ > > -#define KVMPPC_DEBUG_NOTYPE0x0 > > -#define KVMPPC_DEBUG_BREAKPOINT
Re: [PATCH 7/8] KVM: PPC: booke/bookehv: Add debug stub support
On 16.01.2013, at 09:24, Bharat Bhushan wrote: > This patch adds the debug stub support on booke/bookehv. > Now QEMU debug stub can use hw breakpoint, watchpoint and > software breakpoint to debug guest. > > Signed-off-by: Bharat Bhushan > --- > arch/powerpc/include/asm/kvm_host.h |5 + > arch/powerpc/include/asm/kvm_ppc.h|2 + > arch/powerpc/include/uapi/asm/kvm.h | 22 - > arch/powerpc/kernel/asm-offsets.c | 26 ++ > arch/powerpc/kvm/booke.c | 124 + > arch/powerpc/kvm/booke_interrupts.S | 114 ++ > arch/powerpc/kvm/bookehv_interrupts.S | 145 - > arch/powerpc/kvm/e500_emulate.c |6 ++ > arch/powerpc/kvm/e500mc.c |3 +- > 9 files changed, 422 insertions(+), 25 deletions(-) > > diff --git a/arch/powerpc/include/asm/kvm_host.h > b/arch/powerpc/include/asm/kvm_host.h > index f4ba881..a9feeb0 100644 > --- a/arch/powerpc/include/asm/kvm_host.h > +++ b/arch/powerpc/include/asm/kvm_host.h > @@ -504,7 +504,12 @@ struct kvm_vcpu_arch { > u32 mmucfg; > u32 epr; > u32 crit_save; > + /* guest debug registers*/ > struct kvmppc_booke_debug_reg dbg_reg; > + /* shadow debug registers */ > + struct kvmppc_booke_debug_reg shadow_dbg_reg; > + /* host debug registers*/ > + struct kvmppc_booke_debug_reg host_dbg_reg; > #endif > gpa_t paddr_accessed; > gva_t vaddr_accessed; > diff --git a/arch/powerpc/include/asm/kvm_ppc.h > b/arch/powerpc/include/asm/kvm_ppc.h > index b3c481e..e4b3398 100644 > --- a/arch/powerpc/include/asm/kvm_ppc.h > +++ b/arch/powerpc/include/asm/kvm_ppc.h > @@ -45,6 +45,8 @@ enum emulation_result { > EMULATE_FAIL, /* can't emulate this instruction */ > EMULATE_AGAIN,/* something went wrong. go again */ > EMULATE_DO_PAPR, /* kvm_run filled with PAPR request */ > + EMULATE_DEBUG_INST, /* debug instruction for software > + breakpoint, exit to userspace */ Does this do something different from DO_PAPR? Maybe it makes sense to have an exit code EMULATE_EXIT_USER? > }; > > extern int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu); > diff --git a/arch/powerpc/include/uapi/asm/kvm.h > b/arch/powerpc/include/uapi/asm/kvm.h > index e8842ed..a81ab29 100644 > --- a/arch/powerpc/include/uapi/asm/kvm.h > +++ b/arch/powerpc/include/uapi/asm/kvm.h > @@ -25,6 +25,7 @@ > /* Select powerpc specific features in */ > #define __KVM_HAVE_SPAPR_TCE > #define __KVM_HAVE_PPC_SMT > +#define __KVM_HAVE_GUEST_DEBUG > > struct kvm_regs { > __u64 pc; > @@ -267,7 +268,24 @@ struct kvm_fpu { > __u64 fpr[32]; > }; > > +/* > + * Defines for h/w breakpoint, watchpoint (read, write or both) and > + * software breakpoint. > + * These are used as "type" in KVM_SET_GUEST_DEBUG ioctl and "status" > + * for KVM_DEBUG_EXIT. > + */ > +#define KVMPPC_DEBUG_NONE0x0 > +#define KVMPPC_DEBUG_BREAKPOINT (1UL << 1) > +#define KVMPPC_DEBUG_WATCH_WRITE (1UL << 2) > +#define KVMPPC_DEBUG_WATCH_READ (1UL << 3) > struct kvm_debug_exit_arch { > + __u64 address; > + /* > + * exiting to userspace because of h/w breakpoint, watchpoint > + * (read, write or both) and software breakpoint. > + */ > + __u32 status; > + __u32 reserved; > }; > > /* for KVM_SET_GUEST_DEBUG */ > @@ -279,10 +297,6 @@ struct kvm_guest_debug_arch { >* Type denotes h/w breakpoint, read watchpoint, write >* watchpoint or watchpoint (both read and write). >*/ > -#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) > __u32 type; > __u32 reserved; > } bp[16]; > diff --git a/arch/powerpc/kernel/asm-offsets.c > b/arch/powerpc/kernel/asm-offsets.c > index 02048f3..22deda7 100644 > --- a/arch/powerpc/kernel/asm-offsets.c > +++ b/arch/powerpc/kernel/asm-offsets.c > @@ -563,6 +563,32 @@ int main(void) > 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)); > + 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, > +
[PATCH 7/8] KVM: PPC: booke/bookehv: Add debug stub support
This patch adds the debug stub support on booke/bookehv. Now QEMU debug stub can use hw breakpoint, watchpoint and software breakpoint to debug guest. Signed-off-by: Bharat Bhushan --- arch/powerpc/include/asm/kvm_host.h |5 + arch/powerpc/include/asm/kvm_ppc.h|2 + arch/powerpc/include/uapi/asm/kvm.h | 22 - arch/powerpc/kernel/asm-offsets.c | 26 ++ arch/powerpc/kvm/booke.c | 124 + arch/powerpc/kvm/booke_interrupts.S | 114 ++ arch/powerpc/kvm/bookehv_interrupts.S | 145 - arch/powerpc/kvm/e500_emulate.c |6 ++ arch/powerpc/kvm/e500mc.c |3 +- 9 files changed, 422 insertions(+), 25 deletions(-) diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index f4ba881..a9feeb0 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -504,7 +504,12 @@ struct kvm_vcpu_arch { u32 mmucfg; u32 epr; u32 crit_save; + /* guest debug registers*/ struct kvmppc_booke_debug_reg dbg_reg; + /* shadow debug registers */ + struct kvmppc_booke_debug_reg shadow_dbg_reg; + /* host debug registers*/ + struct kvmppc_booke_debug_reg host_dbg_reg; #endif gpa_t paddr_accessed; gva_t vaddr_accessed; diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index b3c481e..e4b3398 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h @@ -45,6 +45,8 @@ enum emulation_result { EMULATE_FAIL, /* can't emulate this instruction */ EMULATE_AGAIN,/* something went wrong. go again */ EMULATE_DO_PAPR, /* kvm_run filled with PAPR request */ + EMULATE_DEBUG_INST, /* debug instruction for software +breakpoint, exit to userspace */ }; extern int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu); diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h index e8842ed..a81ab29 100644 --- a/arch/powerpc/include/uapi/asm/kvm.h +++ b/arch/powerpc/include/uapi/asm/kvm.h @@ -25,6 +25,7 @@ /* Select powerpc specific features in */ #define __KVM_HAVE_SPAPR_TCE #define __KVM_HAVE_PPC_SMT +#define __KVM_HAVE_GUEST_DEBUG struct kvm_regs { __u64 pc; @@ -267,7 +268,24 @@ struct kvm_fpu { __u64 fpr[32]; }; +/* + * Defines for h/w breakpoint, watchpoint (read, write or both) and + * software breakpoint. + * These are used as "type" in KVM_SET_GUEST_DEBUG ioctl and "status" + * for KVM_DEBUG_EXIT. + */ +#define KVMPPC_DEBUG_NONE 0x0 +#define KVMPPC_DEBUG_BREAKPOINT(1UL << 1) +#define KVMPPC_DEBUG_WATCH_WRITE (1UL << 2) +#define KVMPPC_DEBUG_WATCH_READ(1UL << 3) struct kvm_debug_exit_arch { + __u64 address; + /* +* exiting to userspace because of h/w breakpoint, watchpoint +* (read, write or both) and software breakpoint. +*/ + __u32 status; + __u32 reserved; }; /* for KVM_SET_GUEST_DEBUG */ @@ -279,10 +297,6 @@ struct kvm_guest_debug_arch { * Type denotes h/w breakpoint, read watchpoint, write * watchpoint or watchpoint (both read and write). */ -#define KVMPPC_DEBUG_NOTYPE0x0 -#define KVMPPC_DEBUG_BREAKPOINT(1UL << 1) -#define KVMPPC_DEBUG_WATCH_WRITE (1UL << 2) -#define KVMPPC_DEBUG_WATCH_READ(1UL << 3) __u32 type; __u32 reserved; } bp[16]; diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 02048f3..22deda7 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c @@ -563,6 +563,32 @@ int main(void) 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)); + 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, +