From nobody Wed Jul 5 09:46:10 2023 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 4QwvtV3yJvz4lJDy; Wed, 5 Jul 2023 09:46:10 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4QwvtV3T8Lz3C6g; Wed, 5 Jul 2023 09:46:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1688550370; 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=0Tbh3qGGC0mjcG+EN3Y/lHV65ZzsCcCKDSY9nY/i1J8=; b=t3FyjvzZ4AdgslOWIQpts5+wNu3DcDZGoToZ/H7YRhz7xuhDG0wdMMgtNm3S30xu0BD7Ih 9QEPzt1jto7rZXFm/35qW3KHXLn72j40utaDs8pU1A3mZ+aIZrvAQvJC7sr+nLp6F31Vi/ 7fcK2kDoZ/uAHfnxa4SS9TSjjKcfszYdUYKVmZQCwUGzmpeNQz2HP93g0jYls4bKf8MmHe bAnu6HWy+nHKeoC3YNQP3eplX8i45OwTGxjkav9hDQ9PlqMJBLQLpE/LB5uX+wZC5AJvpD fZmqIRFH8vf7uOelLcD2dwNEWfgPzj7poaRqRF2/ljOuydH1vChSuPqZgED/NQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1688550370; 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=0Tbh3qGGC0mjcG+EN3Y/lHV65ZzsCcCKDSY9nY/i1J8=; b=GvFbvruH50raI4CtvlimLx2HiS7Z7Zo8xBFTDRXGZDj6y+ctmnIcavYJJcX/lGX1/LHEVF BVBmtG8Xu/qdQANBtxfw4euCvT6Z5oK2tTcDl05sEdq4/A0IQuZDfdtYYWfr+5VQjzi+gN imzSewjrdZM1+EIm1qP5fYtTJXiHGfGgig6dxNZ1IX8mhFjvvDAjPytxqk8eYRcQMEP2WZ ue6GW8zaaf3Qnk65rJLRgr6BsnHFkvh51Y8ex7LHyIId27J5lq1Bjw7sEebm+mc8XLRZf7 Pf5lAlWIq0jw1INfRzb1xsdD+g3QRovFzV3h16ygZYaCf22Go+1uB11t1yU0mg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1688550370; a=rsa-sha256; cv=none; b=wu/eQ3ZHqaw9fbTR7gMQhtJaSV2El0HFZatuqP0Geh6RTL9B7kELBwtLvX6QiuM7BuVDNz kzUomIl6sqVw2j3EdcW6p4rl3JrWoDgL4svukiQ2N0TxYsrdjoHbFsEJqpgDEC9gX+tVUK uLEvLrrjs7KcfAbhk+szc56l9AqSYXNFbB3WOLTQCULShndxeui4Q/5EbFQ/7njnZsaGkc CvTQPYqE/Dq62EhIIuUiYZCSmfdO2M/L3LnjdglF9PqMbXXfl1bcfFV1m9Z2HzkY5k+RpB 9mONmDFtqs4pui17xEh9pKpmQuC3LxenrovuuGHFhzKTXhNoU1lmS7877QZH4Q== 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 4QwvtV2WSSz1956; Wed, 5 Jul 2023 09:46:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3659kA5d039214; Wed, 5 Jul 2023 09:46:10 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3659kAkA039213; Wed, 5 Jul 2023 09:46:10 GMT (envelope-from git) Date: Wed, 5 Jul 2023 09:46:10 GMT Message-Id: <202307050946.3659kAkA039213@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: df0d0fc99093 - main - Add helpers to allocate an arm64 VFP state struct 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: 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: df0d0fc99093cbdcab9b84911376ee52e58ce7f2 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=df0d0fc99093cbdcab9b84911376ee52e58ce7f2 commit df0d0fc99093cbdcab9b84911376ee52e58ce7f2 Author: Andrew Turner AuthorDate: 2023-05-16 10:09:11 +0000 Commit: Andrew Turner CommitDate: 2023-07-05 09:42:14 +0000 Add helpers to allocate an arm64 VFP state struct This will be used by bhyve and will allow the size to change, e.g. for SVE. Reviewed by: markj Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D40131 --- sys/arm64/arm64/mp_machdep.c | 2 +- sys/arm64/arm64/vfp.c | 57 +++++++++++++++++++++++++++++++++++++++++--- sys/arm64/include/vfp.h | 6 ++++- 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/sys/arm64/arm64/mp_machdep.c b/sys/arm64/arm64/mp_machdep.c index babeee331be0..9aef6a9a080f 100644 --- a/sys/arm64/arm64/mp_machdep.c +++ b/sys/arm64/arm64/mp_machdep.c @@ -274,7 +274,7 @@ init_secondary(uint64_t cpu) cpu_initclocks_ap(); #ifdef VFP - vfp_init(); + vfp_init_secondary(); #endif dbg_init(); diff --git a/sys/arm64/arm64/vfp.c b/sys/arm64/arm64/vfp.c index 22b15ee78596..46ae5d8e8fcd 100644 --- a/sys/arm64/arm64/vfp.c +++ b/sys/arm64/arm64/vfp.c @@ -38,6 +38,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include + #include #include #include @@ -57,6 +59,9 @@ struct fpu_kern_ctx { struct vfpstate state; }; +static uma_zone_t fpu_save_area_zone; +static struct vfpstate *fpu_initialstate; + void vfp_enable(void) { @@ -280,7 +285,7 @@ vfp_restore_state(void) } void -vfp_init(void) +vfp_init_secondary(void) { uint64_t pfr; @@ -291,9 +296,34 @@ vfp_init(void) /* Disable to be enabled when it's used */ vfp_disable(); +} + +static void +vfp_init(const void *dummy __unused) +{ + uint64_t pfr; + + /* Check if there is a vfp unit present */ + pfr = READ_SPECIALREG(id_aa64pfr0_el1); + if ((pfr & ID_AA64PFR0_FP_MASK) == ID_AA64PFR0_FP_NONE) + return; + + fpu_save_area_zone = uma_zcreate("VFP_save_area", + sizeof(struct vfpstate), NULL, NULL, NULL, NULL, + _Alignof(struct vfpstate) - 1, 0); + fpu_initialstate = uma_zalloc(fpu_save_area_zone, M_WAITOK | M_ZERO); - if (PCPU_GET(cpuid) == 0) - thread0.td_pcb->pcb_fpusaved->vfp_fpcr = VFPCR_INIT; + /* Ensure the VFP is enabled before accessing it in vfp_store */ + vfp_enable(); + vfp_store(fpu_initialstate); + + /* Disable to be enabled when it's used */ + vfp_disable(); + + /* Zero the VFP registers but keep fpcr and fpsr */ + bzero(fpu_initialstate->vfp_regs, sizeof(fpu_initialstate->vfp_regs)); + + thread0.td_pcb->pcb_fpusaved->vfp_fpcr = VFPCR_INIT; } SYSINIT(vfp, SI_SUB_CPU, SI_ORDER_ANY, vfp_init, NULL); @@ -433,4 +463,25 @@ is_fpu_kern_thread(u_int flags __unused) curpcb = curthread->td_pcb; return ((curpcb->pcb_fpflags & PCB_FP_KERN) != 0); } + +/* + * FPU save area alloc/free/init utility routines + */ +struct vfpstate * +fpu_save_area_alloc(void) +{ + return (uma_zalloc(fpu_save_area_zone, M_WAITOK)); +} + +void +fpu_save_area_free(struct vfpstate *fsa) +{ + uma_zfree(fpu_save_area_zone, fsa); +} + +void +fpu_save_area_reset(struct vfpstate *fsa) +{ + memcpy(fsa, fpu_initialstate, sizeof(*fsa)); +} #endif diff --git a/sys/arm64/include/vfp.h b/sys/arm64/include/vfp.h index 4f64b0396417..79e710694268 100644 --- a/sys/arm64/include/vfp.h +++ b/sys/arm64/include/vfp.h @@ -66,7 +66,7 @@ struct vfpstate { struct pcb; struct thread; -void vfp_init(void); +void vfp_init_secondary(void); void vfp_enable(void); void vfp_disable(void); void vfp_discard(struct thread *); @@ -94,6 +94,10 @@ int fpu_kern_leave(struct thread *, struct fpu_kern_ctx *); int fpu_kern_thread(u_int); int is_fpu_kern_thread(u_int); +struct vfpstate *fpu_save_area_alloc(void); +void fpu_save_area_free(struct vfpstate *fsa); +void fpu_save_area_reset(struct vfpstate *fsa); + /* Convert to and from Aarch32 FPSCR to Aarch64 FPCR/FPSR */ #define VFP_FPSCR_FROM_SRCR(vpsr, vpcr) ((vpsr) | ((vpcr) & 0x7c00000)) #define VFP_FPSR_FROM_FPSCR(vpscr) ((vpscr) &~ 0x7c00000)