From patchwork Thu Dec 19 10:10:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nadav Amit X-Patchwork-Id: 11302997 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6E5A113A4 for ; Thu, 19 Dec 2019 10:11:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5653C24672 for ; Thu, 19 Dec 2019 10:11:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726701AbfLSKL3 (ORCPT ); Thu, 19 Dec 2019 05:11:29 -0500 Received: from mail-pl1-f195.google.com ([209.85.214.195]:33728 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726609AbfLSKL3 (ORCPT ); Thu, 19 Dec 2019 05:11:29 -0500 Received: by mail-pl1-f195.google.com with SMTP id c13so2342588pls.0 for ; Thu, 19 Dec 2019 02:11:28 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bfL9G0/z//jDm9lThiYy6HzVD6N1lKQVtSeDfgyyw7o=; b=NPKMxTN9dh+sITZ2jenEIcCMDBB2hMc3cBN6ASaBcEuRVzzG2sDgKEEXJJ0ckQcFwI mqGtQ2nSXE4lSgIDCRIKHF7laoRrsivOMj4e6yC0jqWsu31UfgYgXmi1/oTc+gYiyq0O vgUh7S4n5+HbEwB0YogXkNVWqEBWcHCwvLtzQbG8MKXWiDsrpDHzhXoa70XOt+w+ZVA6 1hlc9q9iLCupu7S+t27qPmakBvy8zerLfDk0B50NnFEGxOGOvfIJE2HAtWitgaDpMvyh bHKyjN9EpqzFJJiTObMPhcWTacwIt/NP/Jtn5EyBOqs/QsfuMrpUe0ydTXYQjTa3y/7J clkA== X-Gm-Message-State: APjAAAXzuplrXbqbKDzjSNAIX0Zwx8urYXOZSM5ErtmX2EJySZkdBoJk nf1/YHLV2W5rA/PrHssrLBE= X-Google-Smtp-Source: APXvYqwHMFQoXCxXjp+W86S5b39pMbKC47DWXhLLUIHS+OsB/WUF4RS8TIiVkkCZKjI7RcQ7Wmpuiw== X-Received: by 2002:a17:902:ac97:: with SMTP id h23mr8309400plr.237.1576750288088; Thu, 19 Dec 2019 02:11:28 -0800 (PST) Received: from sc2-haas01-esx0118.eng.vmware.com ([66.170.99.1]) by smtp.gmail.com with ESMTPSA id c184sm7565530pfa.39.2019.12.19.02.11.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2019 02:11:26 -0800 (PST) From: Nadav Amit To: Paolo Bonzini Cc: kvm@vger.kernel.org, Nadav Amit , Sean Christopherson Subject: [kvm-unit-tests PATCH 1/2] x86: vmx: Comprehensive max VMCS field search Date: Thu, 19 Dec 2019 02:10:05 -0800 Message-Id: <20191219101006.49103-2-namit@vmware.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191219101006.49103-1-namit@vmware.com> References: <20191219101006.49103-1-namit@vmware.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Search all VMCS fields when looking for the max VMCS field index. Perform the search backwards to save some time. Change the existing test to compare the maximum expected index (based on MSRs) is equal to the actual one. This improves the test that currently performs greater-equal comparison. Suggested-by: Jim Mattson Cc: Sean Christopherson Signed-off-by: Nadav Amit --- x86/vmx.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/x86/vmx.c b/x86/vmx.c index 5803dc7..a1af59c 100644 --- a/x86/vmx.c +++ b/x86/vmx.c @@ -348,6 +348,34 @@ static bool check_all_vmcs_fields(u8 cookie) return __check_all_vmcs_fields(cookie, NULL); } +static u32 find_vmcs_max_index(void) +{ + u32 idx, width, type, enc; + u64 actual; + int ret; + + /* scan backwards and stop when found */ + for (idx = (1 << 9) - 1; idx >= 0; idx--) { + + /* try all combinations of width and type */ + for (type = 0; type < (1 << 2); type++) { + for (width = 0; width < (1 << 2) ; width++) { + enc = (idx << VMCS_FIELD_INDEX_SHIFT) | + (type << VMCS_FIELD_TYPE_SHIFT) | + (width << VMCS_FIELD_WIDTH_SHIFT); + + ret = vmcs_read_checking(enc, &actual); + assert(!(ret & X86_EFLAGS_CF)); + if (!(ret & X86_EFLAGS_ZF)) + return idx; + } + } + } + /* some VMCS fields should exist */ + assert(0); + return 0; +} + static void test_vmwrite_vmread(void) { struct vmcs *vmcs = alloc_page(); @@ -358,11 +386,13 @@ static void test_vmwrite_vmread(void) assert(!make_vmcs_current(vmcs)); set_all_vmcs_fields(0x42); - report(__check_all_vmcs_fields(0x42, &max_index), "VMWRITE/VMREAD"); + report(check_all_vmcs_fields(0x42), "VMWRITE/VMREAD"); - vmcs_enum_max = rdmsr(MSR_IA32_VMX_VMCS_ENUM) & VMCS_FIELD_INDEX_MASK; - report(vmcs_enum_max >= max_index, - "VMX_VMCS_ENUM.MAX_INDEX expected at least: %x, actual: %x", + vmcs_enum_max = (rdmsr(MSR_IA32_VMX_VMCS_ENUM) & VMCS_FIELD_INDEX_MASK) + >> VMCS_FIELD_INDEX_SHIFT; + max_index = find_vmcs_max_index(); + report(vmcs_enum_max == max_index, + "VMX_VMCS_ENUM.MAX_INDEX expected: %x, actual: %x", max_index, vmcs_enum_max); assert(!vmcs_clear(vmcs)); From patchwork Thu Dec 19 10:10:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nadav Amit X-Patchwork-Id: 11302999 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 38E8A921 for ; Thu, 19 Dec 2019 10:11:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2108024676 for ; Thu, 19 Dec 2019 10:11:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726712AbfLSKLb (ORCPT ); Thu, 19 Dec 2019 05:11:31 -0500 Received: from mail-pf1-f196.google.com ([209.85.210.196]:41490 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726708AbfLSKLa (ORCPT ); Thu, 19 Dec 2019 05:11:30 -0500 Received: by mail-pf1-f196.google.com with SMTP id w62so2938558pfw.8 for ; Thu, 19 Dec 2019 02:11:30 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=n8yO7xftBIOe1P8sRlvhhOgMt72/4wCK1ls+6BhIkpk=; b=ENPxveabQbXoGggTlFPYsygu17dZRDlPLY+Okm7uPe/UtfMbUQvLJ520z1pckWVxt7 5Wnljrhld/6JI/puUsDd5hFBS8CxrTrKcqHY14SMRJZENIHTfWQo50/2RO6D23t0Mp4M KlbziyKMTqUZq9ZheMprWBqLKP9wRKjG8POenKRnwvCRtj2YRmVM+d+Ut4IpPZ61oEXI /Ks5R3sTMJUV8kyTrAE+9oJCvpAVU7dZ+fvXv1T24HqoFMFXKN/H2OvCaZhFSVw+a7/Y KyiyXrao4K0K8nhc+C1pSaj68y0G47a13USuHEjeleYWW+mA1kp/U/zASF+G+wdCYJW8 aV7w== X-Gm-Message-State: APjAAAU6VS2tOSgYMFFgWKf0raKw5Fk0bx0GxqjOGOh1ncrhoMLEhOdH Kx/ynaMRokrEDLjjoT0SYrk= X-Google-Smtp-Source: APXvYqwZJghPYUpd1nNKlYUGYkGIlh34Yk1yg3v4wiBEce/qp78zDdGnBiRP2MV64trdEQ6nr85T2w== X-Received: by 2002:a62:ed19:: with SMTP id u25mr8995317pfh.173.1576750289708; Thu, 19 Dec 2019 02:11:29 -0800 (PST) Received: from sc2-haas01-esx0118.eng.vmware.com ([66.170.99.1]) by smtp.gmail.com with ESMTPSA id c184sm7565530pfa.39.2019.12.19.02.11.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2019 02:11:28 -0800 (PST) From: Nadav Amit To: Paolo Bonzini Cc: kvm@vger.kernel.org, Nadav Amit , Jim Mattson , Sean Christopherson Subject: [kvm-unit-tests PATCH 2/2] x86: vmx: Remove max_index tracking in check_vmcs_field() Date: Thu, 19 Dec 2019 02:10:06 -0800 Message-Id: <20191219101006.49103-3-namit@vmware.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191219101006.49103-1-namit@vmware.com> References: <20191219101006.49103-1-namit@vmware.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Now that comprehensive search for maximum VMCS field index is performed, the tracking of the maximum index in __check_vmcs_field() is no longer needed. Remove all the related logic accordingly. Cc: Jim Mattson Cc: Sean Christopherson Signed-off-by: Nadav Amit --- x86/vmx.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/x86/vmx.c b/x86/vmx.c index a1af59c..8bcb438 100644 --- a/x86/vmx.c +++ b/x86/vmx.c @@ -281,11 +281,10 @@ static void set_vmcs_field(struct vmcs_field *f, u8 cookie) vmcs_write(f->encoding, vmcs_field_value(f, cookie)); } -static bool check_vmcs_field(struct vmcs_field *f, u8 cookie, u32 *max_index) +static bool check_vmcs_field(struct vmcs_field *f, u8 cookie) { u64 expected; u64 actual; - u32 index; int ret; if (f->encoding == VMX_INST_ERROR) { @@ -299,12 +298,6 @@ static bool check_vmcs_field(struct vmcs_field *f, u8 cookie, u32 *max_index) if (ret & X86_EFLAGS_ZF) return true; - if (max_index) { - index = f->encoding & VMCS_FIELD_INDEX_MASK; - if (index > *max_index) - *max_index = index; - } - if (vmcs_field_readonly(f)) { printf("Skipping read-only field %lx\n", f->encoding); return true; @@ -330,24 +323,19 @@ static void set_all_vmcs_fields(u8 cookie) set_vmcs_field(&vmcs_fields[i], cookie); } -static bool __check_all_vmcs_fields(u8 cookie, u32 *max_index) +static bool check_all_vmcs_fields(u8 cookie) { bool pass = true; int i; for (i = 0; i < ARRAY_SIZE(vmcs_fields); i++) { - if (!check_vmcs_field(&vmcs_fields[i], cookie, max_index)) + if (!check_vmcs_field(&vmcs_fields[i], cookie)) pass = false; } return pass; } -static bool check_all_vmcs_fields(u8 cookie) -{ - return __check_all_vmcs_fields(cookie, NULL); -} - static u32 find_vmcs_max_index(void) { u32 idx, width, type, enc;