diff options
author | Luis Machado <luis.machado@linaro.org> | 2020-06-15 13:52:27 -0300 |
---|---|---|
committer | Luis Machado <luis.machado@linaro.org> | 2021-03-24 14:52:08 -0300 |
commit | c1bd443b4d86e12f2a97856270e40df24c7f3df7 (patch) | |
tree | 9aae2ce3110607d8710532a75ff12c529f1cd78d /gdbserver | |
parent | 0424512519142571509c67e83cd9dc2ed51d2dec (diff) | |
download | gdb-c1bd443b4d86e12f2a97856270e40df24c7f3df7.zip gdb-c1bd443b4d86e12f2a97856270e40df24c7f3df7.tar.gz gdb-c1bd443b4d86e12f2a97856270e40df24c7f3df7.tar.bz2 |
AArch64: Add target description/feature for MTE registers
This patch adds a target description and feature "mte" for aarch64.
It includes one new register, tag_ctl, that can be used to configure the
tag generation rules and sync/async modes. It is 64-bit in size.
The patch also adjusts the code that creates the target descriptions at
runtime based on CPU feature checks.
gdb/ChangeLog:
2021-03-24 Luis Machado <luis.machado@linaro.org>
* aarch64-linux-nat.c
(aarch64_linux_nat_target::read_description): Take MTE flag into
account.
Slight refactor to hwcap flag checking.
* aarch64-linux-tdep.c
(aarch64_linux_core_read_description): Likewise.
* aarch64-tdep.c (tdesc_aarch64_list): Add one more dimension for
MTE.
(aarch64_read_description): Add mte_p parameter and update to use it.
Update the documentation.
(aarch64_gdbarch_init): Update call to aarch64_read_description.
* aarch64-tdep.h (aarch64_read_description): Add mte_p parameter.
* arch/aarch64.c: Include ../features/aarch64-mte.c.
(aarch64_create_target_description): Add mte_p parameter and update
the code to use it.
* arch/aarch64.h (aarch64_create_target_description): Add mte_p
parameter.
* features/Makefile (FEATURE_XMLFILES): Add aarch64-mte.xml.
* features/aarch64-mte.c: New file, generated.
* features/aarch64-mte.xml: New file.
gdbserver/ChangeLog:
2021-03-24 Luis Machado <luis.machado@linaro.org>
* linux-aarch64-ipa.cc (get_ipa_tdesc): Update call to
aarch64_linux_read_description.
(initialize_low_tracepoint): Likewise.
* linux-aarch64-low.cc (aarch64_target::low_arch_setup): Take MTE flag
into account.
* linux-aarch64-tdesc.cc (tdesc_aarch64_list): Add one more dimension
for MTE.
(aarch64_linux_read_description): Add mte_p parameter and update to
use it.
* linux-aarch64-tdesc.h (aarch64_linux_read_description): Add mte_p
parameter.
Diffstat (limited to 'gdbserver')
-rw-r--r-- | gdbserver/ChangeLog | 14 | ||||
-rw-r--r-- | gdbserver/linux-aarch64-ipa.cc | 8 | ||||
-rw-r--r-- | gdbserver/linux-aarch64-low.cc | 6 | ||||
-rw-r--r-- | gdbserver/linux-aarch64-tdesc.cc | 10 | ||||
-rw-r--r-- | gdbserver/linux-aarch64-tdesc.h | 3 |
5 files changed, 30 insertions, 11 deletions
diff --git a/gdbserver/ChangeLog b/gdbserver/ChangeLog index 51c059c..db90660 100644 --- a/gdbserver/ChangeLog +++ b/gdbserver/ChangeLog @@ -1,5 +1,19 @@ 2021-03-24 Luis Machado <luis.machado@linaro.org> + * linux-aarch64-ipa.cc (get_ipa_tdesc): Update call to + aarch64_linux_read_description. + (initialize_low_tracepoint): Likewise. + * linux-aarch64-low.cc (aarch64_target::low_arch_setup): Take MTE flag + into account. + * linux-aarch64-tdesc.cc (tdesc_aarch64_list): Add one more dimension + for MTE. + (aarch64_linux_read_description): Add mte_p parameter and update to + use it. + * linux-aarch64-tdesc.h (aarch64_linux_read_description): Add mte_p + parameter. + +2021-03-24 Luis Machado <luis.machado@linaro.org> + * linux-aarch64-low.cc: Include arch/aarch64-mte-linux.h. 2021-03-24 Luis Machado <luis.machado@linaro.org> diff --git a/gdbserver/linux-aarch64-ipa.cc b/gdbserver/linux-aarch64-ipa.cc index 24211df..ebf017e 100644 --- a/gdbserver/linux-aarch64-ipa.cc +++ b/gdbserver/linux-aarch64-ipa.cc @@ -147,12 +147,12 @@ get_raw_reg (const unsigned char *raw_regs, int regnum) /* Return target_desc to use for IPA, given the tdesc index passed by gdbserver. Index is ignored, since we have only one tdesc - at the moment. SVE and pauth not yet supported. */ + at the moment. SVE, pauth and MTE not yet supported. */ const struct target_desc * get_ipa_tdesc (int idx) { - return aarch64_linux_read_description (0, false); + return aarch64_linux_read_description (0, false, false); } /* Allocate buffer for the jump pads. The branch instruction has a reach @@ -204,6 +204,6 @@ alloc_jump_pad_buffer (size_t size) void initialize_low_tracepoint (void) { - /* SVE and pauth not yet supported. */ - aarch64_linux_read_description (0, false); + /* SVE, pauth and MTE not yet supported. */ + aarch64_linux_read_description (0, false, false); } diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc index 7d7da87..14493c1 100644 --- a/gdbserver/linux-aarch64-low.cc +++ b/gdbserver/linux-aarch64-low.cc @@ -664,9 +664,13 @@ aarch64_target::low_arch_setup () { uint64_t vq = aarch64_sve_get_vq (tid); unsigned long hwcap = linux_get_hwcap (8); + unsigned long hwcap2 = linux_get_hwcap2 (8); bool pauth_p = hwcap & AARCH64_HWCAP_PACA; + /* MTE is AArch64-only. */ + bool mte_p = hwcap2 & HWCAP2_MTE; - current_process ()->tdesc = aarch64_linux_read_description (vq, pauth_p); + current_process ()->tdesc + = aarch64_linux_read_description (vq, pauth_p, mte_p); } else current_process ()->tdesc = aarch32_linux_read_description (); diff --git a/gdbserver/linux-aarch64-tdesc.cc b/gdbserver/linux-aarch64-tdesc.cc index a7f728e..ee005b8 100644 --- a/gdbserver/linux-aarch64-tdesc.cc +++ b/gdbserver/linux-aarch64-tdesc.cc @@ -27,22 +27,22 @@ #include <inttypes.h> /* All possible aarch64 target descriptors. */ -struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/]; +struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/][2 /* mte */]; /* Create the aarch64 target description. */ const target_desc * -aarch64_linux_read_description (uint64_t vq, bool pauth_p) +aarch64_linux_read_description (uint64_t vq, bool pauth_p, bool mte_p) { if (vq > AARCH64_MAX_SVE_VQ) error (_("VQ is %" PRIu64 ", maximum supported value is %d"), vq, AARCH64_MAX_SVE_VQ); - struct target_desc *tdesc = tdesc_aarch64_list[vq][pauth_p]; + struct target_desc *tdesc = tdesc_aarch64_list[vq][pauth_p][mte_p]; if (tdesc == NULL) { - tdesc = aarch64_create_target_description (vq, pauth_p); + tdesc = aarch64_create_target_description (vq, pauth_p, mte_p); static const char *expedite_regs_aarch64[] = { "x29", "sp", "pc", NULL }; static const char *expedite_regs_aarch64_sve[] = { "x29", "sp", "pc", @@ -53,7 +53,7 @@ aarch64_linux_read_description (uint64_t vq, bool pauth_p) else init_target_desc (tdesc, expedite_regs_aarch64_sve); - tdesc_aarch64_list[vq][pauth_p] = tdesc; + tdesc_aarch64_list[vq][pauth_p][mte_p] = tdesc; } return tdesc; diff --git a/gdbserver/linux-aarch64-tdesc.h b/gdbserver/linux-aarch64-tdesc.h index 95f115c..8319ca7 100644 --- a/gdbserver/linux-aarch64-tdesc.h +++ b/gdbserver/linux-aarch64-tdesc.h @@ -20,6 +20,7 @@ #ifndef GDBSERVER_LINUX_AARCH64_TDESC_H #define GDBSERVER_LINUX_AARCH64_TDESC_H -const target_desc * aarch64_linux_read_description (uint64_t vq, bool pauth_p); +const target_desc * aarch64_linux_read_description (uint64_t vq, bool pauth_p, + bool mte_p); #endif /* GDBSERVER_LINUX_AARCH64_TDESC_H */ |