diff options
author | Luis Machado <luis.machado@linaro.org> | 2020-06-19 17:31:23 -0300 |
---|---|---|
committer | Luis Machado <luis.machado@linaro.org> | 2021-03-24 14:47:05 -0300 |
commit | dbe692af2d1814100748b18a5dd70214e8611107 (patch) | |
tree | c5f5e256ce4084fb482161faede8e647960742ba /gdb/target-delegates.c | |
parent | 9a182d0461cc34912da51f445a242b392389edd6 (diff) | |
download | gdb-dbe692af2d1814100748b18a5dd70214e8611107.zip gdb-dbe692af2d1814100748b18a5dd70214e8611107.tar.gz gdb-dbe692af2d1814100748b18a5dd70214e8611107.tar.bz2 |
New target methods for memory tagging support
This patch starts adding some of the generic pieces to accomodate memory
tagging.
We have three new target methods:
- supports_memory_tagging: Checks if the target supports memory tagging. This
defaults to false for targets that don't support memory tagging.
- fetch_memtags: Fetches the allocation tags associated with a particular
memory range [address, address + length).
The default is to return 0 without returning any tags. This should only
be called if memory tagging is supported.
- store_memtags: Stores a set of allocation tags for a particular memory
range [address, address + length).
The default is to return 0. This should only
be called if memory tagging is supported.
gdb/ChangeLog:
2021-03-24 Luis Machado <luis.machado@linaro.org>
* remote.c (remote_target) <supports_memory_tagging>: New method
override.
<fetch_memtags>: New method override.
<store_memtags>: New method override.
(remote_target::supports_memory_tagging): New method.
(remote_target::fetch_memtags): New method.
(remote_target::store_memtags): New method.
* target-delegates.c: Regenerate.
* target.h (struct target_ops) <supports_memory_tagging>: New virtual
method.
<fetch_memtags>: New virtual method.
<store_memtags>: New virtual method.
(target_supports_memory_tagging): Define.
(target_fetch_memtags): Define.
(target_store_memtags): Define.
* target-debug.h (target_debug_print_size_t)
(target_debug_print_const_gdb_byte_vector_r)
(target_debug_print_gdb_byte_vector_r): New functions.
Diffstat (limited to 'gdb/target-delegates.c')
-rw-r--r-- | gdb/target-delegates.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/gdb/target-delegates.c b/gdb/target-delegates.c index 1c79997..74103bf 100644 --- a/gdb/target-delegates.c +++ b/gdb/target-delegates.c @@ -173,6 +173,9 @@ struct dummy_target : public target_ops const struct frame_unwind *get_tailcall_unwinder () override; void prepare_to_generate_core () override; void done_generating_core () override; + bool supports_memory_tagging () override; + bool fetch_memtags (CORE_ADDR arg0, size_t arg1, gdb::byte_vector &arg2, int arg3) override; + bool store_memtags (CORE_ADDR arg0, size_t arg1, const gdb::byte_vector &arg2, int arg3) override; }; struct debug_target : public target_ops @@ -344,6 +347,9 @@ struct debug_target : public target_ops const struct frame_unwind *get_tailcall_unwinder () override; void prepare_to_generate_core () override; void done_generating_core () override; + bool supports_memory_tagging () override; + bool fetch_memtags (CORE_ADDR arg0, size_t arg1, gdb::byte_vector &arg2, int arg3) override; + bool store_memtags (CORE_ADDR arg0, size_t arg1, const gdb::byte_vector &arg2, int arg3) override; }; void @@ -4413,3 +4419,92 @@ debug_target::done_generating_core () fputs_unfiltered (")\n", gdb_stdlog); } +bool +target_ops::supports_memory_tagging () +{ + return this->beneath ()->supports_memory_tagging (); +} + +bool +dummy_target::supports_memory_tagging () +{ + return false; +} + +bool +debug_target::supports_memory_tagging () +{ + bool result; + fprintf_unfiltered (gdb_stdlog, "-> %s->supports_memory_tagging (...)\n", this->beneath ()->shortname ()); + result = this->beneath ()->supports_memory_tagging (); + fprintf_unfiltered (gdb_stdlog, "<- %s->supports_memory_tagging (", this->beneath ()->shortname ()); + fputs_unfiltered (") = ", gdb_stdlog); + target_debug_print_bool (result); + fputs_unfiltered ("\n", gdb_stdlog); + return result; +} + +bool +target_ops::fetch_memtags (CORE_ADDR arg0, size_t arg1, gdb::byte_vector &arg2, int arg3) +{ + return this->beneath ()->fetch_memtags (arg0, arg1, arg2, arg3); +} + +bool +dummy_target::fetch_memtags (CORE_ADDR arg0, size_t arg1, gdb::byte_vector &arg2, int arg3) +{ + tcomplain (); +} + +bool +debug_target::fetch_memtags (CORE_ADDR arg0, size_t arg1, gdb::byte_vector &arg2, int arg3) +{ + bool result; + fprintf_unfiltered (gdb_stdlog, "-> %s->fetch_memtags (...)\n", this->beneath ()->shortname ()); + result = this->beneath ()->fetch_memtags (arg0, arg1, arg2, arg3); + fprintf_unfiltered (gdb_stdlog, "<- %s->fetch_memtags (", this->beneath ()->shortname ()); + target_debug_print_CORE_ADDR (arg0); + fputs_unfiltered (", ", gdb_stdlog); + target_debug_print_size_t (arg1); + fputs_unfiltered (", ", gdb_stdlog); + target_debug_print_gdb_byte_vector_r (arg2); + fputs_unfiltered (", ", gdb_stdlog); + target_debug_print_int (arg3); + fputs_unfiltered (") = ", gdb_stdlog); + target_debug_print_bool (result); + fputs_unfiltered ("\n", gdb_stdlog); + return result; +} + +bool +target_ops::store_memtags (CORE_ADDR arg0, size_t arg1, const gdb::byte_vector &arg2, int arg3) +{ + return this->beneath ()->store_memtags (arg0, arg1, arg2, arg3); +} + +bool +dummy_target::store_memtags (CORE_ADDR arg0, size_t arg1, const gdb::byte_vector &arg2, int arg3) +{ + tcomplain (); +} + +bool +debug_target::store_memtags (CORE_ADDR arg0, size_t arg1, const gdb::byte_vector &arg2, int arg3) +{ + bool result; + fprintf_unfiltered (gdb_stdlog, "-> %s->store_memtags (...)\n", this->beneath ()->shortname ()); + result = this->beneath ()->store_memtags (arg0, arg1, arg2, arg3); + fprintf_unfiltered (gdb_stdlog, "<- %s->store_memtags (", this->beneath ()->shortname ()); + target_debug_print_CORE_ADDR (arg0); + fputs_unfiltered (", ", gdb_stdlog); + target_debug_print_size_t (arg1); + fputs_unfiltered (", ", gdb_stdlog); + target_debug_print_const_gdb_byte_vector_r (arg2); + fputs_unfiltered (", ", gdb_stdlog); + target_debug_print_int (arg3); + fputs_unfiltered (") = ", gdb_stdlog); + target_debug_print_bool (result); + fputs_unfiltered ("\n", gdb_stdlog); + return result; +} + |