From patchwork Thu May 20 23:03:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271513 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5BACFC43460 for ; Thu, 20 May 2021 23:03:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 33574613AD for ; Thu, 20 May 2021 23:03:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232907AbhETXFQ (ORCPT ); Thu, 20 May 2021 19:05:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59548 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232619AbhETXFQ (ORCPT ); Thu, 20 May 2021 19:05:16 -0400 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 6B775C061574 for ; Thu, 20 May 2021 16:03:54 -0700 (PDT) Received: by mail-pj1-x104a.google.com with SMTP id q69-20020a17090a1b4bb029015d3adc1867so5604750pjq.1 for ; Thu, 20 May 2021 16:03:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=0wnPxFKJXC46QgurgGHA4bPpgEK+w7m9Db4mfJ3t1U4=; b=czYm0NO48HwGfZe9uAslmUeU4TD4wSespBbvjx5QE0twujoMwW/WmqH4vNPLmaPjy4 raAb5h3/XAaDef0lgujKIqisbSi/guRBrwOwIQ3Dhf0eZtKXWbYBLMEEKUbqAPMWad4d rgrdfG5uDwY0LjaykYzo5A2sa/C803OhG7d8jMDZaO+yVwwDemoIKbrZB1mJwic9noFP mSgohQgDygCU/eFcDTNr8QVIb9zSE1JkLFs82fFo5saLbDrJ3uXbeTQY3tpGuuASgpsG aJxvWDOu8LtzpKRrV8Q134EPd5wktvJuqEJVVvhKXp6eEYEDMsApoSwTMmMl0ACMS73n SakQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=0wnPxFKJXC46QgurgGHA4bPpgEK+w7m9Db4mfJ3t1U4=; b=KOpcrCit6JprJUmtdd06cm4OzUUrmbRIpjCSlIp1c/3+M9XxjR2cJ34tLgrVJqtD8F RyNk/Hnm5DhNwn9o1KdZ/rBvVCg/ZEAJefgdPqf/PN/Ot7ib8Y4E0PQSuaqjh1r/zVqw 3ZSSKjDJWmyMtq3ciOFtv24ezU4iwVJ0TyQaOCtuEtbHOARNPYsDGw1atPPW7SRSK9EY ox1vO4EXTqeR5Uf9TM4d9wkdil2Qdw9YrEuIPFpP1qqHUoehVVtb33aIp1PXLEASHTzF OEeF0bUdqMWIkg6MxVYIaEfyHnFqWqVZ+mkdn7ipti5msFzEJ0eCxlkjTnYQ9tS4qoSM ZnTg== X-Gm-Message-State: AOAM533QlN55zHLPGElLfDswozMULJtpN8x5PBGkALJspKvdR4YnUDlx CwYntbdzSdwELkX6pgxzm8T++7iTZPP2dgfi9cm+GC+2o1bjhDLYsiTXYdBpi8qLj2zL8gGCCMV Txw8o4SYZXKib4Hann3nQ4DWc4nC9c55YeOJCG9BOjrJDrc5oFfMRF9Hsa8YpC1E= X-Google-Smtp-Source: ABdhPJwogPEeX0EIXIvC+Rv3y6zKg/JPTqgJABWCbjZJt12EiwCUrRACL5l9ljGidGQAf2FTqPNS/eitntt+RA== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:a17:902:e309:b029:f1:9342:2036 with SMTP id q9-20020a170902e309b02900f193422036mr8481442plc.53.1621551833624; Thu, 20 May 2021 16:03:53 -0700 (PDT) Date: Thu, 20 May 2021 16:03:28 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-2-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 01/12] KVM: x86: Remove guest mode check from kvm_check_nested_events From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org A survey of the callsites reveals that they all ensure the vCPU is in guest mode before calling kvm_check_nested_events. Remove this dead code so that the only negative value this function returns (at the moment) is -EBUSY. Signed-off-by: Jim Mattson --- arch/x86/kvm/x86.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index bbc4e04e67ad..d517460db413 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -8532,9 +8532,6 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu) int kvm_check_nested_events(struct kvm_vcpu *vcpu) { - if (WARN_ON_ONCE(!is_guest_mode(vcpu))) - return -EIO; - if (kvm_check_request(KVM_REQ_TRIPLE_FAULT, vcpu)) { kvm_x86_ops.nested_ops->triple_fault(vcpu); return 1; From patchwork Thu May 20 23:03:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271515 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B1F62C433B4 for ; Thu, 20 May 2021 23:03:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8D80F613AD for ; Thu, 20 May 2021 23:03:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232919AbhETXFS (ORCPT ); Thu, 20 May 2021 19:05:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59560 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232898AbhETXFS (ORCPT ); Thu, 20 May 2021 19:05:18 -0400 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 52ACFC061574 for ; Thu, 20 May 2021 16:03:56 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id b66-20020a25cb450000b02905076ea039f1so23777316ybg.1 for ; Thu, 20 May 2021 16:03:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=9PMOzhvayBX52a9vOLmHYU5NNHfiPeZ8GQXS4Aphbho=; b=H8M8T33kzx+V2jSG4TklCEeaRbJl+LGoM2hOV7n80WMHw9zgckMDcuEbX79CAjJ4Zk 7t8uup46BqhvOT3k44SFSRLD/8KEFUJmStreNNaMfDArrJY0xdcy3hqB2ITalDJ8yd0s qkfoERemklnYpB69lt7hkI28fU8Kj91Mfg1zAKF+I7uHPCMhd+q5BpSEGrwdLDeswpbu Nz3QIBhM9zm9A6bGPPJlKLusEABW3bUaOzHv7c3AsrOYoeLMETmJV7sVaeMSJIuRfZRy gNH2ZO546DtUV5bgY3EvAJAwiD7mgKS2hJwFvJaJ5EfX+FFFcK6CNEM+9DWBSmTirh3H zWMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=9PMOzhvayBX52a9vOLmHYU5NNHfiPeZ8GQXS4Aphbho=; b=M0LbyJ8SGmMggeoYgFnBvUx0zsFLW8oq7ST03bjB9COqeGk/j4JcOd8X/takx5tLEZ SjcoVViIEmtI6UOKtEE9t+UcY8LjjFEC1RrRA4Z3coixsEDhSvzhpx2nj00RwlNNPnVU h0T76AWPppiG+v6Aqt/b6FwjN7uEdzqeFn31WdNe1JgQU7jUDplqY9OodoyeiMyzXSix NwKV8W3O71OkSaJWh+PjrTaz40R7FyDDB0wmU6fZZfoN9IehIlld7k+875xECjIX8ggq 7SrVbRgOSi0vloxBX5+xGhBSvRqvCog0NX7Kbk3r/GoupmTNVq8aja3bRxrIUgRE4c7/ sMog== X-Gm-Message-State: AOAM5314IFIF0ROogrgMRl50YaPgcLoJgVO7pWuhUaCLA4vSxhT1W94t DQ6B1nKTUJbJT+N6AAHPLSAmSA6gZkEXc9/ZDRFqH34g0S7xRIEIK1wTU+OZEwZMAkt7ctDEGbX Q7G/coAoHtDkMd9rwyfJNLgCpvEM0KbRoBIZBxphwhlAPA6/gIRxIA8omV/YVoKc= X-Google-Smtp-Source: ABdhPJzz786O7RQWj/Altb3OK/dSPBpCKX8SNgBK2GKGePrZV7LFAUGixTUKGoYsxoGM77tX8q29rhEpUgCvEQ== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:a5b:448:: with SMTP id s8mr10525642ybp.363.1621551835480; Thu, 20 May 2021 16:03:55 -0700 (PDT) Date: Thu, 20 May 2021 16:03:29 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-3-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 02/12] KVM: x86: Wake up a vCPU when kvm_check_nested_events fails From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson , Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org At present, there are two reasons why kvm_check_nested_events may return a non-zero value: 1) we just emulated a shutdown VM-exit from L2 to L1. 2) we need to perform an immediate VM-exit from vmcs02. In either case, transition the vCPU to "running." Signed-off-by: Jim Mattson Reviewed-by: Oliver Upton --- arch/x86/kvm/x86.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index d517460db413..d3fea8ea3628 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -9468,8 +9468,8 @@ static inline int vcpu_block(struct kvm *kvm, struct kvm_vcpu *vcpu) static inline bool kvm_vcpu_running(struct kvm_vcpu *vcpu) { - if (is_guest_mode(vcpu)) - kvm_check_nested_events(vcpu); + if (is_guest_mode(vcpu) && kvm_check_nested_events(vcpu)) + return true; return (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE && !vcpu->arch.apf.halted); From patchwork Thu May 20 23:03:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271517 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-23.5 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A4309C433B4 for ; Thu, 20 May 2021 23:03:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8370A6108B for ; Thu, 20 May 2021 23:03:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232912AbhETXFU (ORCPT ); Thu, 20 May 2021 19:05:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59576 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232619AbhETXFT (ORCPT ); Thu, 20 May 2021 19:05:19 -0400 Received: from mail-qk1-x749.google.com (mail-qk1-x749.google.com [IPv6:2607:f8b0:4864:20::749]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 01884C061574 for ; Thu, 20 May 2021 16:03:58 -0700 (PDT) Received: by mail-qk1-x749.google.com with SMTP id o14-20020a05620a0d4eb02903a5eee61155so3556535qkl.9 for ; Thu, 20 May 2021 16:03:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=sEEFc7nxytPNhRyL7aSgTcAzNHBObQcmfsrv08SwNNc=; b=jJLMdJ0mRxDYGPBrizBxv6CjLCHeu1WyLXmVtBhxABQucChMmGOYPupiMnCPABBJwr euA3miJabiMbWLcNPoJBblFu5nzS3HqCFJ4TkbiqrKLrt9Ssn9CY9kqbzXLDqymDnfX0 v1sUOjR/7RyjAkZfxJx1/pFRgRdkOQiBNttNZ6VoF6Th9/fn6r0zP+S0Xa6MxoIEzIRU fdKJ6Py64s5s+Kdnqw4DT9YWGarKylpU5XO7jGg0zd8MQ36Bo4dzBwSyQbhvwBLvABOU wi51nnBtifDgk2x/Sy3NsIYxHs/jniMheNEQc716BMLOl7982s48cY5PVKE+bdyciMkS hP6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=sEEFc7nxytPNhRyL7aSgTcAzNHBObQcmfsrv08SwNNc=; b=YaRx+HMdEP3oHayKENNndLs75m88+fqWH6guSUN5tE/weLW+w6B1D7D/DNNfEEA3iy tF7rZWj6PcKnHm1swIkkJUW28WZ16vA3UiEZQugH3KuM2O+7i1rR8XTLxo2jbL98mj2Q uMjGMYX9IhZX2UrgDK/bvd1SiFQyX8m7vaZLbPuRE3GvALO/1gXrlTGcZXqjxnnct6AR nB/celA0XzJPKjVSWjkXNnTxeQbYIoHo8EVHobNl3yfRjJPlQAuE+6Qfh4ud6zgtze6d NHPtkN/6J3/B/dnSpqHnes9HRd0fLjmIwdzpjatI9gCA8cZfKARXJOyk4LlJRHv4k84f UpxA== X-Gm-Message-State: AOAM5319zRaL1iHl78yZv0KiQcUEztR+ahjzoElqKb7Q8R4tVo65VKpe XdZMZUVEEXLGDAYEFQ+yEyfkRBtWRt4XwDeGrscWKvVode0KD/Gc17PVPS1RqxMrpEoSLue3Lun d8+g9Ib+h56zka9t/JKaQYJw6P1u0UyHfr+aN71h9atKFDq6ZXV+fru9Hx6pB95w= X-Google-Smtp-Source: ABdhPJzFRTrsi99/WJOGnhUbdG/nxGd9roHIyD7LwCahNz4efG7rk3rNCtukGXCwG8lCrY0a6+bl0HlIC90M9w== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:a0c:99e2:: with SMTP id y34mr8798712qve.29.1621551837024; Thu, 20 May 2021 16:03:57 -0700 (PDT) Date: Thu, 20 May 2021 16:03:30 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-4-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 03/12] KVM: nVMX: Add a return code to vmx_complete_nested_posted_interrupt From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson , Sean Christopherson , Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org No functional change intended. Signed-off-by: Jim Mattson Suggested-by: Sean Christopherson Reviewed-by: Oliver Upton --- arch/x86/kvm/vmx/nested.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 6058a65a6ede..7646e6e561ad 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -3682,7 +3682,7 @@ void nested_mark_vmcs12_pages_dirty(struct kvm_vcpu *vcpu) } } -static void vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu) +static int vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu) { struct vcpu_vmx *vmx = to_vmx(vcpu); int max_irr; @@ -3690,17 +3690,17 @@ static void vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu) u16 status; if (!vmx->nested.pi_desc || !vmx->nested.pi_pending) - return; + return 0; vmx->nested.pi_pending = false; if (!pi_test_and_clear_on(vmx->nested.pi_desc)) - return; + return 0; max_irr = find_last_bit((unsigned long *)vmx->nested.pi_desc->pir, 256); if (max_irr != 256) { vapic_page = vmx->nested.virtual_apic_map.hva; if (!vapic_page) - return; + return 0; __kvm_apic_update_irr(vmx->nested.pi_desc->pir, vapic_page, &max_irr); @@ -3713,6 +3713,7 @@ static void vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu) } nested_mark_vmcs12_pages_dirty(vcpu); + return 0; } static void nested_vmx_inject_exception_vmexit(struct kvm_vcpu *vcpu, @@ -3887,8 +3888,7 @@ static int vmx_check_nested_events(struct kvm_vcpu *vcpu) } no_vmexit: - vmx_complete_nested_posted_interrupt(vcpu); - return 0; + return vmx_complete_nested_posted_interrupt(vcpu); } static u32 vmx_get_preemption_timer_value(struct kvm_vcpu *vcpu) From patchwork Thu May 20 23:03:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271519 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5C634C43460 for ; Thu, 20 May 2021 23:04:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 31DB06108B for ; Thu, 20 May 2021 23:04:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232973AbhETXFW (ORCPT ); Thu, 20 May 2021 19:05:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59582 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232925AbhETXFV (ORCPT ); Thu, 20 May 2021 19:05:21 -0400 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 3AFE7C061761 for ; Thu, 20 May 2021 16:03:59 -0700 (PDT) Received: by mail-pg1-x54a.google.com with SMTP id d64-20020a6368430000b02902104a07607cso11252628pgc.1 for ; Thu, 20 May 2021 16:03:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=pqJ9r0w3yO8BRgD+OaCI5cpEj+XpER34J0dTKBLscnU=; b=m0lTEoAoXq8s9zbbMvM/Rp30znBPNMGz6P6NcoJXKFvEN5Ky6+NsfAsFbrs10YGf75 OXOYS4mXYM0nREQnX7qB0g7KOji6NcdU8NdjTc/rZ/1ZzeN9J55NkYrDe+2/QMgMKrVv rv2UiRiN/kiKZwzVzG1ghBqQyrIqIneCFMBPkxFYCeT0FO6fE0fCkXn2ZKSifCqza4z5 wu9tBBnI2oCENKsXcnj3HTfd1VAXlTWdSzLB7lgoY+AFMKN+FVLFHFtrwyJ+L2mUR1Qo v+P0JDwkh8ySJd4GAWwiaUvbBV/tiwcqxQ+EiX817TfKSz+p6sU5BvDpSdv5KX4N7FX8 +mlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=pqJ9r0w3yO8BRgD+OaCI5cpEj+XpER34J0dTKBLscnU=; b=hqXB/my5OPY2roXzG3xUjO+4IY1vcU+OEdWMFN/ytMGXAjNzYfFnzFAuktIRQraGLo 2FVp9k7YoYhZt+4k/YvGgBRkHu5jtaD607sNiKORzGm38tedI9b2hOKpTwxKv7Ckvr1N p4wDvyfBXAmIipQ+Uz36UPCTpJCKIGKkJBx0bd1+XxDCGWfv+C1cvUixCOJSw2IlNW+W nARVEixvnNz8DWtUlgkXPMqzPBxwBnmdrxpgW6CPEeR7SkQbSdxtQ69RHaWFtU80nGyf in8FXKFpjGBDckMsCsFpEIH9dDNOa9kf2Mhf+PKwahWFxLJ3pEOpemihNWAaZP7UfaEf fvNQ== X-Gm-Message-State: AOAM533wHwg+G+XCkc55V8lDuneKNN/7ZlVgMP7295yigy+y/lPPIN79 RBa+Z+Eb51xPtZ0BZ+03Ud9zSazQ46djHZpt2DC9IaQDEzX9KdInKKiqMbBYcpVE/G0xVH2POn6 rZOw1rukyUJdX+gXE5Vov/COY97LTdoTUVytmN7C4TzMIHIpOpQ4MIlcMfFC02bI= X-Google-Smtp-Source: ABdhPJwySGcZbFHPWZN1PoR/+sAVVnXUeYVbBxHqCpBJ/kdsxEjhWBQDX+IuydI77aLHCYbJHePeU8r7IIb/LQ== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:a62:90:0:b029:2db:90a5:74dc with SMTP id 138-20020a6200900000b02902db90a574dcmr6735711pfa.27.1621551838619; Thu, 20 May 2021 16:03:58 -0700 (PDT) Date: Thu, 20 May 2021 16:03:31 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-5-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 04/12] KVM: x86: Add a return code to inject_pending_event From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson , Sean Christopherson Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org No functional change intended. At present, 'r' will always be -EBUSY on a control transfer to the 'out' label. Suggested-by: Sean Christopherson Signed-off-by: Jim Mattson --- arch/x86/kvm/x86.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index d3fea8ea3628..eb35536f8d06 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -8547,7 +8547,7 @@ static void kvm_inject_exception(struct kvm_vcpu *vcpu) static_call(kvm_x86_queue_exception)(vcpu); } -static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit) +static int inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit) { int r; bool can_inject = true; @@ -8594,7 +8594,7 @@ static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit if (is_guest_mode(vcpu)) { r = kvm_check_nested_events(vcpu); if (r < 0) - goto busy; + goto out; } /* try to inject new event if pending */ @@ -8636,7 +8636,7 @@ static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit if (vcpu->arch.smi_pending) { r = can_inject ? static_call(kvm_x86_smi_allowed)(vcpu, true) : -EBUSY; if (r < 0) - goto busy; + goto out; if (r) { vcpu->arch.smi_pending = false; ++vcpu->arch.smi_count; @@ -8649,7 +8649,7 @@ static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit if (vcpu->arch.nmi_pending) { r = can_inject ? static_call(kvm_x86_nmi_allowed)(vcpu, true) : -EBUSY; if (r < 0) - goto busy; + goto out; if (r) { --vcpu->arch.nmi_pending; vcpu->arch.nmi_injected = true; @@ -8664,7 +8664,7 @@ static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit if (kvm_cpu_has_injectable_intr(vcpu)) { r = can_inject ? static_call(kvm_x86_interrupt_allowed)(vcpu, true) : -EBUSY; if (r < 0) - goto busy; + goto out; if (r) { kvm_queue_interrupt(vcpu, kvm_cpu_get_interrupt(vcpu), false); static_call(kvm_x86_set_irq)(vcpu); @@ -8680,11 +8680,14 @@ static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit *req_immediate_exit = true; WARN_ON(vcpu->arch.exception.pending); - return; + return 0; -busy: - *req_immediate_exit = true; - return; +out: + if (r == -EBUSY) { + *req_immediate_exit = true; + r = 0; + } + return r; } static void process_nmi(struct kvm_vcpu *vcpu) @@ -9245,7 +9248,11 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) goto out; } - inject_pending_event(vcpu, &req_immediate_exit); + r = inject_pending_event(vcpu, &req_immediate_exit); + if (r < 0) { + r = 0; + goto out; + } if (req_int_win) static_call(kvm_x86_enable_irq_window)(vcpu); From patchwork Thu May 20 23:03:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271521 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0B86EC433ED for ; Thu, 20 May 2021 23:04:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CA185613AD for ; Thu, 20 May 2021 23:04:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232976AbhETXFY (ORCPT ); Thu, 20 May 2021 19:05:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59598 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232925AbhETXFX (ORCPT ); Thu, 20 May 2021 19:05:23 -0400 Received: from mail-qt1-x84a.google.com (mail-qt1-x84a.google.com [IPv6:2607:f8b0:4864:20::84a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 291A5C061761 for ; Thu, 20 May 2021 16:04:01 -0700 (PDT) Received: by mail-qt1-x84a.google.com with SMTP id v13-20020ac8578d0000b02901e4f5d48831so13497911qta.14 for ; Thu, 20 May 2021 16:04:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=b7yOHMmFLrcErOMnqY+LVtxy8Wx78poOjcCXOFGFxdM=; b=laSXRSNVyv4GpLF+bQLsDCxDUz888lefm3aOVowOShUM7nPiAMZ2gzKTarpAZX4jRR xXaShoVoYsPWsFRZNFLXJ6Z6Mlt+PhRS4+B84BcObGhM0N8VKq5G3BaziyykU79S9xJv 4m4SCQwExdKJs87enqQ1T4F8rfscuiTayCRY9P2T0a3UVSr6+bjKjZRPxVZFhz6vvOCv iWM6EyNtPi32gk+QHf3a3NcTXHc5r/LW40iPPwVey0bBzXZHLLQkF8SyijDEWWAERTmH +lfvozr2/4X+gX1p6qULMYajnuxYIlPuytaSFei4qsJU89DFfYDpNkLFjOAS21BfgB2b dmfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=b7yOHMmFLrcErOMnqY+LVtxy8Wx78poOjcCXOFGFxdM=; b=c8oi64hTQflBTeYQ26Qxyr5PX1mY/ztAOegadI1pf6IlLRiRs8nRKAPv3oQBKzcFiR S1GcjnK6qfyfH2A/MygYWlGalfyXaZCX0No23Qh1cdjBzkmvCckfiCqQ47e3G4HBjpgQ wK0+LHdh8cffKjxaoa0TwjMEaFaHuN4/KayWjnhuJTWpvFbveSPwaM6e/avKNawdI+F5 Rk/m846iWhNJGjIYDsCHFtY6jxfKpcXgPgM8aGLkS4JbPbPPMA8txp5mbKgVs8csC62Z UhbMuCgeBsQxgLYHGpDoK9BdDKGr8OCS87CtR4U+BqZE8gVCIbPH+TXtF2tglkU0Eyyg kAaA== X-Gm-Message-State: AOAM531i8bfel0X/nLUPkIZlHgbj1x095PI5AgKpjnPn7WTID/2DtGpE 8KZTrpFTD/rddUyROB3l4os50fJgJXyOQqurCfrKwKPh2b2O3BtSLLac4WVVEQRjkpn+RNfSrWe m/ifMWAl/X1EG5+1JmwSwTYmivf7/muC2FyhDVpGp20UJe8sXH0GLX4ko69vysiQ= X-Google-Smtp-Source: ABdhPJw0Amz/b8LPfhFK+uKtNdR3vLN6Np/cuHxop+moFmEn3fD4NNFMAk7K1dF0SMSoDUSY2ZB/NHhFBKW6Hw== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:ad4:54c9:: with SMTP id j9mr8889175qvx.62.1621551840042; Thu, 20 May 2021 16:04:00 -0700 (PDT) Date: Thu, 20 May 2021 16:03:32 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-6-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 05/12] KVM: x86: Add a return code to kvm_apic_accept_events From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson , Sean Christopherson Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org No functional change intended. At present, the only negative value returned by kvm_check_nested_events is -EBUSY. Suggested-by: Sean Christopherson Signed-off-by: Jim Mattson --- arch/x86/kvm/lapic.c | 11 ++++++----- arch/x86/kvm/lapic.h | 2 +- arch/x86/kvm/x86.c | 22 ++++++++++++++++++---- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index c0ebef560bd1..f747864ff323 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2856,7 +2856,7 @@ int kvm_lapic_enable_pv_eoi(struct kvm_vcpu *vcpu, u64 data, unsigned long len) return kvm_gfn_to_hva_cache_init(vcpu->kvm, ghc, addr, new_len); } -void kvm_apic_accept_events(struct kvm_vcpu *vcpu) +int kvm_apic_accept_events(struct kvm_vcpu *vcpu) { struct kvm_lapic *apic = vcpu->arch.apic; u8 sipi_vector; @@ -2864,7 +2864,7 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu) unsigned long pe; if (!lapic_in_kernel(vcpu)) - return; + return 0; /* * Read pending events before calling the check_events @@ -2872,12 +2872,12 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu) */ pe = smp_load_acquire(&apic->pending_events); if (!pe) - return; + return 0; if (is_guest_mode(vcpu)) { r = kvm_check_nested_events(vcpu); if (r < 0) - return; + return r == -EBUSY ? 0 : r; /* * If an event has happened and caused a vmexit, * we know INITs are latched and therefore @@ -2898,7 +2898,7 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu) WARN_ON_ONCE(vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED); if (test_bit(KVM_APIC_SIPI, &pe)) clear_bit(KVM_APIC_SIPI, &apic->pending_events); - return; + return 0; } if (test_bit(KVM_APIC_INIT, &pe)) { @@ -2919,6 +2919,7 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu) vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; } } + return 0; } void kvm_lapic_exit(void) diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h index 997c45a5963a..d7c25d0c1354 100644 --- a/arch/x86/kvm/lapic.h +++ b/arch/x86/kvm/lapic.h @@ -76,7 +76,7 @@ void kvm_free_lapic(struct kvm_vcpu *vcpu); int kvm_apic_has_interrupt(struct kvm_vcpu *vcpu); int kvm_apic_accept_pic_intr(struct kvm_vcpu *vcpu); int kvm_get_apic_interrupt(struct kvm_vcpu *vcpu); -void kvm_apic_accept_events(struct kvm_vcpu *vcpu); +int kvm_apic_accept_events(struct kvm_vcpu *vcpu); void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event); u64 kvm_lapic_get_cr8(struct kvm_vcpu *vcpu); void kvm_lapic_set_tpr(struct kvm_vcpu *vcpu, unsigned long cr8); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index eb35536f8d06..9258fee4f272 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -9242,7 +9242,11 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) if (kvm_check_request(KVM_REQ_EVENT, vcpu) || req_int_win || kvm_xen_has_interrupt(vcpu)) { ++vcpu->stat.req_event; - kvm_apic_accept_events(vcpu); + r = kvm_apic_accept_events(vcpu); + if (r < 0) { + r = 0; + goto out; + } if (vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED) { r = 1; goto out; @@ -9454,7 +9458,8 @@ static inline int vcpu_block(struct kvm *kvm, struct kvm_vcpu *vcpu) return 1; } - kvm_apic_accept_events(vcpu); + if (kvm_apic_accept_events(vcpu) < 0) + return 0; switch(vcpu->arch.mp_state) { case KVM_MP_STATE_HALTED: case KVM_MP_STATE_AP_RESET_HOLD: @@ -9678,7 +9683,10 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu) goto out; } kvm_vcpu_block(vcpu); - kvm_apic_accept_events(vcpu); + if (kvm_apic_accept_events(vcpu) < 0) { + r = 0; + goto out; + } kvm_clear_request(KVM_REQ_UNHALT, vcpu); r = -EAGAIN; if (signal_pending(current)) { @@ -9880,11 +9888,16 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, struct kvm_mp_state *mp_state) { + int r = 0; + vcpu_load(vcpu); if (kvm_mpx_supported()) kvm_load_guest_fpu(vcpu); - kvm_apic_accept_events(vcpu); + r = kvm_apic_accept_events(vcpu); + if (r < 0) + goto out; + if ((vcpu->arch.mp_state == KVM_MP_STATE_HALTED || vcpu->arch.mp_state == KVM_MP_STATE_AP_RESET_HOLD) && vcpu->arch.pv.pv_unhalted) @@ -9892,6 +9905,7 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, else mp_state->mp_state = vcpu->arch.mp_state; +out: if (kvm_mpx_supported()) kvm_put_guest_fpu(vcpu); vcpu_put(vcpu); From patchwork Thu May 20 23:03:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271523 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E6C23C433B4 for ; Thu, 20 May 2021 23:04:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C3A1B6128A for ; Thu, 20 May 2021 23:04:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233023AbhETXF3 (ORCPT ); Thu, 20 May 2021 19:05:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59618 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233000AbhETXFY (ORCPT ); Thu, 20 May 2021 19:05:24 -0400 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 7590AC0613ED for ; Thu, 20 May 2021 16:04:02 -0700 (PDT) Received: by mail-pj1-x104a.google.com with SMTP id f8-20020a17090a9b08b0290153366612f7so10018994pjp.1 for ; Thu, 20 May 2021 16:04:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=aBFa8ajwJCwrX44qQPRgic2A0Aj9+F6IN0aDIw7SsiE=; b=K/Uwbulmu7yxdEXoEYu5G63siO16GsGEkUYM5KL7eIAIfmnM/fW2hlkitInu3BRtaY JG1uQwXIZJ7zDL72bEBgGnxFCrT6mP3GSEuUiVEbPIVO6czDQTWh2NaeE3pGdFdUvHI/ 0qRDCIyfADaXRcw3t1tW1M14kc5IIV7nUetulwZm8SdDoNAejlr+zkrslIUa3tRTAcfM JX4qyXJNN7d31pj1VE/2mp08fcFFRpdkKBU0F+AwtGC38ygj94Y1+w/KXixLeg07qCHW Cj6XqnAkkcEp0VAmIfCskAD67+W4iK9umXvYeYu08LDLxhtdAeLKQ7RSP9FtP9grlVDh ROeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=aBFa8ajwJCwrX44qQPRgic2A0Aj9+F6IN0aDIw7SsiE=; b=pI/aKHInz+v3jbj0vrQ1t9Rdi4De/uqf6C2Gtf9Nm2FEGvBo68c9b/q0lNSb9vvOWE xB7aOHUshquuLQ0+on94UQJ7mDnclbuLq92DPZYI4vW1uPrDF+NBlZlO+MTUu6K0U+1O jPVj0urpDr4cOpd1NyMlKLpcRSgmTKTTRiDvmvTLPzlFEQHmg8r/O7N+kjZN4TgmdPoO wszu2ppfLPf7cMqjxYSeJEPl7g8WAN7P/jfloTuP5krouCogHon5NOAjcanwdQoShIM6 LBRbXN0cGDctXmwYsC4Hf00ME9U+OGCBoyxgxLd+xMgvwTvvuPTqv1EcDylAAF2Vazde PF0g== X-Gm-Message-State: AOAM5330/pwthKKkQ9RdyYhYUg+c/xgLm/05c87436659585nAI/pxHv RbCu8dRXRxC/bfxyjJjssh/jX+gJkfsW6tpPWCbEhGZuqHCeJqZwaBn3GQH1q4Yr3am3nl2b0J1 FCRtLZg4GNeadM+dpsIuM0+XHyZs+l55wrZ+5M1+RYZgBsjjp3s6zA5O7jaq1kIU= X-Google-Smtp-Source: ABdhPJyByHNYiGqwo88rP8wMWG3XiXvn46lUFfNTAKiuySapBSwgRaVFzvqonTiYPP1DA7V3Iq3RqRKdedQlRw== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:aa7:8198:0:b029:274:8a92:51b5 with SMTP id g24-20020aa781980000b02902748a9251b5mr6849383pfi.5.1621551841840; Thu, 20 May 2021 16:04:01 -0700 (PDT) Date: Thu, 20 May 2021 16:03:33 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-7-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 06/12] KVM: nVMX: Fail on MMIO completion for nested posted interrupts From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org When the kernel has no mapping for the vmcs02 virtual APIC page, userspace MMIO completion is necessary to process nested posted interrupts. This is not a configuration that KVM supports. Rather than silently ignoring the problem, try to exit to userspace with KVM_INTERNAL_ERROR. Note that the event that triggers this error is consumed as a side-effect of a call to kvm_check_nested_events. On some paths (notably through kvm_vcpu_check_block), the error is dropped. In any case, this is an incremental improvement over always ignoring the error. Signed-off-by: Jim Mattson --- arch/x86/kvm/vmx/nested.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 7646e6e561ad..706c31821362 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -3700,7 +3700,7 @@ static int vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu) if (max_irr != 256) { vapic_page = vmx->nested.virtual_apic_map.hva; if (!vapic_page) - return 0; + goto mmio_needed; __kvm_apic_update_irr(vmx->nested.pi_desc->pir, vapic_page, &max_irr); @@ -3714,6 +3714,10 @@ static int vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu) nested_mark_vmcs12_pages_dirty(vcpu); return 0; + +mmio_needed: + kvm_handle_memory_failure(vcpu, X86EMUL_IO_NEEDED, NULL); + return -ENXIO; } static void nested_vmx_inject_exception_vmexit(struct kvm_vcpu *vcpu, From patchwork Thu May 20 23:03:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271525 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 670E0C433B4 for ; Thu, 20 May 2021 23:04:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 49C2C6108B for ; Thu, 20 May 2021 23:04:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233153AbhETXFg (ORCPT ); Thu, 20 May 2021 19:05:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59610 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232984AbhETXF0 (ORCPT ); Thu, 20 May 2021 19:05:26 -0400 Received: from mail-qt1-x849.google.com (mail-qt1-x849.google.com [IPv6:2607:f8b0:4864:20::849]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4D2C3C061761 for ; Thu, 20 May 2021 16:04:04 -0700 (PDT) Received: by mail-qt1-x849.google.com with SMTP id o15-20020a05622a138fb02901e0ac29f6b2so13485137qtk.11 for ; Thu, 20 May 2021 16:04:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=GdNydyvj7tHXN7vqxe/SwxHU1uQGMopLadupwTPQaV0=; b=FayWd9aapXph08ZHXjPWcaQiQV5AP97ikg/r+HcBhXK1zH4Whj1kt6NwuuJQ21hwMs cAqRrcIXpvw5jsfSUpUUioJH3LqPz3I4eMGt7skvhvkAvIN0GaIfGXl/YW+MK/qE/L7l JwO6bbJZJdXGjz+E8nTocDeJbj8qY624Oyk/5w5d2YNeqzqmOXBWYNMQ/4OZWwltDlA1 E6IBzA0mve/IqWq3yIrF3M6+G9X/lzuBk9j6ExY/fDKvv/MeFlF0u3zt7vlxPcdCvkee 90AWkAdEKCnPkpfIt3TvU0S2xSUJK5aK5QfqzlAcga/bLCNTTHOg9HFZWiWNjxe3nyF2 ilXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=GdNydyvj7tHXN7vqxe/SwxHU1uQGMopLadupwTPQaV0=; b=orJPnad/e5TefoI/LrPwY2usTaHKQXzkn32kYI/s32c5FaO5XLJWTBo14UQJdxYbuO GEQanZMLJ6wc4El7xta17mYT9w6XJLE0wBaK401bxAWedOHektg19yEULRawxp8jeLs1 pB0sQLJr4ZcTdmza+GLHMlg+fmXMbgdFT8+9thyFpA0OGHRYZOWZARRL7u/7iSGU7fzN 2+z+PvS6Dls34GoDJlfCkO9fEnylhrz0HFSZZvbU1WScNO7gWo49WXXgQIQeu6LZkco3 CoGnBraV9Lg8Cx0FiueHcCz3xPtUeIelU+u+Om7Sl/AjIZLkS9uiF/w0XNS270bfne2S IahQ== X-Gm-Message-State: AOAM531TV+PZCjf96FIVTjoR61U7cambxxo+82YYAQfwiTcgQ4qLAGwv lIHUjHvnpwH+V5haIX8+E99Kn2NCjGv9Z0xEOQLB11IA57K3s/ZGVC87Mi+MhR/EC17O0I2QxWK Vum3MEVsrsPGvHUU7AITM7rNayVypxyRSQUttVYHOoSnhez8did6L36BAQLiX59M= X-Google-Smtp-Source: ABdhPJzxZUYM678BtgQ4XEnWb6KCuaRw3kNQon8IuaovahdAN8akXI2JGhv4gLQz5fAP2LyshAC6piRQs0vzQg== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:ad4:54c9:: with SMTP id j9mr8889487qvx.62.1621551843395; Thu, 20 May 2021 16:04:03 -0700 (PDT) Date: Thu, 20 May 2021 16:03:34 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-8-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 07/12] KVM: nVMX: Disable vmcs02 posted interrupts if vmcs12 PID isn't mappable From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Don't allow posted interrupts to modify a stale posted interrupt descriptor (including the initial value of 0). Empirical tests on real hardware reveal that a posted interrupt descriptor referencing an unbacked address has PCI bus error semantics (reads as all 1's; writes are ignored). However, kvm can't distinguish unbacked addresses from device-backed (MMIO) addresses, so it should really ask userspace for an MMIO completion. That's overly complicated, so just punt with KVM_INTERNAL_ERROR. Don't return the error until the posted interrupt descriptor is actually accessed. We don't want to break the existing kvm-unit-tests that assume they can launch an L2 VM with a posted interrupt descriptor that references MMIO space in L1. Fixes: 6beb7bd52e48 ("kvm: nVMX: Refactor nested_get_vmcs12_pages()") Signed-off-by: Jim Mattson --- arch/x86/kvm/vmx/nested.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 706c31821362..defd42201bb4 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -3175,6 +3175,15 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu) offset_in_page(vmcs12->posted_intr_desc_addr)); vmcs_write64(POSTED_INTR_DESC_ADDR, pfn_to_hpa(map->pfn) + offset_in_page(vmcs12->posted_intr_desc_addr)); + } else { + /* + * Defer the KVM_INTERNAL_ERROR exit until + * someone tries to trigger posted interrupt + * processing on this vCPU, to avoid breaking + * existing kvm-unit-tests. + */ + vmx->nested.pi_desc = NULL; + pin_controls_clearbit(vmx, PIN_BASED_POSTED_INTR); } } if (nested_vmx_prepare_msr_bitmap(vcpu, vmcs12)) @@ -3689,10 +3698,14 @@ static int vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu) void *vapic_page; u16 status; - if (!vmx->nested.pi_desc || !vmx->nested.pi_pending) + if (!vmx->nested.pi_pending) return 0; + if (!vmx->nested.pi_desc) + goto mmio_needed; + vmx->nested.pi_pending = false; + if (!pi_test_and_clear_on(vmx->nested.pi_desc)) return 0; From patchwork Thu May 20 23:03:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271527 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8F2ABC43460 for ; Thu, 20 May 2021 23:04:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6DE35613AD for ; Thu, 20 May 2021 23:04:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233004AbhETXFi (ORCPT ); Thu, 20 May 2021 19:05:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59612 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232927AbhETXF1 (ORCPT ); Thu, 20 May 2021 19:05:27 -0400 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 A472CC061763 for ; Thu, 20 May 2021 16:04:05 -0700 (PDT) Received: by mail-pj1-x104a.google.com with SMTP id o1-20020a17090a4201b029015c8f11f550so7156364pjg.5 for ; Thu, 20 May 2021 16:04:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=Otf7aQinzlQ1psbjlGm9ZcByrmOGOiHC8uYjTOHlsVc=; b=IWC3ixlLB40rzU+VF31dGORzbQi8yvBuQGQic5bWk4xLyUOT97ctM/h5utK2ed+OiU TReHl2I1BxIBXRhaIBKcbBZ2Cuc/z1d/+xSBbaR5gL/o9Tamhu2EMa05Qkvx1EgPeJbt vGh7/iKDBVR8DShy4sqrCzOY/1kG81ciSRVyv3QLJ1frxgurxvkJD42XsyavyAY1TGxF ivEmN+EPEY4TpGiNhcZlCcE9meEhAGDE9dKVO9U4ruvX8BQc0R9XFebZxojJJ2tmAX+2 sv/SUkqBMWjDTOJwAAPWPL1nnXlziZ7AKBvCw59VMbCtTpQXWM2xMM2yhL/zHvczzT4R 21TQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=Otf7aQinzlQ1psbjlGm9ZcByrmOGOiHC8uYjTOHlsVc=; b=TN02NX6VjEWkiTUgSHcptYbeqIC5A+ulX6ouDdnws4mwRLZt7R6Sq5rOEUfheeOsx6 RXcmusGKqFb25yC2TOtObFmVJPh/eqAAcywwgHbRBhFPL9ZEMQlbj+imB5EL0wpci1K0 eed2Ijt4cn7d2eddcAmDeuh93KETx5fvaXy8J/Ih3JGMHE8Uen48MzaqDiwv7xCm0N53 S7q13W1w/w5yECJU/VRv0fCM4I85GMWNIfoRQHAeueKawZ/zm491/Niy8vME/tI61C2k UxgqmxU5WfDJGSmTuzAKBwg9PQ7jWU/Ou5ijW8s8lJ5v1shklJGBHcJgYdw6PnG7NI6z /8qw== X-Gm-Message-State: AOAM5303Jl5XwrerwEsNi7BjYO/FG8pcyVZEZAZNfc13mNGt//3O5K5w bcsbIwBSB3QvttFZ9UZv3rt3hHE2GZbfv5Zxr6Ixm2dYEtu9awmGqPf7/UKMFzWiidpOkd3kS3E Srfa9FViyH9GkEO1cN02YTmKafNevPTk2piLX8onActMu99boJEWj2A8UXSDuXMY= X-Google-Smtp-Source: ABdhPJwCOx/wRQDYIVM+YntufPO255uR6vA9FYlkM4681EnJomSNoid21UmbuXdZT2x4gb1alxjBdYPy2lnyUg== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:a17:90b:ed5:: with SMTP id gz21mr7420817pjb.102.1621551845073; Thu, 20 May 2021 16:04:05 -0700 (PDT) Date: Thu, 20 May 2021 16:03:35 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-9-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 08/12] KVM: selftests: Move APIC definitions into a separate file From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson , Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Processor.h is a hodgepodge of definitions. Though the local APIC is technically built into the CPU these days, move the APIC definitions into a new header file: apic.h. Signed-off-by: Jim Mattson Reviewed-by: Oliver Upton --- .../selftests/kvm/include/x86_64/apic.h | 58 +++++++++++++++++++ .../selftests/kvm/include/x86_64/processor.h | 47 --------------- .../selftests/kvm/include/x86_64/vmx.h | 1 + 3 files changed, 59 insertions(+), 47 deletions(-) create mode 100644 tools/testing/selftests/kvm/include/x86_64/apic.h diff --git a/tools/testing/selftests/kvm/include/x86_64/apic.h b/tools/testing/selftests/kvm/include/x86_64/apic.h new file mode 100644 index 000000000000..0d0e35c8866b --- /dev/null +++ b/tools/testing/selftests/kvm/include/x86_64/apic.h @@ -0,0 +1,58 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * tools/testing/selftests/kvm/include/x86_64/apic.h + * + * Copyright (C) 2021, Google LLC. + */ + +#ifndef SELFTEST_KVM_APIC_H +#define SELFTEST_KVM_APIC_H + +#define APIC_DEFAULT_GPA 0xfee00000ULL + +/* APIC base address MSR and fields */ +#define MSR_IA32_APICBASE 0x0000001b +#define MSR_IA32_APICBASE_BSP (1<<8) +#define MSR_IA32_APICBASE_EXTD (1<<10) +#define MSR_IA32_APICBASE_ENABLE (1<<11) +#define MSR_IA32_APICBASE_BASE (0xfffff<<12) +#define GET_APIC_BASE(x) (((x) >> 12) << 12) + +#define APIC_BASE_MSR 0x800 +#define X2APIC_ENABLE (1UL << 10) +#define APIC_ID 0x20 +#define APIC_LVR 0x30 +#define GET_APIC_ID_FIELD(x) (((x) >> 24) & 0xFF) +#define APIC_TASKPRI 0x80 +#define APIC_PROCPRI 0xA0 +#define APIC_EOI 0xB0 +#define APIC_SPIV 0xF0 +#define APIC_SPIV_FOCUS_DISABLED (1 << 9) +#define APIC_SPIV_APIC_ENABLED (1 << 8) +#define APIC_ICR 0x300 +#define APIC_DEST_SELF 0x40000 +#define APIC_DEST_ALLINC 0x80000 +#define APIC_DEST_ALLBUT 0xC0000 +#define APIC_ICR_RR_MASK 0x30000 +#define APIC_ICR_RR_INVALID 0x00000 +#define APIC_ICR_RR_INPROG 0x10000 +#define APIC_ICR_RR_VALID 0x20000 +#define APIC_INT_LEVELTRIG 0x08000 +#define APIC_INT_ASSERT 0x04000 +#define APIC_ICR_BUSY 0x01000 +#define APIC_DEST_LOGICAL 0x00800 +#define APIC_DEST_PHYSICAL 0x00000 +#define APIC_DM_FIXED 0x00000 +#define APIC_DM_FIXED_MASK 0x00700 +#define APIC_DM_LOWEST 0x00100 +#define APIC_DM_SMI 0x00200 +#define APIC_DM_REMRD 0x00300 +#define APIC_DM_NMI 0x00400 +#define APIC_DM_INIT 0x00500 +#define APIC_DM_STARTUP 0x00600 +#define APIC_DM_EXTINT 0x00700 +#define APIC_VECTOR_MASK 0x000FF +#define APIC_ICR2 0x310 +#define SET_APIC_DEST_FIELD(x) ((x) << 24) + +#endif /* SELFTEST_KVM_APIC_H */ diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index 0b30b4e15c38..a4729d9032ce 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -425,53 +425,6 @@ struct kvm_cpuid2 *vcpu_get_supported_hv_cpuid(struct kvm_vm *vm, uint32_t vcpui #define X86_CR0_CD (1UL<<30) /* Cache Disable */ #define X86_CR0_PG (1UL<<31) /* Paging */ -#define APIC_DEFAULT_GPA 0xfee00000ULL - -/* APIC base address MSR and fields */ -#define MSR_IA32_APICBASE 0x0000001b -#define MSR_IA32_APICBASE_BSP (1<<8) -#define MSR_IA32_APICBASE_EXTD (1<<10) -#define MSR_IA32_APICBASE_ENABLE (1<<11) -#define MSR_IA32_APICBASE_BASE (0xfffff<<12) -#define GET_APIC_BASE(x) (((x) >> 12) << 12) - -#define APIC_BASE_MSR 0x800 -#define X2APIC_ENABLE (1UL << 10) -#define APIC_ID 0x20 -#define APIC_LVR 0x30 -#define GET_APIC_ID_FIELD(x) (((x) >> 24) & 0xFF) -#define APIC_TASKPRI 0x80 -#define APIC_PROCPRI 0xA0 -#define APIC_EOI 0xB0 -#define APIC_SPIV 0xF0 -#define APIC_SPIV_FOCUS_DISABLED (1 << 9) -#define APIC_SPIV_APIC_ENABLED (1 << 8) -#define APIC_ICR 0x300 -#define APIC_DEST_SELF 0x40000 -#define APIC_DEST_ALLINC 0x80000 -#define APIC_DEST_ALLBUT 0xC0000 -#define APIC_ICR_RR_MASK 0x30000 -#define APIC_ICR_RR_INVALID 0x00000 -#define APIC_ICR_RR_INPROG 0x10000 -#define APIC_ICR_RR_VALID 0x20000 -#define APIC_INT_LEVELTRIG 0x08000 -#define APIC_INT_ASSERT 0x04000 -#define APIC_ICR_BUSY 0x01000 -#define APIC_DEST_LOGICAL 0x00800 -#define APIC_DEST_PHYSICAL 0x00000 -#define APIC_DM_FIXED 0x00000 -#define APIC_DM_FIXED_MASK 0x00700 -#define APIC_DM_LOWEST 0x00100 -#define APIC_DM_SMI 0x00200 -#define APIC_DM_REMRD 0x00300 -#define APIC_DM_NMI 0x00400 -#define APIC_DM_INIT 0x00500 -#define APIC_DM_STARTUP 0x00600 -#define APIC_DM_EXTINT 0x00700 -#define APIC_VECTOR_MASK 0x000FF -#define APIC_ICR2 0x310 -#define SET_APIC_DEST_FIELD(x) ((x) << 24) - /* VMX_EPT_VPID_CAP bits */ #define VMX_EPT_VPID_CAP_AD_BITS (1ULL << 21) diff --git a/tools/testing/selftests/kvm/include/x86_64/vmx.h b/tools/testing/selftests/kvm/include/x86_64/vmx.h index 65eb1079a161..516c81d86353 100644 --- a/tools/testing/selftests/kvm/include/x86_64/vmx.h +++ b/tools/testing/selftests/kvm/include/x86_64/vmx.h @@ -10,6 +10,7 @@ #include #include "processor.h" +#include "apic.h" /* * Definitions of Primary Processor-Based VM-Execution Controls. From patchwork Thu May 20 23:03:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271529 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C0EFEC433B4 for ; Thu, 20 May 2021 23:04:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A0CD56108B for ; Thu, 20 May 2021 23:04:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233080AbhETXFk (ORCPT ); Thu, 20 May 2021 19:05:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59642 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233090AbhETXF3 (ORCPT ); Thu, 20 May 2021 19:05:29 -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 583DFC0613ED for ; Thu, 20 May 2021 16:04:07 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id q2-20020a170902c9c2b02900f32bb3d379so6689992pld.14 for ; Thu, 20 May 2021 16:04:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=b1Yyxtji990wLGf4EFjh+t57eUb9l79Co7+gYAKZN9U=; b=lD3126jCe05eLLIerxQwPNyvDV9stYLERjWuFSsd4OTqpCgHBfU2smgUWQAX+mIWw8 OIRDYLkuHxK/RAMqOBhT4Md21cFAejdcNE+hYzIgPUHITxrGsodrQNzQloVMuP2LwCmt cxyT0TDOQkzNhOIAC4mISQEOMP5A3iqQRo2qKdrfTn7N8tW2vYiWrAAAxc4a8gFLMm4C z3dl26S5/XcZVRYpxn1y4GPy0zQ0SPj0tqL+NlQfaeaQ+55BnDMoGybqKS5wR1sDRczk wsmbqVLRvBXNx1pzsd0z2Krxt/onXeMAO4aqYdfjIdnzUEWzOEflnGAZvj5INV/Gdhrj DZhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=b1Yyxtji990wLGf4EFjh+t57eUb9l79Co7+gYAKZN9U=; b=ha3a5MKTCF20K6WTxtga5T0RTC42Hn0TqiLGSOUoH3jGtbYvA558IlVCouEQPc0Yt0 bam4VQ9N8/qVXyYE5DEZPORvIkL+d317eYu77Gr/SOViT4zh74maYWI/3CSTqYrACuVZ /ofKtrtyykPiGqgZxCK7DotTPtRVIBQF5i2MayphQfWYCmphAmthju+G6kIrEBsEqp3U E1K1KOu6u+FQfJc8snu1prnd2uBTAbV6alynPoT3tHOWU4Hvq5MvLKGETlyrpQWQSDNk IdeAcx8ylSuB1dO6qCNyCu47tFCGv73HBdKlvqXIDSKOA8oshpOBYrWIaySYoksv+TGM 3/Hg== X-Gm-Message-State: AOAM530NUHFUbiYU8N4PL6kYrAtHJoOjq+A81bOxA7JqlqKyTsKvyzo5 ZRuHtTmoMv8pwBOI4vRzQDPfRLzxBw3ovu5t9GBWOWr1ROv9BOyQh98vxpK9VjMjJ3iviOOygYd 7Pq1t1/B6ekGwN8haqoyttrIoZyO42QeRh5D/AkdUJPl1svc0UcWmi4A2qZbaFm4= X-Google-Smtp-Source: ABdhPJwA0NOs4YRAZKHGZ8OI2TyuR72PKH5p9CfQ6g7TrzS4+a6uXxvYQfLO+1eAmDI1vkznNpZF3228KAcJJA== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:a17:902:b7ca:b029:f0:b0ea:db44 with SMTP id v10-20020a170902b7cab02900f0b0eadb44mr8548415plz.59.1621551846745; Thu, 20 May 2021 16:04:06 -0700 (PDT) Date: Thu, 20 May 2021 16:03:36 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-10-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 09/12] KVM: selftests: Hoist APIC functions out of individual tests From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson , Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Move the APIC functions into the library to encourage code reuse and to avoid unintended deviations. Signed-off-by: Jim Mattson Reviewed-by: Oliver Upton --- tools/testing/selftests/kvm/Makefile | 2 +- .../selftests/kvm/include/x86_64/apic.h | 23 ++++++++ .../selftests/kvm/include/x86_64/processor.h | 2 + tools/testing/selftests/kvm/lib/x86_64/apic.c | 46 +++++++++++++++ .../testing/selftests/kvm/x86_64/evmcs_test.c | 11 +--- .../selftests/kvm/x86_64/set_boot_cpu_id.c | 6 +- .../selftests/kvm/x86_64/xapic_ipi_test.c | 59 +++---------------- 7 files changed, 83 insertions(+), 66 deletions(-) create mode 100644 tools/testing/selftests/kvm/lib/x86_64/apic.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index e439d027939d..af102e03e698 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -34,7 +34,7 @@ ifeq ($(ARCH),s390) endif LIBKVM = lib/assert.c lib/elf.c lib/io.c lib/kvm_util.c lib/sparsebit.c lib/test_util.c lib/guest_modes.c lib/perf_test_util.c -LIBKVM_x86_64 = lib/x86_64/processor.c lib/x86_64/vmx.c lib/x86_64/svm.c lib/x86_64/ucall.c lib/x86_64/handlers.S +LIBKVM_x86_64 = lib/x86_64/apic.c lib/x86_64/processor.c lib/x86_64/vmx.c lib/x86_64/svm.c lib/x86_64/ucall.c lib/x86_64/handlers.S LIBKVM_aarch64 = lib/aarch64/processor.c lib/aarch64/ucall.c LIBKVM_s390x = lib/s390x/processor.c lib/s390x/ucall.c lib/s390x/diag318_test_handler.c diff --git a/tools/testing/selftests/kvm/include/x86_64/apic.h b/tools/testing/selftests/kvm/include/x86_64/apic.h index 0d0e35c8866b..e5a9fe040a6c 100644 --- a/tools/testing/selftests/kvm/include/x86_64/apic.h +++ b/tools/testing/selftests/kvm/include/x86_64/apic.h @@ -8,6 +8,10 @@ #ifndef SELFTEST_KVM_APIC_H #define SELFTEST_KVM_APIC_H +#include + +#include "processor.h" + #define APIC_DEFAULT_GPA 0xfee00000ULL /* APIC base address MSR and fields */ @@ -55,4 +59,23 @@ #define APIC_ICR2 0x310 #define SET_APIC_DEST_FIELD(x) ((x) << 24) +void apic_disable(void); +void xapic_enable(void); +void x2apic_enable(void); + +static inline uint32_t get_bsp_flag(void) +{ + return rdmsr(MSR_IA32_APICBASE) & MSR_IA32_APICBASE_BSP; +} + +static inline uint32_t xapic_read_reg(unsigned int reg) +{ + return ((volatile uint32_t *)APIC_DEFAULT_GPA)[reg >> 2]; +} + +static inline void xapic_write_reg(unsigned int reg, uint32_t val) +{ + ((volatile uint32_t *)APIC_DEFAULT_GPA)[reg >> 2] = val; +} + #endif /* SELFTEST_KVM_APIC_H */ diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index a4729d9032ce..9a5b47d2d5d6 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -13,6 +13,8 @@ #include +#include "../kvm_util.h" + #define X86_EFLAGS_FIXED (1u << 1) #define X86_CR4_VME (1ul << 0) diff --git a/tools/testing/selftests/kvm/lib/x86_64/apic.c b/tools/testing/selftests/kvm/lib/x86_64/apic.c new file mode 100644 index 000000000000..31f318ac67ba --- /dev/null +++ b/tools/testing/selftests/kvm/lib/x86_64/apic.c @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * tools/testing/selftests/kvm/lib/x86_64/processor.c + * + * Copyright (C) 2021, Google LLC. + */ + +#include "apic.h" + +void apic_disable(void) +{ + wrmsr(MSR_IA32_APICBASE, + rdmsr(MSR_IA32_APICBASE) & + ~(MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_EXTD)); +} + +void xapic_enable(void) +{ + uint64_t val = rdmsr(MSR_IA32_APICBASE); + + /* Per SDM: to enable xAPIC when in x2APIC must first disable APIC */ + if (val & MSR_IA32_APICBASE_EXTD) { + apic_disable(); + wrmsr(MSR_IA32_APICBASE, + rdmsr(MSR_IA32_APICBASE) | MSR_IA32_APICBASE_ENABLE); + } else if (!(val & MSR_IA32_APICBASE_ENABLE)) { + wrmsr(MSR_IA32_APICBASE, val | MSR_IA32_APICBASE_ENABLE); + } + + /* + * Per SDM: reset value of spurious interrupt vector register has the + * APIC software enabled bit=0. It must be enabled in addition to the + * enable bit in the MSR. + */ + val = xapic_read_reg(APIC_SPIV) | APIC_SPIV_APIC_ENABLED; + xapic_write_reg(APIC_SPIV, val); +} + +void x2apic_enable(void) +{ + uint32_t spiv_reg = APIC_BASE_MSR + (APIC_SPIV >> 4); + + wrmsr(MSR_IA32_APICBASE, rdmsr(MSR_IA32_APICBASE) | + MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_EXTD); + wrmsr(spiv_reg, rdmsr(spiv_reg) | APIC_SPIV_APIC_ENABLED); +} diff --git a/tools/testing/selftests/kvm/x86_64/evmcs_test.c b/tools/testing/selftests/kvm/x86_64/evmcs_test.c index 63096cea26c6..d058d9e428c6 100644 --- a/tools/testing/selftests/kvm/x86_64/evmcs_test.c +++ b/tools/testing/selftests/kvm/x86_64/evmcs_test.c @@ -22,15 +22,6 @@ static int ud_count; -void enable_x2apic(void) -{ - uint32_t spiv_reg = APIC_BASE_MSR + (APIC_SPIV >> 4); - - wrmsr(MSR_IA32_APICBASE, rdmsr(MSR_IA32_APICBASE) | - MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_EXTD); - wrmsr(spiv_reg, rdmsr(spiv_reg) | APIC_SPIV_APIC_ENABLED); -} - static void guest_ud_handler(struct ex_regs *regs) { ud_count++; @@ -59,7 +50,7 @@ void guest_code(struct vmx_pages *vmx_pages) #define L2_GUEST_STACK_SIZE 64 unsigned long l2_guest_stack[L2_GUEST_STACK_SIZE]; - enable_x2apic(); + x2apic_enable(); GUEST_SYNC(1); GUEST_SYNC(2); diff --git a/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c b/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c index 12c558fc8074..5f8dd74d415f 100644 --- a/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c +++ b/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c @@ -14,16 +14,12 @@ #include "test_util.h" #include "kvm_util.h" #include "processor.h" +#include "apic.h" #define N_VCPU 2 #define VCPU_ID0 0 #define VCPU_ID1 1 -static uint32_t get_bsp_flag(void) -{ - return rdmsr(MSR_IA32_APICBASE) & MSR_IA32_APICBASE_BSP; -} - static void guest_bsp_vcpu(void *arg) { GUEST_SYNC(1); diff --git a/tools/testing/selftests/kvm/x86_64/xapic_ipi_test.c b/tools/testing/selftests/kvm/x86_64/xapic_ipi_test.c index 2f964cdc273c..21b22718a9db 100644 --- a/tools/testing/selftests/kvm/x86_64/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86_64/xapic_ipi_test.c @@ -42,8 +42,6 @@ #define HALTER_VCPU_ID 0 #define SENDER_VCPU_ID 1 -volatile uint32_t *apic_base = (volatile uint32_t *)APIC_DEFAULT_GPA; - /* * Vector for IPI from sender vCPU to halting vCPU. * Value is arbitrary and was chosen for the alternating bit pattern. Any @@ -86,45 +84,6 @@ struct thread_params { uint64_t *pipis_rcvd; /* host address of ipis_rcvd global */ }; -uint32_t read_apic_reg(uint reg) -{ - return apic_base[reg >> 2]; -} - -void write_apic_reg(uint reg, uint32_t val) -{ - apic_base[reg >> 2] = val; -} - -void disable_apic(void) -{ - wrmsr(MSR_IA32_APICBASE, - rdmsr(MSR_IA32_APICBASE) & - ~(MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_EXTD)); -} - -void enable_xapic(void) -{ - uint64_t val = rdmsr(MSR_IA32_APICBASE); - - /* Per SDM: to enable xAPIC when in x2APIC must first disable APIC */ - if (val & MSR_IA32_APICBASE_EXTD) { - disable_apic(); - wrmsr(MSR_IA32_APICBASE, - rdmsr(MSR_IA32_APICBASE) | MSR_IA32_APICBASE_ENABLE); - } else if (!(val & MSR_IA32_APICBASE_ENABLE)) { - wrmsr(MSR_IA32_APICBASE, val | MSR_IA32_APICBASE_ENABLE); - } - - /* - * Per SDM: reset value of spurious interrupt vector register has the - * APIC software enabled bit=0. It must be enabled in addition to the - * enable bit in the MSR. - */ - val = read_apic_reg(APIC_SPIV) | APIC_SPIV_APIC_ENABLED; - write_apic_reg(APIC_SPIV, val); -} - void verify_apic_base_addr(void) { uint64_t msr = rdmsr(MSR_IA32_APICBASE); @@ -136,10 +95,10 @@ void verify_apic_base_addr(void) static void halter_guest_code(struct test_data_page *data) { verify_apic_base_addr(); - enable_xapic(); + xapic_enable(); - data->halter_apic_id = GET_APIC_ID_FIELD(read_apic_reg(APIC_ID)); - data->halter_lvr = read_apic_reg(APIC_LVR); + data->halter_apic_id = GET_APIC_ID_FIELD(xapic_read_reg(APIC_ID)); + data->halter_lvr = xapic_read_reg(APIC_LVR); /* * Loop forever HLTing and recording halts & wakes. Disable interrupts @@ -150,8 +109,8 @@ static void halter_guest_code(struct test_data_page *data) * TPR and PPR for diagnostic purposes in case the test fails. */ for (;;) { - data->halter_tpr = read_apic_reg(APIC_TASKPRI); - data->halter_ppr = read_apic_reg(APIC_PROCPRI); + data->halter_tpr = xapic_read_reg(APIC_TASKPRI); + data->halter_ppr = xapic_read_reg(APIC_PROCPRI); data->hlt_count++; asm volatile("sti; hlt; cli"); data->wake_count++; @@ -166,7 +125,7 @@ static void halter_guest_code(struct test_data_page *data) static void guest_ipi_handler(struct ex_regs *regs) { ipis_rcvd++; - write_apic_reg(APIC_EOI, 77); + xapic_write_reg(APIC_EOI, 77); } static void sender_guest_code(struct test_data_page *data) @@ -179,7 +138,7 @@ static void sender_guest_code(struct test_data_page *data) uint64_t tsc_start; verify_apic_base_addr(); - enable_xapic(); + xapic_enable(); /* * Init interrupt command register for sending IPIs @@ -206,8 +165,8 @@ static void sender_guest_code(struct test_data_page *data) * First IPI can be sent unconditionally because halter vCPU * starts earlier. */ - write_apic_reg(APIC_ICR2, icr2_val); - write_apic_reg(APIC_ICR, icr_val); + xapic_write_reg(APIC_ICR2, icr2_val); + xapic_write_reg(APIC_ICR, icr_val); data->ipis_sent++; /* From patchwork Thu May 20 23:03:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271531 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A75BBC433ED for ; Thu, 20 May 2021 23:04:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8D2AC6128A for ; Thu, 20 May 2021 23:04:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232989AbhETXFl (ORCPT ); Thu, 20 May 2021 19:05:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59662 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233099AbhETXFb (ORCPT ); Thu, 20 May 2021 19:05:31 -0400 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 2BE3BC061761 for ; Thu, 20 May 2021 16:04:09 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id a7-20020a5b00070000b02904ed415d9d84so24452860ybp.0 for ; Thu, 20 May 2021 16:04:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=+3q9om17bTqPH2OesSYY1pKJuwPpvDBvm1QrRLFR54Y=; b=VHVyUIe1ERl5hNnQgTbqEttXupxPlK0R6KI5lyanvIbdNWxr8Wu+88ERzdEoU3c49s 5N3iLsBlLcznAHegMQ+FzZCtHGplUD60a2GPXAIm4mYPrYzugbeCwgkV2HV2km8d+C0b CGi+IUKm/HYkfh+2wMiCdRXU/iF2O2tNDIZnZvyW3+qkXCjPXTNx531ZDtAW8VXiM0U3 w7DxFMmwUBQ2mlQLdbqDLzTrpGtunyUErNPIVmtUD19vjZl7aQyKZsGEzSOQPCPLUOLo CIibqMxEqwwj5JOlnUX5I5T+0PXiajISi8F+uEn/hClhkA9cY+XqqFSlz9IhL+U9qTd6 X/pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=+3q9om17bTqPH2OesSYY1pKJuwPpvDBvm1QrRLFR54Y=; b=oOY6xYQSxbtMbLilNoaaCfQZggH2UEPycmXR3ngWDW2l21MwMenbCdcD2nhZrhxZJ5 nn7gfuzy9YYBIOmY9LEWlfAqUoZdiC+HwI+beOLY4Tl60y8FqJNNSMS6UdhDHSrvlPjI jeABRBg4iews07FO3zu3UMLJZ3mJ+HsAyOIBJ4XFPTKnkc6sWxjo7/Fbyv6ZJdeR7rak MvaqzjjuJBoRZ04+3DWMFFLVV6oHKQ5YVc3aAdk1Oo5gBqogek+5oUZbrzE+8hsPRTWF sPBclsygsphgrCM7fBlSWgiDHMd8g/mvhkUbvLHv9VjI0McvVjc195TmKoykhpqJ/45Z Nt0g== X-Gm-Message-State: AOAM531QLtNkxZxgrQZtBaqOn4OrmO6dHgKIGGGPQQede3bDP+L+ZkVS uN1uLgooMbN90xOGrihwO2EIaJSZjjxYxyuEcs9kA5H0wJrXXf2BUSPNI+qmW38htIx9a22tDJD oL2vb+2e97/hBz1IjM5p7fJ+mmuLwRdC6vrWFV0H4qQ86AYsrjQtMQWK6APb4e1c= X-Google-Smtp-Source: ABdhPJzRaHS6oC9aAmD7sDjaDWjusQYfsGcQGVj/ug4NvatEYzMQJslvCFOHcv/ogY2EFFd7fGno7iyeN5ZttQ== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:a05:6902:4ed:: with SMTP id w13mr10783042ybs.92.1621551848281; Thu, 20 May 2021 16:04:08 -0700 (PDT) Date: Thu, 20 May 2021 16:03:37 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-11-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 10/12] KVM: selftests: Introduce x2APIC register manipulation functions From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson , Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Standardize reads and writes of the x2APIC MSRs. Signed-off-by: Jim Mattson Reviewed-by: Oliver Upton --- tools/testing/selftests/kvm/include/x86_64/apic.h | 10 ++++++++++ tools/testing/selftests/kvm/lib/x86_64/apic.c | 5 ++--- tools/testing/selftests/kvm/x86_64/smm_test.c | 4 ++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86_64/apic.h b/tools/testing/selftests/kvm/include/x86_64/apic.h index e5a9fe040a6c..0be4757f1f20 100644 --- a/tools/testing/selftests/kvm/include/x86_64/apic.h +++ b/tools/testing/selftests/kvm/include/x86_64/apic.h @@ -78,4 +78,14 @@ static inline void xapic_write_reg(unsigned int reg, uint32_t val) ((volatile uint32_t *)APIC_DEFAULT_GPA)[reg >> 2] = val; } +static inline uint64_t x2apic_read_reg(unsigned int reg) +{ + return rdmsr(APIC_BASE_MSR + (reg >> 4)); +} + +static inline void x2apic_write_reg(unsigned int reg, uint64_t value) +{ + wrmsr(APIC_BASE_MSR + (reg >> 4), value); +} + #endif /* SELFTEST_KVM_APIC_H */ diff --git a/tools/testing/selftests/kvm/lib/x86_64/apic.c b/tools/testing/selftests/kvm/lib/x86_64/apic.c index 31f318ac67ba..7168e25c194e 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/apic.c +++ b/tools/testing/selftests/kvm/lib/x86_64/apic.c @@ -38,9 +38,8 @@ void xapic_enable(void) void x2apic_enable(void) { - uint32_t spiv_reg = APIC_BASE_MSR + (APIC_SPIV >> 4); - wrmsr(MSR_IA32_APICBASE, rdmsr(MSR_IA32_APICBASE) | MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_EXTD); - wrmsr(spiv_reg, rdmsr(spiv_reg) | APIC_SPIV_APIC_ENABLED); + x2apic_write_reg(APIC_SPIV, + x2apic_read_reg(APIC_SPIV) | APIC_SPIV_APIC_ENABLED); } diff --git a/tools/testing/selftests/kvm/x86_64/smm_test.c b/tools/testing/selftests/kvm/x86_64/smm_test.c index 613c42c5a9b8..c1f831803ad2 100644 --- a/tools/testing/selftests/kvm/x86_64/smm_test.c +++ b/tools/testing/selftests/kvm/x86_64/smm_test.c @@ -55,8 +55,8 @@ static inline void sync_with_host(uint64_t phase) void self_smi(void) { - wrmsr(APIC_BASE_MSR + (APIC_ICR >> 4), - APIC_DEST_SELF | APIC_INT_ASSERT | APIC_DM_SMI); + x2apic_write_reg(APIC_ICR, + APIC_DEST_SELF | APIC_INT_ASSERT | APIC_DM_SMI); } void guest_code(void *arg) From patchwork Thu May 20 23:03:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271533 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 71B9BC43461 for ; Thu, 20 May 2021 23:04:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4D4326128A for ; Thu, 20 May 2021 23:04:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233028AbhETXFm (ORCPT ); Thu, 20 May 2021 19:05:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59616 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232977AbhETXFf (ORCPT ); Thu, 20 May 2021 19:05:35 -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 B5815C061342 for ; Thu, 20 May 2021 16:04:10 -0700 (PDT) Received: by mail-pf1-x44a.google.com with SMTP id x24-20020aa784d80000b02902dd5846d381so7631243pfn.20 for ; Thu, 20 May 2021 16:04:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=oIzsQQKUBlmG+L5Z1kb0XOIo6gMIumBtyoNwBG1Mros=; b=ZN1Lfn7D2fMxg2rKY32lCBKVgRSthmgRRVJM76COwTHqcjaN7b0+vxoBA8lqWwctLt y3QY7R9MCeJNUudxCT+cE2tF/xAcH6dWo2y8TDH/UFJiN1YB7mQ4bLOpVd6QPr/p/qrd UVrOOk/6WHDQ1TPvn3Cw/Ums48wTek9UlHi/b9TB8XNOL4KxINgpEyS4JUzFtCOCkLeo HUkxwABXo2pi69tBSWWH4jYFrjwFrwb2YfJqT35YMQX9ZqNjK48yxNGDdbHc1KXF2q52 BhBo7nrZu/c/+ExS/sblRX67E6Qqe/omleAyxmIlCm5r/8pXG7ISvv7SCFFGZw2ZSo0f LS8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=oIzsQQKUBlmG+L5Z1kb0XOIo6gMIumBtyoNwBG1Mros=; b=sPg+8ugFczcP1TSbQ2kID7fS3yfZFEVoOOz631cjhcWHHo8c/mxWvSUplma6duofud Rh2diuKp1W8rlep4jflF6KzAP66aoWDyg7BU8MoiAJFFjuJWhyhN2/nIO5dp3C92ruQx lQi8N/Jz3r2D4wDzu0uJ0M+beV+ZlKdHX48pWr7M3+QypjRWnzJbMqI4A/0KjJQuoeGm +CN8oy3CyY+SrSdPATSv1yBAV4nXgYiqLzM9n6d5ui743FtvprRO9S270YHOyVvJm7xb TMilStu+2hl5ACmWms8URXVtqe2WFLDg8h360igI67mLQYbEgPnimwi4gLs0jRCbYxt5 pjRA== X-Gm-Message-State: AOAM530kL2WnN3yWNQjvzMGP1BxCdVH1nJTZUgLjWZjRLdcVySztdEJu BOmYx8dQTpNFXKTvzEWGn9amgy/NjojcPXz4rLi9+DwGYIKyGAk8BFDjKrQ8Ra1zUCsyvC110ra 1HaRuoxurD2R6sETjZsloHV4mRDcBER9FeRFssyNfPhtK53S5TsHlKUGCXfUS6g0= X-Google-Smtp-Source: ABdhPJylHSXWop/Ej1LHSKIKYtI8GMoroxVy9mLQM7IJft8k1lX8WhGmiueuNC9e32W32lNDeqfLGGZW3QbXEg== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:a17:90a:ba07:: with SMTP id s7mr7239125pjr.129.1621551849857; Thu, 20 May 2021 16:04:09 -0700 (PDT) Date: Thu, 20 May 2021 16:03:38 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-12-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 11/12] KVM: selftests: Introduce prepare_tpr_shadow From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson , Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Add support for yet another page to hang from the VMCS12 for nested VMX testing: the virtual APIC page. This page is necessary for a VMCS12 to be launched with the "use TPR shadow" VM-execution control set (except in some oddball circumstances permitted by KVM). Signed-off-by: Jim Mattson Reviewed-by: Oliver Upton --- tools/testing/selftests/kvm/include/x86_64/vmx.h | 5 +++++ tools/testing/selftests/kvm/lib/x86_64/vmx.c | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/tools/testing/selftests/kvm/include/x86_64/vmx.h b/tools/testing/selftests/kvm/include/x86_64/vmx.h index 516c81d86353..83ccb096b966 100644 --- a/tools/testing/selftests/kvm/include/x86_64/vmx.h +++ b/tools/testing/selftests/kvm/include/x86_64/vmx.h @@ -574,6 +574,10 @@ struct vmx_pages { void *apic_access_hva; uint64_t apic_access_gpa; void *apic_access; + + void *virtual_apic_hva; + uint64_t virtual_apic_gpa; + void *virtual_apic; }; union vmx_basic { @@ -618,5 +622,6 @@ void prepare_eptp(struct vmx_pages *vmx, struct kvm_vm *vm, uint32_t eptp_memslot); void prepare_virtualize_apic_accesses(struct vmx_pages *vmx, struct kvm_vm *vm, uint32_t eptp_memslot); +void prepare_tpr_shadow(struct vmx_pages *vmx, struct kvm_vm *vm); #endif /* SELFTEST_KVM_VMX_H */ diff --git a/tools/testing/selftests/kvm/lib/x86_64/vmx.c b/tools/testing/selftests/kvm/lib/x86_64/vmx.c index 2448b30e8efa..1023760d1bf7 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/vmx.c +++ b/tools/testing/selftests/kvm/lib/x86_64/vmx.c @@ -551,3 +551,11 @@ void prepare_virtualize_apic_accesses(struct vmx_pages *vmx, struct kvm_vm *vm, vmx->apic_access_hva = addr_gva2hva(vm, (uintptr_t)vmx->apic_access); vmx->apic_access_gpa = addr_gva2gpa(vm, (uintptr_t)vmx->apic_access); } + +void prepare_tpr_shadow(struct vmx_pages *vmx, struct kvm_vm *vm) +{ + vmx->virtual_apic = (void *)vm_vaddr_alloc(vm, getpagesize(), + 0x10000, 0, 0); + vmx->virtual_apic_hva = addr_gva2hva(vm, (uintptr_t)vmx->virtual_apic); + vmx->virtual_apic_gpa = addr_gva2gpa(vm, (uintptr_t)vmx->virtual_apic); +} From patchwork Thu May 20 23:03:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 12271535 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8033BC433ED for ; Thu, 20 May 2021 23:04:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6688C6108B for ; Thu, 20 May 2021 23:04:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233187AbhETXFn (ORCPT ); Thu, 20 May 2021 19:05:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59682 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233163AbhETXFh (ORCPT ); Thu, 20 May 2021 19:05:37 -0400 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 13619C061574 for ; Thu, 20 May 2021 16:04:13 -0700 (PDT) Received: by mail-pj1-x104a.google.com with SMTP id g11-20020a17090a578bb029015564873bf4so7103176pji.7 for ; Thu, 20 May 2021 16:04:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=0B/3IKv0oEcXstXq6WsjIT/uIBUpF+2HF5+KRCArnfs=; b=bA0YnVrexLcJEK692ZPfdLIW1pwS4RLsB0YDvpOFEJyogmpkrCsmHXQ2AWezzk/vOZ CxbhGQ5JoMUoWY587A7/Ogas/uC5syptsPqRuNfqjEnJOsuY3xioAYi46OZDYmz6U6H4 yQTPXFmTLQ8e+3QPVlRu6bQPk57nLRIPNUn5mZWk60sfeUwsM0/VWIkqiwJFZyA34P4z Qb2pf2QS0fSnChaxnaTK4gqtILnOQsvlkB8ukGkU5r9ZPuTp7aCEiJAwJ/+k5/AuCrLV otvrrtOVfHoB6n0y4mOjE7Mvc7bnsQdawP2lZNXR9x9LjMNFp6r5L63K0woZjLEom3h+ KJDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=0B/3IKv0oEcXstXq6WsjIT/uIBUpF+2HF5+KRCArnfs=; b=p8kYPwg4VQk8KjXrplGkeXvyhO2m2RJJH0nOG7RjR4xYNUL4xbJk+jxxDAssx9pIm4 VJPU+rEzpjs9CKd5SXfdMNe7l0gxDjc0qkPP1dcz1wHTNuzU2LowuEXSrpSjJ6BaX5ez EoRaZLNb0OGJkSxUfUj282jexA/b8iXDL9/OcZCnjp6t3AZ2l6ea6BN8s2SuRU9evYQK HorHo4Xp1THYFG7+Gdg2AM1ZiRM1+NiiJu1N25Nzn2uyMBWiWeGlAociibKmg8y6lZh3 vaxqlOG+hLCeUYsnOi36p8MzDjXtmuC2EdS5Y292QEwUovNSDlGh/nceu3+rxAGVJpHl ypbw== X-Gm-Message-State: AOAM531OYsua2mP5ha3Xiv2UFzRLDXmjstjGvITfIPwT9LohoWVkkPQ8 gd5u+XxhCmyPYyOAtk+dg3xU4XjpE+TbEKL4PFmBRd0HkTKnLpzpH80g8ukIsur9yutsO+/hlPq 7fFcwVn0I2mA2W2hQdoeN2NqA8Ge0iZUTj3EpOV9JIUSnhslhaJLDMTyTMbY2nRk= X-Google-Smtp-Source: ABdhPJwgOu2U3+p1YcxRdaUcX8BgStF+6tCt/4/Rt0etBypGoY6Jolgk7GcB+dhG9wLkgFKsQ1OfqkgXMHISMA== X-Received: from tortoise.c.googlers.com ([fda3:e722:ac3:10:7f:e700:c0a8:1a0d]) (user=jmattson job=sendgmr) by 2002:a17:90a:e016:: with SMTP id u22mr200919pjy.1.1621551851806; Thu, 20 May 2021 16:04:11 -0700 (PDT) Date: Thu, 20 May 2021 16:03:39 -0700 In-Reply-To: <20210520230339.267445-1-jmattson@google.com> Message-Id: <20210520230339.267445-13-jmattson@google.com> Mime-Version: 1.0 References: <20210520230339.267445-1-jmattson@google.com> X-Mailer: git-send-email 2.31.1.818.g46aad6cb9e-goog Subject: [PATCH 12/12] KVM: selftests: Add a test of an unbacked nested PI descriptor From: Jim Mattson To: kvm@vger.kernel.org, pbonzini@redhat.com Cc: Jim Mattson , Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Add a regression test for the unsupported configuration of a VMCS12 posted interrupt descriptor that has no backing memory in L1. KVM should exit to userspace with KVM_INTERNAL_ERROR rather than just silently doing something wrong. Signed-off-by: Jim Mattson Reviewed-by: Oliver Upton --- tools/testing/selftests/kvm/.gitignore | 1 + tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/x86_64/vmx_pi_mmio_test.c | 252 ++++++++++++++++++ 3 files changed, 254 insertions(+) create mode 100644 tools/testing/selftests/kvm/x86_64/vmx_pi_mmio_test.c diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore index bd83158e0e0b..f813761ac0a1 100644 --- a/tools/testing/selftests/kvm/.gitignore +++ b/tools/testing/selftests/kvm/.gitignore @@ -34,6 +34,7 @@ /x86_64/xen_vmcall_test /x86_64/xss_msr_test /x86_64/vmx_pmu_msrs_test +/x86_64/vmx_pi_mmio_test /demand_paging_test /dirty_log_test /dirty_log_perf_test diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index af102e03e698..fef0992f04c9 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -67,6 +67,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/tsc_msrs_test TEST_GEN_PROGS_x86_64 += x86_64/vmx_pmu_msrs_test TEST_GEN_PROGS_x86_64 += x86_64/xen_shinfo_test TEST_GEN_PROGS_x86_64 += x86_64/xen_vmcall_test +TEST_GEN_PROGS_x86_64 += x86_64/vmx_pi_mmio_test TEST_GEN_PROGS_x86_64 += demand_paging_test TEST_GEN_PROGS_x86_64 += dirty_log_test TEST_GEN_PROGS_x86_64 += dirty_log_perf_test diff --git a/tools/testing/selftests/kvm/x86_64/vmx_pi_mmio_test.c b/tools/testing/selftests/kvm/x86_64/vmx_pi_mmio_test.c new file mode 100644 index 000000000000..2246899d8988 --- /dev/null +++ b/tools/testing/selftests/kvm/x86_64/vmx_pi_mmio_test.c @@ -0,0 +1,252 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * vmx_pi_mmio_test + * + * Copyright (C) 2021, Google LLC. + * + * This work is licensed under the terms of the GNU GPL, version 2. + * + * Test that an L2 vCPU can be launched with an unbacked posted + * interrupt descriptor, but that any attempt to send that vCPU its + * posted interrupt notification vector will result in an exit to + * userspace with KVM_INTERNAL_ERROR. + * + */ + +#define _GNU_SOURCE /* for program_invocation_short_name */ +#include +#include +#include + +#include "kvm_util.h" +#include "processor.h" +#include "test_util.h" +#include "vmx.h" + +#include "kselftest.h" + +#define RECEIVER_VCPU_ID 0 +#define SENDER_VCPU_ID 1 + +#define L2_GUEST_STACK_SIZE 64 + +#define TIMEOUT_SECS 10 + +#define L1_PI_VECTOR 33 + +static struct kvm_vm *vm; + +static bool l2_active; + +static void l2_guest_code(void) +{ + l2_active = true; + __asm__ __volatile__("hlt"); + /* NOT REACHED */ +} + +static void l1_receiver_code(struct vmx_pages *vmx_pages, + unsigned long high_gpa) +{ + unsigned long l2_guest_stack[L2_GUEST_STACK_SIZE]; + uint32_t control; + + x2apic_enable(); + + GUEST_ASSERT(prepare_for_vmx_operation(vmx_pages)); + GUEST_ASSERT(load_vmcs(vmx_pages)); + + prepare_vmcs(vmx_pages, l2_guest_code, + &l2_guest_stack[L2_GUEST_STACK_SIZE]); + control = vmreadz(PIN_BASED_VM_EXEC_CONTROL); + control |= PIN_BASED_EXT_INTR_MASK | + PIN_BASED_POSTED_INTR; + vmwrite(PIN_BASED_VM_EXEC_CONTROL, control); + + control = vmreadz(CPU_BASED_VM_EXEC_CONTROL); + control |= CPU_BASED_TPR_SHADOW | + CPU_BASED_ACTIVATE_SECONDARY_CONTROLS; + vmwrite(CPU_BASED_VM_EXEC_CONTROL, control); + + control = vmreadz(SECONDARY_VM_EXEC_CONTROL); + control |= SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY; + vmwrite(SECONDARY_VM_EXEC_CONTROL, control); + + control = vmreadz(VM_EXIT_CONTROLS); + control |= VM_EXIT_ACK_INTR_ON_EXIT; + vmwrite(VM_EXIT_CONTROLS, control); + + vmwrite(VIRTUAL_APIC_PAGE_ADDR, vmx_pages->virtual_apic_gpa); + vmwrite(POSTED_INTR_NV, L1_PI_VECTOR); + vmwrite(POSTED_INTR_DESC_ADDR, high_gpa); + + GUEST_ASSERT(!vmlaunch()); + GUEST_ASSERT(vmreadz(VM_EXIT_REASON) == EXIT_REASON_VMCALL); + + GUEST_DONE(); +} + +static void l1_sender_code(void *arg) +{ + x2apic_enable(); + + x2apic_write_reg(APIC_ICR, + APIC_INT_ASSERT | APIC_DEST_PHYSICAL | + APIC_DM_FIXED | L1_PI_VECTOR | + ((uint64_t)RECEIVER_VCPU_ID << 32)); + + GUEST_DONE(); +} + +static bool vcpu_run_loop(int vcpu_id) +{ + volatile struct kvm_run *run = vcpu_state(vm, vcpu_id); + bool done = false; + struct ucall uc; + + while (!done) { + vcpu_run(vm, vcpu_id); + + if (run->exit_reason != KVM_EXIT_IO) + break; + + switch (get_ucall(vm, vcpu_id, &uc)) { + case UCALL_ABORT: + TEST_FAIL("vCPU %d: %s at %s:%ld", vcpu_id, + (const char *)uc.args[0], __FILE__, + uc.args[1]); + /* NOT REACHED */ + case UCALL_SYNC: + break; + case UCALL_DONE: + done = true; + break; + default: + TEST_FAIL("vCPU %d: Unknown ucall %lu", + vcpu_id, uc.cmd); + /* NOT REACHED */ + } + } + + return done; +} + +static void *receiver(void *arg) +{ + volatile struct kvm_run *run = vcpu_state(vm, RECEIVER_VCPU_ID); + unsigned long high_gpa = *(unsigned long *)arg; + vm_vaddr_t vmx_pages_gva; + struct vmx_pages *vmx; + bool success; + + vmx = vcpu_alloc_vmx(vm, &vmx_pages_gva); + prepare_tpr_shadow(vmx, vm); + vcpu_args_set(vm, RECEIVER_VCPU_ID, 2, vmx_pages_gva, high_gpa); + + success = vcpu_run_loop(RECEIVER_VCPU_ID); + TEST_ASSERT(!success, "Receiver didn't fail as expected.\n"); + TEST_ASSERT(run->exit_reason == + KVM_EXIT_INTERNAL_ERROR, + "Exit reason isn't KVM_EXIT_INTERNAL_ERROR: %u (%s).\n", + run->exit_reason, + exit_reason_str(run->exit_reason)); + TEST_ASSERT(run->internal.suberror == + KVM_INTERNAL_ERROR_EMULATION, + "Internal suberror isn't KVM_INTERNAL_ERROR_EMULATION: %u.\n", + run->internal.suberror); + + return NULL; +} + +static void sender(void) +{ + volatile struct kvm_run *run = vcpu_state(vm, SENDER_VCPU_ID); + bool success; + + success = vcpu_run_loop(SENDER_VCPU_ID); + TEST_ASSERT(run->exit_reason == KVM_EXIT_IO, + "Sender didn't exit with KVM_EXIT_IO: %u (%s).\n", + run->exit_reason, + exit_reason_str(run->exit_reason)); + TEST_ASSERT(success, "Sender didn't complete successfully.\n"); +} + +void check_constraints(void) +{ + uint64_t msr; + + nested_vmx_check_supported(); + + msr = kvm_get_feature_msr(MSR_IA32_VMX_PINBASED_CTLS) >> 32; + if (!(msr & PIN_BASED_EXT_INTR_MASK)) { + print_skip("Cannot enable \"external-interrupt exiting\""); + exit(KSFT_SKIP); + } + if (!(msr & PIN_BASED_POSTED_INTR)) { + print_skip("Cannot enable \"process posted interrupts\""); + exit(KSFT_SKIP); + } + + msr = kvm_get_feature_msr(MSR_IA32_VMX_PROCBASED_CTLS) >> 32; + if (!(msr & CPU_BASED_TPR_SHADOW)) { + print_skip("Cannot enable \"use TPR shadow\""); + exit(KSFT_SKIP); + } + if (!(msr & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS)) { + print_skip("Cannot enable \"activate secondary controls\""); + exit(KSFT_SKIP); + } + + msr = kvm_get_feature_msr(MSR_IA32_VMX_PROCBASED_CTLS2) >> 32; + if (!(msr & SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY)) { + print_skip("Cannot enable \"virtual-interrupt delivery\""); + exit(KSFT_SKIP); + } + + msr = kvm_get_feature_msr(MSR_IA32_VMX_EXIT_CTLS) >> 32; + if (!(msr & VM_EXIT_ACK_INTR_ON_EXIT)) { + print_skip("Cannot enable \"acknowledge interrupt on exit\""); + exit(KSFT_SKIP); + } +} + +int main(int argc, char *argv[]) +{ + unsigned int paddr_width; + unsigned int vaddr_width; + unsigned long high_gpa; + pthread_t thread; + bool *l2_active_hva; + int r; + + kvm_get_cpu_address_width(&paddr_width, &vaddr_width); + high_gpa = (1ul << paddr_width) - getpagesize(); + if ((unsigned long)DEFAULT_GUEST_PHY_PAGES * getpagesize() > high_gpa) { + print_skip("No unbacked physical page available"); + exit(KSFT_SKIP); + } + + check_constraints(); + + vm = vm_create_default(RECEIVER_VCPU_ID, 0, (void *)l1_receiver_code); + vm_vcpu_add_default(vm, SENDER_VCPU_ID, (void *)l1_sender_code); + vcpu_set_cpuid(vm, SENDER_VCPU_ID, kvm_get_supported_cpuid()); + + r = pthread_create(&thread, NULL, receiver, &high_gpa); + TEST_ASSERT(r == 0, + "pthread_create failed errno=%d", errno); + + alarm(TIMEOUT_SECS); + l2_active_hva = (bool *)addr_gva2hva(vm, (vm_vaddr_t)&l2_active); + while (!*l2_active_hva) + pthread_yield(); + + sender(); + + r = pthread_join(thread, NULL); + TEST_ASSERT(r == 0, "pthread_join failed with errno=%d", r); + + kvm_vm_free(vm); + + return 0; +}