AArch64: Treat pauth ops as nops on non-pauth systems
authorAlan Hayward <alan.hayward@arm.com>
Wed, 22 May 2019 13:02:17 +0000 (14:02 +0100)
committerAlan Hayward <alan.hayward@arm.com>
Wed, 22 May 2019 13:35:25 +0000 (14:35 +0100)
Running an address signed binary through GDB on a non pauth system
gives the following error:
Call Frame Instruction op 45 in vendor extension space is not handled on this architecture.

Instead GDB should ignore the op, treating it as a nop.

Add test case for pauth binaries, regardless of whether the target
supports it.

gdb/ChangeLog:

* aarch64-tdep.c (aarch64_execute_dwarf_cfa_vendor_op): Treat
DW_CFA_AARCH64_negate_ra_state as nop on non pauth targets.

gdb/testsuite/ChangeLog:

* gdb.arch/aarch64-pauth.c: New test.
* gdb.arch/aarch64-pauth.exp: New file.

gdb/ChangeLog
gdb/aarch64-tdep.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.arch/aarch64-pauth.c [new file with mode: 0644]
gdb/testsuite/gdb.arch/aarch64-pauth.exp [new file with mode: 0644]

index 52fc11d8f4939dc10dd12ec90b7d45acbde7d9c3..34d97c826650a72f41791cfa3fa2e43ba110b8f3 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-22  Alan Hayward  <alan.hayward@arm.com>
+
+       * aarch64-tdep.c (aarch64_execute_dwarf_cfa_vendor_op): Treat
+       DW_CFA_AARCH64_negate_ra_state as nop on non pauth targets.
+
 2019-05-22  Alan Hayward  <alan.hayward@arm.com>
 
        * NEWS: Add debugredirect and testsuite sections.
index bbb2a25f956c3b09ba199143d5439e2a135fe719..96ebce4c352cb694da9b5cf821be5395721dcd62 100644 (file)
@@ -1180,8 +1180,12 @@ aarch64_execute_dwarf_cfa_vendor_op (struct gdbarch *gdbarch, gdb_byte op,
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   struct dwarf2_frame_state_reg *ra_state;
 
-  if (tdep->has_pauth () && op == DW_CFA_AARCH64_negate_ra_state)
+  if (op == DW_CFA_AARCH64_negate_ra_state)
     {
+      /* On systems without pauth, treat as a nop.  */
+      if (!tdep->has_pauth ())
+       return true;
+
       /* Allocate RA_STATE column if it's not allocated yet.  */
       fs->regs.alloc_regs (AARCH64_DWARF_PAUTH_RA_STATE + 1);
 
index 867455f7a58d40456f7dabe6aa4ef3d59d3df4ea..62adbd7f2ca6f15350bd697c55ed22d27c4e844b 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-22  Alan Hayward  <alan.hayward@arm.com>
+
+       * gdb.arch/aarch64-pauth.c: New test.
+       * gdb.arch/aarch64-pauth.exp: New file.
+
 2019-05-22  Alan Hayward  <alan.hayward@arm.com>
 
        * README (Re-running Tests Outside The Testsuite): New section.
diff --git a/gdb/testsuite/gdb.arch/aarch64-pauth.c b/gdb/testsuite/gdb.arch/aarch64-pauth.c
new file mode 100644 (file)
index 0000000..af9bbe4
--- /dev/null
@@ -0,0 +1,36 @@
+/* This test program is part of GDB, the GNU debugger.
+
+   Copyright 2019 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+int
+bar (int b)
+{
+  int x = 1; /* break here.  */
+  return b - x;
+}
+
+int
+foo (int a)
+{
+  int y = bar (9);
+  return a + y;
+}
+
+int
+main ()
+{
+  foo (5);
+}
diff --git a/gdb/testsuite/gdb.arch/aarch64-pauth.exp b/gdb/testsuite/gdb.arch/aarch64-pauth.exp
new file mode 100644 (file)
index 0000000..ff1bf26
--- /dev/null
@@ -0,0 +1,43 @@
+# Copyright (C) 2019 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test a binary with address signing works regardless of whether the target
+# supports pauth instructions.  On non pauth systems, all pauth instructions
+# are treated as nops.
+
+if {![is_aarch64_target]} {
+    verbose "Skipping ${gdb_test_file_name}."
+    return
+}
+
+# Build program with address signing forced on.
+standard_testfile
+set compile_flags {debug}
+lappend compile_flags "additional_flags=-msign-return-address=all"
+lappend compile_flags "additional_flags=-fno-inline"
+if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} ${compile_flags}] } {
+    return -1
+}
+
+if ![runto_main] {
+    untested "could not run to main"
+    return -1
+}
+
+gdb_breakpoint [ gdb_get_line_number "break here" ]
+gdb_continue_to_breakpoint "break here" ".*break here.*"
+
+# Ensure we can get a full backtrace, despite the address signing.
+gdb_test "bt" "^bt\r\n#0 +bar *\\(b=9\\) +at.*\r\n#1 +0x\[0-9a-f\]* +in +foo \\(a=5\\).*\r\n#2 +0x\[0-9a-f\]* +in +main \\(\\).*" "backtrace"