From patchwork Sat May 18 16:02:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nadav Amit X-Patchwork-Id: 10949237 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id F140217EE for ; Sat, 18 May 2019 23:27:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DF68A2844B for ; Sat, 18 May 2019 23:27:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D401B28564; Sat, 18 May 2019 23:27:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=2.0 tests=BAYES_00,DATE_IN_PAST_06_12, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2D71C284C8 for ; Sat, 18 May 2019 23:27:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729450AbfERXWd (ORCPT ); Sat, 18 May 2019 19:22:33 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:37099 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729041AbfERXWc (ORCPT ); Sat, 18 May 2019 19:22:32 -0400 Received: by mail-pf1-f194.google.com with SMTP id g3so5413956pfi.4 for ; Sat, 18 May 2019 16:22:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=VQsEJ7wfzzufKKEATtYwc18ov4pdRn18iIzHWM6iIc8=; b=GZrM4JuMdUP+5LO274WzhNdtaXgrt5WSUNToYiUX0H+03ZUb7jX6cVzfzCuJpafcVu aB6zUEmGPzx65drAKAeDCBRCveEAc+rum5SN6W886Hgr+APTGGVPSYEjA3Jrad/uS8PX RfbSZWUIR9me17jpakBugXaiJtwtWSXs+jSqTO5nVlevRMsjbEX9P0WtugwaHXkueQOJ BjWEfO/71RKYrR+s9PtTuOIommZYTMOK9wa67PafUvt+7vswcJwW7qn6SnnxjYB01wKD GEfiE4HH0eZhAEnSvGA2/ywbhjVFGygWTdC5s1ayNHjyImDDECWv8IJISwr6uY43XUxh z2mw== 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=VQsEJ7wfzzufKKEATtYwc18ov4pdRn18iIzHWM6iIc8=; b=VrWzBxUwRzFUjo/YytEOTQYtacrSZlKyMfFxyJf3neZ3x/baPNMVmGt7mgE9cpOrVR i4L0kcfZNJALwdr7DdaemVH8e2tFkxoaHqL7AYoxFz4i11fBEjXboXTCxnd7bAyMhgdk 0ylnCaCnULcPxKGeoaXiLq+4aIqplJBmBsyMRXLNqq7ApanLl3mIt9QVv7wsoqBT+f6h aZtY1onATSdcjZ0lq5U1myrMrb7m528NSrW8WINCBBMnGNET+8yfEijC9Y1vdt6yyZ8k XlDyunHK/VusxmILjpACl/n+1sKQKpWvBMClic9/iJV5m7EhAHntMJ/imZHDxtOK6RYu lM5A== X-Gm-Message-State: APjAAAUUxO2cmRyg0iwhlFln5gGZtY0tY4UHyTng4DXeBQhN/cHlflsn VYz58AoWfg3FD6hPPISP6EE= X-Google-Smtp-Source: APXvYqwfI7KfeyawAJp6y1neCi4NyMNu1zKDyT/sMsWjTFvS+aRkPVuY0xg2kjSj9gtE8DZZ9eEXUA== X-Received: by 2002:a62:d244:: with SMTP id c65mr32599784pfg.173.1558221751038; Sat, 18 May 2019 16:22:31 -0700 (PDT) Received: from sc2-haas01-esx0118.eng.vmware.com ([66.170.99.1]) by smtp.gmail.com with ESMTPSA id x17sm20496352pgh.47.2019.05.18.16.22.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 18 May 2019 16:22:29 -0700 (PDT) From: Nadav Amit To: Paolo Bonzini Cc: kvm@vger.kernel.org, rkrcmar@redhat.com, Nadav Amit , Sean Christopherson Subject: [kvm-unit-tests PATCH v2 1/2] x86: nVMX: Use #DB in nmi- and intr-window tests Date: Sat, 18 May 2019 09:02:30 -0700 Message-Id: <20190518160231.4063-2-nadav.amit@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190518160231.4063-1-nadav.amit@gmail.com> References: <20190518160231.4063-1-nadav.amit@gmail.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP According to Intel SDM 26.3.1.5 "Checks on Guest Non-Register State", if the activity state is HLT, the only events that can be injected are NMI, MTF and "Those with interruption type hardware exception and vector 1 (debug exception) or vector 18 (machine-check exception)." Theverify_nmi_window_exit() and verify_intr_window_exit() tests try to do something that real hardware disallows (i.e., fail the VM-entry) by injecting #UD in HLT-state. Inject #DB instead as the injection should succeed in these tests. Cc: Sean Christopherson Reviewed-by: Jim Mattson Signed-off-by: Nadav Amit --- x86/vmx_tests.c | 72 ++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c index d0ce1af..f921286 100644 --- a/x86/vmx_tests.c +++ b/x86/vmx_tests.c @@ -7035,21 +7035,21 @@ static void vmx_pending_event_hlt_test(void) vmx_pending_event_test_core(true); } -static int vmx_window_test_ud_count; +static int vmx_window_test_db_count; -static void vmx_window_test_ud_handler(struct ex_regs *regs) +static void vmx_window_test_db_handler(struct ex_regs *regs) { - vmx_window_test_ud_count++; + vmx_window_test_db_count++; } static void vmx_nmi_window_test_guest(void) { - handle_exception(UD_VECTOR, vmx_window_test_ud_handler); + handle_exception(DB_VECTOR, vmx_window_test_db_handler); asm volatile("vmcall\n\t" "nop\n\t"); - handle_exception(UD_VECTOR, NULL); + handle_exception(DB_VECTOR, NULL); } static void verify_nmi_window_exit(u64 rip) @@ -7068,7 +7068,7 @@ static void verify_nmi_window_exit(u64 rip) static void vmx_nmi_window_test(void) { u64 nop_addr; - void *ud_fault_addr = get_idt_addr(&boot_idt[UD_VECTOR]); + void *db_fault_addr = get_idt_addr(&boot_idt[DB_VECTOR]); if (!(ctrl_pin_rev.clr & PIN_VIRT_NMI)) { report_skip("CPU does not support the \"Virtual NMIs\" VM-execution control."); @@ -7080,7 +7080,7 @@ static void vmx_nmi_window_test(void) return; } - vmx_window_test_ud_count = 0; + vmx_window_test_db_count = 0; report_prefix_push("NMI-window"); test_set_guest(vmx_nmi_window_test_guest); @@ -7113,27 +7113,27 @@ static void vmx_nmi_window_test(void) /* * Ask for "NMI-window exiting" (with event injection), and * expect a VM-exit after the event is injected. (RIP should - * be at the address specified in the IDT entry for #UD.) + * be at the address specified in the IDT entry for #DB.) */ - report_prefix_push("active, no blocking, injecting #UD"); + report_prefix_push("active, no blocking, injecting #DB"); vmcs_write(ENT_INTR_INFO, - INTR_INFO_VALID_MASK | INTR_TYPE_HARD_EXCEPTION | UD_VECTOR); + INTR_INFO_VALID_MASK | INTR_TYPE_HARD_EXCEPTION | DB_VECTOR); enter_guest(); - verify_nmi_window_exit((u64)ud_fault_addr); + verify_nmi_window_exit((u64)db_fault_addr); report_prefix_pop(); /* * Ask for "NMI-window exiting" with NMI blocking, and expect - * a VM-exit after the next IRET (i.e. after the #UD handler + * a VM-exit after the next IRET (i.e. after the #DB handler * returns). So, RIP should be back at one byte past the nop. */ report_prefix_push("active, blocking by NMI"); vmcs_write(GUEST_INTR_STATE, GUEST_INTR_STATE_NMI); enter_guest(); verify_nmi_window_exit(nop_addr + 1); - report("#UD handler executed once (actual %d times)", - vmx_window_test_ud_count == 1, - vmx_window_test_ud_count); + report("#DB handler executed once (actual %d times)", + vmx_window_test_db_count == 1, + vmx_window_test_db_count); report_prefix_pop(); if (!(rdmsr(MSR_IA32_VMX_MISC) & (1 << 6))) { @@ -7154,15 +7154,15 @@ static void vmx_nmi_window_test(void) * Ask for "NMI-window exiting" when entering activity * state HLT (with event injection), and expect a * VM-exit after the event is injected. (RIP should be - * at the address specified in the IDT entry for #UD.) + * at the address specified in the IDT entry for #DB.) */ - report_prefix_push("halted, no blocking, injecting #UD"); + report_prefix_push("halted, no blocking, injecting #DB"); vmcs_write(GUEST_ACTV_STATE, ACTV_HLT); vmcs_write(ENT_INTR_INFO, INTR_INFO_VALID_MASK | INTR_TYPE_HARD_EXCEPTION | - UD_VECTOR); + DB_VECTOR); enter_guest(); - verify_nmi_window_exit((u64)ud_fault_addr); + verify_nmi_window_exit((u64)db_fault_addr); report_prefix_pop(); } @@ -7173,7 +7173,7 @@ static void vmx_nmi_window_test(void) static void vmx_intr_window_test_guest(void) { - handle_exception(UD_VECTOR, vmx_window_test_ud_handler); + handle_exception(DB_VECTOR, vmx_window_test_db_handler); /* * The two consecutive STIs are to ensure that only the first @@ -7185,7 +7185,7 @@ static void vmx_intr_window_test_guest(void) "sti\n\t" "sti\n\t"); - handle_exception(UD_VECTOR, NULL); + handle_exception(DB_VECTOR, NULL); } static void verify_intr_window_exit(u64 rip) @@ -7205,8 +7205,8 @@ static void vmx_intr_window_test(void) { u64 vmcall_addr; u64 nop_addr; - unsigned int orig_ud_gate_type; - void *ud_fault_addr = get_idt_addr(&boot_idt[UD_VECTOR]); + unsigned int orig_db_gate_type; + void *db_fault_addr = get_idt_addr(&boot_idt[DB_VECTOR]); if (!(ctrl_cpu_rev[0].clr & CPU_INTR_WINDOW)) { report_skip("CPU does not support the \"interrupt-window exiting\" VM-execution control."); @@ -7214,12 +7214,12 @@ static void vmx_intr_window_test(void) } /* - * Change the IDT entry for #UD from interrupt gate to trap gate, + * Change the IDT entry for #DB from interrupt gate to trap gate, * so that it won't clear RFLAGS.IF. We don't want interrupts to - * be disabled after vectoring a #UD. + * be disabled after vectoring a #DB. */ - orig_ud_gate_type = boot_idt[UD_VECTOR].type; - boot_idt[UD_VECTOR].type = 15; + orig_db_gate_type = boot_idt[DB_VECTOR].type; + boot_idt[DB_VECTOR].type = 15; report_prefix_push("interrupt-window"); test_set_guest(vmx_intr_window_test_guest); @@ -7244,14 +7244,14 @@ static void vmx_intr_window_test(void) * Ask for "interrupt-window exiting" (with event injection) * with RFLAGS.IF set and no blocking; expect a VM-exit after * the event is injected. That is, RIP should should be at the - * address specified in the IDT entry for #UD. + * address specified in the IDT entry for #DB. */ - report_prefix_push("active, no blocking, RFLAGS.IF=1, injecting #UD"); + report_prefix_push("active, no blocking, RFLAGS.IF=1, injecting #DB"); vmcs_write(ENT_INTR_INFO, - INTR_INFO_VALID_MASK | INTR_TYPE_HARD_EXCEPTION | UD_VECTOR); + INTR_INFO_VALID_MASK | INTR_TYPE_HARD_EXCEPTION | DB_VECTOR); vmcall_addr = vmcs_read(GUEST_RIP); enter_guest(); - verify_intr_window_exit((u64)ud_fault_addr); + verify_intr_window_exit((u64)db_fault_addr); report_prefix_pop(); /* @@ -7323,19 +7323,19 @@ static void vmx_intr_window_test(void) * activity state HLT (with event injection), and * expect a VM-exit after the event is injected. That * is, RIP should should be at the address specified - * in the IDT entry for #UD. + * in the IDT entry for #DB. */ - report_prefix_push("halted, no blocking, injecting #UD"); + report_prefix_push("halted, no blocking, injecting #DB"); vmcs_write(GUEST_ACTV_STATE, ACTV_HLT); vmcs_write(ENT_INTR_INFO, INTR_INFO_VALID_MASK | INTR_TYPE_HARD_EXCEPTION | - UD_VECTOR); + DB_VECTOR); enter_guest(); - verify_intr_window_exit((u64)ud_fault_addr); + verify_intr_window_exit((u64)db_fault_addr); report_prefix_pop(); } - boot_idt[UD_VECTOR].type = orig_ud_gate_type; + boot_idt[DB_VECTOR].type = orig_db_gate_type; vmcs_clear_bits(CPU_EXEC_CTRL0, CPU_INTR_WINDOW); enter_guest(); report_prefix_pop(); From patchwork Sat May 18 16:02:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nadav Amit X-Patchwork-Id: 10949235 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D608D933 for ; Sat, 18 May 2019 23:27:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C687628500 for ; Sat, 18 May 2019 23:27:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BB4F02850D; Sat, 18 May 2019 23:27:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=2.0 tests=BAYES_00,DATE_IN_PAST_06_12, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 57CE028500 for ; Sat, 18 May 2019 23:27:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729531AbfERXWd (ORCPT ); Sat, 18 May 2019 19:22:33 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:46915 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729422AbfERXWd (ORCPT ); Sat, 18 May 2019 19:22:33 -0400 Received: by mail-pl1-f193.google.com with SMTP id r18so4971864pls.13 for ; Sat, 18 May 2019 16:22:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=WjxX8zAwbhv74gaYcVoc/KxtV/PKEZnjymT0I9JZiFA=; b=Xi94euO9fwiwC3IzjOJuSmu9RS/T79vM1y/+jkItMEjWQDedUKmulXbccbNaAJVDI3 dSxjGBczk1Ze4UAZo/emEtEnABpV9tuEmqjBF+4YjEIy8F1F4S7aFO/u95oZDa7ofQ2g CY1VyaG1frJoGvEVqWCZVtvb1HiIsgQGlsMe0TM7i5DZd7MbL9zDdlICy45IzCoDhfHk TGN6PL4L2AI1KMob4xpG+5ehzjCk4qKwCTZ/5eM9Qre67q5QSdmMDLBQXhytczo0j6OU Fj1blcdJvPbKmW5j/2SFgj1uV4w2BJVEJSZ9DdpA0lX7YbiljhNITuzT9Alu8nfLiHw/ HX5Q== 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=WjxX8zAwbhv74gaYcVoc/KxtV/PKEZnjymT0I9JZiFA=; b=P3RzeefSJjJPrg9DlPU8tgY0oYiqB/EZbKqEVP8Uli1Cj7JXO2+UoYS2ePb7Uimb5e smoIfq/asAVlsuxs+u6OBKOUhFz3BZiSLLjliENm/Luq4Xc056piO8dSgUJLQMD+l53Y t4BxH8z3rITxtYdFzFedFWBGqK+8n7gfZ2D/F13Sh3HYwt82tt7jNPubOOPLpN8ezQwZ d7W0FM3OpkDj4x0/uiWTAQCqUnXN1WMvWpTtAfv4UuCNDFtWqFkj4cZNpFPhlGTGnjed tVVSLBW7taosQ4YWCjwH2QrGXHKGjQ0llTYXrMPYpqE2TNxCiClOpLWpIVWQ2udRTqxe 5bbw== X-Gm-Message-State: APjAAAW6/nJJ8IKcqH5K38HYNnDFek9fIX0koA/WDzsDXMWRVCX6qHqF 0olDZC4RbNN5cy7mRfxlxPJImfoJVBw= X-Google-Smtp-Source: APXvYqx1sgCzKdxjGykuGSvLXd6HPxVX03JpO7BYpF6uCCpcC1GQrvhxCGcyE3jVtqYhNo0Su4rOuA== X-Received: by 2002:a17:902:b205:: with SMTP id t5mr17936343plr.314.1558221752496; Sat, 18 May 2019 16:22:32 -0700 (PDT) Received: from sc2-haas01-esx0118.eng.vmware.com ([66.170.99.1]) by smtp.gmail.com with ESMTPSA id x17sm20496352pgh.47.2019.05.18.16.22.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 18 May 2019 16:22:31 -0700 (PDT) From: Nadav Amit To: Paolo Bonzini Cc: kvm@vger.kernel.org, rkrcmar@redhat.com, Nadav Amit , Sean Christopherson Subject: [kvm-unit-tests PATCH v2 2/2] x86: nVMX: Set guest as active after NMI/INTR-window tests Date: Sat, 18 May 2019 09:02:31 -0700 Message-Id: <20190518160231.4063-3-nadav.amit@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190518160231.4063-1-nadav.amit@gmail.com> References: <20190518160231.4063-1-nadav.amit@gmail.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Running tests which are similar to verify_nmi_window_exit() and verify_intr_window_exit() on bare-metal suggests that real CPUs do not wake up. It appears, according to Sean, that the activity state should not change after NMI/INTR-window. Remove the offending test and set the activity state to "active" after each test to prevent the whole test-suite from getting stuck. Cc: Sean Christopherson Reviewed-by: Jim Mattson Signed-off-by: Nadav Amit --- x86/vmx_tests.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c index f921286..1092fad 100644 --- a/x86/vmx_tests.c +++ b/x86/vmx_tests.c @@ -7060,9 +7060,7 @@ static void verify_nmi_window_exit(u64 rip) exit_reason == VMX_NMI_WINDOW, exit_reason); report("RIP (%#lx) is %#lx", vmcs_read(GUEST_RIP) == rip, vmcs_read(GUEST_RIP), rip); - report("Activity state (%ld) is 'ACTIVE'", - vmcs_read(GUEST_ACTV_STATE) == ACTV_ACTIVE, - vmcs_read(GUEST_ACTV_STATE)); + vmcs_write(GUEST_ACTV_STATE, ACTV_ACTIVE); } static void vmx_nmi_window_test(void) @@ -7196,9 +7194,7 @@ static void verify_intr_window_exit(u64 rip) exit_reason == VMX_INTR_WINDOW, exit_reason); report("RIP (%#lx) is %#lx", vmcs_read(GUEST_RIP) == rip, vmcs_read(GUEST_RIP), rip); - report("Activity state (%ld) is 'ACTIVE'", - vmcs_read(GUEST_ACTV_STATE) == ACTV_ACTIVE, - vmcs_read(GUEST_ACTV_STATE)); + vmcs_write(GUEST_ACTV_STATE, ACTV_ACTIVE); } static void vmx_intr_window_test(void)