mirror of
https://github.com/qemu/qemu.git
synced 2025-08-14 11:43:46 +00:00
target/ppc: Move handling of hardware breakpoints to a separate function
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> Message-Id: <20190228225759.21328-4-farosas@linux.ibm.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
2586a4d7a0
commit
2cbd158131
@ -1597,35 +1597,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)
|
static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run)
|
||||||
{
|
{
|
||||||
CPUState *cs = CPU(cpu);
|
CPUState *cs = CPU(cpu);
|
||||||
CPUPPCState *env = &cpu->env;
|
CPUPPCState *env = &cpu->env;
|
||||||
struct kvm_debug_exit_arch *arch_info = &run->debug.arch;
|
struct kvm_debug_exit_arch *arch_info = &run->debug.arch;
|
||||||
int handle = 0;
|
int handle = 0;
|
||||||
int n;
|
|
||||||
int flag = 0;
|
|
||||||
|
|
||||||
if (cs->singlestep_enabled) {
|
if (cs->singlestep_enabled) {
|
||||||
handle = 1;
|
handle = 1;
|
||||||
} else if (arch_info->status) {
|
} else if (arch_info->status) {
|
||||||
if (nb_hw_breakpoint + nb_hw_watchpoint > 0) {
|
handle = kvm_handle_hw_breakpoint(cs, arch_info);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (kvm_find_sw_breakpoint(cs, arch_info->address)) {
|
} else if (kvm_find_sw_breakpoint(cs, arch_info->address)) {
|
||||||
handle = 1;
|
handle = 1;
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user