From nobody Sat Nov 23 13:06:34 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=reject dis=none) header.from=cloud.com ARC-Seal: i=1; a=rsa-sha256; t=1723124566; cv=none; d=zohomail.com; s=zohoarc; b=XAA+dUEYm5ZoDT4tfDRMrDa8HcL5Qh+WBg5KQGw3uEamBnozzykeZ90se8GaLjfMIvP2213ow6MQMgIKL3uEqlrQ2/tK+Y+yBFM7Xi2xZusEOoITYwDGksrxF5aoawPBMb1/Y+o1Kl5dRSZ9LsSe5EL7ZUB1n4OqPZFVNrSwJUw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1723124566; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=iSMAJrbKIJks8IvZYbCfs4ficfe6mQhEmBJARLfZWYI=; b=WbJjzllnOSPQDrmKuYc7VwPdvEp4kMADMZqoAOZZSB47X6VL0qe6sGcdm1+/5Nv1xpGGTkFlTZ9et8NzogiNqfQklL6hG5fq/Jwq8oEPRvCDW2M7gUI+AItqnrl0Xy3a5ZevEX/yeuAMH5smui7EZvQH4I+m1sGqH3bLVSn/reI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 17231245668381011.3368260757015; Thu, 8 Aug 2024 06:42:46 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.774151.1184640 (Exim 4.92) (envelope-from ) id 1sc3PN-0002mT-Ux; Thu, 08 Aug 2024 13:42:25 +0000 Received: by outflank-mailman (output) from mailman id 774151.1184640; Thu, 08 Aug 2024 13:42:25 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1sc3PN-0002lX-Qy; Thu, 08 Aug 2024 13:42:25 +0000 Received: by outflank-mailman (input) for mailman id 774151; Thu, 08 Aug 2024 13:42:24 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1sc3PM-0002jZ-Gg for xen-devel@lists.xenproject.org; Thu, 08 Aug 2024 13:42:24 +0000 Received: from mail-ed1-x52b.google.com (mail-ed1-x52b.google.com [2a00:1450:4864:20::52b]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 0a59fba5-558c-11ef-bc04-fd08da9f4363; Thu, 08 Aug 2024 15:42:23 +0200 (CEST) Received: by mail-ed1-x52b.google.com with SMTP id 4fb4d7f45d1cf-5bb8e62570fso1170344a12.1 for ; Thu, 08 Aug 2024 06:42:23 -0700 (PDT) Received: from EMEAENGAAD19049.citrite.net ([185.25.67.249]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5bbb2d35172sm676426a12.71.2024.08.08.06.42.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Aug 2024 06:42:21 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 0a59fba5-558c-11ef-bc04-fd08da9f4363 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloud.com; s=cloud; t=1723124542; x=1723729342; darn=lists.xenproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=iSMAJrbKIJks8IvZYbCfs4ficfe6mQhEmBJARLfZWYI=; b=ahGvNw60o18MvNuwC9ph0jWilQucjKLLSlNJ8/oOj11VnKd6R/i1zz87Td69EfeAMi G/xnKaHDNGlH/o8DJJGBoBnJbQdJMBWcfZ06ywir+1BN4JfV3N283e/Ivy6Igkcihqb2 0gYsjemwNl3+TaHtSyWKyOTpXPmOfZBzOzAzk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723124542; x=1723729342; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iSMAJrbKIJks8IvZYbCfs4ficfe6mQhEmBJARLfZWYI=; b=qtfs3hlQn1wswrcvW8+VH5KO2qG1E8uCHR4Ng9m7mun1LmZrYd+UpihPSDzBS8JKes mZuKOHrYH0i54dcnm4taHBXp2xKrWixGADtz0u6+1ZFzj739XOhHYoRIRCp7JHggG7Jv XX7OxNvC+Ucia7wHt+TTyVx214dNq+e0Vbp2M8l30w2W8p8OSbtyTMe5Q6jnJdT+UQVU 2MPtAJMPZI1PUiYNbDcVlupPnfLvQkRBfxT3SZ672C11P09kYCp+82xh/zQJ4ctNPB5a gz2vJQ0okL9xU0f+VXEIqpZW2hbx4H5CCN3pxL4u+sorsYpeVHHopgt0wxebHU9vgT/u 19Xg== X-Gm-Message-State: AOJu0YyytaWG32VL5yeWJ4ur4o6By4LA1std9Mp3L/HDsid/aJv8/bNc VMIslpO0AnpPTFK1g5AUVq5rs5l6NH9Y5OaR20qsEWohDj9sz2ZWUWEZGSikLcyXBKayi0grPAh Z X-Google-Smtp-Source: AGHT+IGUiGSqCpH1+k8o88g8/J60vQ87PRNGPIKuAkIy08w57jyD71wTYz5Zhj1rSM6hN8gmnr2Yvw== X-Received: by 2002:a05:6402:2108:b0:5a3:5218:5d80 with SMTP id 4fb4d7f45d1cf-5bbb233f281mr1587970a12.21.1723124542052; Thu, 08 Aug 2024 06:42:22 -0700 (PDT) From: Alejandro Vallejo To: Xen-devel Cc: Alejandro Vallejo , Jan Beulich , Andrew Cooper , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Subject: [PATCH v2 1/2] x86/fpu: Combine fpu_ctxt and xsave_area in arch_vcpu Date: Thu, 8 Aug 2024 14:41:49 +0100 Message-ID: <20240808134150.29927-2-alejandro.vallejo@cloud.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240808134150.29927-1-alejandro.vallejo@cloud.com> References: <20240808134150.29927-1-alejandro.vallejo@cloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @cloud.com) X-ZM-MESSAGEID: 1723124567842116600 Content-Type: text/plain; charset="utf-8" fpu_ctxt is either a pointer to the legacy x87/SSE save area (used by FXSAV= E) or a pointer aliased with xsave_area that points to its fpu_sse subfield. Such subfield is at the base and is identical in size and layout to the legacy buffer. This patch merges the 2 pointers in the arch_vcpu into a single XSAVE area.= In the very rare case in which the host doesn't support XSAVE all we're doing = is wasting a tiny amount of memory and trading those for a lot more simplicity= in the code. Signed-off-by: Alejandro Vallejo --- v2: * Added BUILD_BUG_ON(sizeof(x) !=3D sizeof(fpusse_t)) on forceful casts involving fpusse_t. * Reworded comment on top of vcpu_arch->user_regs * Added missing whitespace in x86_emulate/blk.c --- xen/arch/x86/domctl.c | 5 +++- xen/arch/x86/hvm/emulate.c | 4 +-- xen/arch/x86/hvm/hvm.c | 5 +++- xen/arch/x86/i387.c | 45 +++++-------------------------- xen/arch/x86/include/asm/domain.h | 8 +++--- xen/arch/x86/x86_emulate/blk.c | 3 ++- xen/arch/x86/xstate.c | 13 ++++++--- 7 files changed, 32 insertions(+), 51 deletions(-) diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index 68b5b46d1a83..bceff6be0ff3 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -1344,7 +1344,10 @@ void arch_get_info_guest(struct vcpu *v, vcpu_guest_= context_u c) #define c(fld) (c.nat->fld) #endif =20 - memcpy(&c.nat->fpu_ctxt, v->arch.fpu_ctxt, sizeof(c.nat->fpu_ctxt)); + memcpy(&c.nat->fpu_ctxt, &v->arch.xsave_area->fpu_sse, + sizeof(c.nat->fpu_ctxt)); + BUILD_BUG_ON(sizeof(c.nat->fpu_ctxt) !=3D sizeof(fpusse_t)); + if ( is_pv_domain(d) ) c(flags =3D v->arch.pv.vgc_flags & ~(VGCF_i387_valid|VGCF_in_kerne= l)); else diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index feb4792cc567..03020542c3ba 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -2363,7 +2363,7 @@ static int cf_check hvmemul_get_fpu( alternative_vcall(hvm_funcs.fpu_dirty_intercept); else if ( type =3D=3D X86EMUL_FPU_fpu ) { - const fpusse_t *fpu_ctxt =3D curr->arch.fpu_ctxt; + const fpusse_t *fpu_ctxt =3D &curr->arch.xsave_area->fpu_sse; =20 /* * Latch current register state so that we can back out changes @@ -2403,7 +2403,7 @@ static void cf_check hvmemul_put_fpu( =20 if ( aux ) { - fpusse_t *fpu_ctxt =3D curr->arch.fpu_ctxt; + fpusse_t *fpu_ctxt =3D &curr->arch.xsave_area->fpu_sse; bool dval =3D aux->dval; int mode =3D hvm_guest_x86_mode(curr); =20 diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index f49e29faf753..6607dba562a4 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -916,7 +916,10 @@ static int cf_check hvm_save_cpu_ctxt(struct vcpu *v, = hvm_domain_context_t *h) =20 if ( v->fpu_initialised ) { - memcpy(ctxt.fpu_regs, v->arch.fpu_ctxt, sizeof(ctxt.fpu_regs)); + memcpy(ctxt.fpu_regs, &v->arch.xsave_area->fpu_sse, + sizeof(ctxt.fpu_regs)); + BUILD_BUG_ON(sizeof(ctxt.fpu_regs) !=3D sizeof(fpusse_t)); + ctxt.flags =3D XEN_X86_FPU_INITIALISED; } =20 diff --git a/xen/arch/x86/i387.c b/xen/arch/x86/i387.c index 134e0bece519..fbb9d3584a3d 100644 --- a/xen/arch/x86/i387.c +++ b/xen/arch/x86/i387.c @@ -39,7 +39,7 @@ static inline void fpu_xrstor(struct vcpu *v, uint64_t ma= sk) /* Restore x87 FPU, MMX, SSE and SSE2 state */ static inline void fpu_fxrstor(struct vcpu *v) { - const fpusse_t *fpu_ctxt =3D v->arch.fpu_ctxt; + const fpusse_t *fpu_ctxt =3D &v->arch.xsave_area->fpu_sse; =20 /* * Some CPUs don't save/restore FDP/FIP/FOP unless an exception @@ -151,7 +151,7 @@ static inline void fpu_xsave(struct vcpu *v) /* Save x87 FPU, MMX, SSE and SSE2 state */ static inline void fpu_fxsave(struct vcpu *v) { - fpusse_t *fpu_ctxt =3D v->arch.fpu_ctxt; + fpusse_t *fpu_ctxt =3D &v->arch.xsave_area->fpu_sse; unsigned int fip_width =3D v->domain->arch.x87_fip_width; =20 if ( fip_width !=3D 4 ) @@ -212,7 +212,7 @@ void vcpu_restore_fpu_nonlazy(struct vcpu *v, bool need= _stts) * above) we also need to restore full state, to prevent subsequently * saving state belonging to another vCPU. */ - if ( v->arch.fully_eager_fpu || (v->arch.xsave_area && xstate_all(v)) ) + if ( v->arch.fully_eager_fpu || xstate_all(v) ) { if ( cpu_has_xsave ) fpu_xrstor(v, XSTATE_ALL); @@ -299,44 +299,14 @@ void save_fpu_enable(void) /* Initialize FPU's context save area */ int vcpu_init_fpu(struct vcpu *v) { - int rc; - v->arch.fully_eager_fpu =3D opt_eager_fpu; - - if ( (rc =3D xstate_alloc_save_area(v)) !=3D 0 ) - return rc; - - if ( v->arch.xsave_area ) - v->arch.fpu_ctxt =3D &v->arch.xsave_area->fpu_sse; - else - { - BUILD_BUG_ON(__alignof(v->arch.xsave_area->fpu_sse) < 16); - v->arch.fpu_ctxt =3D _xzalloc(sizeof(v->arch.xsave_area->fpu_sse), - __alignof(v->arch.xsave_area->fpu_sse)= ); - if ( v->arch.fpu_ctxt ) - { - fpusse_t *fpu_sse =3D v->arch.fpu_ctxt; - - fpu_sse->fcw =3D FCW_DEFAULT; - fpu_sse->mxcsr =3D MXCSR_DEFAULT; - } - else - rc =3D -ENOMEM; - } - - return rc; + return xstate_alloc_save_area(v); } =20 void vcpu_setup_fpu(struct vcpu *v, struct xsave_struct *xsave_area, const void *data, unsigned int fcw_default) { - /* - * For the entire function please note that vcpu_init_fpu() (above) po= ints - * v->arch.fpu_ctxt into v->arch.xsave_area when XSAVE is available. H= ence - * accesses through both pointers alias one another, and the shorter f= orm - * is used here. - */ - fpusse_t *fpu_sse =3D v->arch.fpu_ctxt; + fpusse_t *fpu_sse =3D &v->arch.xsave_area->fpu_sse; =20 ASSERT(!xsave_area || xsave_area =3D=3D v->arch.xsave_area); =20 @@ -373,10 +343,7 @@ void vcpu_setup_fpu(struct vcpu *v, struct xsave_struc= t *xsave_area, /* Free FPU's context save area */ void vcpu_destroy_fpu(struct vcpu *v) { - if ( v->arch.xsave_area ) - xstate_free_save_area(v); - else - xfree(v->arch.fpu_ctxt); + xstate_free_save_area(v); } =20 /* diff --git a/xen/arch/x86/include/asm/domain.h b/xen/arch/x86/include/asm/d= omain.h index bca3258d69ac..3da60af2a44a 100644 --- a/xen/arch/x86/include/asm/domain.h +++ b/xen/arch/x86/include/asm/domain.h @@ -592,11 +592,11 @@ struct pv_vcpu struct arch_vcpu { /* - * guest context (mirroring struct vcpu_guest_context) common - * between pv and hvm guests + * Guest context common between PV and HVM guests. Includes general pu= rpose + * registers, segment registers and other parts of the exception frame. + * + * It doesn't contain FPU state, as that lives in xsave_area instead. */ - - void *fpu_ctxt; struct cpu_user_regs user_regs; =20 /* Debug registers. */ diff --git a/xen/arch/x86/x86_emulate/blk.c b/xen/arch/x86/x86_emulate/blk.c index e790f4f90056..28b54f26fe29 100644 --- a/xen/arch/x86/x86_emulate/blk.c +++ b/xen/arch/x86/x86_emulate/blk.c @@ -11,7 +11,8 @@ !defined(X86EMUL_NO_SIMD) # ifdef __XEN__ # include -# define FXSAVE_AREA current->arch.fpu_ctxt +# define FXSAVE_AREA ((struct x86_fxsr *) \ + (void *)¤t->arch.xsave_area->fpu_sse) # else # define FXSAVE_AREA get_fpu_save_area() # endif diff --git a/xen/arch/x86/xstate.c b/xen/arch/x86/xstate.c index 5c4144d55e89..850ee31bd18c 100644 --- a/xen/arch/x86/xstate.c +++ b/xen/arch/x86/xstate.c @@ -507,9 +507,16 @@ int xstate_alloc_save_area(struct vcpu *v) unsigned int size; =20 if ( !cpu_has_xsave ) - return 0; - - if ( !is_idle_vcpu(v) || !cpu_has_xsavec ) + { + /* + * This is bigger than FXSAVE_SIZE by 64 bytes, but it helps treat= ing + * the FPU state uniformly as an XSAVE buffer even if XSAVE is not + * available in the host. Note the alignment restriction of the XS= AVE + * area are stricter than those of the FXSAVE area. + */ + size =3D XSTATE_AREA_MIN_SIZE; + } + else if ( !is_idle_vcpu(v) || !cpu_has_xsavec ) { size =3D xsave_cntxt_size; BUG_ON(size < XSTATE_AREA_MIN_SIZE); --=20 2.45.2 From nobody Sat Nov 23 13:06:34 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=reject dis=none) header.from=cloud.com ARC-Seal: i=1; a=rsa-sha256; t=1723124573; cv=none; d=zohomail.com; s=zohoarc; b=KLYd6O75ZorcXIHmsoLDmQUYsoF440HJcJKjBJctaaPXSdU/HktMfVqieax/9w5rxvNX9bDh15pJqFi3wRzN1Z/GAhWSEt3Wy/fwgtX8qYJFwOEFBL4uSDYWoOOWU7NJrNfVXt1xIRb95LgYxkNrIHAeEAJMun+BcZmvJz9D7kw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1723124573; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=BwRkrDUsnDDc1HKYet7Tp7o3hYwj8I4tk9q0yVqzszQ=; b=FeizOwG6pxHf/ysMC1nDk3ihSiIJUykdBZB4senA0QGDpUl8IxUzy14XTvK0N4dxfcdNUAtVlwfMT4zZcp5zNmcs0y4ZsGXVYPcTHp4bZnSO0D5FCvlvYPWXC4BNIdDT914u5mZ9dCwSHXl8iN+H1H2IAN3ZhsunQOGWqdKNjf8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1723124573029214.5624316390996; Thu, 8 Aug 2024 06:42:53 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.774152.1184647 (Exim 4.92) (envelope-from ) id 1sc3PO-0002u3-Ay; Thu, 08 Aug 2024 13:42:26 +0000 Received: by outflank-mailman (output) from mailman id 774152.1184647; Thu, 08 Aug 2024 13:42:26 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1sc3PO-0002sL-3b; Thu, 08 Aug 2024 13:42:26 +0000 Received: by outflank-mailman (input) for mailman id 774152; Thu, 08 Aug 2024 13:42:24 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1sc3PM-0002jZ-Uj for xen-devel@lists.xenproject.org; Thu, 08 Aug 2024 13:42:24 +0000 Received: from mail-ed1-x52a.google.com (mail-ed1-x52a.google.com [2a00:1450:4864:20::52a]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 0b106731-558c-11ef-bc04-fd08da9f4363; Thu, 08 Aug 2024 15:42:24 +0200 (CEST) Received: by mail-ed1-x52a.google.com with SMTP id 4fb4d7f45d1cf-5b8c2a6135dso1308792a12.1 for ; Thu, 08 Aug 2024 06:42:24 -0700 (PDT) Received: from EMEAENGAAD19049.citrite.net ([185.25.67.249]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5bbb2d35172sm676426a12.71.2024.08.08.06.42.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Aug 2024 06:42:22 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 0b106731-558c-11ef-bc04-fd08da9f4363 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloud.com; s=cloud; t=1723124543; x=1723729343; darn=lists.xenproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BwRkrDUsnDDc1HKYet7Tp7o3hYwj8I4tk9q0yVqzszQ=; b=TdwrDRqg+IVcDuFKM3p7ZotyXu6Tj6gIKTl+fgM+mhs2j2FVKp3a9JLvUhpDRzO/IH 4UO49iVEir8UDSaIsSdxce12K4gV5CdogzR8rL1iDpWu4ZZkrNNTCdiueBHDO1qIyBsp s6BbQKCeMoDuCTFEcpX6kHCRMJM6LYgM095n8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723124543; x=1723729343; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BwRkrDUsnDDc1HKYet7Tp7o3hYwj8I4tk9q0yVqzszQ=; b=Ut5FKnapOuk9QBrwHig0D4GsVg+MA/XPitZBSo4z1r3b/mTYxmkiiEqXolhw8cCQVa N3Q2VHvt3VvPuxIDfqXsjNm6groWwTp2yrvq3bOjRDb8ebN99i4RRTdJOrUsKrkeb8dL vajaIqr8vAyaLhztJWNwjjYBLf06k+SHvm9ax7/9jyb/DIW/7AHa/gxr4geAVPlUL3fQ WjoHfaKRI4a58lMrt6twPvH45NBD9QJBvbVBSpcQ3o35mcYjxqjsOvIBhrL28KvDM9m1 zmiC45xOlIi6v1jEEG9zXBmXrhzS4yVOVY9BbMpl02eQ9OLFKQFieP30MZzJe1++Vsig fspg== X-Gm-Message-State: AOJu0Yx2XZpPW5gre56Aa99+a3SeVeXIuA9dNBWkBQVfNOVjiY50f/QN lcBUchua49+Ux/FXjs90wmujgf+E5lRtP7rBoWXZnRix9LL6bs5obC4UsrJ/DnfteJDNdoscxzi H X-Google-Smtp-Source: AGHT+IFDlS+F7uKLxzrgTijdmiqpplkXz8gvxBeDAwkAnMvGtlIBNWE5icxfplXQXacuAwrTaPqKmg== X-Received: by 2002:a05:6402:3591:b0:5af:e7d1:9532 with SMTP id 4fb4d7f45d1cf-5bbb2196e12mr1342204a12.8.1723124543197; Thu, 08 Aug 2024 06:42:23 -0700 (PDT) From: Alejandro Vallejo To: Xen-devel Cc: Alejandro Vallejo , Jan Beulich , Andrew Cooper , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Subject: [PATCH v2 2/2] x86/fpu: Split fpu_setup_fpu() in two Date: Thu, 8 Aug 2024 14:41:50 +0100 Message-ID: <20240808134150.29927-3-alejandro.vallejo@cloud.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240808134150.29927-1-alejandro.vallejo@cloud.com> References: <20240808134150.29927-1-alejandro.vallejo@cloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @cloud.com) X-ZM-MESSAGEID: 1723124573909116600 Content-Type: text/plain; charset="utf-8" It was trying to do too many things at once and there was no clear way of defining what it was meant to do.This commit splits the function in two. 1. A reset function, parameterized by the FCW value. FCW_RESET means to r= eset the state to power-on reset values, while FCW_DEFAULT means to reset t= o the default values present during vCPU creation. 2. A x87/SSE state loader (equivalent to the old function when it took a = data pointer). While at it, make sure the abridged tag is consistent with the manuals and start as 0xFF. Signed-off-by: Alejandro Vallejo --- v2: * Reworded comment about pre-Xen 4.1 migrations. * Reset abridged FTW to -1 (tag=3D0x5555), as per the manuals. * Undo const cast-away. * Split vcpu_reset_fpu() into vcpu_default_fpu() * vcpu_init_fpu() already exists. * Removed backticks from comments --- xen/arch/x86/domain.c | 7 ++-- xen/arch/x86/hvm/hvm.c | 27 ++++++++++---- xen/arch/x86/i387.c | 60 +++++++++++++++---------------- xen/arch/x86/include/asm/i387.h | 28 ++++++++++++--- xen/arch/x86/include/asm/xstate.h | 1 + 5 files changed, 77 insertions(+), 46 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index d977ec71ca20..5af9e3e7a8b4 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -1186,9 +1186,10 @@ int arch_set_info_guest( is_pv_64bit_domain(d) ) v->arch.flags &=3D ~TF_kernel_mode; =20 - vcpu_setup_fpu(v, v->arch.xsave_area, - flags & VGCF_I387_VALID ? &c.nat->fpu_ctxt : NULL, - FCW_DEFAULT); + if ( flags & VGCF_I387_VALID ) + vcpu_setup_fpu(v, &c.nat->fpu_ctxt); + else + vcpu_default_fpu(v); =20 if ( !compat ) { diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 6607dba562a4..83cb21884ce6 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1164,10 +1164,25 @@ static int cf_check hvm_load_cpu_ctxt(struct domain= *d, hvm_domain_context_t *h) seg.attr =3D ctxt.ldtr_arbytes; hvm_set_segment_register(v, x86_seg_ldtr, &seg); =20 - /* Cover xsave-absent save file restoration on xsave-capable host. */ - vcpu_setup_fpu(v, xsave_enabled(v) ? NULL : v->arch.xsave_area, - ctxt.flags & XEN_X86_FPU_INITIALISED ? ctxt.fpu_regs : = NULL, - FCW_RESET); + /* + * On Xen 4.1 and later the FPU state is restored on later HVM context= in + * the migrate stream, so what we're doing here is initialising the FPU + * state for guests from even older versions of Xen. + * + * In particular: + * 1. If there's an XSAVE context later in the stream what we do her= e for + * the FPU doesn't matter because it'll be overriden later. + * 2. If there isn't and the guest didn't use extended states it's s= till + * fine because we have all the information we need here. + * 3. If there isn't and the guest DID use extended states (could've + * happened prior to Xen 4.1) then we're in a pickle because we h= ave + * to make up non-existing state. For this case we initialise the= FPU + * as using x87/SSE only because the rest of the state is gone. + */ + if ( ctxt.flags & XEN_X86_FPU_INITIALISED ) + vcpu_setup_fpu(v, &ctxt.fpu_regs); + else + vcpu_reset_fpu(v); =20 v->arch.user_regs.rax =3D ctxt.rax; v->arch.user_regs.rbx =3D ctxt.rbx; @@ -4007,9 +4022,7 @@ void hvm_vcpu_reset_state(struct vcpu *v, uint16_t cs= , uint16_t ip) v->arch.guest_table =3D pagetable_null(); } =20 - if ( v->arch.xsave_area ) - v->arch.xsave_area->xsave_hdr.xstate_bv =3D 0; - vcpu_setup_fpu(v, v->arch.xsave_area, NULL, FCW_RESET); + vcpu_reset_fpu(v); =20 arch_vcpu_regs_init(v); v->arch.user_regs.rip =3D ip; diff --git a/xen/arch/x86/i387.c b/xen/arch/x86/i387.c index fbb9d3584a3d..af5ae805998a 100644 --- a/xen/arch/x86/i387.c +++ b/xen/arch/x86/i387.c @@ -303,41 +303,37 @@ int vcpu_init_fpu(struct vcpu *v) return xstate_alloc_save_area(v); } =20 -void vcpu_setup_fpu(struct vcpu *v, struct xsave_struct *xsave_area, - const void *data, unsigned int fcw_default) +void vcpu_reset_fpu(struct vcpu *v) { - fpusse_t *fpu_sse =3D &v->arch.xsave_area->fpu_sse; - - ASSERT(!xsave_area || xsave_area =3D=3D v->arch.xsave_area); - - v->fpu_initialised =3D !!data; + v->fpu_initialised =3D false; + *v->arch.xsave_area =3D (struct xsave_struct) { + .fpu_sse =3D { + .mxcsr =3D MXCSR_DEFAULT, + .fcw =3D FCW_RESET, + .ftw =3D FTW_RESET, + }, + .xsave_hdr.xstate_bv =3D fcw =3D=3D X86_XCR0_X87, + }; +} =20 - if ( data ) - { - memcpy(fpu_sse, data, sizeof(*fpu_sse)); - if ( xsave_area ) - xsave_area->xsave_hdr.xstate_bv =3D XSTATE_FP_SSE; - } - else if ( xsave_area && fcw_default =3D=3D FCW_DEFAULT ) - { - xsave_area->xsave_hdr.xstate_bv =3D 0; - fpu_sse->mxcsr =3D MXCSR_DEFAULT; - } - else - { - memset(fpu_sse, 0, sizeof(*fpu_sse)); - fpu_sse->fcw =3D fcw_default; - fpu_sse->mxcsr =3D MXCSR_DEFAULT; - if ( v->arch.xsave_area ) - { - v->arch.xsave_area->xsave_hdr.xstate_bv &=3D ~XSTATE_FP_SSE; - if ( fcw_default !=3D FCW_DEFAULT ) - v->arch.xsave_area->xsave_hdr.xstate_bv |=3D X86_XCR0_X87; - } - } +void vcpu_default_fpu(struct vcpu *v) +{ + v->fpu_initialised =3D false; + *v->arch.xsave_area =3D (struct xsave_struct) { + .fpu_sse =3D { + .mxcsr =3D MXCSR_DEFAULT, + .fcw =3D FCW_DEFAULT, + }, + }; +} =20 - if ( xsave_area ) - xsave_area->xsave_hdr.xcomp_bv =3D 0; +void vcpu_setup_fpu(struct vcpu *v, const void *data) +{ + v->fpu_initialised =3D true; + *v->arch.xsave_area =3D (struct xsave_struct) { + .fpu_sse =3D *(const fpusse_t*)data, + .xsave_hdr.xstate_bv =3D XSTATE_FP_SSE, + }; } =20 /* Free FPU's context save area */ diff --git a/xen/arch/x86/include/asm/i387.h b/xen/arch/x86/include/asm/i38= 7.h index a783549db991..7a69577de45b 100644 --- a/xen/arch/x86/include/asm/i387.h +++ b/xen/arch/x86/include/asm/i387.h @@ -31,10 +31,30 @@ void vcpu_restore_fpu_nonlazy(struct vcpu *v, bool need= _stts); void vcpu_restore_fpu_lazy(struct vcpu *v); void vcpu_save_fpu(struct vcpu *v); void save_fpu_enable(void); - int vcpu_init_fpu(struct vcpu *v); -struct xsave_struct; -void vcpu_setup_fpu(struct vcpu *v, struct xsave_struct *xsave_area, - const void *data, unsigned int fcw_default); void vcpu_destroy_fpu(struct vcpu *v); + +/* + * Restore v's FPU to power-on reset values + * + * @param v vCPU containing the FPU + */ +void vcpu_reset_fpu(struct vcpu *v); + +/* + * Restore v's FPU to default values + * + * @param v vCPU containing the FPU + */ +void vcpu_default_fpu(struct vcpu *v); + +/* + * Load x87/SSE state into v's FPU + * + * Overrides the XSAVE header to set the state components to be x87 and SS= E. + * + * @param v vCPU containing the FPU + * @param data 512-octet blob for x87/SSE state + */ +void vcpu_setup_fpu(struct vcpu *v, const void *data); #endif /* __ASM_I386_I387_H */ diff --git a/xen/arch/x86/include/asm/xstate.h b/xen/arch/x86/include/asm/x= state.h index ebeb2a3dcaf9..6144ed6f8551 100644 --- a/xen/arch/x86/include/asm/xstate.h +++ b/xen/arch/x86/include/asm/xstate.h @@ -14,6 +14,7 @@ =20 #define FCW_DEFAULT 0x037f #define FCW_RESET 0x0040 +#define FTW_RESET 0xFF #define MXCSR_DEFAULT 0x1f80 =20 extern uint32_t mxcsr_mask; --=20 2.45.2