ARM64: Add support for ARM64e pointer authentication codes (PAC).
Contributed by Peter Cawley. #559
This commit is contained in:
18
src/lj_err.c
18
src/lj_err.c
@@ -444,10 +444,10 @@ LJ_FUNCA int lj_err_unwind_dwarf(int version, int actions,
|
||||
if ((actions & _UA_FORCE_UNWIND)) {
|
||||
return _URC_CONTINUE_UNWIND;
|
||||
} else if (cf) {
|
||||
ASMFunction ip;
|
||||
_Unwind_SetGR(ctx, LJ_TARGET_EHRETREG, errcode);
|
||||
_Unwind_SetIP(ctx, (uintptr_t)(cframe_unwind_ff(cf) ?
|
||||
lj_vm_unwind_ff_eh :
|
||||
lj_vm_unwind_c_eh));
|
||||
ip = cframe_unwind_ff(cf) ? lj_vm_unwind_ff_eh : lj_vm_unwind_c_eh;
|
||||
_Unwind_SetIP(ctx, (uintptr_t)lj_ptr_strip(ip));
|
||||
return _URC_INSTALL_CONTEXT;
|
||||
}
|
||||
#if LJ_TARGET_X86ORX64
|
||||
@@ -580,9 +580,17 @@ extern void __deregister_frame(const void *);
|
||||
|
||||
uint8_t *lj_err_register_mcode(void *base, size_t sz, uint8_t *info)
|
||||
{
|
||||
void **handler;
|
||||
ASMFunction handler = (ASMFunction)err_unwind_jit;
|
||||
memcpy(info, err_frame_jit_template, sizeof(err_frame_jit_template));
|
||||
handler = (void *)err_unwind_jit;
|
||||
#if LJ_ABI_PAUTH
|
||||
#if LJ_TARGET_ARM64
|
||||
handler = ptrauth_auth_and_resign(handler,
|
||||
ptrauth_key_function_pointer, 0,
|
||||
ptrauth_key_process_independent_code, info + ERR_FRAME_JIT_OFS_HANDLER);
|
||||
#else
|
||||
#error "missing pointer authentication support for this architecture"
|
||||
#endif
|
||||
#endif
|
||||
memcpy(info + ERR_FRAME_JIT_OFS_HANDLER, &handler, sizeof(handler));
|
||||
*(uint32_t *)(info + ERR_FRAME_JIT_OFS_CODE_SIZE) =
|
||||
(uint32_t)(sz - sizeof(err_frame_jit_template) - (info - (uint8_t *)base));
|
||||
|
||||
Reference in New Issue
Block a user