summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Cheeseman <luke.cheeseman@arm.com>2018-12-17 11:43:24 +0000
committerLuke Cheeseman <luke.cheeseman@arm.com>2018-12-17 11:43:24 +0000
commit0930d6cee2caf71685a84b648f85a2f80bc182c4 (patch)
treebaa94c4dd56225b4bee5da58607ae96cf3b420a9
parent96fa50101690f48f0e7a7ffe363a5612d9ecac41 (diff)
downloadlibunwind_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.hpp10
-rw-r--r--src/DwarfParser.hpp11
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;