From nobody Tue Mar 17 17:11:41 2026 X-Original-To: dev-commits-src-all@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 4fZz5Z69R9z6VJk5 for ; Tue, 17 Mar 2026 17:11:46 +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 4fZz5Z3fR7z3hp4 for ; Tue, 17 Mar 2026 17:11:46 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1773767506; 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=miu2q3jL+HjfiTXWDrDUeRRkqE5OAnnT4XuWPAX8JRU=; b=U7rbIUu3L5paCv6lYHbpDUF1iyxLPGvIuWj1hKvp1FJcayOOV4et0JIpKplfrQMyI6ogPQ jj294TGvOOrvjy9voYxHr44iSiGDuw2vkWzDSALlC4V6P/zijqucULFqe4nwGnVFgH2hRI sRtSwbh4KA3qn9lUrLNUN0u5l6LdwE/a7UzeOWJLcC34OZ8NY9CE72enAzq2NAcYIqZxmZ iq+TbycdwoTSx8Ds3Jvbk6Gf5EPzjQc7pbszDTZhZzjx3xoRYgaAri7mZsm8agxgAKJZ1x RzKXNe2DQvo0swxefxczSZurMp2kWj92r4J/NEWYc5162G5vUNlZJBMVKrO93Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1773767506; a=rsa-sha256; cv=none; b=ZZ/oFtvdr+irRMfjoviGcw0uuJW25G7kE7mLOqHjvbBycmiDx/RQbh13nFPJHbkIXtiiuo EQuGYbpaMmk7XhM/E6DAZlmCXmR5DkfuKJv2iKda0H+UZxkcrWW35J35a0N2jLrfXs4GCz 8ttW26ya4NdZiQB1AlddiPVULu9RXC4yzTYReaRQ8l1qmGeAH1JJlmGyTJ5f7c5+g2K1Rt YrKyIKUIsGiY5/zVQDL7FrMfyIG/r+N3ndEPxpn4OeoFcDL0jU47rrxv9lPdsw4o+oZgjc oG3sIXH5zmi8QnmMEZ8bXcvJLg6qH+cefzFQaZ+iT8rxiTArTJjIdzJfQobOVg== 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=1773767506; 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=miu2q3jL+HjfiTXWDrDUeRRkqE5OAnnT4XuWPAX8JRU=; b=KbfDhVIu8BjjCw2X+jyp9QfTVrgrlzRhlZIJMRxaiPoXQXz7TWwnb1UbaMNsey7WDJh836 DNrYCfWyBEIP8E5Y5tA/NqkQU1fUhhSkItmGVmbM+v+ryEMLKPDk6AH/q2e+KaoftcrspS R6Qs2a5/GQc+VUq8WH/zRHgaQVJV2smHrUMnlMlsmyJe51h+IeJBFt/hcD3E3TK/sv9wtQ MANWhQFE+bZBoPk7Pzb60sXEPJ1qsprLRLTKT0hBUXJkyjC3ECIJFvx96OV9xN3XBxRePt ga0Zs25vrx7IEGIKx+luP2lyM1hfS7bCx6A7PJPFiQSlFzctMUT5phIwDT7Ogg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fZz5Z3BW2zWpp for ; Tue, 17 Mar 2026 17:11:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 2237d by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 17 Mar 2026 17:11:41 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: 14e97448fceb - main - arm64: Have a common call to userret List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@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/main X-Git-Reftype: branch X-Git-Commit: 14e97448fcebbe4b038eaf5628933abe5f9e690d Auto-Submitted: auto-generated Date: Tue, 17 Mar 2026 17:11:41 +0000 Message-Id: <69b98b4d.2237d.6aa3ea3c@gitrepo.freebsd.org> The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=14e97448fcebbe4b038eaf5628933abe5f9e690d commit 14e97448fcebbe4b038eaf5628933abe5f9e690d Author: Andrew Turner AuthorDate: 2026-03-17 17:10:07 +0000 Commit: Andrew Turner CommitDate: 2026-03-17 17:10:40 +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 --- 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 3ce0b29f0b82..ad461aa1bffc 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; } @@ -416,9 +416,6 @@ bad_far: frame->tf_elr, error); } } - - if (lower) - userret(td, frame); } static void @@ -672,6 +669,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, @@ -699,6 +697,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 @@ -710,7 +709,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 @@ -720,11 +718,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: @@ -746,22 +743,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: @@ -770,12 +763,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: /* @@ -786,7 +777,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); @@ -799,24 +789,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"));