From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1936) id C11EA3858036; Tue, 3 May 2022 23:11:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C11EA3858036 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: John Baldwin To: gdb-cvs@sourceware.org Subject: [binutils-gdb] gdbserver: Read the tpidr register from NT_ARM_TLS on Linux. X-Act-Checkin: binutils-gdb X-Git-Author: John Baldwin X-Git-Refname: refs/heads/master X-Git-Oldrev: 224151d7748ef13df82878067266cfaa9861e360 X-Git-Newrev: 9c27bc99e4e1c4fbf51dc8f6186f0fdd5994a38b Message-Id: <20220503231114.C11EA3858036@sourceware.org> Date: Tue, 3 May 2022 23:11:14 +0000 (GMT) X-BeenThere: gdb-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 May 2022 23:11:14 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D9c27bc99e4e1= c4fbf51dc8f6186f0fdd5994a38b commit 9c27bc99e4e1c4fbf51dc8f6186f0fdd5994a38b Author: John Baldwin Date: Tue May 3 16:05:10 2022 -0700 gdbserver: Read the tpidr register from NT_ARM_TLS on Linux. Diff: --- gdbserver/linux-aarch64-ipa.cc | 8 ++++---- gdbserver/linux-aarch64-low.cc | 32 +++++++++++++++++++++++++++++++- gdbserver/linux-aarch64-tdesc.cc | 11 ++++++----- gdbserver/linux-aarch64-tdesc.h | 2 +- 4 files changed, 42 insertions(+), 11 deletions(-) diff --git a/gdbserver/linux-aarch64-ipa.cc b/gdbserver/linux-aarch64-ipa.cc index 296c63534d8..dc907d3ff88 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 regnu= m) =20 /* 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, pauth and MTE not yet supported. */ + at the moment. SVE, pauth, MTE and TLS not yet supported. */ =20 const struct target_desc * get_ipa_tdesc (int idx) { - return aarch64_linux_read_description (0, false, false); + return aarch64_linux_read_description (0, false, false, false); } =20 /* 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, pauth and MTE not yet supported. */ - aarch64_linux_read_description (0, false, false); + /* SVE, pauth, MTE and TLS not yet supported. */ + aarch64_linux_read_description (0, false, false, false); } diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc index 0091f998c63..c924821c25c 100644 --- a/gdbserver/linux-aarch64-low.cc +++ b/gdbserver/linux-aarch64-low.cc @@ -287,6 +287,26 @@ aarch64_store_mteregset (struct regcache *regcache, co= nst void *buf) supply_register (regcache, mte_base, mte_regset); } =20 +/* Fill BUF with TLS register from the regcache. */ + +static void +aarch64_fill_tlsregset (struct regcache *regcache, void *buf) +{ + int tls_regnum =3D find_regno (regcache->tdesc, "tpidr"); + + collect_register (regcache, tls_regnum, buf); +} + +/* Store TLS register to regcache. */ + +static void +aarch64_store_tlsregset (struct regcache *regcache, const void *buf) +{ + int tls_regnum =3D find_regno (regcache->tdesc, "tpidr"); + + supply_register (regcache, tls_regnum, buf); +} + bool aarch64_target::low_supports_breakpoints () { @@ -719,6 +739,10 @@ static struct regset_info aarch64_regsets[] =3D { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_TAGGED_ADDR_CTRL, 0, OPTIONAL_REGS, aarch64_fill_mteregset, aarch64_store_mteregset }, + /* TLS register. */ + { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_TLS, + 0, OPTIONAL_REGS, + aarch64_fill_tlsregset, aarch64_store_tlsregset }, NULL_REGSET }; =20 @@ -770,6 +794,10 @@ aarch64_adjust_register_sets (const struct aarch64_fea= tures &features) if (features.mte) regset->size =3D AARCH64_LINUX_SIZEOF_MTE; break; + case NT_ARM_TLS: + if (features.tls) + regset->size =3D AARCH64_TLS_REGS_SIZE; + break; default: gdb_assert_not_reached ("Unknown register set found."); } @@ -802,9 +830,11 @@ aarch64_target::low_arch_setup () features.pauth =3D linux_get_hwcap (8) & AARCH64_HWCAP_PACA; /* A-profile MTE is 64-bit only. */ features.mte =3D linux_get_hwcap2 (8) & HWCAP2_MTE; + features.tls =3D true; =20 current_process ()->tdesc - =3D aarch64_linux_read_description (vq, features.pauth, features.mte); + =3D aarch64_linux_read_description (vq, features.pauth, features.mte, + features.tls); =20 /* Adjust the register sets we should use for this particular set of features. */ diff --git a/gdbserver/linux-aarch64-tdesc.cc b/gdbserver/linux-aarch64-tde= sc.cc index 14d6a4f80eb..be96612d571 100644 --- a/gdbserver/linux-aarch64-tdesc.cc +++ b/gdbserver/linux-aarch64-tdesc.cc @@ -27,22 +27,23 @@ #include =20 /* All possible aarch64 target descriptors. */ -struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/]= [2 /* mte */]; +struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/]= [2 /* mte */][2 /* tls */]; =20 /* Create the aarch64 target description. */ =20 const target_desc * -aarch64_linux_read_description (uint64_t vq, bool pauth_p, bool mte_p) +aarch64_linux_read_description (uint64_t vq, bool pauth_p, bool mte_p, + bool tls_p) { if (vq > AARCH64_MAX_SVE_VQ) error (_("VQ is %" PRIu64 ", maximum supported value is %d"), vq, AARCH64_MAX_SVE_VQ); =20 - struct target_desc *tdesc =3D tdesc_aarch64_list[vq][pauth_p][mte_p]; + struct target_desc *tdesc =3D tdesc_aarch64_list[vq][pauth_p][mte_p][tls= _p]; =20 if (tdesc =3D=3D NULL) { - tdesc =3D aarch64_create_target_description (vq, pauth_p, mte_p, fal= se); + tdesc =3D aarch64_create_target_description (vq, pauth_p, mte_p, tls= _p); =20 static const char *expedite_regs_aarch64[] =3D { "x29", "sp", "pc", = NULL }; static const char *expedite_regs_aarch64_sve[] =3D { "x29", "sp", "p= c", @@ -53,7 +54,7 @@ aarch64_linux_read_description (uint64_t vq, bool pauth_p= , bool mte_p) else init_target_desc (tdesc, expedite_regs_aarch64_sve); =20 - tdesc_aarch64_list[vq][pauth_p][mte_p] =3D tdesc; + tdesc_aarch64_list[vq][pauth_p][mte_p][tls_p] =3D tdesc; } =20 return tdesc; diff --git a/gdbserver/linux-aarch64-tdesc.h b/gdbserver/linux-aarch64-tdes= c.h index 66d6fa32f16..4ab658447a2 100644 --- a/gdbserver/linux-aarch64-tdesc.h +++ b/gdbserver/linux-aarch64-tdesc.h @@ -21,6 +21,6 @@ #define GDBSERVER_LINUX_AARCH64_TDESC_H =20 const target_desc * aarch64_linux_read_description (uint64_t vq, bool paut= h_p, - bool mte_p); + bool mte_p, bool tls_p); =20 #endif /* GDBSERVER_LINUX_AARCH64_TDESC_H */