aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2024-02-07 13:46:59 +0000
committerMark Johnston <markj@FreeBSD.org>2024-02-07 13:46:59 +0000
commite6516294f4c7afa9da40a39caab86a5cd2aeb35a (patch)
tree1dd9d76d33ff80b5ffb011c6369b32b1f485e4d5 /usr.sbin
parentf1e8d3361b944a46f514c7d44330a5f2c0b62a1c (diff)
downloadsrc-e6516294f4c7afa9da40a39caab86a5cd2aeb35a.tar.gz
src-e6516294f4c7afa9da40a39caab86a5cd2aeb35a.zip
bhyve: Add support for the 'p' query
This lets gdb query individual registers. It's easy to implement and is used by gdb when attaching to a CHERI target, so let's support it. Sponsored by: Innovate UK Reviewed by: corvink, jhb MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D43664
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/bhyve/gdb.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/usr.sbin/bhyve/gdb.c b/usr.sbin/bhyve/gdb.c
index 4f427b1a0863..84e725f9085e 100644
--- a/usr.sbin/bhyve/gdb.c
+++ b/usr.sbin/bhyve/gdb.c
@@ -1036,6 +1036,29 @@ gdb_read_regs(void)
}
static void
+gdb_read_one_reg(const uint8_t *data, size_t len)
+{
+ uint64_t regval;
+ uintmax_t reg;
+
+ reg = parse_integer(data, len);
+ if (reg >= nitems(gdb_regset)) {
+ send_error(EINVAL);
+ return;
+ }
+
+ if (vm_get_register(vcpus[cur_vcpu], gdb_regset[reg].id, &regval) ==
+ -1) {
+ send_error(errno);
+ return;
+ }
+
+ start_packet();
+ append_unsigned_native(regval, gdb_regset[reg].size);
+ finish_packet();
+}
+
+static void
gdb_read_mem(const uint8_t *data, size_t len)
{
uint64_t gpa, gva, val;
@@ -1597,10 +1620,12 @@ handle_command(const uint8_t *data, size_t len)
/* TODO: Resume any stopped CPUs. */
break;
- case 'g': {
+ case 'g':
gdb_read_regs();
break;
- }
+ case 'p':
+ gdb_read_one_reg(data + 1, len - 1);
+ break;
case 'H': {
int tid;
@@ -1672,7 +1697,6 @@ handle_command(const uint8_t *data, size_t len)
case 'v':
/* Handle 'vCont' */
/* 'vCtrlC' */
- case 'p': /* TODO */
case 'P': /* TODO */
case 'Q': /* TODO */
case 't': /* TODO */