Enable ARMv8.1-m PACBTI support

This set of changes enable support for the ARMv8.1-m PACBTI extensions [1].

The goal of the PACBTI extensions is similar in scope to that of a-profile
PAC/BTI (aarch64 only), but the underlying implementation is different.

One important difference is that the pointer authentication code is stored
in a separate register, thus we don't need to mask/unmask the return address
from a function in order to produce a correct backtrace.

The patch introduces the following modifications:

- Extend the prologue analyser for 32-bit ARM to handle some instructions
from ARMv8.1-m PACBTI: pac, aut, pacg, autg and bti. Also keep track of
return address signing/authentication instructions.

- Adds code to identify object file attributes that indicate the presence of
ARMv8.1-m PACBTI (Tag_PAC_extension, Tag_BTI_extension, Tag_PACRET_use and
Tag_BTI_use).

- Adds support for DWARF pseudo-register RA_AUTH_CODE, as described in the
aadwarf32 [2].

- Extends the dwarf unwinder to track the value of RA_AUTH_CODE.

- Decorates backtraces with the "[PAC]" identifier when a frame has signed
the return address.

- Makes GDB aware of a new XML feature "org.gnu.gdb.arm.m-profile-pacbti". This
feature is not included as an XML file on GDB's side because it is only
supported for bare metal targets.

- Additional documentation.

[1] https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/armv8-1-m-pointer-authentication-and-branch-target-identification-extension
[2] https://github.com/ARM-software/abi-aa/blob/main/aadwarf32/aadwarf32.rst
This commit is contained in:
Luis Machado
2021-11-01 17:14:26 -03:00
committed by Luis Machado
parent c8154ce0d6
commit a01567f4f7
4 changed files with 247 additions and 20 deletions

View File

@@ -21,6 +21,19 @@
#include "gdbsupport/tdesc.h"
/* Prologue helper macros for ARMv8.1-m PACBTI. */
#define IS_PAC(instruction) (instruction == 0xf3af801d)
#define IS_PACBTI(instruction) (instruction == 0xf3af800d)
#define IS_BTI(instruction) (instruction == 0xf3af800f)
#define IS_PACG(instruction) ((instruction & 0xfff0f0f0) == 0xfb60f000)
#define IS_AUT(instruction) (instruction == 0xf3af802d)
#define IS_AUTG(instruction) ((instruction & 0xfff00ff0) == 0xfb500f00)
/* DWARF register numbers according to the AADWARF32 document. */
enum arm_dwarf_regnum {
ARM_DWARF_RA_AUTH_CODE = 143
};
/* Register numbers of various important registers. */
enum gdb_regnum {