From patchwork Fri Dec 30 16:24:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Lewis X-Patchwork-Id: 13084473 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 97175C4167B for ; Fri, 30 Dec 2022 16:25:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235229AbiL3QZD (ORCPT ); Fri, 30 Dec 2022 11:25:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43462 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229967AbiL3QZB (ORCPT ); Fri, 30 Dec 2022 11:25:01 -0500 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D820163FC for ; Fri, 30 Dec 2022 08:25:00 -0800 (PST) Received: by mail-pg1-x549.google.com with SMTP id s76-20020a632c4f000000b0049ceb0f185eso3231515pgs.7 for ; Fri, 30 Dec 2022 08:25:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=MpDOjh28JsAURpTnDCHBXTn8SRkFcmuZMnLUukHdgGY=; b=HGyFmKbPz7YAmNGmGmlYBVFZWnojZVPDD4tYUvlWgQ5Ks3HZ1/ODD0SZJQsr+6Gr4D LrY5sn2QSd4PIXvXXZF1r7EwNFRKZ31PG+oaZwljCYCmxJCWXVWJjqtnTXVQBxAS7qsg haEzrdiR7SF2eU0+mMTsExEjBX3bnHWz1qbBna0ScTDg6Dn2DENgreS0ttev/SWcnNe/ xP1q+ySlSnYGt5hOFiGjLejCjNb64P8gmJC8m+5J85Fai33M7d/j/ivnX763D6cNUHlk PwWR1asefPZMbEpwRj9Z2PENxeRc9v0PZ6Ok9umhZ5dOjaES1MgW435GZZicFOIY0tdJ hndw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=MpDOjh28JsAURpTnDCHBXTn8SRkFcmuZMnLUukHdgGY=; b=kUVsF62VJpsUzWeoghv/6w/Gs3/jpOVOxge+Y7uc3xTW9X/oYwbhJbLgnWlVqyy9Mr YybtHptiCvfgK0StcAypgZyPPgm1kp23T0WEYkLw3VFb8xSJeN8j834awdoDv1P5pTFu qlZJRlrK7iOyyVdvzZArtjwey5Kene7p3S1jasdJQha7mzOQV/KMNeYt/AqKMJTZBs6P wLheBYZZxSXUbHH67ud1Nk+R2MXo/BtGIR+47oHVXp/mPKP9QW5mTuzFmIYKbfeMiMFn Nl+dJXb0Jp9CYqsqd8b2fR5MD5xXNbEX/15chq4/6U/9yaJJW0MTKLi1K2UVB/+DOI08 LYDw== X-Gm-Message-State: AFqh2ko1hPmICGh9Hx2E30v/ktNdKryvvKp1aynURy4U52NEmiBl3R/l dgC1X3bex5sRGZDMogfd5Ng3XM2iyRB6ihAwl0GzzVRiK/66gMdNat2aMinlKiDGvnDPF2DYwMX WMsBUpsgv1Hjk0tZ6YWzU6wVrizY15ZkS7Zq4N1sSuOoAI5pva28Fkfj9AQF4KO6YQZzw X-Google-Smtp-Source: AMrXdXsDV2jrkutrIIZQu2b6XbKlj80oZd7VAJGoSGgCQIwewPK6P+k7/c1jS1+TUG2V+DPEhEaSjrYWSEPD0DLO X-Received: from aaronlewis.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2675]) (user=aaronlewis job=sendgmr) by 2002:a17:903:2653:b0:189:cdc8:7261 with SMTP id je19-20020a170903265300b00189cdc87261mr2140432plb.168.1672417500198; Fri, 30 Dec 2022 08:25:00 -0800 (PST) Date: Fri, 30 Dec 2022 16:24:37 +0000 In-Reply-To: <20221230162442.3781098-1-aaronlewis@google.com> Mime-Version: 1.0 References: <20221230162442.3781098-1-aaronlewis@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20221230162442.3781098-2-aaronlewis@google.com> Subject: [PATCH v2 1/6] KVM: x86: Clear all supported MPX xfeatures if they are not all set From: Aaron Lewis To: kvm@vger.kernel.org Cc: pbonzini@redhat.com, jmattson@google.com, seanjc@google.com, Aaron Lewis Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Be a good citizen and don't allow any of the supported MPX xfeatures[1] to be set if they can't all be set. That way userspace or a guest doesn't fail if it attempts to set them in XCR0. [1] CPUID.(EAX=0DH,ECX=0):EAX.BNDREGS[bit-3] CPUID.(EAX=0DH,ECX=0):EAX.BNDCSR[bit-4] Suggested-by: Jim Mattson Signed-off-by: Aaron Lewis --- arch/x86/kvm/cpuid.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index c4e8257629165..2431c46d456b4 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -855,6 +855,16 @@ static int __do_cpuid_func_emulated(struct kvm_cpuid_array *array, u32 func) return 0; } +static u64 sanitize_xcr0(u64 xcr0) +{ + u64 mask; + + mask = XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR; + if ((xcr0 & mask) != mask) + xcr0 &= ~mask; + + return xcr0; +} + static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function) { struct kvm_cpuid_entry2 *entry; @@ -982,6 +992,8 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function) u64 permitted_xcr0 = kvm_caps.supported_xcr0 & xstate_get_guest_group_perm(); u64 permitted_xss = kvm_caps.supported_xss; + permitted_xcr0 = sanitize_xcr0(permitted_xcr0); + entry->eax &= permitted_xcr0; entry->ebx = xstate_required_size(permitted_xcr0, false); entry->ecx = entry->ebx; From patchwork Fri Dec 30 16:24:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Lewis X-Patchwork-Id: 13084474 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 488C6C3DA7D for ; Fri, 30 Dec 2022 16:25:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235233AbiL3QZF (ORCPT ); Fri, 30 Dec 2022 11:25:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43468 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229967AbiL3QZE (ORCPT ); Fri, 30 Dec 2022 11:25:04 -0500 Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B08CF63FC for ; Fri, 30 Dec 2022 08:25:02 -0800 (PST) Received: by mail-pg1-x54a.google.com with SMTP id e11-20020a63d94b000000b0048988ed9a6cso10380273pgj.1 for ; Fri, 30 Dec 2022 08:25:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=cEH8j+eDdInggeGdIc/loNz3/XrV+zCztah1+1tBKz8=; b=BD6kfxRrY9FvlRtHWfIfmHRRmVBbzLmPnpj32fBGQSCrJxCH2J0tqJ/Py5qjcHFmAH 62JfXnz2skfKmhcZfTvjOf2uJGaalr/bEYFjw/WiBzx8oBYnYHJgDgb0ESM8E500K96V quLgJCgNde2n3W+RhN+XDd6Lap9xvGVJoQCybyQWC4fjNaQSs0AJ896AKWLOPD3+ddGU xaA4ABMrtTWV5aT0OfZYasbF34qZhymAeKOc5MhV1vAm9so9yVGnPKEBx2u5F1nGPaK/ rFV4Ob8EZC14WJ3mKVAWd1YAlGFutNBCJGVHmYmcH9c1yWIXnnMT6QeyPiNnOqgp/wGF 1icg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=cEH8j+eDdInggeGdIc/loNz3/XrV+zCztah1+1tBKz8=; b=x/LQINAIaTQUa9HnLl8dl5FciWBj0pO2GZ8oq/oCgDZJwZ/cRfNiHrlDln18hzKVCy nqqjuPWW/B9CYQMeOpvCa/4nXWUG325A5FwD9N/my2raHrMZqefdQBiPTUk+d66rXk5M gsu0ZpQf0ALCV++xovygH9C1w4L1M8Q4TNl/3SyKaCOoQLOcYVUooLFdxGSAb8cb1eTO SRRdDbKQQXxR+SvKzzSDt9QUGxcqlnFRjtFHJZQEkiikjkkGpS4euaF/gYYagIJ21YEV acZtPp/581LsRHte9l7V/ik5koUZ9YDDd8Rw1NHb191va2DE9Dt7badMlZZJdgXZFpG0 SufQ== X-Gm-Message-State: AFqh2kp8hfslOot2A722pQXhqnAsKDCxk8Qgl2nGf5lXFc91N+aqBtFX drZhwBnqPJN8cAUR6Mq8Z5XLAbfIE6S4uczEe/JK9G4BOhklX2z7fsF9/a2ZpbU3VcnAQcJoP/z PsWV9s7y4+MP1M8psxLredVEw1g8yyYkPI5L2/u7dG+89FEeExyI/m4XIi0Yflwwt70Rm X-Google-Smtp-Source: AMrXdXtR65wIxjasOel5TTMC8ImzHGxt1iSe1zi3NwzEg1qNP1vdZAYKTNs9rCWcy1rniRe0kk/kfZzMfIqrMj28 X-Received: from aaronlewis.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2675]) (user=aaronlewis job=sendgmr) by 2002:a17:90a:5c86:b0:219:c1fb:5da8 with SMTP id r6-20020a17090a5c8600b00219c1fb5da8mr2802493pji.221.1672417502067; Fri, 30 Dec 2022 08:25:02 -0800 (PST) Date: Fri, 30 Dec 2022 16:24:38 +0000 In-Reply-To: <20221230162442.3781098-1-aaronlewis@google.com> Mime-Version: 1.0 References: <20221230162442.3781098-1-aaronlewis@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20221230162442.3781098-3-aaronlewis@google.com> Subject: [PATCH v2 2/6] KVM: x86: Clear all supported AVX-512 xfeatures if they are not all set From: Aaron Lewis To: kvm@vger.kernel.org Cc: pbonzini@redhat.com, jmattson@google.com, seanjc@google.com, Aaron Lewis Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Be a good citizen and don't allow any of the supported AVX-512 xfeatures[1] to be set if they can't all be set. That way userspace or a guest doesn't fail if it attempts to set them in XCR0. It's important to note that in order to set any of the AVX-512 xfeatures, the SSE[bit-1] and AVX[bit-2] must also be set. [1] CPUID.(EAX=0DH,ECX=0):EAX.OPMASK[bit-5] CPUID.(EAX=0DH,ECX=0):EAX.ZMM_Hi256[bit-6] CPUID.(EAX=0DH,ECX=0):EAX.ZMM_Hi16_ZMM[bit-7] Suggested-by: Jim Mattson Signed-off-by: Aaron Lewis --- arch/x86/kvm/cpuid.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 2431c46d456b4..89ad8cd865173 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -862,6 +862,10 @@ static u64 sanitize_xcr0(u64 xcr0) { if ((xcr0 & mask) != mask) xcr0 &= ~mask; + mask = XFEATURE_MASK_SSE | XFEATURE_MASK_YMM | XFEATURE_MASK_AVX512; + if ((xcr0 & mask) != mask) + xcr0 &= ~XFEATURE_MASK_AVX512; + return xcr0; } From patchwork Fri Dec 30 16:24:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Lewis X-Patchwork-Id: 13084475 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 74A44C4167B for ; Fri, 30 Dec 2022 16:25:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235240AbiL3QZI (ORCPT ); Fri, 30 Dec 2022 11:25:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43484 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229967AbiL3QZG (ORCPT ); Fri, 30 Dec 2022 11:25:06 -0500 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8883963FC for ; Fri, 30 Dec 2022 08:25:04 -0800 (PST) Received: by mail-yb1-xb49.google.com with SMTP id s6-20020a259006000000b00706c8bfd130so22647868ybl.11 for ; Fri, 30 Dec 2022 08:25:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=t9euw23AvLOKmgxif0QMlhmbR+VDi8SZe//P9Qi80Hw=; b=d2EqC9LsNWNcP1sJ1zEpANiizSEGI4Soyly6dW15XDDbSn+Z8uHXx1bA2Ljf+AOxSn 6ljD4moSJ7uDcrnRG7pmkLWr5MqO5PCl/7CXp/ER3h1ouRN6C6x5I0k6yc4jwzDuCFNn AV5mElrZQFJT6xYB4xO4VnhypQ12BnIJF44cZtVlpVo75/lY8+kffKMg7svzC3fM3OA1 D/mDUoXlNuaHcwnPIPFnvxBJf2cdFuqjq1P/TXi7xNbqrtKJjw3OTc5DVLnDXqCraNAj OciA73njrZHCmrEN4DZudu6JfLTdoFyl1GfwZXd1V/L1ITqkmvD1VFyfWQ/nCzDpsEm/ v7sQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=t9euw23AvLOKmgxif0QMlhmbR+VDi8SZe//P9Qi80Hw=; b=ZOHZBQhR/xq3OGlUZnIWbCxl7XzPO/Xo1g5qPnvse5oup8Kq+rSE53nZeX0GKHgNzX cznh3y8ErEtMOMdGp9NmOMZZmk6lCbGXpxm1gnK5vx0P1zkko3S6m/SYG632xwGrayN3 YImOQ8cdfRz9mEz0jpT9eNzu90jFKF3+/tEH2ALBbIwUhjmHkF1uxStAjynmzNUaVaZF LnE0vZBRBl2uAJk6eFq7gby4hwJu78a7hzvv2xkudVHwNTV89sxlgQkgg9TzXKPwN1V3 oZxXJCruCFBmx4MeXREDOGmm/wcG72CRRj1TW+FYoTG/kpJlZ9BPP00Ad03WQ6ktOL4A +RIQ== X-Gm-Message-State: AFqh2kp0zRNsohqv0XKnvO1Wl9VUa/5R9zsEcJ06nvcbnRsfx7waNFmo NgeH8kI+OMD+IVVMnrFt/ujs31QDsaTZifrZxpCGQukTwNqIfnOtpfhtSUctht5LZFb0VyMXeJW rj2pSwX1XmO3aG4Fiw+p9tgRppFrhgFhZCpVsWiQyuOUbIKl+4Dn8ZSQxY6Lrp3DwirBh X-Google-Smtp-Source: AMrXdXv9GeTC2Zs9RvS4SDhRuExvf1F6fCw4NpOW/najOkACnnljgkmHZwI6pqCyIIu9sHF3HBsLslPOVjA892aA X-Received: from aaronlewis.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2675]) (user=aaronlewis job=sendgmr) by 2002:a81:7103:0:b0:478:831e:4a63 with SMTP id m3-20020a817103000000b00478831e4a63mr1531932ywc.425.1672417503715; Fri, 30 Dec 2022 08:25:03 -0800 (PST) Date: Fri, 30 Dec 2022 16:24:39 +0000 In-Reply-To: <20221230162442.3781098-1-aaronlewis@google.com> Mime-Version: 1.0 References: <20221230162442.3781098-1-aaronlewis@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20221230162442.3781098-4-aaronlewis@google.com> Subject: [PATCH v2 3/6] KVM: x86: Clear all supported AMX xfeatures if they are not all set From: Aaron Lewis To: kvm@vger.kernel.org Cc: pbonzini@redhat.com, jmattson@google.com, seanjc@google.com, Aaron Lewis Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Be a good citizen and don't allow any of the supported AMX xfeatures[1] to be set if they can't all be set. That way userspace or a guest doesn't fail if it attempts to set them in XCR0. [1] CPUID.(EAX=0DH,ECX=0):EAX.XTILE_CFG[bit-17] CPUID.(EAX=0DH,ECX=0):EAX.XTILE_DATA[bit-18] Suggested-by: Sean Christopherson Signed-off-by: Aaron Lewis --- arch/x86/kvm/cpuid.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 89ad8cd865173..bdccc4ddb45b1 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -866,6 +866,9 @@ static u64 sanitize_xcr0(u64 xcr0) { if ((xcr0 & mask) != mask) xcr0 &= ~XFEATURE_MASK_AVX512; + if ((xcr0 & XFEATURE_MASK_XTILE) != XFEATURE_MASK_XTILE) + xcr0 &= ~XFEATURE_MASK_XTILE; + return xcr0; } From patchwork Fri Dec 30 16:24:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Lewis X-Patchwork-Id: 13084476 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 42822C3DA7D for ; Fri, 30 Dec 2022 16:25:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235238AbiL3QZJ (ORCPT ); Fri, 30 Dec 2022 11:25:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43508 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235239AbiL3QZH (ORCPT ); Fri, 30 Dec 2022 11:25:07 -0500 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 30D411C137 for ; Fri, 30 Dec 2022 08:25:06 -0800 (PST) Received: by mail-pj1-x104a.google.com with SMTP id b16-20020a17090a551000b00225aa26f1dbso9023614pji.8 for ; Fri, 30 Dec 2022 08:25:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=f0C5GuIe1dBEke5RFrB7sVhrtoLubRh+09eyq8bpu38=; b=jgdeIXQYzIIMbPKhgL4kLqlPAPQ+RG2Wy1veKzA6UHZrbtpehEgdieXul6vNX35s2X Tn21NYLGz2x04rB2ezeOil/TPZe/8hhEN0il4o0bMTGKnNDcL6eT06tFeV71p+EFk9kX APjhc3a3Q/W2grGxPMtditmP7wHcJdMQxjXtPs60MvoRTUW9B3U6G0GQ+X+YTn5U6tU0 uqBlTNwvtk3CAEKRp9IxZmOuMdk9+knIg17euA0PAOSAd+uT/Cfy9BVrkJ8jWsCMwrac PQn91Sg5cgZJrmoUu0GTrIxgkeMNj+ZNcmGMR3U7AxVgVjEOUD/pUT1V5T1HCPc80WbM NUNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=f0C5GuIe1dBEke5RFrB7sVhrtoLubRh+09eyq8bpu38=; b=fFK12rsijIaAfj2nsGEFqfajNptUZaQOw7pKhTRHhWKrLLj4qEVI3enl6H5+EbSfOb RI17DuJhbuJcwjo0HgdhcKJ7WXTM8p1LUt0fPkRxWT2nJ4IJcl4p5CSizyRHAVaY3Szn oml64YTXczQ25+E1PGA/E/yDq9XpeFkxBk3qiytdEDLryoWNgNRaQ2BcOI7orzIC6HY/ Tz1SMGFoSi8866JlKPyA5uKC/HKq18ukqZW2hW4UCGbQF9ApHpibFWH2FRI/KdNhobaR a3568ykV0L7IHij0ucTzqULf76xsa+WlRTS6QpGj0/dE33knjyY3fBcBwoyPn6bnYNMk n8dw== X-Gm-Message-State: AFqh2kpIRrQ/oxLNd9EWG2ztAvHia+AB/I19cF/wKFstd4I7QoD4r0ZZ OVY+9FOrKiyNrTBRDHKaZgOwQwWZfgkCmokHo8p2xKgRmJrZB/KKFKFXFtHja9vR+8IH+hZr1Ff C9aqttwIG50mWPmr3OyCgLDdge3pnTu4fc16fIlIrYBiUYl/+RtM4VW3pNogCmquxNdo7 X-Google-Smtp-Source: AMrXdXsUsWHsXzmZhnFE6ZaD/6jagcSMucA7McVfwdsc30amZTvpzlD7IRZUbCsYepcWDuS+iZKpdTomWsiAFRUd X-Received: from aaronlewis.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2675]) (user=aaronlewis job=sendgmr) by 2002:a62:30c6:0:b0:581:6059:b7c8 with SMTP id w189-20020a6230c6000000b005816059b7c8mr1001008pfw.26.1672417505490; Fri, 30 Dec 2022 08:25:05 -0800 (PST) Date: Fri, 30 Dec 2022 16:24:40 +0000 In-Reply-To: <20221230162442.3781098-1-aaronlewis@google.com> Mime-Version: 1.0 References: <20221230162442.3781098-1-aaronlewis@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20221230162442.3781098-5-aaronlewis@google.com> Subject: [PATCH v2 4/6] KVM: selftests: Hoist XGETBV and XSETBV to make them more accessible From: Aaron Lewis To: kvm@vger.kernel.org Cc: pbonzini@redhat.com, jmattson@google.com, seanjc@google.com, Aaron Lewis Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org The instructions XGETBV and XSETBV are useful to other tests. Move them to processor.h to make them available to be used more broadly. No functional change intended. Signed-off-by: Aaron Lewis Reviewed-by: Jim Mattson --- .../selftests/kvm/include/x86_64/processor.h | 19 +++++++++++++++ tools/testing/selftests/kvm/x86_64/amx_test.c | 24 +++---------------- 2 files changed, 22 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 2a5f47d513884..5f06d6f27edf7 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -493,6 +493,25 @@ 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 bd72c6eb3b670..4b733ad218313 100644 --- a/tools/testing/selftests/kvm/x86_64/amx_test.c +++ b/tools/testing/selftests/kvm/x86_64/amx_test.c @@ -68,24 +68,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" @@ -121,7 +103,7 @@ static inline void check_cpuid_xsave(void) static bool check_xsave_supports_xtile(void) { - return __xgetbv(0) & XFEATURE_MASK_XTILE; + return xgetbv(0) & XFEATURE_MASK_XTILE; } static void check_xtile_info(void) @@ -177,9 +159,9 @@ static void init_regs(void) cr4 |= X86_CR4_OSXSAVE; set_cr4(cr4); - xcr0 = __xgetbv(0); + xcr0 = xgetbv(0); xcr0 |= XFEATURE_MASK_XTILE; - __xsetbv(0x0, xcr0); + xsetbv(0x0, xcr0); } static void __attribute__((__flatten__)) guest_code(struct tile_config *amx_cfg, From patchwork Fri Dec 30 16:24:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Lewis X-Patchwork-Id: 13084477 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 71A43C4167B for ; Fri, 30 Dec 2022 16:25:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235248AbiL3QZK (ORCPT ); Fri, 30 Dec 2022 11:25:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235243AbiL3QZI (ORCPT ); Fri, 30 Dec 2022 11:25:08 -0500 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ADF0D1C126 for ; Fri, 30 Dec 2022 08:25:07 -0800 (PST) Received: by mail-pg1-x549.google.com with SMTP id 84-20020a630257000000b00477f88d334eso10443073pgc.11 for ; Fri, 30 Dec 2022 08:25:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=wjr9E/VJc/P1Y7whIHcfDB38hDTLVG7H3PGa2lFNg8A=; b=CACIqhk2Mcy9Y9dKKCyYNWkoyeo8SOyi5MY5EGh/sBeB/CMrBb1Bdkz1HuAiCAjguz tznjRnLJz/koaRBxmjjGwtTWl9KcyjsLb9YPx3ENhvhVm0jg+ZU0eURKlU+S7hv7IPaE k/8HWOTlBIzM6Y88sZw78xvqSc3u70C4ejU98fTfVj9f1nHtU0LjgF/Qk6+hVPOu73Nm BrzfuDR75ztUq4IJyu6d+vykz3hG6fTOkDOmWZ4OhhrTtdSKjl+Ay6Oeq6uiqwxOfXly ld9ix7EOxcLkbOjA9yBDEoffV01pAZ11Rv9Qzh8qT/KU1D3jm0C8fDN5j/qrqC6yg0l5 nktg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=wjr9E/VJc/P1Y7whIHcfDB38hDTLVG7H3PGa2lFNg8A=; b=ioaBJ0S/sYff7MI9qHOxGvxURN6Xy8Ixz1tCr34P+zX4rufkdfNqUNPmjmKUDHKrCZ SfavuW2LfbsWfnsTe6Sxd7IG08xfLk87t2R+JC6AfQl0IiFVeA7xzIA+SybF07eSFKf0 HBiyJiEgSQt2XUehahmrtG3q4IYdNZK+yCy2cy2JOlPnvnywlIUJFnbjBISP3B6vwpWt VeangM6uN5ADKANyvI/1w0yChiiFy7BfVhI4kR3d7dN5IfOI8au0gv13Fnzq2P6lBrJg C+hUcvNqD6J8HyloZgSFT8nnm2lRZPeLUyDQm/reSQB0Ms5XHLKXs6g38YBBlPidobLy LZYQ== X-Gm-Message-State: AFqh2krHCmv3VGMdQnCU7JhvPT/eCQClBAwRQkEZzSlT7s2X/abnrMWv 0+wTbszH4E48lhpUEQXu3OfKecVIoKV0ZV+EHzTnasgs2bwGcbm3kSCr1KDRr6Epb/qFio8jFaw S2Y9hbLDW8Yrrv4zNwdSwZiQtV84Qnyi+tfT4Znvia3PufCIc65A/YRrKVSz51dQF8MH2 X-Google-Smtp-Source: AMrXdXvX86inkt8Gw5ivwZ8h18y7lCjZwIrL2Zq++0XgxfguMo6PjUeGUuCUa5qjoOsJxQfzSlagBKrzUNY4kuy3 X-Received: from aaronlewis.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2675]) (user=aaronlewis job=sendgmr) by 2002:a05:6a00:4393:b0:56b:e64c:5c7e with SMTP id bt19-20020a056a00439300b0056be64c5c7emr1272345pfb.18.1672417507151; Fri, 30 Dec 2022 08:25:07 -0800 (PST) Date: Fri, 30 Dec 2022 16:24:41 +0000 In-Reply-To: <20221230162442.3781098-1-aaronlewis@google.com> Mime-Version: 1.0 References: <20221230162442.3781098-1-aaronlewis@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20221230162442.3781098-6-aaronlewis@google.com> Subject: [PATCH v2 5/6] KVM: selftests: Add XFEATURE masks to common code From: Aaron Lewis To: kvm@vger.kernel.org Cc: pbonzini@redhat.com, jmattson@google.com, seanjc@google.com, Aaron Lewis Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Add XFEATURE masks to processor.h to make them more broadly available in KVM selftests. They were taken from fpu/types.h, which included a difference in spacing between the ones in amx_test from XTILECFG and XTILEDATA, to XTILE_CFG and XTILE_DATA. This has been reflected in amx_test. Signed-off-by: Aaron Lewis --- .../selftests/kvm/include/x86_64/processor.h | 16 ++++++++++++++ tools/testing/selftests/kvm/x86_64/amx_test.c | 22 +++++++------------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index 5f06d6f27edf7..c1132ac277227 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -45,6 +45,22 @@ #define X86_CR4_SMAP (1ul << 21) #define X86_CR4_PKE (1ul << 22) +#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, diff --git a/tools/testing/selftests/kvm/x86_64/amx_test.c b/tools/testing/selftests/kvm/x86_64/amx_test.c index 4b733ad218313..14a7656620d5f 100644 --- a/tools/testing/selftests/kvm/x86_64/amx_test.c +++ b/tools/testing/selftests/kvm/x86_64/amx_test.c @@ -33,12 +33,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 xsave_data { @@ -187,14 +181,14 @@ static void __attribute__((__flatten__)) guest_code(struct tile_config *amx_cfg, __tilerelease(); GUEST_SYNC(5); /* bit 18 not in the XCOMP_BV after xsavec() */ - set_xstatebv(xsave_data, XFEATURE_MASK_XTILEDATA); - __xsavec(xsave_data, XFEATURE_MASK_XTILEDATA); - GUEST_ASSERT((get_xstatebv(xsave_data) & XFEATURE_MASK_XTILEDATA) == 0); + set_xstatebv(xsave_data, XFEATURE_MASK_XTILE_DATA); + __xsavec(xsave_data, XFEATURE_MASK_XTILE_DATA); + GUEST_ASSERT((get_xstatebv(xsave_data) & XFEATURE_MASK_XTILE_DATA) == 0); /* xfd=0x40000, disable amx tiledata */ - wrmsr(MSR_IA32_XFD, XFEATURE_MASK_XTILEDATA); + wrmsr(MSR_IA32_XFD, 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 */ @@ -206,11 +200,11 @@ 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(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILEDATA); + GUEST_ASSERT(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILE_DATA); GUEST_SYNC(8); - GUEST_ASSERT(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILEDATA); + GUEST_ASSERT(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILE_DATA); /* Clear xfd_err */ wrmsr(MSR_IA32_XFD_ERR, 0); /* xfd=0, enable amx */ From patchwork Fri Dec 30 16:24:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Lewis X-Patchwork-Id: 13084478 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 03A78C3DA7D for ; Fri, 30 Dec 2022 16:25:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235268AbiL3QZN (ORCPT ); Fri, 30 Dec 2022 11:25:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43534 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235245AbiL3QZK (ORCPT ); Fri, 30 Dec 2022 11:25:10 -0500 Received: from mail-pg1-x549.google.com (mail-pg1-x549.google.com [IPv6:2607:f8b0:4864:20::549]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 77C2A63FC for ; Fri, 30 Dec 2022 08:25:09 -0800 (PST) Received: by mail-pg1-x549.google.com with SMTP id s76-20020a632c4f000000b0049ceb0f185eso3231677pgs.7 for ; Fri, 30 Dec 2022 08:25:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Yhfrk/52wm4AFDi/mc+1vvT+9S7e8FJyWcR7c7u9018=; b=X72w3/yvTPj9htBmgCtAdC4I8SVLEkBIAovj/08uPXmTTnP+vroEYAayaE8osUP3JS Y/qOwmEs7upvtMQk0yUNqdeCfaZOG+715CZ4M63ccIPp8OTMXLHsHvAfmqfANUWuSqe7 g+N9/utfCb91iWcBsdzc9K9FtIRsUBS6Ta8Ttriq3h/8Tsr3AVhaKInKWUsgldAzU6eN HKUIH5C6jHYXWLcaHWYZb1RuxtY+3ed5pDT3PkcxRj771YCxOaovmZGrltd+YABwCYAV J2UsEUDd1yGC8rrEHBQIuiRXyIJkooof9zhc3UtQ3BWNKiEsBcY6Top3IOkxqP9p5j4L G5wQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Yhfrk/52wm4AFDi/mc+1vvT+9S7e8FJyWcR7c7u9018=; b=W+zrwT8lCxOdHzGS0qsv4thsVPqyAQF/o9iVRFCHJfQpzI6fFLTtODkLqtAwgQC9qc AnXiNERNXZk9nJgjfruCJICr0N5OPjS9tTocbwikxI8axTuSg9TFZXv7aJ17W/kOUo/O rbKDnz4hZX0EVX2J0a6BF27bwvee5k+vh1UlNLtduNyCy+G5D22UH4sFnQoQd/MTd+Zm meXBN6jEWWN+gpRRcslYlGFU1rj403KJNM+/9YW0QcHvOIoX/GSUpujgN/NBEwVyb5kM 6cE6eHmoU8fol5qhVPHtarkzinOAuMHKRv5U0o2jvGW5ldEkESWJ9sQwGPJGImrhXCrL qE1A== X-Gm-Message-State: AFqh2kqZgUqeKdffkROVTXkecawhKzyxAsTN4XW3EQ2qQhOk7M7IV4iB u+/yk7CuqM9oyyWLZdACn8grA22SoMqOUL9SFQ70qMJYhBOHP0Bh6O+Rf2/8PO2/hFOV593jlTq vvMPB0d5JD6EJCHj9QTeNLqLNRwp57mlETx22e7H/x4eYImDq+MVZ4DrB2h3mtRFtcDrA X-Google-Smtp-Source: AMrXdXschlB8w7UUhl4ummy0bl+PrFAr096VJnWBusk4xBMciGhgGJVGb98Bs8EY62TD6ipx8RV3LUZPaS3ktQYh X-Received: from aaronlewis.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2675]) (user=aaronlewis job=sendgmr) by 2002:a63:d14a:0:b0:479:5a45:6d32 with SMTP id c10-20020a63d14a000000b004795a456d32mr1452676pgj.138.1672417508987; Fri, 30 Dec 2022 08:25:08 -0800 (PST) Date: Fri, 30 Dec 2022 16:24:42 +0000 In-Reply-To: <20221230162442.3781098-1-aaronlewis@google.com> Mime-Version: 1.0 References: <20221230162442.3781098-1-aaronlewis@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20221230162442.3781098-7-aaronlewis@google.com> Subject: [PATCH v2 6/6] KVM: selftests: Add XCR0 Test From: Aaron Lewis To: kvm@vger.kernel.org Cc: pbonzini@redhat.com, jmattson@google.com, seanjc@google.com, Aaron Lewis Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Test that the supported xfeatures, i.e. EDX:EAX of CPUID.(EAX=0DH,ECX=0), don't set userspace up for failure. Though it isn't architectural, test that the supported xfeatures aren't set in a half baked state that will cause a #GP if used to execute XSETBV. Check that the rules for XCR0 described in the SDM vol 1, section 13.3 ENABLING THE XSAVE FEATURE SET AND XSAVE-ENABLED FEATURES, are followed for the supported xfeatures too. Signed-off-by: Aaron Lewis --- tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/x86_64/xcr0_cpuid_test.c | 121 ++++++++++++++++++ 2 files changed, 122 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 1750f91dd9362..e2e56c82b8a90 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -104,6 +104,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/x86_64/xcr0_cpuid_test.c b/tools/testing/selftests/kvm/x86_64/xcr0_cpuid_test.c new file mode 100644 index 0000000000000..6bef362872154 --- /dev/null +++ b/tools/testing/selftests/kvm/x86_64/xcr0_cpuid_test.c @@ -0,0 +1,121 @@ +// 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" + +static uint64_t get_supported_user_xfeatures(void) +{ + uint32_t a, b, c, d; + + cpuid(0xd, &a, &b, &c, &d); + + return a | ((uint64_t)d << 32); +} + +static void guest_code(void) +{ + uint64_t xcr0_rest; + uint64_t supported_xcr0; + uint64_t xfeature_mask; + uint64_t supported_state; + + set_cr4(get_cr4() | X86_CR4_OSXSAVE); + + xcr0_rest = xgetbv(0); + supported_xcr0 = get_supported_user_xfeatures(); + + GUEST_ASSERT(xcr0_rest == 1ul); + + /* Check AVX */ + xfeature_mask = XFEATURE_MASK_SSE | XFEATURE_MASK_YMM; + supported_state = supported_xcr0 & xfeature_mask; + GUEST_ASSERT(supported_state != XFEATURE_MASK_YMM); + + /* Check MPX */ + xfeature_mask = XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR; + supported_state = supported_xcr0 & xfeature_mask; + GUEST_ASSERT((supported_state == xfeature_mask) || + (supported_state == 0ul)); + + /* Check AVX-512 */ + xfeature_mask = XFEATURE_MASK_SSE | XFEATURE_MASK_YMM | + XFEATURE_MASK_AVX512; + supported_state = supported_xcr0 & xfeature_mask; + GUEST_ASSERT((supported_state == xfeature_mask) || + ((supported_state & XFEATURE_MASK_AVX512) == 0ul)); + + /* Check AMX */ + xfeature_mask = XFEATURE_MASK_XTILE; + supported_state = supported_xcr0 & xfeature_mask; + GUEST_ASSERT((supported_state == xfeature_mask) || + (supported_state == 0ul)); + + GUEST_SYNC(0); + + xsetbv(0, supported_xcr0); + + GUEST_DONE(); +} + +static void guest_gp_handler(struct ex_regs *regs) +{ + GUEST_ASSERT(!"Failed to set the supported xfeature bits in XCR0."); +} + +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)); + + /* Tell stdout not to buffer its content */ + setbuf(stdout, NULL); + + 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_SYNC: + vm_install_exception_handler(vm, GP_VECTOR, + guest_gp_handler); + break; + case UCALL_ABORT: + REPORT_GUEST_ASSERT(uc); + break; + case UCALL_DONE: + goto done; + default: + TEST_FAIL("Unknown ucall %lu", uc.cmd); + } + } + +done: + kvm_vm_free(vm); + return 0;