From nobody Thu Nov 20 14:08:16 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass header.i=@intel.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1763447819; cv=none; d=zohomail.com; s=zohoarc; b=Rs74xK/0/PC9MBHHd4rZPHAaj4+f7hzxQzVh9v7u/KfXbUX75bjNqN6BKMgI+0FD3lCBHVBXZScsqPUjwMFBqvu4V79Dw/P6UolhemhvDGJal7wM4xo489zyqZ0rM+ITkRWplZN+HaDUTeJDH4ItqdbEYJMl1TzppfB1AjHY+cg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1763447819; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ifjjtaz5EgDmSW2tV6xskHBc73ophEUyV70cdAUYpe4=; b=GmuCPIoIx+7Zi5oE2NRjy161jLJbeV6WA34VbZY16pC1FQIHAp6+aR9c944cGTzvlVMY0bwtMdLJMhODpSo4KHllnNdKfI4he863ruvVzXWHusPv8maxtckCor/6YJ66FTfa99T7m5EcIe+SksJLsodoUSy9DBAEaQxnKUwA0PA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=@intel.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1763447819986871.6621130054591; Mon, 17 Nov 2025 22:36:59 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vLFKE-0005mT-G1; Tue, 18 Nov 2025 01:36:26 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vLFJz-0005il-Q2 for qemu-devel@nongnu.org; Tue, 18 Nov 2025 01:36:13 -0500 Received: from mgamail.intel.com ([198.175.65.10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vLFJu-0007C8-Lr for qemu-devel@nongnu.org; Tue, 18 Nov 2025 01:36:11 -0500 Received: from orviesa010.jf.intel.com ([10.64.159.150]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2025 22:36:04 -0800 Received: from liuzhao-optiplex-7080.sh.intel.com ([10.239.160.39]) by orviesa010.jf.intel.com with ESMTP; 17 Nov 2025 22:36:01 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1763447767; x=1794983767; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=3SBdBPQBRxL5z9Idz9iWiTCAiuxoH88bRpb2EOhC/tU=; b=N25Q59D4FBHYrtVMdQjK8DoroWr0bhdo22BP9LokyUrX5VWCazcGJ/V/ hJxar4gUj40mV6ddjGgxsR5CS3SEgZvpLLNHUaYL1CRbCFxAaYZ1qp8uq 2KSALCQ4F6idI6ctJNaQWD32SRU9Il5yWFNykeR6xSJYMvTFyeaY62eRi Wa/bBk8/vwPeKO9jnhRcTDLGzpPBSuJPUZGJ3Ev8GbwbZxPhqrPFpJtzx lLGX7Pz0OHSFS84X3sdzkktuJoYec5c5vwbxGUEzRVTjHrk/sB/jbx2UI wgrM9GWJAqZzpsvEwYBdiS7wZesWBZgnMiRVYDDX6s3BoCRHCuFHPHc+N A==; X-CSE-ConnectionGUID: lrmahDTmQZWDHtfI+erH9A== X-CSE-MsgGUID: fnAZHPeESca6D56EO97Z8A== X-IronPort-AV: E=McAfee;i="6800,10657,11616"; a="82850941" X-IronPort-AV: E=Sophos;i="6.19,314,1754982000"; d="scan'208";a="82850941" X-CSE-ConnectionGUID: QKH0LtM+Q9K2rg0wDDzQzg== X-CSE-MsgGUID: 2Dp6btboRKSwTvu5x3nGyA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.19,314,1754982000"; d="scan'208";a="189962637" From: Zhao Liu To: Paolo Bonzini Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org, "Chang S . Bae" , Zide Chen , Xudong Hao , Zhao Liu Subject: [PATCH 1/5] i386/cpu: Add APX EGPRs into xsave area Date: Tue, 18 Nov 2025 14:58:13 +0800 Message-Id: <20251118065817.835017-2-zhao1.liu@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251118065817.835017-1-zhao1.liu@intel.com> References: <20251118065817.835017-1-zhao1.liu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=198.175.65.10; envelope-from=zhao1.liu@intel.com; helo=mgamail.intel.com X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @intel.com) X-ZM-MESSAGEID: 1763447820507158500 Content-Type: text/plain; charset="utf-8" From: Zide Chen APX feature bit is in CPUID_7_1_EDX[21], and APX has EGPR component with index 19 in xstate area, EGPR component has 16 64bit regs. Add EGRP component into xstate area. Note, APX re-uses the 128-byte XSAVE area that had been previously allocated by MPX which has been deprecated on Intel processors, so check whether APX and MPX are set at the same for Guest, if this case happens, mask off them both to avoid conflict for xsave area. Tested-by: Xudong Hao Signed-off-by: Zide Chen Co-developed-by: Zhao Liu Signed-off-by: Zhao Liu --- target/i386/cpu.c | 25 +++++++++++++++++++++++++ target/i386/cpu.h | 17 +++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 84adfaf99dc8..16bc4b18266c 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2111,6 +2111,12 @@ ExtSaveArea x86_ext_save_areas[XSAVE_STATE_AREA_COUN= T] =3D { { FEAT_7_0_EDX, CPUID_7_0_EDX_AMX_TILE }, }, }, + [XSTATE_APX_BIT] =3D { + .size =3D sizeof(XSaveAPX), + .features =3D { + { FEAT_7_1_EDX, CPUID_7_1_EDX_APX }, + }, + }, }; =20 uint32_t xsave_area_size(uint64_t mask, bool compacted) @@ -9116,6 +9122,25 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **er= rp) env->features[FEAT_KVM] =3D 0; } =20 + /* + * Since Intel MPX had been previously deprecated, APX re-purposes the + * 128-byte XSAVE area that had been previously allocated by MPX (state + * component indices 3 and 4, making up a 128-byte area located at an + * offset of 960 bytes into an un-compacted XSAVE buffer), as a single + * state component housing 128-bytes of storage for EGPRs (8-bytes * 16 + * registers). + * + * Check the conflict between MPX and APX before initializing xsave + * components. + */ + if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_MPX) && + (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_APX)) { + mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_MPX, + "this feature is conflict with APX"); + mark_unavailable_features(cpu, FEAT_7_1_EDX, CPUID_7_1_EDX_APX, + "this feature is conflict with MPX"); + } + x86_cpu_enable_xsave_components(cpu); =20 /* CPUID[EAX=3D7,ECX=3D0].EBX always increased level automatically: */ diff --git a/target/i386/cpu.h b/target/i386/cpu.h index d8bdf342f98d..bc7e16d6e6c1 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -604,6 +604,7 @@ typedef enum X86Seg { #define XSTATE_ARCH_LBR_BIT 15 #define XSTATE_XTILE_CFG_BIT 17 #define XSTATE_XTILE_DATA_BIT 18 +#define XSTATE_APX_BIT 19 =20 #define XSTATE_FP_MASK (1ULL << XSTATE_FP_BIT) #define XSTATE_SSE_MASK (1ULL << XSTATE_SSE_BIT) @@ -620,6 +621,7 @@ typedef enum X86Seg { #define XSTATE_ARCH_LBR_MASK (1ULL << XSTATE_ARCH_LBR_BIT) #define XSTATE_XTILE_CFG_MASK (1ULL << XSTATE_XTILE_CFG_BIT) #define XSTATE_XTILE_DATA_MASK (1ULL << XSTATE_XTILE_DATA_BIT) +#define XSTATE_APX_MASK (1ULL << XSTATE_APX_BIT) =20 #define XSTATE_DYNAMIC_MASK (XSTATE_XTILE_DATA_MASK) =20 @@ -639,7 +641,8 @@ typedef enum X86Seg { XSTATE_BNDCSR_MASK | XSTATE_OPMASK_MASK |= \ XSTATE_ZMM_Hi256_MASK | \ XSTATE_Hi16_ZMM_MASK | XSTATE_PKRU_MASK |= \ - XSTATE_XTILE_CFG_MASK | XSTATE_XTILE_DATA= _MASK) + XSTATE_XTILE_CFG_MASK | \ + XSTATE_XTILE_DATA_MASK | XSTATE_APX_MASK) =20 /* CPUID feature bits available in XSS */ #define CPUID_XSTATE_XSS_MASK (XSTATE_ARCH_LBR_MASK | XSTATE_CET_U_MASK = | \ @@ -1042,6 +1045,8 @@ uint64_t x86_cpu_get_supported_feature_word(X86CPU *c= pu, FeatureWord w); #define CPUID_7_1_EDX_PREFETCHITI (1U << 14) /* Support for Advanced Vector Extensions 10 */ #define CPUID_7_1_EDX_AVX10 (1U << 19) +/* Support for Advanced Performance Extensions */ +#define CPUID_7_1_EDX_APX (1U << 21) =20 /* Indicate bit 7 of the IA32_SPEC_CTRL MSR is supported */ #define CPUID_7_2_EDX_PSFD (1U << 0) @@ -1684,6 +1689,8 @@ typedef struct { =20 #define ARCH_LBR_NR_ENTRIES 32 =20 +#define EGPR_NUM 16 + /* CPU can't have 0xFFFFFFFF APIC ID, use that value to distinguish * that APIC ID hasn't been set yet */ @@ -1794,6 +1801,11 @@ typedef struct XSaveXTILEDATA { uint8_t xtiledata[8][1024]; } XSaveXTILEDATA; =20 +/* Ext. save area 19: APX state */ +typedef struct XSaveAPX { + uint64_t egprs[EGPR_NUM]; +} XSaveAPX; + QEMU_BUILD_BUG_ON(sizeof(XSaveAVX) !=3D 0x100); QEMU_BUILD_BUG_ON(sizeof(XSaveBNDREG) !=3D 0x40); QEMU_BUILD_BUG_ON(sizeof(XSaveBNDCSR) !=3D 0x40); @@ -1806,6 +1818,7 @@ QEMU_BUILD_BUG_ON(sizeof(XSaveCETS) !=3D 0x18); QEMU_BUILD_BUG_ON(sizeof(XSaveArchLBR) !=3D 0x328); QEMU_BUILD_BUG_ON(sizeof(XSaveXTILECFG) !=3D 0x40); QEMU_BUILD_BUG_ON(sizeof(XSaveXTILEDATA) !=3D 0x2000); +QEMU_BUILD_BUG_ON(sizeof(XSaveAPX) !=3D 0x80); =20 typedef struct ExtSaveArea { uint32_t offset, size; @@ -1820,7 +1833,7 @@ typedef struct ExtSaveArea { const FeatureMask features[2]; } ExtSaveArea; =20 -#define XSAVE_STATE_AREA_COUNT (XSTATE_XTILE_DATA_BIT + 1) +#define XSAVE_STATE_AREA_COUNT (XSTATE_APX_BIT + 1) =20 extern ExtSaveArea x86_ext_save_areas[XSAVE_STATE_AREA_COUNT]; =20 --=20 2.34.1