diff options
author | Tom Tromey <tromey@adacore.com> | 2020-04-08 14:33:35 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-04-08 14:47:59 -0600 |
commit | d6225aff7a4f11c3443515c0d8dad12351b97575 (patch) | |
tree | 15a0f1a7bd457f0e21a3a2f55d5c36d79c233638 /gdbserver/win32-i386-low.cc | |
parent | 71fbdbafe07a4edb2ac88705e03e2cb14b3c77da (diff) | |
download | gdb-d6225aff7a4f11c3443515c0d8dad12351b97575.zip gdb-d6225aff7a4f11c3443515c0d8dad12351b97575.tar.gz gdb-d6225aff7a4f11c3443515c0d8dad12351b97575.tar.bz2 |
Add read_pc / write_pc support to win32-low
This changes win32-low.c to implement the read_pc and write_pc
methods. A subsequent patch will need these.
Note that I have no way to test, or even compile, the win32-arm-low.c
change.
gdbserver/ChangeLog
2020-04-08 Tom Tromey <tromey@adacore.com>
* win32-low.h (win32_process_target::read_pc)
(win32_process_target::write_pc): Declare.
* win32-low.c (win32_process_target::read_pc)
(win32_process_target::write_pc): New methods.
* win32-i386-low.c (i386_win32_get_pc, i386_win32_set_pc): New
functions.
(the_low_target): Update.
* win32-arm-low.c (arm_win32_get_pc, arm_win32_set_pc): New
functions.
(the_low_target): Update.
Diffstat (limited to 'gdbserver/win32-i386-low.cc')
-rw-r--r-- | gdbserver/win32-i386-low.cc | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/gdbserver/win32-i386-low.cc b/gdbserver/win32-i386-low.cc index 1c14bc7..eac15b5 100644 --- a/gdbserver/win32-i386-low.cc +++ b/gdbserver/win32-i386-low.cc @@ -450,6 +450,50 @@ i386_arch_setup (void) win32_tdesc = tdesc; } +/* Implement win32_target_ops "get_pc" method. */ + +static CORE_ADDR +i386_win32_get_pc (struct regcache *regcache) +{ + bool use_64bit = register_size (regcache->tdesc, 0) == 8; + + if (use_64bit) + { + uint64_t pc; + + collect_register_by_name (regcache, "rip", &pc); + return (CORE_ADDR) pc; + } + else + { + uint32_t pc; + + collect_register_by_name (regcache, "eip", &pc); + return (CORE_ADDR) pc; + } +} + +/* Implement win32_target_ops "set_pc" method. */ + +static void +i386_win32_set_pc (struct regcache *regcache, CORE_ADDR pc) +{ + bool use_64bit = register_size (regcache->tdesc, 0) == 8; + + if (use_64bit) + { + uint64_t newpc = pc; + + supply_register_by_name (regcache, "rip", &newpc); + } + else + { + uint32_t newpc = pc; + + supply_register_by_name (regcache, "eip", &newpc); + } +} + struct win32_target_ops the_low_target = { i386_arch_setup, sizeof (mappings) / sizeof (mappings[0]), @@ -462,6 +506,8 @@ struct win32_target_ops the_low_target = { i386_single_step, &i386_win32_breakpoint, i386_win32_breakpoint_len, + i386_win32_get_pc, + i386_win32_set_pc, i386_supports_z_point_type, i386_insert_point, i386_remove_point, |