diff options
author | Luke Cheeseman <luke.cheeseman@arm.com> | 2018-12-17 11:43:24 +0000 |
---|---|---|
committer | Luke Cheeseman <luke.cheeseman@arm.com> | 2018-12-17 11:43:24 +0000 |
commit | 0930d6cee2caf71685a84b648f85a2f80bc182c4 (patch) | |
tree | baa94c4dd56225b4bee5da58607ae96cf3b420a9 | |
parent | 96fa50101690f48f0e7a7ffe363a5612d9ecac41 (diff) | |
download | libunwind_llvm-0930d6cee2caf71685a84b648f85a2f80bc182c4.tar.gz |
[AArch64][libunwind] Unwinding support for return address signing with B Key
- Support for the case where the return address has been signed with the B key
- When the B key is used, a 'B' character is present in the augmentation string
of CIE associated with the FDE for the function.
Differential Revision: https://reviews.llvm.org/D55704
git-svn-id: https://llvm.org/svn/llvm-project/libunwind/trunk@349339 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | src/DwarfInstructions.hpp | 10 | ||||
-rw-r--r-- | src/DwarfParser.hpp | 11 |
2 files changed, 18 insertions, 3 deletions
diff --git a/src/DwarfInstructions.hpp b/src/DwarfInstructions.hpp index 2bf19c5..1d35b22 100644 --- a/src/DwarfInstructions.hpp +++ b/src/DwarfInstructions.hpp @@ -211,9 +211,13 @@ int DwarfInstructions<A, R>::stepWithDwarf(A &addressSpace, pint_t pc, register unsigned long long x17 __asm("x17") = returnAddress; register unsigned long long x16 __asm("x16") = cfa; - // This is the autia1716 instruction. The hint instruction is used here - // as gcc does not assemble autia1716 for pre armv8.3a targets. - asm("hint 0xc": "+r"(x17): "r"(x16)); + // These are the autia1716/autib1716 instructions. The hint instructions + // are used here as gcc does not assemble autia1716/autib1716 for pre + // armv8.3a targets. + if (cieInfo.addressesSignedWithBKey) + asm("hint 0xe" : "+r"(x17) : "r"(x16)); // autib1716 + else + asm("hint 0xc" : "+r"(x17) : "r"(x16)); // autia1716 returnAddress = x17; #endif } diff --git a/src/DwarfParser.hpp b/src/DwarfParser.hpp index 68506a3..9de2898 100644 --- a/src/DwarfParser.hpp +++ b/src/DwarfParser.hpp @@ -49,6 +49,9 @@ public: bool isSignalFrame; bool fdesHaveAugmentationData; uint8_t returnAddressRegister; +#if defined(_LIBUNWIND_TARGET_AARCH64) + bool addressesSignedWithBKey; +#endif }; /// Information about an FDE (Frame Description Entry) @@ -263,6 +266,9 @@ const char *CFI_Parser<A>::parseCIE(A &addressSpace, pint_t cie, cieInfo->dataAlignFactor = 0; cieInfo->isSignalFrame = false; cieInfo->fdesHaveAugmentationData = false; +#if defined(_LIBUNWIND_TARGET_AARCH64) + cieInfo->addressesSignedWithBKey = false; +#endif cieInfo->cieStart = cie; pint_t p = cie; pint_t cieLength = (pint_t)addressSpace.get32(p); @@ -326,6 +332,11 @@ const char *CFI_Parser<A>::parseCIE(A &addressSpace, pint_t cie, case 'S': cieInfo->isSignalFrame = true; break; +#if defined(_LIBUNWIND_TARGET_AARCH64) + case 'B': + cieInfo->addressesSignedWithBKey = true; + break; +#endif default: // ignore unknown letters break; |