diff options
author | Mike Pall <mike> | 2023-08-12 22:25:40 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2023-08-12 22:25:40 +0200 |
commit | 27af72e66f6a285298d1a9be370779aae945eb14 (patch) | |
tree | 5b12777dac86ab8afbdfd337af020f1d1da0f044 /src/lj_emit_arm64.h | |
parent | 117ddf35e6ef1bb9016881f828337677db493cee (diff) | |
download | luajit-27af72e66f6a285298d1a9be370779aae945eb14.tar.gz luajit-27af72e66f6a285298d1a9be370779aae945eb14.tar.bz2 luajit-27af72e66f6a285298d1a9be370779aae945eb14.zip |
ARM64: Add support for ARM64e pointer authentication codes (PAC).
Contributed by Peter Cawley. #559
Diffstat (limited to 'src/lj_emit_arm64.h')
-rw-r--r-- | src/lj_emit_arm64.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/lj_emit_arm64.h b/src/lj_emit_arm64.h index fcc9c1d8..65463a5e 100644 --- a/src/lj_emit_arm64.h +++ b/src/lj_emit_arm64.h | |||
@@ -348,16 +348,22 @@ static void emit_cnb(ASMState *as, A64Ins ai, Reg r, MCode *target) | |||
348 | 348 | ||
349 | #define emit_jmp(as, target) emit_branch(as, A64I_B, (target)) | 349 | #define emit_jmp(as, target) emit_branch(as, A64I_B, (target)) |
350 | 350 | ||
351 | static void emit_call(ASMState *as, void *target) | 351 | static void emit_call(ASMState *as, ASMFunction target) |
352 | { | 352 | { |
353 | MCode *p = --as->mcp; | 353 | MCode *p = --as->mcp; |
354 | ptrdiff_t delta = (char *)target - (char *)p; | 354 | #if LJ_ABI_PAUTH |
355 | char *targetp = ptrauth_auth_data((char *)target, | ||
356 | ptrauth_key_function_pointer, 0); | ||
357 | #else | ||
358 | char *targetp = (char *)target; | ||
359 | #endif | ||
360 | ptrdiff_t delta = targetp - (char *)p; | ||
355 | if (A64F_S_OK(delta>>2, 26)) { | 361 | if (A64F_S_OK(delta>>2, 26)) { |
356 | *p = A64I_BL | A64F_S26(delta>>2); | 362 | *p = A64I_BL | A64F_S26(delta>>2); |
357 | } else { /* Target out of range: need indirect call. But don't use R0-R7. */ | 363 | } else { /* Target out of range: need indirect call. But don't use R0-R7. */ |
358 | Reg r = ra_allock(as, i64ptr(target), | 364 | Reg r = ra_allock(as, i64ptr(target), |
359 | RSET_RANGE(RID_X8, RID_MAX_GPR)-RSET_FIXED); | 365 | RSET_RANGE(RID_X8, RID_MAX_GPR)-RSET_FIXED); |
360 | *p = A64I_BLR | A64F_N(r); | 366 | *p = A64I_BLR_AUTH | A64F_N(r); |
361 | } | 367 | } |
362 | } | 368 | } |
363 | 369 | ||