diff options
author | Mark Johnston <markj@FreeBSD.org> | 2024-02-07 13:46:59 +0000 |
---|---|---|
committer | Mark Johnston <markj@FreeBSD.org> | 2024-02-07 13:46:59 +0000 |
commit | e6516294f4c7afa9da40a39caab86a5cd2aeb35a (patch) | |
tree | 1dd9d76d33ff80b5ffb011c6369b32b1f485e4d5 /usr.sbin | |
parent | f1e8d3361b944a46f514c7d44330a5f2c0b62a1c (diff) | |
download | src-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.c | 30 |
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, ®val) == + -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 */ |