From db3a1eec371f8c2c060805dbe93eaf76aa92c5f8 Mon Sep 17 00:00:00 2001 From: Andrew Turner Date: Wed, 29 Dec 2021 17:40:42 +0000 Subject: [PATCH] Rework the arm64 sigtramp code to be a trampoline To help with switching to a vdso sigtramp switch to passing through the sigcode function when entering a signal. This ensures the return address is within the function. Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D33690 --- sys/arm64/arm64/exec_machdep.c | 5 ++--- sys/arm64/arm64/sigtramp.S | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sys/arm64/arm64/exec_machdep.c b/sys/arm64/arm64/exec_machdep.c index b60909c9594..c8e333f330c 100644 --- a/sys/arm64/arm64/exec_machdep.c +++ b/sys/arm64/arm64/exec_machdep.c @@ -624,10 +624,9 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) tf->tf_x[0] = sig; tf->tf_x[1] = (register_t)&fp->sf_si; tf->tf_x[2] = (register_t)&fp->sf_uc; - - tf->tf_elr = (register_t)catcher; + tf->tf_x[8] = (register_t)catcher; tf->tf_sp = (register_t)fp; - tf->tf_lr = (register_t)p->p_sysent->sv_sigcode_base; + tf->tf_elr = (register_t)p->p_sysent->sv_sigcode_base; /* Clear the single step flag while in the signal handler */ if ((td->td_pcb->pcb_flags & PCB_SINGLE_STEP) != 0) { diff --git a/sys/arm64/arm64/sigtramp.S b/sys/arm64/arm64/sigtramp.S index b06ec6fa109..a9ad10da766 100644 --- a/sys/arm64/arm64/sigtramp.S +++ b/sys/arm64/arm64/sigtramp.S @@ -31,6 +31,7 @@ #include ENTRY(sigcode) + blr x8 mov x0, sp add x0, x0, #SF_UC