Message ID | 1404989882-17362-6-git-send-email-Bharat.Bhushan@freescale.com |
---|---|
State | New |
Headers | show |
On 10.07.14 12:58, Bharat Bhushan wrote: > This patch allow insert/remove software breakpoint > > Signed-off-by: Bharat Bhushan <Bharat.Bhushan@freescale.com> > --- > v5->v6 > - No change > > target-ppc/kvm.c | 73 +++++++++++++++++++++++++++++++++++++++++++++----------- > 1 file changed, 59 insertions(+), 14 deletions(-) > > diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c > index d1239b4..c4a1fa5 100644 > --- a/target-ppc/kvm.c > +++ b/target-ppc/kvm.c > @@ -1320,6 +1320,55 @@ 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, > + sizeof(sc), 0) || > + cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&sc, sizeof(sc), 1)) { > + 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, sizeof(sc), 0) || > + sc != debug_inst_opcode || > + cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, > + sizeof(sc), 1)) { > + return -EINVAL; > + } > + > + 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); > @@ -1360,6 +1409,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 */ > + ret = 0; Where do we inject the program interrupt into our guest here? Alex
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c index d1239b4..c4a1fa5 100644 --- a/target-ppc/kvm.c +++ b/target-ppc/kvm.c @@ -1320,6 +1320,55 @@ 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, + sizeof(sc), 0) || + cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&sc, sizeof(sc), 1)) { + 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, sizeof(sc), 0) || + sc != debug_inst_opcode || + cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, + sizeof(sc), 1)) { + return -EINVAL; + } + + 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); @@ -1360,6 +1409,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 */ + ret = 0; + break; + default: fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason); ret = -1; @@ -2048,16 +2107,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; @@ -2072,10 +2121,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; /*
This patch allow insert/remove software breakpoint Signed-off-by: Bharat Bhushan <Bharat.Bhushan@freescale.com> --- v5->v6 - No change target-ppc/kvm.c | 73 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 14 deletions(-)