From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 34572 invoked by alias); 6 Mar 2019 13:33:43 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 34487 invoked by uid 89); 6 Mar 2019 13:33:43 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=dat, DOCTYPE, !DOCTYPE, !doctype X-HELO: EUR04-DB3-obe.outbound.protection.outlook.com Received: from mail-eopbgr60089.outbound.protection.outlook.com (HELO EUR04-DB3-obe.outbound.protection.outlook.com) (40.107.6.89) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 06 Mar 2019 13:33:39 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector1-arm-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=z6xKsclI8IF20N4g6qThJm0uZq9aSl6XRPT3OKFLUjg=; b=Ang4Yw7SEzQ0ROUoZGVUvmWyz/KttViTK03iweldwodR9bZzfAboRPDu8Ijn+F9a5V9nkVuH/aiYTCHqQejk+dz7n0Utdo+fkUTXE+LWP9qX1Cgkg6aCzAKVDQYft+EKt5IE0q3/1OgiNtVtHao9csfE0cyRLsrTXrpCRvxNKB8= Received: from DB6PR0802MB2133.eurprd08.prod.outlook.com (10.172.227.22) by DB6PR0802MB2262.eurprd08.prod.outlook.com (10.172.227.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1665.19; Wed, 6 Mar 2019 13:33:34 +0000 Received: from DB6PR0802MB2133.eurprd08.prod.outlook.com ([fe80::e974:35a7:c83c:e5b7]) by DB6PR0802MB2133.eurprd08.prod.outlook.com ([fe80::e974:35a7:c83c:e5b7%3]) with mapi id 15.20.1686.018; Wed, 6 Mar 2019 13:33:34 +0000 From: Alan Hayward To: "gdb-patches@sourceware.org" CC: nd , Alan Hayward Subject: [PATCH v2 1/8] AArch64: Add pointer authentication feature Date: Wed, 06 Mar 2019 13:33:00 -0000 Message-ID: <20190306133325.2531-2-alan.hayward@arm.com> References: <20190306133325.2531-1-alan.hayward@arm.com> In-Reply-To: <20190306133325.2531-1-alan.hayward@arm.com> received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Alan.Hayward@arm.com; x-ms-exchange-senderadcheck: 1 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-IsSubscribed: yes X-SW-Source: 2019-03/txt/msg00089.txt.bz2 Pointer Authentication is a new feature in AArch64 v8.3-a. When enabled in the compiler, function return addresses will be mangled by the kernel. Add register description xml and wire up to aarch64_linux_read_description. This description includes the two pauth user registers. Nothing yet uses the feature - that is added in later patches. gdb/ChangeLog: 2019-03-06 Alan Hayward Jiong Wang * aarch64-linux-nat.c (aarch64_linux_nat_target::read_description): Add pauth param. * aarch64-linux-tdep.c (aarch64_linux_core_read_description): Likewise. * aarch64-tdep.c (struct target_desc): Add in pauth. (aarch64_read_description): Add pauth param. (aarch64_gdbarch_init): Likewise. * aarch64-tdep.h (aarch64_read_description): Likewise. * arch/aarch64.c (aarch64_create_target_description): Likewise. * arch/aarch64.h (aarch64_create_target_description): Likewise. * features/Makefile: Add new files. * features/aarch64-pauth.c: New file. * features/aarch64-pauth.xml: New file. gdb/doc/ChangeLog: 2019-03-06 Alan Hayward Jiong Wang * gdb.texinfo: Describe pauth feature. gdb/gdbserver/ChangeLog: 2019-03-06 Alan Hayward Jiong Wang * linux-aarch64-ipa.c (get_ipa_tdesc): Add pauth param. (initialize_low_tracepoint): Likewise. * linux-aarch64-low.c (aarch64_arch_setup): Likewise. * linux-aarch64-tdesc-selftest.c (aarch64_tdesc_test): Likewise. * linux-aarch64-tdesc.c (struct target_desc): Likewise. (aarch64_linux_read_description): Likewise. * linux-aarch64-tdesc.h (aarch64_linux_read_description): Likewise. --- gdb/aarch64-linux-nat.c | 5 +++-- gdb/aarch64-linux-tdep.c | 4 +++- gdb/aarch64-tdep.c | 14 +++++++------- gdb/aarch64-tdep.h | 2 +- gdb/arch/aarch64.c | 6 +++++- gdb/arch/aarch64.h | 5 +++-- gdb/doc/gdb.texinfo | 3 +++ gdb/features/Makefile | 1 + gdb/features/aarch64-pauth.c | 16 ++++++++++++++++ gdb/features/aarch64-pauth.xml | 13 +++++++++++++ gdb/gdbserver/linux-aarch64-ipa.c | 8 ++++---- gdb/gdbserver/linux-aarch64-low.c | 3 ++- gdb/gdbserver/linux-aarch64-tdesc-selftest.c | 2 +- gdb/gdbserver/linux-aarch64-tdesc.c | 10 +++++----- gdb/gdbserver/linux-aarch64-tdesc.h | 2 +- 15 files changed, 68 insertions(+), 26 deletions(-) create mode 100644 gdb/features/aarch64-pauth.c create mode 100644 gdb/features/aarch64-pauth.xml diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c index 6f91e9568e..f58a41e195 100644 --- a/gdb/aarch64-linux-nat.c +++ b/gdb/aarch64-linux-nat.c @@ -605,8 +605,9 @@ aarch64_linux_nat_target::read_description () ret =3D ptrace (PTRACE_GETREGSET, tid, NT_ARM_VFP, &iovec); if (ret =3D=3D 0) return tdesc_arm_with_neon; - else - return aarch64_read_description (aarch64_sve_get_vq (tid)); + + /* pauth not yet supported. */ + return aarch64_read_description (aarch64_sve_get_vq (tid), false); } =20 /* Convert a native/host siginfo object, into/from the siginfo in the diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index 39e607658f..445019accc 100644 --- a/gdb/aarch64-linux-tdep.c +++ b/gdb/aarch64-linux-tdep.c @@ -640,7 +640,9 @@ aarch64_linux_core_read_description (struct gdbarch *gd= barch, if (target_auxv_search (target, AT_HWCAP, &aarch64_hwcap) !=3D 1) return NULL; =20 - return aarch64_read_description (aarch64_linux_core_read_vq (gdbarch, ab= fd)); + /* pauth not yet supported. */ + return aarch64_read_description (aarch64_linux_core_read_vq (gdbarch, ab= fd), + false); } =20 /* Implementation of `gdbarch_stap_is_single_operand', as defined in diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index dd57ef9873..0518837a1f 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -69,7 +69,7 @@ #define HA_MAX_NUM_FLDS 4 =20 /* All possible aarch64 target descriptors. */ -struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1]; +struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/]; =20 /* The standard register names, and all the valid aliases for them. */ static const struct @@ -2885,18 +2885,18 @@ aarch64_displaced_step_hw_singlestep (struct gdbarc= h *gdbarch, (It is not possible to set VQ to zero on an SVE system). */ =20 const target_desc * -aarch64_read_description (uint64_t vq) +aarch64_read_description (uint64_t vq, bool pauth_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]; + struct target_desc *tdesc =3D tdesc_aarch64_list[vq][pauth_p]; =20 if (tdesc =3D=3D NULL) { - tdesc =3D aarch64_create_target_description (vq); - tdesc_aarch64_list[vq] =3D tdesc; + tdesc =3D aarch64_create_target_description (vq, pauth_p); + tdesc_aarch64_list[vq][pauth_p] =3D tdesc; } =20 return tdesc; @@ -2961,7 +2961,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struc= t gdbarch_list *arches) =20 /* Ensure we always have a target description. */ if (!tdesc_has_registers (tdesc)) - tdesc =3D aarch64_read_description (0); + tdesc =3D aarch64_read_description (0, false); gdb_assert (tdesc); =20 feature_core =3D tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.core"); @@ -3190,7 +3190,7 @@ When on, AArch64 specific debugging is enabled."), selftests::register_test ("aarch64-process-record", selftests::aarch64_process_record_test); selftests::record_xml_tdesc ("aarch64.xml", - aarch64_create_target_description (0)); + aarch64_create_target_description (0, false)); #endif } =20 diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h index 704eacb50c..3db6bee9f3 100644 --- a/gdb/aarch64-tdep.h +++ b/gdb/aarch64-tdep.h @@ -89,7 +89,7 @@ struct gdbarch_tdep } }; =20 -const target_desc *aarch64_read_description (uint64_t vq); +const target_desc *aarch64_read_description (uint64_t vq, bool pauth_p); =20 extern int aarch64_process_record (struct gdbarch *gdbarch, struct regcache *regcache, CORE_ADDR addr); diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c index d36ed9d19e..11a15dd94c 100644 --- a/gdb/arch/aarch64.c +++ b/gdb/arch/aarch64.c @@ -22,11 +22,12 @@ #include "../features/aarch64-core.c" #include "../features/aarch64-fpu.c" #include "../features/aarch64-sve.c" +#include "../features/aarch64-pauth.c" =20 /* See arch/aarch64.h. */ =20 target_desc * -aarch64_create_target_description (uint64_t vq) +aarch64_create_target_description (uint64_t vq, bool pauth_p) { target_desc *tdesc =3D allocate_target_description (); =20 @@ -43,5 +44,8 @@ aarch64_create_target_description (uint64_t vq) else regnum =3D create_feature_aarch64_sve (tdesc, regnum, vq); =20 + if (pauth_p) + regnum =3D create_feature_aarch64_pauth (tdesc, regnum); + return tdesc; } diff --git a/gdb/arch/aarch64.h b/gdb/arch/aarch64.h index 807a4a6558..4fe6d02f6e 100644 --- a/gdb/arch/aarch64.h +++ b/gdb/arch/aarch64.h @@ -24,9 +24,10 @@ =20 /* Create the aarch64 target description. A non zero VQ value indicates b= oth the presence of SVE and the Vector Quotient - the number of 128bit chun= ks in - an SVE Z register. */ + an SVE Z register. HAS_PAUTH_P indicates the presence of the PAUTH + feature. */ =20 -target_desc *aarch64_create_target_description (uint64_t vq); +target_desc *aarch64_create_target_description (uint64_t vq, bool has_paut= h_p); =20 /* Register numbers of various important registers. Note that on SVE, the Z registers reuse the V register numbers and the V diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index f2028f86b0..e4d8e44cae 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -43076,6 +43076,9 @@ The @samp{org.gnu.gdb.aarch64.sve} feature is optio= nal. If present, it should contain registers @samp{z0} through @samp{z31}, @samp{p0} through @samp{p15}, @samp{ffr} and @samp{vg}. =20 +The @samp{org.gnu.gdb.aarch64.pauth} feature is optional. If present, +it should contain registers @samp{pauth_dmask} and @samp{pauth_cmask}. + @node ARC Features @subsection ARC Features @cindex target descriptions, ARC Features diff --git a/gdb/features/Makefile b/gdb/features/Makefile index 3d84ca09a1..d0cd4f851f 100644 --- a/gdb/features/Makefile +++ b/gdb/features/Makefile @@ -227,6 +227,7 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gd= bserver-regs.xsl =20 FEATURE_XMLFILES =3D aarch64-core.xml \ aarch64-fpu.xml \ + aarch64-pauth.xml \ i386/32bit-core.xml \ i386/32bit-sse.xml \ i386/32bit-linux.xml \ diff --git a/gdb/features/aarch64-pauth.c b/gdb/features/aarch64-pauth.c new file mode 100644 index 0000000000..e4b84ffb55 --- /dev/null +++ b/gdb/features/aarch64-pauth.c @@ -0,0 +1,16 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: aarch64-pauth.xml */ + +#include "common/tdesc.h" + +static int +create_feature_aarch64_pauth (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature =3D tdesc_create_feature (result, "org.gnu.gdb.aarch64.pauth"); + tdesc_create_reg (feature, "pauth_dmask", regnum++, 1, NULL, 64, "int"); + tdesc_create_reg (feature, "pauth_cmask", regnum++, 1, NULL, 64, "int"); + + return regnum; +} diff --git a/gdb/features/aarch64-pauth.xml b/gdb/features/aarch64-pauth.xml new file mode 100644 index 0000000000..9c8987fca7 --- /dev/null +++ b/gdb/features/aarch64-pauth.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/gdb/gdbserver/linux-aarch64-ipa.c b/gdb/gdbserver/linux-aarch6= 4-ipa.c index 94db53f59a..3804b1e239 100644 --- a/gdb/gdbserver/linux-aarch64-ipa.c +++ b/gdb/gdbserver/linux-aarch64-ipa.c @@ -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 not yet supported. */ + at the moment. SVE and pauth not yet supported. */ =20 const struct target_desc * get_ipa_tdesc (int idx) { - return aarch64_linux_read_description (0); + return aarch64_linux_read_description (0, 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 not yet supported. */ - aarch64_linux_read_description (0); + /* SVE and pauth not yet supported. */ + aarch64_linux_read_description (0, false); } diff --git a/gdb/gdbserver/linux-aarch64-low.c b/gdb/gdbserver/linux-aarch6= 4-low.c index 0b2946ea22..db329da4dc 100644 --- a/gdb/gdbserver/linux-aarch64-low.c +++ b/gdb/gdbserver/linux-aarch64-low.c @@ -501,7 +501,8 @@ aarch64_arch_setup (void) if (is_elf64) { uint64_t vq =3D aarch64_sve_get_vq (tid); - current_process ()->tdesc =3D aarch64_linux_read_description (vq); + /* pauth not yet supported. */ + current_process ()->tdesc =3D aarch64_linux_read_description (vq, fa= lse); } else current_process ()->tdesc =3D tdesc_arm_with_neon; diff --git a/gdb/gdbserver/linux-aarch64-tdesc-selftest.c b/gdb/gdbserver/l= inux-aarch64-tdesc-selftest.c index 1b2453aa30..bf24a27c59 100644 --- a/gdb/gdbserver/linux-aarch64-tdesc-selftest.c +++ b/gdb/gdbserver/linux-aarch64-tdesc-selftest.c @@ -29,7 +29,7 @@ namespace tdesc { static void aarch64_tdesc_test () { - const target_desc *tdesc =3D aarch64_linux_read_description (0); + const target_desc *tdesc =3D aarch64_linux_read_description (0, false); SELF_CHECK (*tdesc =3D=3D *tdesc_aarch64); } } diff --git a/gdb/gdbserver/linux-aarch64-tdesc.c b/gdb/gdbserver/linux-aarc= h64-tdesc.c index 6ab473ea51..6f9b4f1efc 100644 --- a/gdb/gdbserver/linux-aarch64-tdesc.c +++ b/gdb/gdbserver/linux-aarch64-tdesc.c @@ -24,22 +24,22 @@ #include =20 /* All possible aarch64 target descriptors. */ -struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1]; +struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/]; =20 /* Create the aarch64 target description. */ =20 const target_desc * -aarch64_linux_read_description (uint64_t vq) +aarch64_linux_read_description (uint64_t vq, bool pauth_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]; + struct target_desc *tdesc =3D tdesc_aarch64_list[vq][pauth_p]; =20 if (tdesc =3D=3D NULL) { - tdesc =3D aarch64_create_target_description (vq); + tdesc =3D aarch64_create_target_description (vq, pauth_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", @@ -50,7 +50,7 @@ aarch64_linux_read_description (uint64_t vq) else init_target_desc (tdesc, expedite_regs_aarch64_sve); =20 - tdesc_aarch64_list[vq] =3D tdesc; + tdesc_aarch64_list[vq][pauth_p] =3D tdesc; } =20 return tdesc; diff --git a/gdb/gdbserver/linux-aarch64-tdesc.h b/gdb/gdbserver/linux-aarc= h64-tdesc.h index 7ce8150663..06b3ec9b1e 100644 --- a/gdb/gdbserver/linux-aarch64-tdesc.h +++ b/gdb/gdbserver/linux-aarch64-tdesc.h @@ -20,7 +20,7 @@ #ifndef GDBSERVER_LINUX_AARCH64_TDESC_H #define GDBSERVER_LINUX_AARCH64_TDESC_H =20 -const target_desc * aarch64_linux_read_description (uint64_t vq); +const target_desc * aarch64_linux_read_description (uint64_t vq, bool paut= h_p); =20 #if GDB_SELF_TEST void initialize_low_tdesc (); --=20 2.17.2 (Apple Git-113)