Skip to content

Commit 6dc0ebd

Browse files
committed
AArch64: Add pointer authentication feature
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: * 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: * gdb.texinfo: Describe pauth feature. gdb/gdbserver/ChangeLog: * 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.
1 parent 968aa7a commit 6dc0ebd

18 files changed

+101
-26
lines changed

gdb/ChangeLog

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,20 @@
1+
2019-03-22 Alan Hayward <alan.hayward@arm.com>
2+
Jiong Wang <jiong.wang@arm.com>
3+
4+
* aarch64-linux-nat.c
5+
(aarch64_linux_nat_target::read_description): Add pauth param.
6+
* aarch64-linux-tdep.c
7+
(aarch64_linux_core_read_description): Likewise.
8+
* aarch64-tdep.c (struct target_desc): Add in pauth.
9+
(aarch64_read_description): Add pauth param.
10+
(aarch64_gdbarch_init): Likewise.
11+
* aarch64-tdep.h (aarch64_read_description): Likewise.
12+
* arch/aarch64.c (aarch64_create_target_description): Likewise.
13+
* arch/aarch64.h (aarch64_create_target_description): Likewise.
14+
* features/Makefile: Add new files.
15+
* features/aarch64-pauth.c: New file.
16+
* features/aarch64-pauth.xml: New file.
17+
118
2019-03-20 Tom Tromey <tromey@adacore.com>
219

320
* infrun.c (handle_inferior_event): Rename from

gdb/aarch64-linux-nat.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -605,8 +605,9 @@ aarch64_linux_nat_target::read_description ()
605605
ret = ptrace (PTRACE_GETREGSET, tid, NT_ARM_VFP, &iovec);
606606
if (ret == 0)
607607
return tdesc_arm_with_neon;
608-
else
609-
return aarch64_read_description (aarch64_sve_get_vq (tid));
608+
609+
/* pauth not yet supported. */
610+
return aarch64_read_description (aarch64_sve_get_vq (tid), false);
610611
}
611612

612613
/* Convert a native/host siginfo object, into/from the siginfo in the

gdb/aarch64-linux-tdep.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,9 @@ aarch64_linux_core_read_description (struct gdbarch *gdbarch,
640640
if (target_auxv_search (target, AT_HWCAP, &aarch64_hwcap) != 1)
641641
return NULL;
642642

643-
return aarch64_read_description (aarch64_linux_core_read_vq (gdbarch, abfd));
643+
/* pauth not yet supported. */
644+
return aarch64_read_description (aarch64_linux_core_read_vq (gdbarch, abfd),
645+
false);
644646
}
645647

646648
/* Implementation of `gdbarch_stap_is_single_operand', as defined in

gdb/aarch64-tdep.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
#define HA_MAX_NUM_FLDS 4
7070

7171
/* All possible aarch64 target descriptors. */
72-
struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1];
72+
struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1][2/*pauth*/];
7373

7474
/* The standard register names, and all the valid aliases for them. */
7575
static const struct
@@ -2885,18 +2885,18 @@ aarch64_displaced_step_hw_singlestep (struct gdbarch *gdbarch,
28852885
(It is not possible to set VQ to zero on an SVE system). */
28862886

28872887
const target_desc *
2888-
aarch64_read_description (uint64_t vq)
2888+
aarch64_read_description (uint64_t vq, bool pauth_p)
28892889
{
28902890
if (vq > AARCH64_MAX_SVE_VQ)
28912891
error (_("VQ is %" PRIu64 ", maximum supported value is %d"), vq,
28922892
AARCH64_MAX_SVE_VQ);
28932893

2894-
struct target_desc *tdesc = tdesc_aarch64_list[vq];
2894+
struct target_desc *tdesc = tdesc_aarch64_list[vq][pauth_p];
28952895

28962896
if (tdesc == NULL)
28972897
{
2898-
tdesc = aarch64_create_target_description (vq);
2899-
tdesc_aarch64_list[vq] = tdesc;
2898+
tdesc = aarch64_create_target_description (vq, pauth_p);
2899+
tdesc_aarch64_list[vq][pauth_p] = tdesc;
29002900
}
29012901

29022902
return tdesc;
@@ -2961,7 +2961,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
29612961

29622962
/* Ensure we always have a target description. */
29632963
if (!tdesc_has_registers (tdesc))
2964-
tdesc = aarch64_read_description (0);
2964+
tdesc = aarch64_read_description (0, false);
29652965
gdb_assert (tdesc);
29662966

29672967
feature_core = tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.core");
@@ -3190,7 +3190,7 @@ When on, AArch64 specific debugging is enabled."),
31903190
selftests::register_test ("aarch64-process-record",
31913191
selftests::aarch64_process_record_test);
31923192
selftests::record_xml_tdesc ("aarch64.xml",
3193-
aarch64_create_target_description (0));
3193+
aarch64_create_target_description (0, false));
31943194
#endif
31953195
}
31963196

