From patchwork Wed Apr 5 00:45:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 79423 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp255246vqo; Tue, 4 Apr 2023 18:04:20 -0700 (PDT) X-Google-Smtp-Source: AKy350ajS1oz81l5WIBWIh7edz9Derl+SEBZHvPyjbKJOg7SU+r0P2B5QQm9z34+Y3+TPGhckR1f X-Received: by 2002:a17:903:5c3:b0:1a1:918e:4129 with SMTP id kf3-20020a17090305c300b001a1918e4129mr4016389plb.30.1680656660187; Tue, 04 Apr 2023 18:04:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680656660; cv=none; d=google.com; s=arc-20160816; b=iBRG0Aa7oxK9KT3uQ1USE6efyJwzGXDuqsPg8jMsafe9407tdfRBvrD8cymfOxbN1W sXF3/hO9+JtffJ+q04E1FObuJh3tbdrwJSVrz60xL8SYPUcAalO8ZGtlxeV1PqjRKxcX TJLU8zF86XC/rv3Pxjn1BITSbIg96ilnl+wrl6F7yMD7WOFTAPXIWHFDjGoylIGG2rGt sq9lkehw1F7oDlrUR+2NRyAVzyQHnA3QW8eBbvHhd4IqKJLvYBJLeVgGBRwCyjqvcNjz +TgkeK3JfRRzoytw7kTQnqgVVwbA04N1mo6RoJnRgToZd2i6fhpHoNpMroQVnfAqHF9R wkBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=7DA+p9LgbhVdVl+ZZN2EOFJj3Y+toC812cwG1G1Tydo=; b=p+oFFOGanfJVAUEh8QS8GTb9Y3xzQNXJ4ftqVK9fhC80J06cbj3E6u4uu6RhahVM83 p2G2lnj3/I/g7+4UP9HVDp8UUwpAREubrJUQ2HL8JmoVcYkVTGbzCuHzOs0yj0NfjHko ZQ+OA2q57R3+Ybpl8AaBDcbM785zrUGho6ZqoXH5ORQMhTghaHGlIYv4wTdH8xS88ruc bPQvJTQJEnGII9TKoAb1WwyUSNNl25E/0Y9SRVBIRAsY5vccEUqYF0wLvmj0oqC2Ir4i 2Pe0FsgDBjUJ5Sodm9KjfisCndIH6UI+EhMmjvSlGeRpQfhKLSds2Vh+pMYD23PyPQAL YyBw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=NuptfWe+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a1-20020a170902ecc100b001a21fd27407si11717565plh.469.2023.04.04.18.03.49; Tue, 04 Apr 2023 18:04:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=NuptfWe+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236695AbjDEAp2 (ORCPT + 99 others); Tue, 4 Apr 2023 20:45:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56404 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236610AbjDEAp0 (ORCPT ); Tue, 4 Apr 2023 20:45:26 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6612018E for ; Tue, 4 Apr 2023 17:45:25 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id z16-20020a170902d55000b001a06f9b5e31so20500520plf.21 for ; Tue, 04 Apr 2023 17:45:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1680655525; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=7DA+p9LgbhVdVl+ZZN2EOFJj3Y+toC812cwG1G1Tydo=; b=NuptfWe+kbxpMI4xsKwwX3YVDMgXaZ48Y3wNEkIDr743/Q757lyf/pOnOzUmRThrUq 65zXsyfaIMgHd3AgFVjMbeNqzFVtITy9vvBN071dZtWEiJNTq10X+JDf/aMndem5ymbD j+fFgjBgOTirtIvdmAic2l7FUDkz7jodobZqdztSLKApS9S4jEE7fxeXP2uaFoz16Cvw JJrpTZ3A8ats7oTsoLcBGJHg68R5EgXNSbnA8OGHVYnEnQnmU6KvmtyW8RBB9lksCtyb TqECMaLutBKQk+nDl5CQiWAwH1KAVdwxeQio5mK3jQNYSMESSjyDxcv6PFgBSqd8Qmc0 ytNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680655525; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=7DA+p9LgbhVdVl+ZZN2EOFJj3Y+toC812cwG1G1Tydo=; b=xqfUUWbNVnAQJI2cqzVUp3JrwIdSjizehSXw68V/XyjgMB8GlMxSKPu3pZPbOlkC8K NzxIYKDddOGLbGIePbvxT2mIRjb8HGTxlHYO4og7m9FnpXaPPTA6WHsH0Ci3q51BFWu3 AsbNp3/xUkNKceD66y71l62Z0ncxNQiBbieQukipsMiSCJUeIFFtE3YebdMk+IMXQm3A jwT8a4Q6aX/mmMCpQEBShDtFu/ngYCmt5gBjLNp3cJ2PZ9JiJCCWbcD4bBxW/6k/FniX mev0fRUChio3CwioUCeKwP+VXrce0i6F0ipQVXxirlMr9AwpUwkKAkHIGil/6qzamx5c 0Ilg== X-Gm-Message-State: AAQBX9c4mI353kYiIrhCcc+DU86b0J5lCYOg6gNynQCEbDJA9PKpIJSM vR52oR24Sc8lvqTQxM9xzpjm2wv9lTs= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ba94:b0:1a0:48ff:5388 with SMTP id k20-20020a170902ba9400b001a048ff5388mr1806065pls.6.1680655524982; Tue, 04 Apr 2023 17:45:24 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 4 Apr 2023 17:45:15 -0700 In-Reply-To: <20230405004520.421768-1-seanjc@google.com> Mime-Version: 1.0 References: <20230405004520.421768-1-seanjc@google.com> X-Mailer: git-send-email 2.40.0.348.gf938b09366-goog Message-ID: <20230405004520.421768-2-seanjc@google.com> Subject: [PATCH v4 1/6] KVM: x86: Add a helper to handle filtering of unpermitted XCR0 features From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Aaron Lewis , Mingwei Zhang , Jim Mattson X-Spam-Status: No, score=-7.7 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1762296238364718010?= X-GMAIL-MSGID: =?utf-8?q?1762296238364718010?= From: Aaron Lewis Add a helper, kvm_get_filtered_xcr0(), to dedup code that needs to account for XCR0 features that require explicit opt-in on a per-process basis. In addition to documenting when KVM should/shouldn't consult xstate_get_guest_group_perm(), the helper will also allow sanitizing the filtered XCR0 to avoid enumerating architecturally illegal XCR0 values, e.g. XTILE_CFG without XTILE_DATA. No functional changes intended. Signed-off-by: Aaron Lewis Reviewed-by: Mingwei Zhang [sean: rename helper, move to x86.h, massage changelog] Signed-off-by: Sean Christopherson --- arch/x86/kvm/cpuid.c | 2 +- arch/x86/kvm/x86.c | 4 +--- arch/x86/kvm/x86.h | 13 +++++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 6972e0be60fa..542bcaab3592 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -996,7 +996,7 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function) entry->eax = entry->ebx = entry->ecx = 0; break; case 0xd: { - u64 permitted_xcr0 = kvm_caps.supported_xcr0 & xstate_get_guest_group_perm(); + u64 permitted_xcr0 = kvm_get_filtered_xcr0(); u64 permitted_xss = kvm_caps.supported_xss; entry->eax &= permitted_xcr0; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 2c0ff40e5345..7bac4162cfae 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -4567,9 +4567,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) r = 0; break; case KVM_CAP_XSAVE2: { - u64 guest_perm = xstate_get_guest_group_perm(); - - r = xstate_required_size(kvm_caps.supported_xcr0 & guest_perm, false); + r = xstate_required_size(kvm_get_filtered_xcr0(), false); if (r < sizeof(struct kvm_xsave)) r = sizeof(struct kvm_xsave); break; diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index 203fb6640b5b..b6c6988d99b5 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -315,6 +315,19 @@ extern struct kvm_caps kvm_caps; extern bool enable_pmu; +/* + * Get a filtered version of KVM's supported XCR0 that strips out dynamic + * features for which the current process doesn't (yet) have permission to use. + * This is intended to be used only when enumerating support to userspace, + * e.g. in KVM_GET_SUPPORTED_CPUID and KVM_CAP_XSAVE2, it does NOT need to be + * used to check/restrict guest behavior as KVM rejects KVM_SET_CPUID{2} if + * userspace attempts to enable unpermitted features. + */ +static inline u64 kvm_get_filtered_xcr0(void) +{ + return kvm_caps.supported_xcr0 & xstate_get_guest_group_perm(); +} + static inline bool kvm_mpx_supported(void) { return (kvm_caps.supported_xcr0 & (XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR)) From patchwork Wed Apr 5 00:45:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 79421 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp254520vqo; Tue, 4 Apr 2023 18:02:43 -0700 (PDT) X-Google-Smtp-Source: AKy350a13lXUnakKOsyuuCPPqqjphCCRu1fK1SNfYA6LBu817dG21RfPBpsVejLIYw7vZj07HBRj X-Received: by 2002:aa7:9809:0:b0:625:e728:4c5f with SMTP id e9-20020aa79809000000b00625e7284c5fmr3891079pfl.22.1680656562948; Tue, 04 Apr 2023 18:02:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680656562; cv=none; d=google.com; s=arc-20160816; b=HFk7vTYMirkOXth69rStHI4dkRtJ/zpizcU/LRFhXmvMgoD7prrXs0/h5PL+yzSSRa zfe5JzlzQ3eiTp/PnVodKoT8pyPXWfLYyvDda719IILS0JvQqXqmJwknMw8de2ZQ8RT3 oPMLFpok24Hmzyqbq9CI8UCrCdS/9NAhbRMhazvqflbZjrgIWhQ0X5k1//qdcBeVpQUl qFXlbx+EUky5gov1h6S2gQn0UQvnUKknug1nD1GuO1zxHN82wUQjpKwnwcFfhodeNllC Jf5KjlnX3CJEWMLHY4S3crYk3MnmNKbxZGAE7rK+v7sPLC+KER2wTkm6UknKJDSEIzTP qhwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=vzwiHRIkx/Ofvz49IPzfAACO6Ci51KB/Wu9lsV23c8g=; b=wpFbZelt0/jiGDXOF2CazAitoVdcMFe1po8Zy7SgHUis09e085DMXmDI2RA65iwn19 y6Xo5jEX7uPNmXextwFr2s71GLsekSV2bMCIUsVs/smI+9GDG8gxj/xwGLMXsYidvZux v32IjvT+rCsBI0W0caMMeOH5m+TmtdWGRsQ82Z76V7hRlP+KIVUsLmvAR4qim+cSlvOe 3EGMjl/sCpCYrJUh7NTog71L7lkWrjptiBG3eSZOeajXaJqQN8gE4MbG3LT1petyCwlC SiSd5cqS76jw1GMI2pTsjxFlR0n92CSiC4FZszUDQQfxG8fk/VkMVZxp9o+OoS9g/1qQ OZoQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=X0zmknsM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id y4-20020aa79424000000b00622ae306420si11004341pfo.279.2023.04.04.18.00.44; Tue, 04 Apr 2023 18:02:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=X0zmknsM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236712AbjDEApc (ORCPT + 99 others); Tue, 4 Apr 2023 20:45:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56500 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236697AbjDEAp2 (ORCPT ); Tue, 4 Apr 2023 20:45:28 -0400 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 591AF4693 for ; Tue, 4 Apr 2023 17:45:27 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-54629ed836aso203154577b3.10 for ; Tue, 04 Apr 2023 17:45:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1680655526; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=vzwiHRIkx/Ofvz49IPzfAACO6Ci51KB/Wu9lsV23c8g=; b=X0zmknsMe5WLmMccyTXLQG3HEv612eXVzRKnN8/ZIqgA8C5+68PswLGyJ75lEjdwSj /IwI8QPPL+nr5lUO/s+891Kfua4dDnvza+lYmwYBldQ5ZnX0hv5Oh466FPYtu/Xfkv7l qgt4UJ5HXVn84Bwp9qgZJ/ZZ7cvR0HWr91GfS7vyN6kiVjLhZCcetdNgou3W25U1vyKO uik15E6ZrTFRRDX2dNDoVW7qUM7d8srDSbxz57O2ANlIrfkURmz5fAbR5XnGMKP/jp+5 XyLhAU80vOo7FONqF1G8S8E4pXyPBBrrSBZUbYocQ5kd39SZikffdZIgR6NX/1n+R8s+ NeUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680655526; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=vzwiHRIkx/Ofvz49IPzfAACO6Ci51KB/Wu9lsV23c8g=; b=RQbWh1/cb50O12BMNxuBouPWKQzI4Gd5Dwxj+LnsDUPROjFteSXac4WQuf+yypBlg2 EycEHBQ/fjye9hZ9NW3ny6I0p63/oRZ9jru7imL0zjoFgbkY6BawDYjDoi1SQ1ZvuCEJ J1SrXUhiRCJ+R4zk7LBsQj9P9HUvyaGcoUZQmCFSMo3vwQmhJPPfNqTBRyASKSemW26N 1wawr2YYqLK6VwvLwyq3vPPnXtCdSAv9HXtLUnSCtYVtgbrIwOweYfBjVJCbhbVOSaeC xFGs1Z6tkdfe1Tb2e976qyp4wSWS/sbRSuhIZKe2rPsGxGPkr5fqc+xOBuu90rot8H2F toRw== X-Gm-Message-State: AAQBX9dGoW/PJQiryrXS+rOzkDV3wrCXt5Cce9/HAS2rWNGx7v+pJku9 62L8aNiWZ9teTqzIWJ7ghagTqvibGp0= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:cacf:0:b0:b77:158d:b3a0 with SMTP id a198-20020a25cacf000000b00b77158db3a0mr777440ybg.6.1680655526560; Tue, 04 Apr 2023 17:45:26 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 4 Apr 2023 17:45:16 -0700 In-Reply-To: <20230405004520.421768-1-seanjc@google.com> Mime-Version: 1.0 References: <20230405004520.421768-1-seanjc@google.com> X-Mailer: git-send-email 2.40.0.348.gf938b09366-goog Message-ID: <20230405004520.421768-3-seanjc@google.com> Subject: [PATCH v4 2/6] KVM: x86: Filter out XTILE_CFG if XTILE_DATA isn't permitted From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Aaron Lewis , Mingwei Zhang , Jim Mattson X-Spam-Status: No, score=-7.7 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1762296136361990693?= X-GMAIL-MSGID: =?utf-8?q?1762296136361990693?= Filter out XTILE_CFG from the supported XCR0 reported to userspace if the current process doesn't have access to XTILE_DATA. Attempting to set XTILE_CFG in XCR0 will #GP if XTILE_DATA is also not set, and so keeping XTILE_CFG as supported results in explosions if userspace feeds KVM_GET_SUPPORTED_CPUID back into KVM and the guest doesn't sanity check CPUID. Fixes: 445ecdf79be0 ("kvm: x86: Exclude unpermitted xfeatures at KVM_GET_SUPPORTED_CPUID") Reported-by: Aaron Lewis Signed-off-by: Sean Christopherson --- arch/x86/kvm/x86.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index b6c6988d99b5..3402d69820da 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -3,6 +3,7 @@ #define ARCH_X86_KVM_X86_H #include +#include #include #include #include "kvm_cache_regs.h" @@ -325,7 +326,22 @@ extern bool enable_pmu; */ static inline u64 kvm_get_filtered_xcr0(void) { - return kvm_caps.supported_xcr0 & xstate_get_guest_group_perm(); + u64 permitted_xcr0 = kvm_caps.supported_xcr0; + + BUILD_BUG_ON(XFEATURE_MASK_USER_DYNAMIC != XFEATURE_MASK_XTILE_DATA); + + if (permitted_xcr0 & XFEATURE_MASK_USER_DYNAMIC) { + permitted_xcr0 &= xstate_get_guest_group_perm(); + + /* + * Treat XTILE_CFG as unsupported if the current process isn't + * allowed to use XTILE_DATA, as attempting to set XTILE_CFG in + * XCR0 without setting XTILE_DATA is architecturally illegal. + */ + if (!(permitted_xcr0 & XFEATURE_MASK_XTILE_DATA)) + permitted_xcr0 &= ~XFEATURE_MASK_XTILE_CFG; + } + return permitted_xcr0; } static inline bool kvm_mpx_supported(void) From patchwork Wed Apr 5 00:45:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 79422 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp254654vqo; Tue, 4 Apr 2023 18:02:58 -0700 (PDT) X-Google-Smtp-Source: AKy350a4GJTMVOuShB14mdWCSGI55soxNIg6fSwy+U9+6ku2OB7Gv+GtR6PbimOk9k8jB8kndzep X-Received: by 2002:a05:6a20:84a3:b0:d8:cb1a:f4e5 with SMTP id u35-20020a056a2084a300b000d8cb1af4e5mr3731213pzd.23.1680656578268; Tue, 04 Apr 2023 18:02:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680656578; cv=none; d=google.com; s=arc-20160816; b=w2L09vHc+ifDWkunxsOLv1sMIl6HcWLxXVujI/eXPRjlxkAQW2o8DUmn8DXoYaxvp6 5DbfkQ60MADRaR6YRDA8RhVNjD7WHQ1x3DLgFxrJ38PK0hezGcTfwuQ6WOnYMU0snlJ4 wqXwNymnjfXQHcrGaNFKCHJSyqSPSUnmoLCd8gYECbvg7gmi8WaKpbQj7dTa9VRfnvLO Kj3ld9vbhiKJwo+L6tEK4qo+eq6UDTr1y+9CkhPTFY4CHc2UmWk3B87MxFmSz+lHY0Iw /XQK+NW1L6PHgIOV/o5TH9eVUiI4DmnwxTdrb4FaRuky58EOZY2WxvKcr6Vtdv8Yeq+s wZFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=tf25xAl4fSdxFBAk8i0l5aGjOrxXQadDD1CZezPxob4=; b=c+TJUAhvvtNPer1f8h2IV7cnXaZVr8t9HibzETM+t6Hhx1sQqxeMbpWdb21nD2WO9k 1GZn1lDZYkKyT9ISDzZoR2iDncMO77uhQUJa37aTCr2YbSvo47+EX8lctuQ5PkRgvZww EQrfyqJ0DDHMOtPuy0xcWZ1fJDwYmXj2eF/Hy4M8rCZGoxEF4YeJQWaNXIrD7IIbiNZM CCCKySu8ZJcKfLLzkUFDdaXE5qBfkFWSiCgsdcJPaju/JZwM988+9/c9cAhpxofh3cmP KCEutQtr1FefZugXVsuJ7dy/RHL4BArqnoJXYb4SESfJnTHqV1d/6Z8Iamx6tbwSIyrN kQUQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=k3vSRE8u; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a8-20020aa79708000000b00622a0ec4624si11304255pfg.9.2023.04.04.18.02.44; Tue, 04 Apr 2023 18:02:58 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=k3vSRE8u; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236719AbjDEApg (ORCPT + 99 others); Tue, 4 Apr 2023 20:45:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236610AbjDEAp3 (ORCPT ); Tue, 4 Apr 2023 20:45:29 -0400 Received: from mail-pf1-x44a.google.com (mail-pf1-x44a.google.com [IPv6:2607:f8b0:4864:20::44a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CDB124C0C for ; Tue, 4 Apr 2023 17:45:28 -0700 (PDT) Received: by mail-pf1-x44a.google.com with SMTP id y186-20020a62cec3000000b00627df3d6ec4so15517285pfg.12 for ; Tue, 04 Apr 2023 17:45:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1680655528; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=tf25xAl4fSdxFBAk8i0l5aGjOrxXQadDD1CZezPxob4=; b=k3vSRE8uQSYLQ5FHcz/pee6bDiPafNfanLHpLWinnqWSebl9zem+gxu9QQCpk/1Brr 55gJmi5Wx+I48U9ScE+y+g8gHjPKFwfcATMGdcaqLioTN3kx0U6W9NqCr3xKtOt3dqAL 41/V11LD7CC3rDGsHXBIiRdUOer0/+Nyl1JEuiv0BHHyHp2Td/Ok924VfjEFsKwwEojB ywDI8B4uzpOSjrB94WT9uSVf4u9rj6DcnfUdsQZBto5gS3FaVEHCmdVeqFPs+wEtWcbW J26aicb/UNXWJw2I9Yo0vTBRTQr5QMnYiGkS/yGxNxB14JmxviepHPNH3t+5kfJkCixT t8eA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680655528; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=tf25xAl4fSdxFBAk8i0l5aGjOrxXQadDD1CZezPxob4=; b=uJTzKBMYF7gMmObmPTpF4T69ohceqXdN1W1xJpScdfXKDd2/FRz8HaDie1sFARzNUq HCcXl3K/KlZVNgY7ZN+HCHvP8ZxtKDYfmWv+2Z9jeegQ6S6FeLm2xt/tJPJb644n3jI/ sVTk0ULFj17S1jcRsu06EpSdXGPCYmEmFerYC0BqD4rA5i10eSMR19hLFAYewytVtwOU N+MkxlbnLrlB+r8s+uywhFz3Xj99s37ZgjbujFMZclI6jdKcYbKiY4PLMS+I3el0yhuw BgPcykeoxs6xEZbopX4yO7+UpCqfEYlGA4B0GQ681T7nBIJ+w0MtxFVlY+EJ9ih6tyoJ Jlfw== X-Gm-Message-State: AAQBX9dbk45QmDMNJgLQHNJdbvrK+K3TBjoMI158NjzaPKpDZGZTzdq3 RElae4iTEqvw/Ew1oQii5VR8im6phEE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:b692:b0:19f:3aa9:9ea1 with SMTP id c18-20020a170902b69200b0019f3aa99ea1mr1802510pls.8.1680655528391; Tue, 04 Apr 2023 17:45:28 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 4 Apr 2023 17:45:17 -0700 In-Reply-To: <20230405004520.421768-1-seanjc@google.com> Mime-Version: 1.0 References: <20230405004520.421768-1-seanjc@google.com> X-Mailer: git-send-email 2.40.0.348.gf938b09366-goog Message-ID: <20230405004520.421768-4-seanjc@google.com> Subject: [PATCH v4 3/6] KVM: selftests: Move XGETBV and XSETBV helpers to common code From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Aaron Lewis , Mingwei Zhang , Jim Mattson X-Spam-Status: No, score=-7.7 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1762296152399550626?= X-GMAIL-MSGID: =?utf-8?q?1762296152399550626?= From: Aaron Lewis The instructions XGETBV and XSETBV are useful to other tests. Move them to processor.h to make them more broadly available. No functional change intended. Reviewed-by: Jim Mattson Signed-off-by: Aaron Lewis Reviewed-by: Mingwei Zhang [sean: reword shortlog] Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/x86_64/processor.h | 18 ++++++++++++++ tools/testing/selftests/kvm/x86_64/amx_test.c | 24 +++---------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index 3538fa6db72d..f6061fe7057f 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -510,6 +510,24 @@ static inline void set_cr4(uint64_t val) __asm__ __volatile__("mov %0, %%cr4" : : "r" (val) : "memory"); } +static inline u64 xgetbv(u32 index) +{ + u32 eax, edx; + + __asm__ __volatile__("xgetbv;" + : "=a" (eax), "=d" (edx) + : "c" (index)); + return eax | ((u64)edx << 32); +} + +static inline void xsetbv(u32 index, u64 value) +{ + u32 eax = value; + u32 edx = value >> 32; + + __asm__ __volatile__("xsetbv" :: "a" (eax), "d" (edx), "c" (index)); +} + static inline struct desc_ptr get_gdt(void) { struct desc_ptr gdt; diff --git a/tools/testing/selftests/kvm/x86_64/amx_test.c b/tools/testing/selftests/kvm/x86_64/amx_test.c index 5c82d7e6f552..af1ef6f79d32 100644 --- a/tools/testing/selftests/kvm/x86_64/amx_test.c +++ b/tools/testing/selftests/kvm/x86_64/amx_test.c @@ -65,24 +65,6 @@ struct xtile_info { static struct xtile_info xtile; -static inline u64 __xgetbv(u32 index) -{ - u32 eax, edx; - - asm volatile("xgetbv;" - : "=a" (eax), "=d" (edx) - : "c" (index)); - return eax + ((u64)edx << 32); -} - -static inline void __xsetbv(u32 index, u64 value) -{ - u32 eax = value; - u32 edx = value >> 32; - - asm volatile("xsetbv" :: "a" (eax), "d" (edx), "c" (index)); -} - static inline void __ldtilecfg(void *cfg) { asm volatile(".byte 0xc4,0xe2,0x78,0x49,0x00" @@ -160,10 +142,10 @@ static void init_regs(void) set_cr4(cr4); GUEST_ASSERT(this_cpu_has(X86_FEATURE_OSXSAVE)); - xcr0 = __xgetbv(0); + xcr0 = xgetbv(0); xcr0 |= XFEATURE_MASK_XTILE; - __xsetbv(0x0, xcr0); - GUEST_ASSERT((__xgetbv(0) & XFEATURE_MASK_XTILE) == XFEATURE_MASK_XTILE); + xsetbv(0x0, xcr0); + GUEST_ASSERT((xgetbv(0) & XFEATURE_MASK_XTILE) == XFEATURE_MASK_XTILE); } static void __attribute__((__flatten__)) guest_code(struct tile_config *amx_cfg, From patchwork Wed Apr 5 00:45:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 79429 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp266962vqo; Tue, 4 Apr 2023 18:33:04 -0700 (PDT) X-Google-Smtp-Source: AKy350Z+ZwJLrGB2wPXR/Ofo+n8JVYFx6a5nFkIKvv+dCZ9mthFe93yWRWAOvnWct4QxvvNay5/q X-Received: by 2002:aa7:950d:0:b0:62a:443b:eb3 with SMTP id b13-20020aa7950d000000b0062a443b0eb3mr4216197pfp.27.1680658384421; Tue, 04 Apr 2023 18:33:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680658384; cv=none; d=google.com; s=arc-20160816; b=swxt3j5omt4CFMKKm8cCpE9qrMeT10Qk4gbf03ZNkgamUOCXbS3b01WUWzYNF8kFbi ObNU8nYIUgIxhVd4Wq+A8UJ32m0S0TYBsJuigfueOASGq3dLscC11sBvLjLZOrTd3FWc V5rO+sNfNbb27gd65/WA11rgvkUPTorGQC64Ev9GzgC5wQUsk5pOwN9+70FHJlmaxQl2 H/V637DQ5qqa1jAWTotGT+dnH5+91Hl/zVMZ+19tfuV0lLbcboAiNyUlgNeRWhH36Wb3 H9ShT9vpeqfwP+ePu5nkPQMkr3OLdusn2trxq6MPMHKwZQA6/DY66pC5M5ZM893qZW7j 8PdQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=SL1I67lV9tgXgAEvmRnaRT+4/QRS9Sk5XoUvQ3XeqRI=; b=RSJGO6ugskNN57xnSJ5vgFz+i/htYXCaFlW6LmM7kJAEIhWWCZG4wpuS74DOcbyJLm RAVajkPBkuQLMNoZmIwKN0vidsVXgHBx5wga0psJCl62L6itnt91C3z+Mmerd74QGbyp 8zyzlFTS6CdiHEbxgufJW1SagEQJSe8l807hCDz3zeTgQKVvBRYYjtdazAUeR7fA/R2q 6tOG7tzE6gE0x6sgyKhUyJ8b+EOro040K/iUyHjw41dHRVCGyHc2NvKkmJEMcVDm0Ujh VJkgSSC5mM/9RlQbS312v9459jmS1swAWDigWVNdAkCt9ag2Y6urbc2CbD9ClUpBQu+R uJsw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=J1cGRcd7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id y4-20020a63de44000000b0050c0a00c1edsi11670837pgi.703.2023.04.04.18.32.06; Tue, 04 Apr 2023 18:33:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=J1cGRcd7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236751AbjDEApq (ORCPT + 99 others); Tue, 4 Apr 2023 20:45:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56776 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236701AbjDEApd (ORCPT ); Tue, 4 Apr 2023 20:45:33 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 78CD049F1 for ; Tue, 4 Apr 2023 17:45:31 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id h4-20020a170902f54400b001a1f5f00f3fso19958083plf.2 for ; Tue, 04 Apr 2023 17:45:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1680655530; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=SL1I67lV9tgXgAEvmRnaRT+4/QRS9Sk5XoUvQ3XeqRI=; b=J1cGRcd7ht1RyeB1dMJiFXaAS4GM2LJk6yDcKESwIL0R8iRCfuxajLpzX5zKnLczuT bxHd8FnJcmI+SMglu4+SA0klmsqwRW5SfSo5bl5HR6bJHuu1qPq6v3juzseWWsYJgb/V qrrGQHve/MBiMDnwbl1Esflahc8hUQ8bBJobaJ6AxXYy65kpWiJyj3l4dYWC7G27Im0e t74ZnovCetz0rNdxnZIXALMXptBqCyPGES/luAPTP1pp0sriD8E2SrddR/A2hqU9zu7A ooe89p4LhjJK3UJbupaz4huRnLNo5WWpBkBpLENrTH0Edn7F1ChvNZXsQlCy9xesCATr orEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680655530; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=SL1I67lV9tgXgAEvmRnaRT+4/QRS9Sk5XoUvQ3XeqRI=; b=rUZri2jOo4hy7CnZyCVVtunsDPameZ17yISYWfx2UhHktYTODf2YWYsmrEFf04qZlw 6LIyJVIKDoFFxCBSuQWNlaMc+32jWffIQFWJBsZbhB5vshRBwgvD4xwAYbx8XLrdNIv7 zInGsMJfrCZ7lSmMaZgRxGgQlUEa1SX4fH3UM/HfotF9o2QlMAANyDBjuaTd4wF6OZKS GoJ4Yk2+b5QPMlrUOwHeRnNdRFujA322LVeqcC8JPIwQPycw15z3M1pMi90FUOzjp0OY MOBfHkgDYRZsst7ye/s9TNaS9A0Gy5AvT0nYSPVnYtvtWvVgbgOTbyZpBa7LDzfsKS1r B7pA== X-Gm-Message-State: AAQBX9cJa3rJUx3X00HKIij32KDXdOidlcNjJOA9ViwI5mu7+U3FYWVL uD3jCg4rQ5CMGXJfT+7G3xhZOGsPOSQ= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90a:4591:b0:234:acfd:c8da with SMTP id v17-20020a17090a459100b00234acfdc8damr1604747pjg.2.1680655530265; Tue, 04 Apr 2023 17:45:30 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 4 Apr 2023 17:45:18 -0700 In-Reply-To: <20230405004520.421768-1-seanjc@google.com> Mime-Version: 1.0 References: <20230405004520.421768-1-seanjc@google.com> X-Mailer: git-send-email 2.40.0.348.gf938b09366-goog Message-ID: <20230405004520.421768-5-seanjc@google.com> Subject: [PATCH v4 4/6] KVM: selftests: Rework dynamic XFeature helper to take mask, not bit From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Aaron Lewis , Mingwei Zhang , Jim Mattson X-Spam-Status: No, score=-7.7 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1762298046357503998?= X-GMAIL-MSGID: =?utf-8?q?1762298046357503998?= Take the XFeature mask in __vm_xsave_require_permission() instead of the bit so that there's no need to define macros for both the bit and the mask. Asserting that only a single bit is set and retrieving said bit is easy enough via log2 helpers. Opportunistically clean up the error message for the ARCH_REQ_XCOMP_GUEST_PERM sanity check. Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/x86_64/processor.h | 6 +++--- .../selftests/kvm/lib/x86_64/processor.c | 17 ++++++++++------- tools/testing/selftests/kvm/x86_64/amx_test.c | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index f6061fe7057f..41d798375570 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -1098,10 +1098,10 @@ uint64_t kvm_hypercall(uint64_t nr, uint64_t a0, uint64_t a1, uint64_t a2, uint64_t __xen_hypercall(uint64_t nr, uint64_t a0, void *a1); void xen_hypercall(uint64_t nr, uint64_t a0, void *a1); -void __vm_xsave_require_permission(int bit, const char *name); +void __vm_xsave_require_permission(uint64_t xfeature, const char *name); -#define vm_xsave_require_permission(perm) \ - __vm_xsave_require_permission(perm, #perm) +#define vm_xsave_require_permission(xfeature) \ + __vm_xsave_require_permission(xfeature, #xfeature) enum pg_level { PG_LEVEL_NONE, diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c index a12b21a2ef37..898b30096c80 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/processor.c +++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c @@ -697,7 +697,7 @@ uint64_t kvm_get_feature_msr(uint64_t msr_index) return buffer.entry.data; } -void __vm_xsave_require_permission(int bit, const char *name) +void __vm_xsave_require_permission(uint64_t xfeature, const char *name) { int kvm_fd; u64 bitmask; @@ -705,12 +705,15 @@ void __vm_xsave_require_permission(int bit, const char *name) struct kvm_device_attr attr = { .group = 0, .attr = KVM_X86_XCOMP_GUEST_SUPP, - .addr = (unsigned long) &bitmask + .addr = (unsigned long) &bitmask, }; TEST_ASSERT(!kvm_supported_cpuid, "kvm_get_supported_cpuid() cannot be used before ARCH_REQ_XCOMP_GUEST_PERM"); + TEST_ASSERT(is_power_of_2(xfeature), + "Dynamic XFeatures must be enabled one at a time"); + kvm_fd = open_kvm_dev_path_or_exit(); rc = __kvm_ioctl(kvm_fd, KVM_GET_DEVICE_ATTR, &attr); close(kvm_fd); @@ -720,16 +723,16 @@ void __vm_xsave_require_permission(int bit, const char *name) TEST_ASSERT(rc == 0, "KVM_GET_DEVICE_ATTR(0, KVM_X86_XCOMP_GUEST_SUPP) error: %ld", rc); - __TEST_REQUIRE(bitmask & (1ULL << bit), + __TEST_REQUIRE(bitmask & xfeature, "Required XSAVE feature '%s' not supported", name); - TEST_REQUIRE(!syscall(SYS_arch_prctl, ARCH_REQ_XCOMP_GUEST_PERM, bit)); + TEST_REQUIRE(!syscall(SYS_arch_prctl, ARCH_REQ_XCOMP_GUEST_PERM, ilog2(xfeature))); rc = syscall(SYS_arch_prctl, ARCH_GET_XCOMP_GUEST_PERM, &bitmask); TEST_ASSERT(rc == 0, "prctl(ARCH_GET_XCOMP_GUEST_PERM) error: %ld", rc); - TEST_ASSERT(bitmask & (1ULL << bit), - "prctl(ARCH_REQ_XCOMP_GUEST_PERM) failure bitmask=0x%lx", - bitmask); + TEST_ASSERT(bitmask & xfeature, + "'%s' (0x%lx) not permitted after prctl(ARCH_REQ_XCOMP_GUEST_PERM) perrmited=0x%lx", + name, xfeature, bitmask); } void vcpu_init_cpuid(struct kvm_vcpu *vcpu, const struct kvm_cpuid2 *cpuid) diff --git a/tools/testing/selftests/kvm/x86_64/amx_test.c b/tools/testing/selftests/kvm/x86_64/amx_test.c index af1ef6f79d32..a0f74f5121a6 100644 --- a/tools/testing/selftests/kvm/x86_64/amx_test.c +++ b/tools/testing/selftests/kvm/x86_64/amx_test.c @@ -233,7 +233,7 @@ int main(int argc, char *argv[]) * Note, all off-by-default features must be enabled before anything * caches KVM_GET_SUPPORTED_CPUID, e.g. before using kvm_cpu_has(). */ - vm_xsave_require_permission(XSTATE_XTILE_DATA_BIT); + vm_xsave_require_permission(XFEATURE_MASK_XTILEDATA); TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_XFD)); TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_XSAVE)); From patchwork Wed Apr 5 00:45:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 79428 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp261132vqo; Tue, 4 Apr 2023 18:18:12 -0700 (PDT) X-Google-Smtp-Source: AKy350bNjpffvn5Awr/9XbhACkAPMa8csJ7jqPY0RqP+LKpveeRgVrVDl7y75Z6Q2cU51GwzHwND X-Received: by 2002:a17:90a:d185:b0:23d:44c6:745a with SMTP id fu5-20020a17090ad18500b0023d44c6745amr4933136pjb.2.1680657492526; Tue, 04 Apr 2023 18:18:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680657492; cv=none; d=google.com; s=arc-20160816; b=KfisTHXNjDEUmqNMTpE/oafIjBFgmAyCNrCE6xf8c+/DiuKo0OYkR0WAFyE3jqLo2d fYknN+fxArxvrIj1IZ7xqD8V9oxc6v9yptfneNELnHkpp23SD3h1L62xrXD3750d/3ub /VWXDKlqHI+icnmCyZpWAwlqZZYrHteYRgh+s6IL8DhRmYGGcectCRZYV4SSw+GAsA78 iX4T2rQlmDaPeSbAd8nO55ucbtR/a7qq4jJatUVyiH66JHRx8z7kA3bNIqS3wlGvl+/9 PuvktibwSBPZPDgQPY0b++rG/Vq5uMu6/ncFzOFfmk043JoNMctK/gaZLWe+g8y4gDvy KqGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=bZtl93ldMr9OOkgRDj/Fj0OOXpGgF15cFMR2dIgZs2w=; b=KRlQhAVZ/DLNZj73j8C4mIxuVKskIrWnZPtbC+ArHgpOCXfgKmkJ6off/z861LtWKz IkAwKzVQCmJmXnU3rWz1QXIMs0xA3cVFeYy4+kTgH+OxYPBeUnzJJOOmjLKbzqFy8lnn JYRHK2h+za6aWbVTwlMjB45RDq28qbS8KjmS8bvrZ+mHqKgPGNqO+jLjx6NYJrGp3aSO sTsN5DHhKKf3dC1b0YLlrSYK0cXF24mWkAUz+lwNCZNkz3zmbNUY2ZiDI1vFUcRnDr8j b47tq6Ak4fgLrXXoBLoK7GIUmX33HOaCOyPyiKD7EplntpQzWcBzy32TuIDyjb6ekjYK Lpmg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=hzlhVYMh; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id r5-20020a17090aad0500b00230a19ce84asi349619pjq.147.2023.04.04.18.17.59; Tue, 04 Apr 2023 18:18:12 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=hzlhVYMh; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236486AbjDEApu (ORCPT + 99 others); Tue, 4 Apr 2023 20:45:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57162 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236726AbjDEApj (ORCPT ); Tue, 4 Apr 2023 20:45:39 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DD3BC423B for ; Tue, 4 Apr 2023 17:45:32 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id m6-20020a056902118600b00aeb1e3dbd1bso33301010ybu.9 for ; Tue, 04 Apr 2023 17:45:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1680655532; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=bZtl93ldMr9OOkgRDj/Fj0OOXpGgF15cFMR2dIgZs2w=; b=hzlhVYMhCOCJy1ylKcFVYwb8V7aQ32ComHcrKgecVtklfF+xeCqWCl7zkLdMj/dpKo B/dYa0eJGXLuFhItVzhTkf5ZJeRKx623SLbhX7OsAh7JJe/D7ljkU3cCtQCn4VcGks3M Kv/+S6Uuf9z8OftkfWwAgQAFdK9IneXHKeOG6CtUqzuo0ifOWpqdeenVCIC6PyQ5+inu gRwNb9oUdgSKVUW1STe3Xgism2DNc4clF8vZ854ex4Sg5MYgwPzETW485pdeZfM5rFdi 8DOZSBPvE9KwsXCEUUFkl+zrurn00B3N2Z3dAyBMCeH3wWROLnmQqiaZ5QTB70kmSKoq yeUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680655532; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=bZtl93ldMr9OOkgRDj/Fj0OOXpGgF15cFMR2dIgZs2w=; b=vkrah1rlEo0lZPxTECmBak0FG0wcV0uWc3SwE2h4UDC1CkhI9OW6ZZbbSG8Lv18d9Y eUfSjk8ukuSV1hu+I/yGkAmicCLhq3KAyHNU2mJgcDfsjsdSPvv7tMqmmkr4fVbhF1/x kjKExKYaMqVnDleDxVbeGfdtzHHlg9PT6/qYaaKtRz2XHpqqt86O9ZFh0HiM3DliyIeY 5qqzMT1iSwz06OINcwz9WGsHwasrTiWBIwCCHzuxeoF6baiPluYERDDDajsY+V+MxALD EKQ4YSaw8UINZ1dFSye05e3hc7LtErqsH5bFW0427OnFWA7rJ8V4BZ+r4TRuFx9ueWG2 H9xQ== X-Gm-Message-State: AAQBX9f58iTasc0APoBdbkt7WQEgRmqV7kxxXLmemMN24HV32lA59Xkf JJ7GqomXs2K+Iwn9TaxeW2mrXAsh1iw= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a81:b627:0:b0:544:d154:fd3c with SMTP id u39-20020a81b627000000b00544d154fd3cmr2596017ywh.1.1680655532028; Tue, 04 Apr 2023 17:45:32 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 4 Apr 2023 17:45:19 -0700 In-Reply-To: <20230405004520.421768-1-seanjc@google.com> Mime-Version: 1.0 References: <20230405004520.421768-1-seanjc@google.com> X-Mailer: git-send-email 2.40.0.348.gf938b09366-goog Message-ID: <20230405004520.421768-6-seanjc@google.com> Subject: [PATCH v4 5/6] KVM: selftests: Add all known XFEATURE masks to common code From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Aaron Lewis , Mingwei Zhang , Jim Mattson X-Spam-Status: No, score=-7.7 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1762297111069056167?= X-GMAIL-MSGID: =?utf-8?q?1762297111069056167?= From: Aaron Lewis Add all known XFEATURE masks to processor.h to make them more broadly available in KVM selftests. Relocate and clean up the exiting AMX (XTILE) defines in processor.h, e.g. drop the intermediate define and use BIT_ULL. Signed-off-by: Aaron Lewis Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/x86_64/processor.h | 25 ++++++++---- tools/testing/selftests/kvm/x86_64/amx_test.c | 38 ++++++++----------- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index 41d798375570..187309f3e7e9 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -60,6 +60,23 @@ struct xstate { u8 extended_state_area[0]; } __attribute__ ((packed, aligned (64))); +#define XFEATURE_MASK_FP BIT_ULL(0) +#define XFEATURE_MASK_SSE BIT_ULL(1) +#define XFEATURE_MASK_YMM BIT_ULL(2) +#define XFEATURE_MASK_BNDREGS BIT_ULL(3) +#define XFEATURE_MASK_BNDCSR BIT_ULL(4) +#define XFEATURE_MASK_OPMASK BIT_ULL(5) +#define XFEATURE_MASK_ZMM_Hi256 BIT_ULL(6) +#define XFEATURE_MASK_Hi16_ZMM BIT_ULL(7) +#define XFEATURE_MASK_XTILE_CFG BIT_ULL(17) +#define XFEATURE_MASK_XTILE_DATA BIT_ULL(18) + +#define XFEATURE_MASK_AVX512 (XFEATURE_MASK_OPMASK | \ + XFEATURE_MASK_ZMM_Hi256 | \ + XFEATURE_MASK_Hi16_ZMM) +#define XFEATURE_MASK_XTILE (XFEATURE_MASK_XTILE_DATA | \ + XFEATURE_MASK_XTILE_CFG) + /* Note, these are ordered alphabetically to match kvm_cpuid_entry2. Eww. */ enum cpuid_output_regs { KVM_CPUID_EAX, @@ -1138,14 +1155,6 @@ void virt_map_level(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr, #define X86_CR0_CD (1UL<<30) /* Cache Disable */ #define X86_CR0_PG (1UL<<31) /* Paging */ -#define XSTATE_XTILE_CFG_BIT 17 -#define XSTATE_XTILE_DATA_BIT 18 - -#define XSTATE_XTILE_CFG_MASK (1ULL << XSTATE_XTILE_CFG_BIT) -#define XSTATE_XTILE_DATA_MASK (1ULL << XSTATE_XTILE_DATA_BIT) -#define XFEATURE_XTILE_MASK (XSTATE_XTILE_CFG_MASK | \ - XSTATE_XTILE_DATA_MASK) - #define PFERR_PRESENT_BIT 0 #define PFERR_WRITE_BIT 1 #define PFERR_USER_BIT 2 diff --git a/tools/testing/selftests/kvm/x86_64/amx_test.c b/tools/testing/selftests/kvm/x86_64/amx_test.c index a0f74f5121a6..11329e5ff945 100644 --- a/tools/testing/selftests/kvm/x86_64/amx_test.c +++ b/tools/testing/selftests/kvm/x86_64/amx_test.c @@ -34,12 +34,6 @@ #define MAX_TILES 16 #define RESERVED_BYTES 14 -#define XFEATURE_XTILECFG 17 -#define XFEATURE_XTILEDATA 18 -#define XFEATURE_MASK_XTILECFG (1 << XFEATURE_XTILECFG) -#define XFEATURE_MASK_XTILEDATA (1 << XFEATURE_XTILEDATA) -#define XFEATURE_MASK_XTILE (XFEATURE_MASK_XTILECFG | XFEATURE_MASK_XTILEDATA) - #define XSAVE_HDR_OFFSET 512 struct tile_config { @@ -172,25 +166,25 @@ static void __attribute__((__flatten__)) guest_code(struct tile_config *amx_cfg, * After XSAVEC, XTILEDATA is cleared in the xstate_bv but is set in * the xcomp_bv. */ - xstate->header.xstate_bv = XFEATURE_MASK_XTILEDATA; - __xsavec(xstate, XFEATURE_MASK_XTILEDATA); - GUEST_ASSERT(!(xstate->header.xstate_bv & XFEATURE_MASK_XTILEDATA)); - GUEST_ASSERT(xstate->header.xcomp_bv & XFEATURE_MASK_XTILEDATA); + xstate->header.xstate_bv = XFEATURE_MASK_XTILE_DATA; + __xsavec(xstate, XFEATURE_MASK_XTILE_DATA); + GUEST_ASSERT(!(xstate->header.xstate_bv & XFEATURE_MASK_XTILE_DATA)); + GUEST_ASSERT(xstate->header.xcomp_bv & XFEATURE_MASK_XTILE_DATA); /* xfd=0x40000, disable amx tiledata */ - wrmsr(MSR_IA32_XFD, XFEATURE_MASK_XTILEDATA); + wrmsr(MSR_IA32_XFD, XFEATURE_MASK_XTILE_DATA); /* * XTILEDATA is cleared in xstate_bv but set in xcomp_bv, this property * remains the same even when amx tiledata is disabled by IA32_XFD. */ - xstate->header.xstate_bv = XFEATURE_MASK_XTILEDATA; - __xsavec(xstate, XFEATURE_MASK_XTILEDATA); - GUEST_ASSERT(!(xstate->header.xstate_bv & XFEATURE_MASK_XTILEDATA)); - GUEST_ASSERT((xstate->header.xcomp_bv & XFEATURE_MASK_XTILEDATA)); + xstate->header.xstate_bv = XFEATURE_MASK_XTILE_DATA; + __xsavec(xstate, XFEATURE_MASK_XTILE_DATA); + GUEST_ASSERT(!(xstate->header.xstate_bv & XFEATURE_MASK_XTILE_DATA)); + GUEST_ASSERT((xstate->header.xcomp_bv & XFEATURE_MASK_XTILE_DATA)); GUEST_SYNC(6); - GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILEDATA); + GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILE_DATA); set_tilecfg(amx_cfg); __ldtilecfg(amx_cfg); /* Trigger #NM exception */ @@ -202,14 +196,14 @@ static void __attribute__((__flatten__)) guest_code(struct tile_config *amx_cfg, void guest_nm_handler(struct ex_regs *regs) { - /* Check if #NM is triggered by XFEATURE_MASK_XTILEDATA */ + /* Check if #NM is triggered by XFEATURE_MASK_XTILE_DATA */ GUEST_SYNC(7); GUEST_ASSERT(!(get_cr0() & X86_CR0_TS)); - GUEST_ASSERT(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILEDATA); - GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILEDATA); + GUEST_ASSERT(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILE_DATA); + GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILE_DATA); GUEST_SYNC(8); - GUEST_ASSERT(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILEDATA); - GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILEDATA); + GUEST_ASSERT(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILE_DATA); + GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILE_DATA); /* Clear xfd_err */ wrmsr(MSR_IA32_XFD_ERR, 0); /* xfd=0, enable amx */ @@ -233,7 +227,7 @@ int main(int argc, char *argv[]) * Note, all off-by-default features must be enabled before anything * caches KVM_GET_SUPPORTED_CPUID, e.g. before using kvm_cpu_has(). */ - vm_xsave_require_permission(XFEATURE_MASK_XTILEDATA); + vm_xsave_require_permission(XFEATURE_MASK_XTILE_DATA); TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_XFD)); TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_XSAVE)); From patchwork Wed Apr 5 00:45:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 79430 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp266976vqo; Tue, 4 Apr 2023 18:33:06 -0700 (PDT) X-Google-Smtp-Source: AKy350ZUGcTAPlTZWM3OpnqKpGMMaxz9PlsmMA8fjfZ+ZChX/+wDFUyxAzTmXno3cLueaudCeze0 X-Received: by 2002:a05:6a20:4e13:b0:c6:c85f:da5b with SMTP id gk19-20020a056a204e1300b000c6c85fda5bmr4401129pzb.55.1680658386428; Tue, 04 Apr 2023 18:33:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680658386; cv=none; d=google.com; s=arc-20160816; b=GAN3KMhUCxGlVMo9ZoYJzmzk+m1UtFAxTovntBR8qrp02/zSY3nxSEsLuDtBi6eJNW GmZKzElZP+pM981UZG+Csk9iMtLFTBippYyW+7oTJmJeE+AgsN8OcTd43n3aVVwShobD f5zxDeB7Pqy8okyLsTT1vg0kA3gQGro4Q9ahXYqEV5qEhisqapexwdXX71ptAr2Ry/Ry Mow+Nr2MUYbXXGtzYsY/3aHsv+qfjtGONqu3irCyDk2zrW0LQgS3X0Pyi0mVZ3tJCh8O TU7ekf37Eko0xASYd3Y98xxlMJTG8LQhoSow2Nbk1e1RkTRLuFWVLk86BKY1qeuApeSd ABJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=iP4zSUAb/NsRt+s845gBr40fiLxdAbGQ8k72w+L3KVU=; b=ioouf0f7qugGa7f32Xmkjey1jpLY2fXrISsRNJhXJGaEtGH8Ock+pRN0CObRWJhxHS 0ISBj9yqrKLn5sIqo+I3QR4ZtvfSutS+i0Vmth+kuOa1aKXdjkzZAc6JXF9rymbjECEI kEAweJv3tu+Rxt+Untr3mmig3U5MQzwBiGp6X6v1LUGWZzRTT+yI2y4VXnxxyHRzYIxc xV+xbFPnC9VyvJjrI2L73xKRggrhZGQyrRa4aatn/KU3O38MIobBUmUeH+ovDaPZjVE6 8AXPVeBYjRtTd1nlZHecVg3VaUy+NhhuNRVcADri823wyXlMlZsyne1H9oJjcWOJoXsQ 1rjg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=mSg4XJa9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id g20-20020aa796b4000000b00625e8ef7241si703325pfk.30.2023.04.04.18.32.53; Tue, 04 Apr 2023 18:33:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=mSg4XJa9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236721AbjDEApy (ORCPT + 99 others); Tue, 4 Apr 2023 20:45:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56722 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236710AbjDEApn (ORCPT ); Tue, 4 Apr 2023 20:45:43 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C71B049F2 for ; Tue, 4 Apr 2023 17:45:33 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id h4-20020a170902f54400b001a1f5f00f3fso19958134plf.2 for ; Tue, 04 Apr 2023 17:45:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1680655533; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=iP4zSUAb/NsRt+s845gBr40fiLxdAbGQ8k72w+L3KVU=; b=mSg4XJa9URBJtOYdn6q0rE6QKLeOz5/E5d9ocqZ/qdi+Pd0RtRdL2ubTzMXMPjtcVV 8g3rnux3TaudOHJGf5B+9KRf+6LHGfe1tpDwOQ99LrTeQAQuQ9o2o+3Aknds7wjEFOpJ 2vI+lsLOr4Pcp1pGwartbgqTjJlrWZtHQFlDd77RLTgEB/kOqecF65FvDMoGn7udrblA ZnOvnxFaE83H+5wINSRJN9AA7ndGL3SL3lRnc/T/sr4KyTNYKrJNJVKt9uztJRL+4QVq 3J4KP8Bc+NrFeVFRHrPclVM1YXAR5m0rg6bRtNlBUnI9ZHZKVUPeQBAZXoF5OLksTfkC IhmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680655533; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=iP4zSUAb/NsRt+s845gBr40fiLxdAbGQ8k72w+L3KVU=; b=sWXPqRcx93niy+Ko4tSv6pbOXu8SyGDslrWCRnfNAUxA6is5fTFTtC9k7sJEtA5J4x dy89nsj44aFPVoLWFm3eddK0kjpLAAhLA130rXr4s75ouGtN6DI4e+TsLz6FalQpZCFa jVuSjhq5C7SrMAwZ5j6X2ZjcZ+4f6Ognk6lv0PbAh5lJj9IiRB+omql8emimE3xmHXU9 dQvrpgY6Yci7M27hD9j06KzNRdWjvcCA1s2bwdjG8M9083NLj0PJzcDkq6slaMtxD1ab IbCYLEgu5IW65DnPeen3ZlOBVaQYdIIRZQIG/Cxw1Tkr+lHx3WamAm6T8AI8GLbvFwxc e3kg== X-Gm-Message-State: AAQBX9dBt2wqYFeu4RwmDzDKYehA8f5VXLmqeV1OUrJF+BWjlSjWSF9j HwDFGTpu2LE+/EFhQpO33oo/tKTWqBs= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a63:150c:0:b0:514:26cf:9c05 with SMTP id v12-20020a63150c000000b0051426cf9c05mr739577pgl.7.1680655533462; Tue, 04 Apr 2023 17:45:33 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 4 Apr 2023 17:45:20 -0700 In-Reply-To: <20230405004520.421768-1-seanjc@google.com> Mime-Version: 1.0 References: <20230405004520.421768-1-seanjc@google.com> X-Mailer: git-send-email 2.40.0.348.gf938b09366-goog Message-ID: <20230405004520.421768-7-seanjc@google.com> Subject: [PATCH v4 6/6] KVM: selftests: Add test to verify KVM's supported XCR0 From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Aaron Lewis , Mingwei Zhang , Jim Mattson X-Spam-Status: No, score=-7.7 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1762298047730878486?= X-GMAIL-MSGID: =?utf-8?q?1762298047730878486?= From: Aaron Lewis Check both architectural rules and KVM's ABI for KVM_GET_SUPPORTED_CPUID to ensure the supported xfeatures[1] don't violate any of them. The architectural rules[2] and KVM's contract with userspace ensure for a given feature, e.g. sse, avx, amx, etc... their associated xfeatures are either all sets or none of them are set, and any dependencies are enabled if needed. [1] EDX:EAX of CPUID.(EAX=0DH,ECX=0) [2] SDM vol 1, 13.3 ENABLING THE XSAVE FEATURE SET AND XSAVE-ENABLED FEATURES Cc: Mingwei Zhang Signed-off-by: Aaron Lewis [sean: expand comments, use a fancy X86_PROPERTY] Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/include/x86_64/processor.h | 20 +++ .../selftests/kvm/x86_64/xcr0_cpuid_test.c | 132 ++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 tools/testing/selftests/kvm/x86_64/xcr0_cpuid_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index 84a627c43795..18cadc669798 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -105,6 +105,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/vmx_tsc_adjust_test TEST_GEN_PROGS_x86_64 += x86_64/vmx_nested_tsc_scaling_test TEST_GEN_PROGS_x86_64 += x86_64/xapic_ipi_test TEST_GEN_PROGS_x86_64 += x86_64/xapic_state_test +TEST_GEN_PROGS_x86_64 += x86_64/xcr0_cpuid_test TEST_GEN_PROGS_x86_64 += x86_64/xss_msr_test TEST_GEN_PROGS_x86_64 += x86_64/debug_regs TEST_GEN_PROGS_x86_64 += x86_64/tsc_msrs_test diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index 187309f3e7e9..70c5469e4023 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -241,8 +241,11 @@ struct kvm_x86_cpu_property { #define X86_PROPERTY_PMU_NR_GP_COUNTERS KVM_X86_CPU_PROPERTY(0xa, 0, EAX, 8, 15) #define X86_PROPERTY_PMU_EBX_BIT_VECTOR_LENGTH KVM_X86_CPU_PROPERTY(0xa, 0, EAX, 24, 31) +#define X86_PROPERTY_SUPPORTED_XCR0_LO KVM_X86_CPU_PROPERTY(0xd, 0, EAX, 0, 31) #define X86_PROPERTY_XSTATE_MAX_SIZE_XCR0 KVM_X86_CPU_PROPERTY(0xd, 0, EBX, 0, 31) #define X86_PROPERTY_XSTATE_MAX_SIZE KVM_X86_CPU_PROPERTY(0xd, 0, ECX, 0, 31) +#define X86_PROPERTY_SUPPORTED_XCR0_HI KVM_X86_CPU_PROPERTY(0xd, 0, EDX, 0, 31) + #define X86_PROPERTY_XSTATE_TILE_SIZE KVM_X86_CPU_PROPERTY(0xd, 18, EAX, 0, 31) #define X86_PROPERTY_XSTATE_TILE_OFFSET KVM_X86_CPU_PROPERTY(0xd, 18, EBX, 0, 31) #define X86_PROPERTY_AMX_MAX_PALETTE_TABLES KVM_X86_CPU_PROPERTY(0x1d, 0, EAX, 0, 31) @@ -681,6 +684,15 @@ static inline bool this_pmu_has(struct kvm_x86_pmu_feature feature) !this_cpu_has(feature.anti_feature); } +static __always_inline uint64_t this_cpu_supported_xcr0(void) +{ + if (!this_cpu_has_p(X86_PROPERTY_SUPPORTED_XCR0_LO)) + return 0; + + return this_cpu_property(X86_PROPERTY_SUPPORTED_XCR0_LO) | + ((uint64_t)this_cpu_property(X86_PROPERTY_SUPPORTED_XCR0_HI) << 32); +} + typedef u32 __attribute__((vector_size(16))) sse128_t; #define __sse128_u union { sse128_t vec; u64 as_u64[2]; u32 as_u32[4]; } #define sse128_lo(x) ({ __sse128_u t; t.vec = x; t.as_u64[0]; }) @@ -1104,6 +1116,14 @@ static inline uint8_t wrmsr_safe(uint32_t msr, uint64_t val) return kvm_asm_safe("wrmsr", "a"(val & -1u), "d"(val >> 32), "c"(msr)); } +static inline uint8_t xsetbv_safe(uint32_t index, uint64_t value) +{ + u32 eax = value; + u32 edx = value >> 32; + + return kvm_asm_safe("xsetbv", "a" (eax), "d" (edx), "c" (index)); +} + bool kvm_is_tdp_enabled(void); uint64_t *__vm_get_page_table_entry(struct kvm_vm *vm, uint64_t vaddr, diff --git a/tools/testing/selftests/kvm/x86_64/xcr0_cpuid_test.c b/tools/testing/selftests/kvm/x86_64/xcr0_cpuid_test.c new file mode 100644 index 000000000000..905bd5ae4431 --- /dev/null +++ b/tools/testing/selftests/kvm/x86_64/xcr0_cpuid_test.c @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * XCR0 cpuid test + * + * Copyright (C) 2022, Google LLC. + */ + +#include +#include +#include +#include +#include + +#include "test_util.h" + +#include "kvm_util.h" +#include "processor.h" + +/* + * Assert that architectural dependency rules are satisfied, e.g. that AVX is + * supported if and only if SSE is supported. + */ +#define ASSERT_XFEATURE_DEPENDENCIES(supported_xcr0, xfeatures, dependencies) \ +do { \ + uint64_t __supported = (supported_xcr0) & ((xfeatures) | (dependencies)); \ + \ + GUEST_ASSERT_3((__supported & (xfeatures)) != (xfeatures) || \ + __supported == ((xfeatures) | (dependencies)), \ + __supported, (xfeatures), (dependencies)); \ +} while (0) + +/* + * Assert that KVM reports a sane, usable as-is XCR0. Architecturally, a CPU + * isn't strictly required to _support_ all XFeatures related to a feature, but + * at the same time XSETBV will #GP if bundled XFeatures aren't enabled and + * disabled coherently. E.g. a CPU can technically enumerate supported for + * XTILE_CFG but not XTILE_DATA, but attempting to enable XTILE_CFG without + * XTILE_DATA will #GP. + */ +#define ASSERT_ALL_OR_NONE_XFEATURE(supported_xcr0, xfeatures) \ +do { \ + uint64_t __supported = (supported_xcr0) & (xfeatures); \ + \ + GUEST_ASSERT_2(!__supported || __supported == (xfeatures), \ + __supported, (xfeatures)); \ +} while (0) + +static void guest_code(void) +{ + uint64_t xcr0_reset; + uint64_t supported_xcr0; + int i, vector; + + set_cr4(get_cr4() | X86_CR4_OSXSAVE); + + xcr0_reset = xgetbv(0); + supported_xcr0 = this_cpu_supported_xcr0(); + + GUEST_ASSERT(xcr0_reset == XFEATURE_MASK_FP); + + /* Check AVX */ + ASSERT_XFEATURE_DEPENDENCIES(supported_xcr0, + XFEATURE_MASK_YMM, + XFEATURE_MASK_SSE); + + /* Check MPX */ + ASSERT_ALL_OR_NONE_XFEATURE(supported_xcr0, + XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR); + + /* Check AVX-512 */ + ASSERT_XFEATURE_DEPENDENCIES(supported_xcr0, + XFEATURE_MASK_AVX512, + XFEATURE_MASK_SSE | XFEATURE_MASK_YMM); + ASSERT_ALL_OR_NONE_XFEATURE(supported_xcr0, + XFEATURE_MASK_AVX512); + + /* Check AMX */ + ASSERT_ALL_OR_NONE_XFEATURE(supported_xcr0, + XFEATURE_MASK_XTILE); + + vector = xsetbv_safe(0, supported_xcr0); + GUEST_ASSERT_2(!vector, supported_xcr0, vector); + + for (i = 0; i < 64; i++) { + if (supported_xcr0 & BIT_ULL(i)) + continue; + + vector = xsetbv_safe(0, supported_xcr0 | BIT_ULL(i)); + GUEST_ASSERT_3(vector == GP_VECTOR, supported_xcr0, vector, BIT_ULL(i)); + } + + GUEST_DONE(); +} + +int main(int argc, char *argv[]) +{ + struct kvm_vcpu *vcpu; + struct kvm_run *run; + struct kvm_vm *vm; + struct ucall uc; + + TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_XSAVE)); + + vm = vm_create_with_one_vcpu(&vcpu, guest_code); + run = vcpu->run; + + vm_init_descriptor_tables(vm); + vcpu_init_descriptor_tables(vcpu); + + while (1) { + vcpu_run(vcpu); + + TEST_ASSERT(run->exit_reason == KVM_EXIT_IO, + "Unexpected exit reason: %u (%s),\n", + run->exit_reason, + exit_reason_str(run->exit_reason)); + + switch (get_ucall(vcpu, &uc)) { + case UCALL_ABORT: + REPORT_GUEST_ASSERT_3(uc, "0x%lx 0x%lx 0x%lx"); + break; + case UCALL_DONE: + goto done; + default: + TEST_FAIL("Unknown ucall %lu", uc.cmd); + } + } + +done: + kvm_vm_free(vm); + return 0; +}