Message ID | 20190228225759.21328-4-farosas@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/ppc: single step for KVM HV | expand |
On Thu, Feb 28, 2019 at 07:57:57PM -0300, Fabiano Rosas wrote: > This is in preparation for a refactoring of the kvm_handle_debug > function in the next patch. > > Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com> Nice cleanup regardless of anything else. Applied to ppc-for-4.0. > --- > target/ppc/kvm.c | 47 ++++++++++++++++++++++++++++------------------- > 1 file changed, 28 insertions(+), 19 deletions(-) > > diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c > index d01852fe31..941c4e7523 100644 > --- a/target/ppc/kvm.c > +++ b/target/ppc/kvm.c > @@ -1593,35 +1593,44 @@ void kvm_arch_update_guest_debug(CPUState *cs, struct kvm_guest_debug *dbg) > } > } > > +static int kvm_handle_hw_breakpoint(CPUState *cs, > + struct kvm_debug_exit_arch *arch_info) > +{ > + int handle = 0; > + int n; > + int flag = 0; > + > + if (nb_hw_breakpoint + nb_hw_watchpoint > 0) { > + if (arch_info->status & KVMPPC_DEBUG_BREAKPOINT) { > + n = find_hw_breakpoint(arch_info->address, GDB_BREAKPOINT_HW); > + if (n >= 0) { > + handle = 1; > + } > + } else if (arch_info->status & (KVMPPC_DEBUG_WATCH_READ | > + KVMPPC_DEBUG_WATCH_WRITE)) { > + n = find_hw_watchpoint(arch_info->address, &flag); > + if (n >= 0) { > + handle = 1; > + cs->watchpoint_hit = &hw_watchpoint; > + hw_watchpoint.vaddr = hw_debug_points[n].addr; > + hw_watchpoint.flags = flag; > + } > + } > + } > + return handle; > +} > + > static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run) > { > CPUState *cs = CPU(cpu); > CPUPPCState *env = &cpu->env; > struct kvm_debug_exit_arch *arch_info = &run->debug.arch; > int handle = 0; > - int n; > - int flag = 0; > > if (cs->singlestep_enabled) { > handle = 1; > } else if (arch_info->status) { > - if (nb_hw_breakpoint + nb_hw_watchpoint > 0) { > - if (arch_info->status & KVMPPC_DEBUG_BREAKPOINT) { > - n = find_hw_breakpoint(arch_info->address, GDB_BREAKPOINT_HW); > - if (n >= 0) { > - handle = 1; > - } > - } else if (arch_info->status & (KVMPPC_DEBUG_WATCH_READ | > - KVMPPC_DEBUG_WATCH_WRITE)) { > - n = find_hw_watchpoint(arch_info->address, &flag); > - if (n >= 0) { > - handle = 1; > - cs->watchpoint_hit = &hw_watchpoint; > - hw_watchpoint.vaddr = hw_debug_points[n].addr; > - hw_watchpoint.flags = flag; > - } > - } > - } > + handle = kvm_handle_hw_breakpoint(cs, arch_info); > } else if (kvm_find_sw_breakpoint(cs, arch_info->address)) { > handle = 1; > } else {
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index d01852fe31..941c4e7523 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -1593,35 +1593,44 @@ void kvm_arch_update_guest_debug(CPUState *cs, struct kvm_guest_debug *dbg) } } +static int kvm_handle_hw_breakpoint(CPUState *cs, + struct kvm_debug_exit_arch *arch_info) +{ + int handle = 0; + int n; + int flag = 0; + + if (nb_hw_breakpoint + nb_hw_watchpoint > 0) { + if (arch_info->status & KVMPPC_DEBUG_BREAKPOINT) { + n = find_hw_breakpoint(arch_info->address, GDB_BREAKPOINT_HW); + if (n >= 0) { + handle = 1; + } + } else if (arch_info->status & (KVMPPC_DEBUG_WATCH_READ | + KVMPPC_DEBUG_WATCH_WRITE)) { + n = find_hw_watchpoint(arch_info->address, &flag); + if (n >= 0) { + handle = 1; + cs->watchpoint_hit = &hw_watchpoint; + hw_watchpoint.vaddr = hw_debug_points[n].addr; + hw_watchpoint.flags = flag; + } + } + } + return handle; +} + static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run) { CPUState *cs = CPU(cpu); CPUPPCState *env = &cpu->env; struct kvm_debug_exit_arch *arch_info = &run->debug.arch; int handle = 0; - int n; - int flag = 0; if (cs->singlestep_enabled) { handle = 1; } else if (arch_info->status) { - if (nb_hw_breakpoint + nb_hw_watchpoint > 0) { - if (arch_info->status & KVMPPC_DEBUG_BREAKPOINT) { - n = find_hw_breakpoint(arch_info->address, GDB_BREAKPOINT_HW); - if (n >= 0) { - handle = 1; - } - } else if (arch_info->status & (KVMPPC_DEBUG_WATCH_READ | - KVMPPC_DEBUG_WATCH_WRITE)) { - n = find_hw_watchpoint(arch_info->address, &flag); - if (n >= 0) { - handle = 1; - cs->watchpoint_hit = &hw_watchpoint; - hw_watchpoint.vaddr = hw_debug_points[n].addr; - hw_watchpoint.flags = flag; - } - } - } + handle = kvm_handle_hw_breakpoint(cs, arch_info); } else if (kvm_find_sw_breakpoint(cs, arch_info->address)) { handle = 1; } else {
This is in preparation for a refactoring of the kvm_handle_debug function in the next patch. Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com> --- target/ppc/kvm.c | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-)