binutils-gdb/gdb/python
Alan Hayward 3d31bc39e6 AArch64 pauth: Indicate unmasked addresses in backtrace
Armv8.3-a Pointer Authentication causes the function return address to be
obfuscated on entry to some functions. GDB must unmask the link register in
order to produce a backtrace.

The following patch adds markers of [PAC] to the bracktrace, to indicate
which addresses needed unmasking.  This includes the backtrace when using MI.

For example, consider the following backtrace:

(gdb) bt
0  0x0000000000400490 in puts@plt ()
1  0x00000000004005dc in foo ("hello") at cbreak-lib.c:6
2  0x0000000000400604 [PAC] in bar () at cbreak-lib.c:12
3  0x0000000000400620 [PAC] in main2 () at cbreak.c:17
4  0x00000000004005b4 in main () at cbreak-3.c:10

The functions in cbreak-lib use pointer auth, which masks the return address
to the previous function, causing the addresses of bar (in the library) and main2
(in the main binary) to require unmasking in order to unwind the backtrace.

An extra bool is added alongside the prev_pc in the frame structure.  At the
point at which the link register is unmasked, the AArch64 port calls into frame
to sets the bool.  This is the most efficient way of doing it.

The marker is also added to the python frame printer, which is always printed if
set.  The marker is not explicitly exposed to the python code.

I expect this will potentially cause issues with some tests in the testsuite
when Armv8.3 pointer authentication is used.  This should be fixed up in the
the future once real hardware is available for full testsuite testing.

gdb/ChangeLog:

        * NEWS: Expand the Pointer Authentication entry.
        * aarch64-tdep.c (aarch64_frame_unmask_address): Rename from this.
        (aarch64_frame_unmask_lr): ... to this.
        (aarch64_prologue_prev_register, aarch64_dwarf2_prev_register):
        Call aarch64_frame_unmask_lr.
        * frame.c (struct frame_info): Add "masked" variable.
        (frame_set_previous_pc_masked) (frame_get_pc_masked): New functions.
        (fprint_frame): Check for masked pc.
        * frame.h (frame_set_previous_pc_masked) (frame_get_pc_masked): New
        declarations.
	* python/py-framefilter.c (py_print_frame): Check for masked pc.
        * stack.c (print_frame): Check for masked pc.

gdb/doc/ChangeLog:

        * gdb.texinfo (AArch64 Pointer Authentication): New subsection.
2019-08-07 13:34:12 +01:00
..
lib/gdb Make first and last lines of 'command help documentation' consistent. 2019-08-07 00:04:33 +02:00
py-all-events.def Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
py-arch.c Rename gdb exception types 2019-04-08 09:05:40 -06:00
py-auto-load.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
py-block.c Add block['var'] accessor 2019-08-05 13:06:18 -05:00
py-bpevent.c Do not include py-ref.h in most files 2019-01-22 20:35:21 -07:00
py-breakpoint.c "catch catch/throw/rethrow", breakpoint -> catchpoint 2019-07-09 19:34:18 +01:00
py-cmd.c Rename gdb exception types 2019-04-08 09:05:40 -06:00
py-continueevent.c Do not include py-ref.h in most files 2019-01-22 20:35:21 -07:00
py-event-types.def Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
py-event.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
py-event.h Normalize include guards in gdb 2019-02-07 03:27:23 -07:00
py-events.h Normalize include guards in gdb 2019-02-07 03:27:23 -07:00
py-evtregistry.c Do not include py-ref.h in most files 2019-01-22 20:35:21 -07:00
py-evts.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
py-exitedevent.c Change inferior_to_inferior_object to return a gdbpy_ref 2019-01-02 16:28:33 -07:00
py-finishbreakpoint.c Rename gdb exception types 2019-04-08 09:05:40 -06:00
py-frame.c Rename gdb exception types 2019-04-08 09:05:40 -06:00
py-framefilter.c AArch64 pauth: Indicate unmasked addresses in backtrace 2019-08-07 13:34:12 +01:00
py-function.c Do not include py-ref.h in most files 2019-01-22 20:35:21 -07:00
py-gdb-readline.c Rename gdb exception types 2019-04-08 09:05:40 -06:00
py-inferior.c Fix use-after-move bug in add_thread_object 2019-07-11 09:15:18 -06:00
py-infevents.c Do not include py-ref.h in most files 2019-01-22 20:35:21 -07:00
py-infthread.c Reduce manual reference counting in py-inferior.c 2019-07-10 12:24:22 -06:00
py-instruction.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
py-instruction.h Normalize include guards in gdb 2019-02-07 03:27:23 -07:00
py-lazy-string.c Rename gdb exception types 2019-04-08 09:05:40 -06:00
py-linetable.c Rename gdb exception types 2019-04-08 09:05:40 -06:00
py-newobjfileevent.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
py-objfile.c Add Objfile.lookup_{global,static}_symbol functions 2019-07-29 20:44:08 -05:00
py-param.c Rename gdb exception types 2019-04-08 09:05:40 -06:00
py-prettyprint.c gdb: Introduce 'print max-depth' feature 2019-04-29 22:01:09 +01:00
py-progspace.c Rename gdb exception types 2019-04-08 09:05:40 -06:00
py-record-btrace.c Don't include gdbarch.h from defs.h 2019-07-10 14:53:53 -06:00
py-record-btrace.h Normalize include guards in gdb 2019-02-07 03:27:23 -07:00
py-record-full.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
py-record-full.h Normalize include guards in gdb 2019-02-07 03:27:23 -07:00
py-record.c Rename gdb exception types 2019-04-08 09:05:40 -06:00
py-record.h Normalize include guards in gdb 2019-02-07 03:27:23 -07:00
py-ref.h Rename common to gdbsupport 2019-07-09 07:45:38 -06:00
py-signalevent.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
py-stopevent.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
py-stopevent.h Normalize include guards in gdb 2019-02-07 03:27:23 -07:00
py-symbol.c [PR/24474] Add gdb.lookup_static_symbol to the python API 2019-07-30 11:04:37 -05:00
py-symtab.c More block constification 2019-03-24 23:32:08 -06:00
py-threadevent.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
py-type.c Rename common to gdbsupport 2019-07-09 07:45:38 -06:00
py-unwind.c Rename gdb exception types 2019-04-08 09:05:40 -06:00
py-utils.c Make exception handling more efficient 2019-04-25 12:59:35 -06:00
py-value.c gdb: Introduce 'print max-depth' feature 2019-04-29 22:01:09 +01:00
py-varobj.c Do not include py-ref.h in most files 2019-01-22 20:35:21 -07:00
py-xmethods.c Do not include py-ref.h in most files 2019-01-22 20:35:21 -07:00
python-config.py
python-internal.h [PR/24474] Add gdb.lookup_static_symbol to the python API 2019-07-30 11:04:37 -05:00
python.c [PR/24474] Add gdb.lookup_static_symbol to the python API 2019-07-30 11:04:37 -05:00
python.h Normalize include guards in gdb 2019-02-07 03:27:23 -07:00