mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-24 06:10:12 +00:00
[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 llvm-svn: 349339
This commit is contained in:
parent
490ae11717
commit
357973192d
@ -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
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user