From nobody Tue Feb 04 12:26:34 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 4YnMzt6Tycz5mkHc; Tue, 04 Feb 2025 12:26:34 +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 4YnMzt5zZmz3bNv; Tue, 04 Feb 2025 12:26:34 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738671994; 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=dTr88lkmFoXEKUBnNV3nHW6gbKu+xwMuLqGjolff02U=; b=BR6rh5tkYO10SadB7/z3Cchdiw1uUcowtADxxqxK+rr672EGbNvK/mbpn8ot2TC+H/1B6X N/vDT51/pFqfrfqbit8yFbn4scXDZTg7G+9hIn1bSEJJMGzU6S2CT39nQ+gRMBEKBK0hOI pYpfp+26SDFubAlpBXyNV8SBKddY4UYeZusAvopAJps6bTvDwnosEZtY8WVgiHpjLX8izY XMampzpORlnGBjqvVjpuN513emeuCAKnk+rZkpp3lxmxV/jJD5cm4kL5m+Ud0saWyBD3H9 uI3F5aFBOHxPw9LNvXqBFBAFBd+ZoEUmDmjFAC/juXvr9l6mWxnkuPh20xK5Ww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738671994; 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=dTr88lkmFoXEKUBnNV3nHW6gbKu+xwMuLqGjolff02U=; b=bYRoPB3DoFOibEAZPKC7d2pwyUma/JDu8QbzJUtKauyuAX5pBA8+9JvAf1SE9n7Zstdx8J e63aMIpkkXx2ttuS/ZcLXYP8F/OLdljr4jcpxWhwHZNQctX/JIa4/7Ys5U6qYt0B6kZvxJ JS88rF8pGqT0+JtcZVt8RzWHoidgYuemjhyisCGofLvl28QL/I0flNhc5dPW4baVVHAV1g y4XQ514A1DvaYRVQ50XJc611jtYRsf/HxlQpZaSgpFczhM8n5xLLzXcMCBm8HT1+wXRCMc 1C5shmuS4K1R2rYBBy6895YNIcb/mI7mwq+nLDQ8RC/4h5gRBcCaUlXflOAAqg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1738671994; a=rsa-sha256; cv=none; b=d+71gCpQMFdixEW11WMhfRWTqu7X9vYUZOj3nHjbr4MlHAWrW/O5ABaxbjAMAadpku98w+ 4AqeN84j6raBgmaYPXMFCUU5l6t/sQip/rFjbkZy0ui9E9BwkUrmMuFekdRv8BkPEnWcc9 PgK0d3FLmC3rFxTtOcX+yVgEQcw26Hfjbhqrf/beyrp1vz3AAIsgYI9YTLnTZLePyCYFsv y5gG2hvtzLW4bSdVpt/vmEEPrj3b3cIdpkRSwp3l1fJb4WOIVP/Q2q8HdpOo3y9zccVHYN QcPBsoxWTDk5UvZJzLyjvkuVpMS3gvWRXJHQfJE77886YdUhvpKnYa+QDv+2BQ== 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 4YnMzt4sNyz1L82; Tue, 04 Feb 2025 12:26:34 +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 514CQYPR040835; Tue, 4 Feb 2025 12:26:34 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 514CQYkD040832; Tue, 4 Feb 2025 12:26:34 GMT (envelope-from git) Date: Tue, 4 Feb 2025 12:26:34 GMT Message-Id: <202502041226.514CQYkD040832@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: 32111003c308 - main - arm64/vmm: save and restore HCRX_EL2 register 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: 32111003c3087389cc5e50949ee3a26c4e7b26c4 Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=32111003c3087389cc5e50949ee3a26c4e7b26c4 commit 32111003c3087389cc5e50949ee3a26c4e7b26c4 Author: Harry Moulton AuthorDate: 2025-01-23 12:40:05 +0000 Commit: Andrew Turner CommitDate: 2025-02-04 11:24:41 +0000 arm64/vmm: save and restore HCRX_EL2 register With the addition of the Extended Hypervisor Configuration Register (HCRX_EL2), this change ensures that it is both set to 0 before entering a vm, and that it is properly saved/restored. Reviewed by: andrew Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D48584 Signed-off-by: Harry Moulton --- sys/arm64/vmm/arm64.h | 1 + sys/arm64/vmm/vmm_hyp.c | 15 +++++++++++++++ sys/arm64/vmm/vmm_reset.c | 2 ++ 3 files changed, 18 insertions(+) diff --git a/sys/arm64/vmm/arm64.h b/sys/arm64/vmm/arm64.h index 8cfe77dcde6f..6a0c4c78e568 100644 --- a/sys/arm64/vmm/arm64.h +++ b/sys/arm64/vmm/arm64.h @@ -94,6 +94,7 @@ struct hypctx { /* EL2 control registers */ uint64_t cptr_el2; /* Architectural Feature Trap Register */ uint64_t hcr_el2; /* Hypervisor Configuration Register */ + uint64_t hcrx_el2; /* Extended Hypervisor Configuration Register */ uint64_t mdcr_el2; /* Monitor Debug Configuration Register */ uint64_t vpidr_el2; /* Virtualization Processor ID Register */ uint64_t vmpidr_el2; /* Virtualization Multiprocessor ID Register */ diff --git a/sys/arm64/vmm/vmm_hyp.c b/sys/arm64/vmm/vmm_hyp.c index bd119c80139b..d61885c15871 100644 --- a/sys/arm64/vmm/vmm_hyp.c +++ b/sys/arm64/vmm/vmm_hyp.c @@ -259,6 +259,14 @@ vmm_hyp_reg_store(struct hypctx *hypctx, struct hyp *hyp, bool guest) hypctx->hcr_el2 = READ_SPECIALREG(hcr_el2); hypctx->vpidr_el2 = READ_SPECIALREG(vpidr_el2); hypctx->vmpidr_el2 = READ_SPECIALREG(vmpidr_el2); + +#ifndef VMM_VHE + /* hcrx_el2 depends on feat_hcx */ + uint64_t mmfr1 = READ_SPECIALREG(id_aa64mmfr1_el1); + if (ID_AA64MMFR1_HCX_VAL(mmfr1) >> ID_AA64MMFR1_HCX_SHIFT) { + hypctx->hcrx_el2 = READ_SPECIALREG(MRS_REG_ALT_NAME(HCRX_EL2)); + } +#endif } static void @@ -268,6 +276,13 @@ vmm_hyp_reg_restore(struct hypctx *hypctx, struct hyp *hyp, bool guest) /* Restore the special registers */ WRITE_SPECIALREG(hcr_el2, hypctx->hcr_el2); + + if (guest_or_nonvhe(guest)) { + uint64_t mmfr1 = READ_SPECIALREG(id_aa64mmfr1_el1); + if (ID_AA64MMFR1_HCX_VAL(mmfr1) >> ID_AA64MMFR1_HCX_SHIFT) { + WRITE_SPECIALREG(MRS_REG_ALT_NAME(HCRX_EL2), hypctx->hcrx_el2); + } + } isb(); WRITE_SPECIALREG(sp_el0, hypctx->sp_el0); diff --git a/sys/arm64/vmm/vmm_reset.c b/sys/arm64/vmm/vmm_reset.c index 8ccb83e7a0ea..79d022cf33e8 100644 --- a/sys/arm64/vmm/vmm_reset.c +++ b/sys/arm64/vmm/vmm_reset.c @@ -140,6 +140,8 @@ reset_vm_el2_regs(void *vcpu) el2ctx->hcr_el2 |= HCR_E2H; } + /* Set the Extended Hypervisor Configuration Register */ + el2ctx->hcrx_el2 = 0; /* TODO: Trap all extensions we don't support */ el2ctx->mdcr_el2 = 0; /* PMCR_EL0.N is read from MDCR_EL2.HPMN */