From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39042) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WzSeY-0007y3-Ja for qemu-devel@nongnu.org; Tue, 24 Jun 2014 11:29:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WzSeG-0005ip-8y for qemu-devel@nongnu.org; Tue, 24 Jun 2014 11:28:58 -0400 Received: from e28smtp05.in.ibm.com ([122.248.162.5]:40097) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WzSeF-0005iO-Lj for qemu-devel@nongnu.org; Tue, 24 Jun 2014 11:28:40 -0400 Received: from /spool/local by e28smtp05.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 24 Jun 2014 20:58:34 +0530 Message-ID: <53A9991E.5080204@linux.vnet.ibm.com> Date: Tue, 24 Jun 2014 20:58:30 +0530 From: Madhavan Srinivasan MIME-Version: 1.0 References: <1403611807-7082-1-git-send-email-Bharat.Bhushan@freescale.com> <1403611807-7082-5-git-send-email-Bharat.Bhushan@freescale.com> In-Reply-To: <1403611807-7082-5-git-send-email-Bharat.Bhushan@freescale.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 4/5 v3][RESEND] ppc: Add software breakpoint support List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Bharat Bhushan , agraf@suse.de Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org On Tuesday 24 June 2014 05:40 PM, Bharat Bhushan wrote: > This patch allow insert/remove software breakpoint > > Signed-off-by: Bharat Bhushan > --- > target-ppc/kvm.c | 71 +++++++++++++++++++++++++++++++++++++++++++++----------- > 1 file changed, 57 insertions(+), 14 deletions(-) > > diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c > index 5238de7..8e2dbb3 100644 > --- a/target-ppc/kvm.c > +++ b/target-ppc/kvm.c > @@ -1317,6 +1317,53 @@ static int kvmppc_handle_dcr_write(CPUPPCState *env, uint32_t dcrn, uint32_t dat > return 0; > } > > +int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp) > +{ > + /* Mixed endian case is not handled */ > + uint32_t sc = debug_inst_opcode; > + > + if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 0) || > + cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&sc, 4, 1)) { Instead of hard coding, can we use sizeof ()? > + return -EINVAL; > + } > + > + return 0; > +} > + > +int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp) > +{ > + uint32_t sc; > + > + if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&sc, 4, 0) || > + sc != debug_inst_opcode || > + cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 1)) { > + return -EINVAL; > + } > + Same. Can we use sizeof? > + return 0; > +} > + > +void kvm_arch_update_guest_debug(CPUState *cs, struct kvm_guest_debug *dbg) > +{ > + /* Software Breakpoint updates */ > + if (kvm_sw_breakpoints_active(cs)) { > + dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP; > + } > +} > + > +static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run) > +{ > + CPUState *cs = CPU(cpu); > + struct kvm_debug_exit_arch *arch_info = &run->debug.arch; > + int handle = 0; > + > + if (kvm_find_sw_breakpoint(cs, arch_info->address)) { > + handle = 1; > + } > + > + return handle; > +} > + > int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run) > { > PowerPCCPU *cpu = POWERPC_CPU(cs); > @@ -1357,6 +1404,16 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run) > ret = 0; > break; > > + case KVM_EXIT_DEBUG: > + DPRINTF("handle debug exception\n"); > + if (kvm_handle_debug(cpu, run)) { > + ret = EXCP_DEBUG; > + break; > + } > + /* re-enter, this exception was guest-internal */ Kindly can you explain when this will happen? > + ret = 0; > + break; > + > default: > fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason); > ret = -1; > @@ -2044,16 +2101,6 @@ void kvm_arch_init_irq_routing(KVMState *s) > { > } > > -int kvm_arch_insert_sw_breakpoint(CPUState *cpu, struct kvm_sw_breakpoint *bp) > -{ > - return -EINVAL; > -} > - > -int kvm_arch_remove_sw_breakpoint(CPUState *cpu, struct kvm_sw_breakpoint *bp) > -{ > - return -EINVAL; > -} > - > int kvm_arch_insert_hw_breakpoint(target_ulong addr, target_ulong len, int type) > { > return -EINVAL; > @@ -2068,10 +2115,6 @@ void kvm_arch_remove_all_hw_breakpoints(void) > { > } > > -void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg) > -{ > -} > - > struct kvm_get_htab_buf { > struct kvm_get_htab_header header; > /* >