gdb/aarch64-tdep.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ struct gdbarch_tdep
8989
}
9090
};
9191

92-
const target_desc *aarch64_read_description (uint64_t vq);
92+
const target_desc *aarch64_read_description (uint64_t vq, bool pauth_p);
9393

9494
extern int aarch64_process_record (struct gdbarch *gdbarch,
9595
struct regcache *regcache, CORE_ADDR addr);

gdb/arch/aarch64.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@
2222
#include "../features/aarch64-core.c"
2323
#include "../features/aarch64-fpu.c"
2424
#include "../features/aarch64-sve.c"
25+
#include "../features/aarch64-pauth.c"
2526

2627
/* See arch/aarch64.h. */
2728

2829
target_desc *
29-
aarch64_create_target_description (uint64_t vq)
30+
aarch64_create_target_description (uint64_t vq, bool pauth_p)
3031
{
3132
target_desc *tdesc = allocate_target_description ();
3233

@@ -43,5 +44,8 @@ aarch64_create_target_description (uint64_t vq)
4344
else
4445
regnum = create_feature_aarch64_sve (tdesc, regnum, vq);
4546

47+
if (pauth_p)
48+
regnum = create_feature_aarch64_pauth (tdesc, regnum);
49+
4650
return tdesc;
4751
}

gdb/arch/aarch64.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@
2424

2525
/* Create the aarch64 target description. A non zero VQ value indicates both
2626
the presence of SVE and the Vector Quotient - the number of 128bit chunks in
27-
an SVE Z register. */
27+
an SVE Z register. HAS_PAUTH_P indicates the presence of the PAUTH
28+
feature. */
2829

29-
target_desc *aarch64_create_target_description (uint64_t vq);
30+
target_desc *aarch64_create_target_description (uint64_t vq, bool has_pauth_p);
3031

3132
/* Register numbers of various important registers.
3233
Note that on SVE, the Z registers reuse the V register numbers and the V

gdb/doc/ChangeLog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
2019-03-22 Alan Hayward <alan.hayward@arm.com>
2+
Jiong Wang <jiong.wang@arm.com>
3+
4+
* gdb.texinfo (AArch64 Features): Describe pauth feature.
5+
16
2019-03-20 Tom Tromey <tromey@adacore.com>
27

38
* python.texi (Selecting Pretty-Printers): Use @defvar for

gdb/doc/gdb.texinfo

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43162,6 +43162,9 @@ The @samp{org.gnu.gdb.aarch64.sve} feature is optional. If present,
4316243162
it should contain registers @samp{z0} through @samp{z31}, @samp{p0}
4316343163
through @samp{p15}, @samp{ffr} and @samp{vg}.
4316443164

43165+
The @samp{org.gnu.gdb.aarch64.pauth} feature is optional. If present,
43166+
it should contain registers @samp{pauth_dmask} and @samp{pauth_cmask}.
43167+
4316543168
@node ARC Features
4316643169
@subsection ARC Features
4316743170
@cindex target descriptions, ARC Features

gdb/features/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
227227

228228
FEATURE_XMLFILES = aarch64-core.xml \
229229
aarch64-fpu.xml \
230+
aarch64-pauth.xml \
230231
i386/32bit-core.xml \
231232
i386/32bit-sse.xml \
232233
i386/32bit-linux.xml \

0 commit comments

Comments
 (0)