From nobody Mon May 12 12:50:27 2025 X-Original-To: dev-commits-src-main@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 4Zwzwh5cZvz5w0n1; Mon, 12 May 2025 12:50:28 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Zwzwh1zfWz3rKB; Mon, 12 May 2025 12:50:28 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1747054228; 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=M0+gNM2OHZMIM3PWitbBNjAgNQjud2jXv/D18keJiQY=; b=tQMd2sG7T9JcgXE1aJqOFm1jA1ACitUen2aWTRtjjGLMzPQjopooJF4KROvZOr1dXwPwHH I6iZxwZ4DNSkhRChBmUXe6IqfbGrCo7PT37FnWd1F5wFIsRAo07njK94R5YkDpXYbViJEf vDnjwsSbqMSpdKV+6UiZu9xZU9zFOZbD+8CBrSVM2XwilCNBCDIuqZkyy6B5x8UeFU8JgX j1Piu2JxMowOkdNtCGtuDINqo1GnrmBehzvE/E6D0p/WBlTjcb0AVVj3WUk8HiBzpf8AMW emh/uEEhKT3kqjrSPOSanw9+VtNFMLd5Et29C88Nza44XZU53m3qZL8JfJIpUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1747054228; 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=M0+gNM2OHZMIM3PWitbBNjAgNQjud2jXv/D18keJiQY=; b=wsndGD41aJdot0dEMg36ezCL0KEPYVUp/E0yEwiEWsV2jgTojVsO0G5j/QX4Our8nAdM7U /oL8PqhMY/FF9K0Q6rxw8pyKaeeDgv4azBDMzTat9Y29+Yd2kolFpx0KEoi7iY1Gi0PZ2R CGrPC1bH9Q0uWk6ZlREINiKGY1x+OBUG2rGkLbtz2s2gwHFKtAZ/z5bcUwhTJrdY4S4Zve fp8z88rPZMqamKh/Cafg51cBXtjSAN29Xs2ugF2sBLHdJWCCBjBaWmyBPcyJ/w6VBHvvbI iNw4vMTiSQNkrIMrwylESr78qo4mMKMqtW7CeO2DmG6z3eMJzLH9ca+Yev4oxA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1747054228; a=rsa-sha256; cv=none; b=wlZIb1hIMwYgsN+11+JWl00UZp7hAlSTF36vnJSQ5QT49SaE4UOh9SgubetDgxzsPoaFwd 9lgzkhIEZsduDXmGXP/NE+1x4GVX6ZTwIkeq9y+0Vh09cCgn4ct1XZ3eNwwBv1Q6quYk31 Pbh4KFMKb4brekWqzkuaNSrPyFHm5b84MWHbI2XpTrGFvgfJXk92bAsWvgycIYTVYslXfN GnFowFZsDukfaXVc5/nvuJHKFND0ylCdTSARYLr/XkRk6g0F59FO9i0y1kr846zMKekweI tLK1XRo3/VmXXt5F4kcLsuSvgY4WyKt1oX/Z6NMttP80ZSTuF8+fHuj/LnhGwA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Zwzwg6Wg4z1Fyw; Mon, 12 May 2025 12:50:27 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 54CCoRRo083068; Mon, 12 May 2025 12:50:27 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 54CCoR3r083065; Mon, 12 May 2025 12:50:27 GMT (envelope-from git) Date: Mon, 12 May 2025 12:50:27 GMT Message-Id: <202505121250.54CCoR3r083065@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: 5bcd16cced3b - main - arm64: Use the new sys handler for ID regs List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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: 5bcd16cced3b57d16e5c0973641c31acba4e1f64 Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=5bcd16cced3b57d16e5c0973641c31acba4e1f64 commit 5bcd16cced3b57d16e5c0973641c31acba4e1f64 Author: Andrew Turner AuthorDate: 2025-05-12 11:07:09 +0000 Commit: Andrew Turner CommitDate: 2025-05-12 11:07:09 +0000 arm64: Use the new sys handler for ID regs Switch to the new sys instruction handling for the ID registers. Reviewed by: harry.moulton_arm.com Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D50211 --- sys/arm64/arm64/identcpu.c | 75 ++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/sys/arm64/arm64/identcpu.c b/sys/arm64/arm64/identcpu.c index c4eaaaafc279..508ea0d472d3 100644 --- a/sys/arm64/arm64/identcpu.c +++ b/sys/arm64/arm64/identcpu.c @@ -2384,48 +2384,49 @@ user_ctr_handler(vm_offset_t va, uint32_t insn, struct trapframe *frame, return (1); } -static int -user_mrs_handler(vm_offset_t va, uint32_t insn, struct trapframe *frame, - uint32_t esr) +static bool +user_idreg_handler(uint64_t esr, struct trapframe *frame) { uint64_t value; - int CRm, Op2, i, reg; + int reg; - if ((insn & MRS_MASK) != MRS_VALUE) - return (0); + if (ESR_ELx_EXCEPTION(esr) != EXCP_MSR) + return (false); + + /* Only support reading from ID registers */ + if ((esr & ISS_MSR_DIR) == 0) + return (false); /* - * We only emulate Op0 == 3, Op1 == 0, CRn == 0, CRm == {0, 4-7}. - * These are in the EL1 CPU identification space. - * CRm == 0 holds MIDR_EL1, MPIDR_EL1, and REVID_EL1. - * CRm == {4-7} holds the ID_AA64 registers. + * This only handles the ID register space and a few registers that + * are safe to pass through to userspace. * - * For full details see the ARMv8 ARM (ARM DDI 0487C.a) - * Table D9-2 System instruction encodings for non-Debug System - * register accesses. + * These registers are all in the space op0 == 3, op1 == 0, + * CRn == 0. We support the following CRm: + * - CRm == 0: midr_el1, mpidr_el1, and revidr_el1. + * - CRm in {4-7}: sanitized ID registers. + * + * Registers in the ID register space (CRm in {4-7}) are all + * read-only and have either defined fields, or are read as + * zero (RAZ). For these we return 0 for any unknown register. */ - if (mrs_Op0(insn) != 3 || mrs_Op1(insn) != 0 || mrs_CRn(insn) != 0) - return (0); - - CRm = mrs_CRm(insn); - if (CRm > 7 || (CRm < 4 && CRm != 0)) - return (0); + if (ISS_MSR_OP0(esr) != 3 || ISS_MSR_OP1(esr) != 0 || + ISS_MSR_CRn(esr) != 0) + return (false); - Op2 = mrs_Op2(insn); value = 0; - - for (i = 0; i < nitems(user_regs); i++) { - if (user_regs[i].CRm == CRm && user_regs[i].Op2 == Op2) { - if (SV_CURPROC_ABI() == SV_ABI_FREEBSD) - value = CPU_DESC_FIELD(user_cpu_desc, i); - else - value = CPU_DESC_FIELD(l_user_cpu_desc, i); - break; + if (ISS_MSR_CRm(esr) >= 4 && ISS_MSR_CRm(esr) <= 7) { + for (int i = 0; i < nitems(user_regs); i++) { + if (user_regs[i].iss == (esr & ISS_MSR_REG_MASK)) { + if (SV_CURPROC_ABI() == SV_ABI_FREEBSD) + value = CPU_DESC_FIELD(user_cpu_desc, i); + else + value = CPU_DESC_FIELD(l_user_cpu_desc, i); + break; + } } - } - - if (CRm == 0) { - switch (Op2) { + } else if (ISS_MSR_CRm(esr) == 0) { + switch (ISS_MSR_OP2(esr)) { case 0: value = READ_SPECIALREG(midr_el1); break; @@ -2436,8 +2437,10 @@ user_mrs_handler(vm_offset_t va, uint32_t insn, struct trapframe *frame, value = READ_SPECIALREG(revidr_el1); break; default: - return (0); + return (false); } + } else { + return (false); } /* @@ -2446,7 +2449,7 @@ user_mrs_handler(vm_offset_t va, uint32_t insn, struct trapframe *frame, */ frame->tf_elr += INSN_SIZE; - reg = MRS_REGISTER(insn); + reg = ISS_MSR_Rt(esr); /* If reg is 31 then write to xzr, i.e. do nothing */ if (reg == 31) return (1); @@ -2456,7 +2459,7 @@ user_mrs_handler(vm_offset_t va, uint32_t insn, struct trapframe *frame, else if (reg == 30) frame->tf_lr = value; - return (1); + return (true); } /* @@ -2795,7 +2798,7 @@ identify_cpu_sysinit(void *dummy __unused) #endif install_undef_handler(user_ctr_handler); - install_undef_handler(user_mrs_handler); + install_sys_handler(user_idreg_handler); } SYSINIT(identify_cpu, SI_SUB_CPU, SI_ORDER_MIDDLE, identify_cpu_sysinit, NULL);