diff options
author | Luis Machado <luis.machado@linaro.org> | 2020-06-19 17:37:33 -0300 |
---|---|---|
committer | Luis Machado <luis.machado@linaro.org> | 2021-03-24 14:55:14 -0300 |
commit | c7782e50b13b4ca522dd6da2c7c22760c9603e6a (patch) | |
tree | 9565f890c9d345299d95e98a398781fd6fe427cf /gdb/arch | |
parent | 1e735120b95236b1f0fd8c383e64b02b64909d7c (diff) | |
download | gdb-c7782e50b13b4ca522dd6da2c7c22760c9603e6a.zip gdb-c7782e50b13b4ca522dd6da2c7c22760c9603e6a.tar.gz gdb-c7782e50b13b4ca522dd6da2c7c22760c9603e6a.tar.bz2 |
AArch64: Implement the memory tagging gdbarch hooks
This patch implements the memory tagging gdbarch hooks for AArch64, for
the MTE feature.
gdb/ChangeLog:
2021-03-24 Luis Machado <luis.machado@linaro.org>
* aarch64-linux-tdep.c: Include target.h, arch-utils.h, value.h.
(aarch64_mte_get_atag, aarch64_linux_tagged_address_p)
(aarch64_linux_memtag_mismatch_p, aarch64_linux_set_memtags)
(aarch64_linux_get_memtag, aarch64_linux_memtag_to_string): New
functions.
(aarch64_linux_init_abi): Initialize MTE-related gdbarch hooks.
* arch/aarch64-mte-linux.c (aarch64_mte_make_ltag_bits)
(aarch64_mte_make_ltag, aarch64_linux_set_ltag)
(aarch64_linux_get_ltag): New functions.
* arch/aarch64-mte-linux.h (AARCH64_MTE_LOGICAL_TAG_START_BIT)
(AARCH64_MTE_LOGICAL_MAX_VALUE): Define.
(aarch64_mte_make_ltag_bits, aarch64_mte_make_ltag)
(aarch64_mte_set_ltag, aarch64_mte_get_ltag): New prototypes.
Diffstat (limited to 'gdb/arch')
-rw-r--r-- | gdb/arch/aarch64-mte-linux.c | 38 | ||||
-rw-r--r-- | gdb/arch/aarch64-mte-linux.h | 18 |
2 files changed, 56 insertions, 0 deletions
diff --git a/gdb/arch/aarch64-mte-linux.c b/gdb/arch/aarch64-mte-linux.c index 3d72b8d..959c024 100644 --- a/gdb/arch/aarch64-mte-linux.c +++ b/gdb/arch/aarch64-mte-linux.c @@ -36,3 +36,41 @@ aarch64_mte_get_tag_granules (CORE_ADDR addr, size_t len, size_t granule_size) /* We always have at least 1 granule. */ return 1 + (e_addr - s_addr) / granule_size; } + +/* See arch/aarch64-mte-linux.h */ + +CORE_ADDR +aarch64_mte_make_ltag_bits (CORE_ADDR value) +{ + return value & AARCH64_MTE_LOGICAL_MAX_VALUE; +} + +/* See arch/aarch64-mte-linux.h */ + +CORE_ADDR +aarch64_mte_make_ltag (CORE_ADDR value) +{ + return (aarch64_mte_make_ltag_bits (value) + << AARCH64_MTE_LOGICAL_TAG_START_BIT); +} + +/* See arch/aarch64-mte-linux.h */ + +CORE_ADDR +aarch64_mte_set_ltag (CORE_ADDR address, CORE_ADDR tag) +{ + /* Remove the existing tag. */ + address &= ~aarch64_mte_make_ltag (AARCH64_MTE_LOGICAL_MAX_VALUE); + + /* Return the new tagged address. */ + return address | aarch64_mte_make_ltag (tag); +} + +/* See arch/aarch64-mte-linux.h */ + +CORE_ADDR +aarch64_mte_get_ltag (CORE_ADDR address) +{ + CORE_ADDR ltag_addr = address >> AARCH64_MTE_LOGICAL_TAG_START_BIT; + return aarch64_mte_make_ltag_bits (ltag_addr); +} diff --git a/gdb/arch/aarch64-mte-linux.h b/gdb/arch/aarch64-mte-linux.h index 88bd8d0..f517638 100644 --- a/gdb/arch/aarch64-mte-linux.h +++ b/gdb/arch/aarch64-mte-linux.h @@ -32,6 +32,8 @@ /* We have one tag per 16 bytes of memory. */ #define AARCH64_MTE_GRANULE_SIZE 16 +#define AARCH64_MTE_LOGICAL_TAG_START_BIT 56 +#define AARCH64_MTE_LOGICAL_MAX_VALUE 0xf /* Memory tag types for AArch64. */ enum class aarch64_memtag_type @@ -47,4 +49,20 @@ enum class aarch64_memtag_type extern size_t aarch64_mte_get_tag_granules (CORE_ADDR addr, size_t len, size_t granule_size); +/* Return the 4-bit tag made from VALUE. */ +extern CORE_ADDR aarch64_mte_make_ltag_bits (CORE_ADDR value); + +/* Return the 4-bit tag that can be OR-ed to an address. */ +extern CORE_ADDR aarch64_mte_make_ltag (CORE_ADDR value); + +/* Helper to set the logical TAG for a 64-bit ADDRESS. + + It is always possible to set the logical tag. */ +extern CORE_ADDR aarch64_mte_set_ltag (CORE_ADDR address, CORE_ADDR tag); + +/* Helper to get the logical tag from a 64-bit ADDRESS. + + It is always possible to get the logical tag. */ +extern CORE_ADDR aarch64_mte_get_ltag (CORE_ADDR address); + #endif /* ARCH_AARCH64_LINUX_H */ |