Browse Source
As HW virtualization requires specific support to handle breakpoints lets push out special casing out of the core gdbstub code and into AccelOpsClass. This will make it easier to add other accelerator support and reduces some of the stub shenanigans. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Mads Ynddal <mads@ynddal.dk> Message-Id: <20220929114231.583801-45-alex.bennee@linaro.org>pull/224/head
14 changed files with 259 additions and 160 deletions
@ -0,0 +1,16 @@ |
|||
/*
|
|||
* gdbstub internals |
|||
* |
|||
* Copyright (c) 2022 Linaro Ltd |
|||
* |
|||
* SPDX-License-Identifier: GPL-2.0-or-later |
|||
*/ |
|||
|
|||
#ifndef _INTERNALS_H_ |
|||
#define _INTERNALS_H_ |
|||
|
|||
int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len); |
|||
int gdb_breakpoint_remove(CPUState *cs, int type, hwaddr addr, hwaddr len); |
|||
void gdb_breakpoint_remove_all(CPUState *cs); |
|||
|
|||
#endif /* _INTERNALS_H_ */ |
|||
@ -1 +1,9 @@ |
|||
# |
|||
# The main gdbstub still relies on per-build definitions of various |
|||
# types. The bits pushed to softmmu/user.c try to use guest agnostic |
|||
# types such as hwaddr. |
|||
# |
|||
|
|||
specific_ss.add(files('gdbstub.c')) |
|||
softmmu_ss.add(files('softmmu.c')) |
|||
user_ss.add(files('user.c')) |
|||
|
|||
@ -0,0 +1,42 @@ |
|||
/*
|
|||
* gdb server stub - softmmu specific bits |
|||
* |
|||
* Debug integration depends on support from the individual |
|||
* accelerators so most of this involves calling the ops helpers. |
|||
* |
|||
* Copyright (c) 2022 Linaro Ltd |
|||
* |
|||
* SPDX-License-Identifier: GPL-2.0-or-later |
|||
*/ |
|||
|
|||
#include "qemu/osdep.h" |
|||
#include "exec/gdbstub.h" |
|||
#include "exec/hwaddr.h" |
|||
#include "sysemu/cpus.h" |
|||
#include "internals.h" |
|||
|
|||
int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len) |
|||
{ |
|||
const AccelOpsClass *ops = cpus_get_accel(); |
|||
if (ops->insert_breakpoint) { |
|||
return ops->insert_breakpoint(cs, type, addr, len); |
|||
} |
|||
return -ENOSYS; |
|||
} |
|||
|
|||
int gdb_breakpoint_remove(CPUState *cs, int type, hwaddr addr, hwaddr len) |
|||
{ |
|||
const AccelOpsClass *ops = cpus_get_accel(); |
|||
if (ops->remove_breakpoint) { |
|||
return ops->remove_breakpoint(cs, type, addr, len); |
|||
} |
|||
return -ENOSYS; |
|||
} |
|||
|
|||
void gdb_breakpoint_remove_all(CPUState *cs) |
|||
{ |
|||
const AccelOpsClass *ops = cpus_get_accel(); |
|||
if (ops->remove_all_breakpoints) { |
|||
ops->remove_all_breakpoints(cs); |
|||
} |
|||
} |
|||
@ -0,0 +1,62 @@ |
|||
/*
|
|||
* gdbstub user-mode helper routines. |
|||
* |
|||
* We know for user-mode we are using TCG so we can call stuff directly. |
|||
* |
|||
* Copyright (c) 2022 Linaro Ltd |
|||
* |
|||
* SPDX-License-Identifier: GPL-2.0-or-later |
|||
*/ |
|||
|
|||
#include "qemu/osdep.h" |
|||
#include "exec/hwaddr.h" |
|||
#include "exec/gdbstub.h" |
|||
#include "hw/core/cpu.h" |
|||
#include "internals.h" |
|||
|
|||
int gdb_breakpoint_insert(CPUState *cs, int type, hwaddr addr, hwaddr len) |
|||
{ |
|||
CPUState *cpu; |
|||
int err = 0; |
|||
|
|||
switch (type) { |
|||
case GDB_BREAKPOINT_SW: |
|||
case GDB_BREAKPOINT_HW: |
|||
CPU_FOREACH(cpu) { |
|||
err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL); |
|||
if (err) { |
|||
break; |
|||
} |
|||
} |
|||
return err; |
|||
default: |
|||
/* user-mode doesn't support watchpoints */ |
|||
return -ENOSYS; |
|||
} |
|||
} |
|||
|
|||
int gdb_breakpoint_remove(CPUState *cs, int type, hwaddr addr, hwaddr len) |
|||
{ |
|||
CPUState *cpu; |
|||
int err = 0; |
|||
|
|||
switch (type) { |
|||
case GDB_BREAKPOINT_SW: |
|||
case GDB_BREAKPOINT_HW: |
|||
CPU_FOREACH(cpu) { |
|||
err = cpu_breakpoint_remove(cpu, addr, BP_GDB); |
|||
if (err) { |
|||
break; |
|||
} |
|||
} |
|||
return err; |
|||
default: |
|||
/* user-mode doesn't support watchpoints */ |
|||
return -ENOSYS; |
|||
} |
|||
} |
|||
|
|||
void gdb_breakpoint_remove_all(CPUState *cs) |
|||
{ |
|||
cpu_breakpoint_remove_all(cs, BP_GDB); |
|||
} |
|||
Loading…
Reference in new issue