aboutsummaryrefslogtreecommitdiff
path: root/src/lj_emit_arm64.h
diff options
context:
space:
mode:
authorMike Pall <mike>2023-08-12 22:25:40 +0200
committerMike Pall <mike>2023-08-12 22:25:40 +0200
commit27af72e66f6a285298d1a9be370779aae945eb14 (patch)
tree5b12777dac86ab8afbdfd337af020f1d1da0f044 /src/lj_emit_arm64.h
parent117ddf35e6ef1bb9016881f828337677db493cee (diff)
downloadluajit-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.h12
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
351static void emit_call(ASMState *as, void *target) 351static 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