diff options
author | John Baldwin <jhb@FreeBSD.org> | 2021-07-13 08:16:12 -0700 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2021-07-13 08:16:12 -0700 |
commit | 5a680bf9f2c89df9d192a1f5c6b02022babf7793 (patch) | |
tree | 7ba49463c926ae37fe0301b358bbe14e76d37b7a /gdb/fbsd-nat.c | |
parent | 30a696c543419bb9cadb844f9d2e2d6ecc66d3b5 (diff) | |
download | fsf-binutils-gdb-5a680bf9f2c89df9d192a1f5c6b02022babf7793.zip fsf-binutils-gdb-5a680bf9f2c89df9d192a1f5c6b02022babf7793.tar.gz fsf-binutils-gdb-5a680bf9f2c89df9d192a1f5c6b02022babf7793.tar.bz2 |
fbsd-nat: Add helper functions to fetch and store register sets.
In particular, this supports register sets described by a regcache_map
which are fetched and stored with dedicated ptrace operations. These
functions are intended to be used in architecture-specific
fetch_registers and store_registers target methods.
Diffstat (limited to 'gdb/fbsd-nat.c')
-rw-r--r-- | gdb/fbsd-nat.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index 234e74f..33eddb5 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -1601,6 +1601,52 @@ fbsd_nat_target::supports_disable_randomization () #endif } +/* See fbsd-nat.h. */ + +void +fbsd_nat_target::fetch_register_set (struct regcache *regcache, int regnum, + int fetch_op, const struct regset *regset, + void *regs, size_t size) +{ + const struct regcache_map_entry *map + = (const struct regcache_map_entry *) regset->regmap; + pid_t pid = get_ptrace_pid (regcache->ptid ()); + + if (regnum == -1 || regcache_map_supplies (map, regnum, regcache->arch(), + size)) + { + if (ptrace (fetch_op, pid, (PTRACE_TYPE_ARG3) regs, 0) == -1) + perror_with_name (_("Couldn't get registers")); + + regcache->supply_regset (regset, regnum, regs, size); + } +} + +/* See fbsd-nat.h. */ + +void +fbsd_nat_target::store_register_set (struct regcache *regcache, int regnum, + int fetch_op, int store_op, + const struct regset *regset, void *regs, + size_t size) +{ + const struct regcache_map_entry *map + = (const struct regcache_map_entry *) regset->regmap; + pid_t pid = get_ptrace_pid (regcache->ptid ()); + + if (regnum == -1 || regcache_map_supplies (map, regnum, regcache->arch(), + size)) + { + if (ptrace (fetch_op, pid, (PTRACE_TYPE_ARG3) regs, 0) == -1) + perror_with_name (_("Couldn't get registers")); + + regcache->collect_regset (regset, regnum, regs, size); + + if (ptrace (store_op, pid, (PTRACE_TYPE_ARG3) regs, 0) == -1) + perror_with_name (_("Couldn't write registers")); + } +} + void _initialize_fbsd_nat (); void _initialize_fbsd_nat () |