From nobody Wed Apr 08 14:01:43 2026 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4frPr81hX6z6YBJT for ; Wed, 08 Apr 2026 14:01:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4frPr72y3Mz3gMM for ; Wed, 08 Apr 2026 14:01:43 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775656903; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=gGuHWP03WkhH40tZxqAfjcrSpifYAV70B3stec8vdXo=; b=rNm9XXyvXOSL7uwF/wlBMyVy87mGYRI5dcDWq8SB7md7XBdGvMk3vLpVQ8JxhV7sJe539x nYcBVOM61IJnBu/A6kBj1GBiT4LcRIxJRzyYSS6oHa8b8Uy5V7AIFVbmvxGl1PZBltAOkL oD3z+0+kKsLH2ry2nMnO+B6kcdIRKtxDTXDCe/GPq4ps9iIi1881PTEkaiq45y+iKOzQYO zme6E0Y4mLC/vgTD+wp/yVMrnNFJt6GBfeK2o3yKUd35RmAbok/Q/6/if5CS9I+NS5UjXQ jLb2WQHZ9vKXjBaxXdE+y9SiZ33KBF9BUVdul9DO4zb1MACgYcsDrAOFXGAf+A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1775656903; a=rsa-sha256; cv=none; b=KGSgdV3mZ4jvgop0tVfSSPtFAlH4Vt+aLfeLhGs85uUopeLkhdaczEF6JSeAhtgt4p1SsE dluCQ4dnhpKt3gNQWbjnfJEm4JeTuknOGTyDPKWUFyeWHTRl/SLKppIQ+8oTB54r3sqeNF r59RYdfc50MlcL6LbDFCXvbUjoeBetj2h62YQIYsC0TkFjvhW88lPJF7st5oA4Ju4ezT7A Qk7RM5lq9R2OHE2wG43mhZMs7p1tNLlm8FYqwSrZ9EiD1g4MTlHqqyjplojl3+fyONm1Bs 7XMqX3ZTTOvr+MqrwX7cJiGrt9ma2JHwPrSPWE27uxSQoUn1TNMrL36ZIfy82Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775656903; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=gGuHWP03WkhH40tZxqAfjcrSpifYAV70B3stec8vdXo=; b=CigaGLtefjlT3zpXd3YMO2HEortgjWcpwRbRunzX2EZidueJdor0Mb1tjf0Fqd9zSnRuU0 NZ6IDY/ii/FmNWutJ7JyJiWT2oACwIsA/GRem8tv1SeoY/DW475VchlXkzN2iECUr9+0rg 7vz490i7OQyHkweD9bfZesj23HRtPmvSHv4TcaqStko+Kib9L8jsJSpqqG4BlKdkkbFJA+ hq8CXUcis3LdrdKGehMzvT9DFEY99UUpSvxpHwhXOAMzqCcH2I4nihUd+w+ykj/jT8G8mQ U9T/b+mpP9o1mhwP2Ncst135UeCGyVKdG9wkIKKH9TUrPSsGLTY5KXv7+/tcWA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4frPr71rQBzDWC for ; Wed, 08 Apr 2026 14:01:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3b799 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 08 Apr 2026 14:01:43 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Andrew Turner Subject: git: f6f5d927bf75 - stable/15 - arm64: Have a common call to userret List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: f6f5d927bf756810bb16c5f90540453eb309eb21 Auto-Submitted: auto-generated Date: Wed, 08 Apr 2026 14:01:43 +0000 Message-Id: <69d65fc7.3b799.4acab9ef@gitrepo.freebsd.org> The branch stable/15 has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=f6f5d927bf756810bb16c5f90540453eb309eb21 commit f6f5d927bf756810bb16c5f90540453eb309eb21 Author: Andrew Turner AuthorDate: 2026-03-17 17:10:07 +0000 Commit: Andrew Turner CommitDate: 2026-04-08 13:59:54 +0000 arm64: Have a common call to userret Rather than each exception calling userret use a common copy. As syscallret already calls userret we need to skip it in that case. Reviewed by: kib Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D55250 (cherry picked from commit 14e97448fcebbe4b038eaf5628933abe5f9e690d) --- sys/arm64/arm64/trap.c | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/sys/arm64/arm64/trap.c b/sys/arm64/arm64/trap.c index b3c68fa4826f..867e5c57f8e5 100644 --- a/sys/arm64/arm64/trap.c +++ b/sys/arm64/arm64/trap.c @@ -193,17 +193,19 @@ test_bs_fault(void *addr) addr == &generic_bs_poke_8f); } -static void +static bool svc_handler(struct thread *td, struct trapframe *frame) { if ((frame->tf_esr & ESR_ELx_ISS_MASK) == 0) { syscallenter(td); syscallret(td); + /* Skip userret as syscallret already called it */ + return (true); } else { call_trapsignal(td, SIGILL, ILL_ILLOPN, (void *)frame->tf_elr, ESR_ELx_EXCEPTION(frame->tf_esr)); - userret(td, frame); + return (false); } } @@ -220,7 +222,6 @@ align_abort(struct thread *td, struct trapframe *frame, uint64_t esr, call_trapsignal(td, SIGBUS, BUS_ADRALN, (void *)frame->tf_elr, ESR_ELx_EXCEPTION(frame->tf_esr)); - userret(td, frame); } @@ -231,7 +232,6 @@ external_abort(struct thread *td, struct trapframe *frame, uint64_t esr, if (lower) { call_trapsignal(td, SIGBUS, BUS_OBJERR, (void *)far, ESR_ELx_EXCEPTION(frame->tf_esr)); - userret(td, frame); return; } @@ -411,9 +411,6 @@ bad_far: frame->tf_elr, error); } } - - if (lower) - userret(td, frame); } static void @@ -667,6 +664,7 @@ do_el0_sync(struct thread *td, struct trapframe *frame) uint32_t exception; uint64_t esr, far; int dfsc; + bool skip_userret; /* Check we have a sane environment when entering from userland */ KASSERT((uintptr_t)get_pcpu() >= VM_MIN_KERNEL_ADDRESS, @@ -694,6 +692,7 @@ do_el0_sync(struct thread *td, struct trapframe *frame) CTR4(KTR_TRAP, "%s: exception=%lu, elr=0x%lx, esr=0x%lx", __func__, exception, frame->tf_elr, esr); + skip_userret = false; switch (exception) { case EXCP_FP_SIMD: #ifdef VFP @@ -705,7 +704,6 @@ do_el0_sync(struct thread *td, struct trapframe *frame) case EXCP_TRAP_FP: #ifdef VFP fpe_trap(td, (void *)frame->tf_elr, esr); - userret(td, frame); #else panic("VFP exception in userland"); #endif @@ -715,11 +713,10 @@ do_el0_sync(struct thread *td, struct trapframe *frame) if (!sve_restore_state(td)) call_trapsignal(td, SIGILL, ILL_ILLTRP, (void *)frame->tf_elr, exception); - userret(td, frame); break; case EXCP_SVC32: case EXCP_SVC64: - svc_handler(td, frame); + skip_userret = svc_handler(td, frame); break; case EXCP_INSN_ABORT_L: case EXCP_DATA_ABORT_L: @@ -741,22 +738,18 @@ do_el0_sync(struct thread *td, struct trapframe *frame) if (!undef_insn(frame)) call_trapsignal(td, SIGILL, ILL_ILLTRP, (void *)far, exception); - userret(td, frame); break; case EXCP_FPAC: call_trapsignal(td, SIGILL, ILL_ILLOPN, (void *)frame->tf_elr, exception); - userret(td, frame); break; case EXCP_SP_ALIGN: call_trapsignal(td, SIGBUS, BUS_ADRALN, (void *)frame->tf_sp, exception); - userret(td, frame); break; case EXCP_PC_ALIGN: call_trapsignal(td, SIGBUS, BUS_ADRALN, (void *)frame->tf_elr, exception); - userret(td, frame); break; case EXCP_BRKPT_EL0: case EXCP_BRK: @@ -765,12 +758,10 @@ do_el0_sync(struct thread *td, struct trapframe *frame) #endif /* COMPAT_FREEBSD32 */ call_trapsignal(td, SIGTRAP, TRAP_BRKPT, (void *)frame->tf_elr, exception); - userret(td, frame); break; case EXCP_WATCHPT_EL0: call_trapsignal(td, SIGTRAP, TRAP_TRACE, (void *)far, exception); - userret(td, frame); break; case EXCP_MSR: /* @@ -781,7 +772,6 @@ do_el0_sync(struct thread *td, struct trapframe *frame) if (!undef_insn(frame)) call_trapsignal(td, SIGILL, ILL_PRVOPC, (void *)frame->tf_elr, exception); - userret(td, frame); break; case EXCP_SOFTSTP_EL0: PROC_LOCK(td->td_proc); @@ -794,24 +784,22 @@ do_el0_sync(struct thread *td, struct trapframe *frame) PROC_UNLOCK(td->td_proc); call_trapsignal(td, SIGTRAP, TRAP_TRACE, (void *)frame->tf_elr, exception); - userret(td, frame); break; case EXCP_BTI: call_trapsignal(td, SIGILL, ILL_ILLOPC, (void *)frame->tf_elr, exception); - userret(td, frame); break; case EXCP_MOE: handle_moe(td, frame, esr); - userret(td, frame); break; default: call_trapsignal(td, SIGBUS, BUS_OBJERR, (void *)frame->tf_elr, exception); - userret(td, frame); break; } + if (!skip_userret) + userret(td, frame); KASSERT( (td->td_pcb->pcb_fpflags & ~(PCB_FP_USERMASK|PCB_FP_SVEVALID)) == 0, ("Kernel VFP flags set while entering userspace"));