Received: by 2002:ac2:5a04:0:0:0:0:0 with SMTP id q4csp148761lfn; Fri, 25 Feb 2022 02:38:48 -0800 (PST) X-Google-Smtp-Source: ABdhPJzSL/SdvtotyDC4Dv9MB63S9vylS0dY9/dMVCd+cQEwomUPs92MLQM5xDYtnjGbv8v1qATA X-Received: by 2002:a17:907:3e94:b0:6d1:d64e:3141 with SMTP id hs20-20020a1709073e9400b006d1d64e3141mr5386569ejc.213.1645785408527; Fri, 25 Feb 2022 02:36:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1645785408; cv=none; d=google.com; s=arc-20160816; b=xZhaWJotOhdz1/bIA4UNxy9zjtYJ6lvJ2a2UVq0vRMa4XUTyYVok23OuMy/64EncQP AmWyJaVht8rZK/NWYnwuIAAoJtrZIBWzGCom8s1OwYY8gHY+Hdpqlcuw+YugNoaqRBRV XMRfF6ZLEy2Y58KUE88tpnXXpyvjL3Nw/FhTxy9msTg0WO+FVJ2WTJPBqjpCyEPxoOGK tmGYMFaC2TJdfEZgjazn1DizAS9UYveYbH+8fHNETVfTsAthaLOtIE5zgmmbmVEPtbNE MEcaNdqeYzuJ5oktmQ6B6ysmu/fOO1gbz5gfzmsswfCaWb5Jrways3Rnn9uhCZalJnhk LOJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=TzSaM49N+ylzaX1Pr93kHIM9Cf0GC2pciQ6HMBUe6Mw=; b=rMJegAkQxkbGv0u710C9wGFs/7OFasfyl9VqMvs6HsqCSkslei/3+14gZL6sHdUCtH ZzBpy3IrmpdWdWpU5R0d+k9s0xHMq8PTGTp9kk+gNuizgVfe884ya31zCmv8TJ45CM9t qKXdM0j2FEC94qh10AObWlB+ABly0Iw4DXVg+Cv+P0hwrvYwmiuWLdk9RCsTPiI8Gge0 8+szovWVUdES0sRapsBHAAlOPBXzIR1sT0uOk9QZR8o9it82xo5Pzc07N2i19HYR1Dlb mfmWd/c/MffLWyzBiOZ5q8LWl3DW+LgurSi/bLMk4SQpmKfWr1+Vs7TI+5oVjZqhwptc BN+Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="bdJGMu/u"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id qx21-20020a170906fcd500b006d0b3918d3csi1268807ejb.280.2022.02.25.02.36.16; Fri, 25 Feb 2022 02:36:48 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="bdJGMu/u"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238775AbiBYIyN (ORCPT + 99 others); Fri, 25 Feb 2022 03:54:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54640 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238770AbiBYIyI (ORCPT ); Fri, 25 Feb 2022 03:54:08 -0500 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9D2922255BC; Fri, 25 Feb 2022 00:53:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1645779216; x=1677315216; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=aAScniTQ6hnuqdjEfXh/mJB2BVkSgcocqcMrF3sJiqY=; b=bdJGMu/u+y48mUpyesbwHsvLx9TKoFTD9YdKkET/bhixqsbzYlVZDhZu rY6vF+M0fxrx78Xd3FwJsucwOvDdyhTLwm1Nd3lfH/k30Vt5LS+OdMoYP RHjvkPFxUoZOiScR/I37AhMyrVIAa9Wil6hpMj1PSbX+BCLere7MCoRLc SHLdu+TXyarKYHmc2w4E6v+4bj6O+vveX/RU7nfVEmtj8yhWnXJ/7jzdH SotZDypo1fPH7GkFLpRNKfv0tvkugzF9hLWKN/RzstSP7zeTdu+VmIaAE qQ0X1JkN7Ng2RbMN+IKurfLlNIpUbuSrwF/mOjVV3YxJ6j5Mh35b3GA8M Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10268"; a="277090079" X-IronPort-AV: E=Sophos;i="5.90,136,1643702400"; d="scan'208";a="277090079" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Feb 2022 00:53:36 -0800 X-IronPort-AV: E=Sophos;i="5.90,136,1643702400"; d="scan'208";a="549186527" Received: from arthur-vostro-3668.sh.intel.com ([10.239.13.120]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Feb 2022 00:53:30 -0800 From: Zeng Guang To: Paolo Bonzini , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, Dave Hansen , Tony Luck , Kan Liang , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , Kim Phillips , Jarkko Sakkinen , Jethro Beekman , Kai Huang Cc: x86@kernel.org, linux-kernel@vger.kernel.org, Robert Hu , Gao Chao , Zeng Guang Subject: [PATCH v6 5/9] KVM: x86: Add support for vICR APIC-write VM-Exits in x2APIC mode Date: Fri, 25 Feb 2022 16:22:19 +0800 Message-Id: <20220225082223.18288-6-guang.zeng@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220225082223.18288-1-guang.zeng@intel.com> References: <20220225082223.18288-1-guang.zeng@intel.com> X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Upcoming Intel CPUs will support virtual x2APIC MSR writes to the vICR, i.e. will trap and generate an APIC-write VM-Exit instead of intercepting the WRMSR. Add support for handling "nodecode" x2APIC writes, which were previously impossible. Note, x2APIC MSR writes are 64 bits wide. Signed-off-by: Zeng Guang --- arch/x86/kvm/lapic.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 629c116b0d3e..e4bcdab1fac0 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -67,6 +67,7 @@ static bool lapic_timer_advance_dynamic __read_mostly; #define LAPIC_TIMER_ADVANCE_NS_MAX 5000 /* step-by-step approximation to mitigate fluctuation */ #define LAPIC_TIMER_ADVANCE_ADJUST_STEP 8 +static int kvm_lapic_msr_read(struct kvm_lapic *apic, u32 reg, u64 *data); static inline void __kvm_lapic_set_reg(char *regs, int reg_off, u32 val) { @@ -2227,10 +2228,28 @@ EXPORT_SYMBOL_GPL(kvm_lapic_set_eoi); /* emulate APIC access in a trap manner */ void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset) { - u32 val = kvm_lapic_get_reg(vcpu->arch.apic, offset); + struct kvm_lapic *apic = vcpu->arch.apic; + u64 val; + + if (apic_x2apic_mode(apic)) { + /* + * When guest APIC is in x2APIC mode and IPI virtualization + * is enabled, accessing APIC_ICR may cause trap-like VM-exit + * on Intel hardware. Other offsets are not possible. + */ + if (WARN_ON_ONCE(offset != APIC_ICR)) + return; - /* TODO: optimize to just emulate side effect w/o one more write */ - kvm_lapic_reg_write(vcpu->arch.apic, offset, val); + kvm_lapic_msr_read(apic, offset, &val); + if (val & APIC_ICR_BUSY) + kvm_x2apic_icr_write(apic, val); + else + kvm_apic_send_ipi(apic, (u32)val, (u32)(val >> 32)); + } else { + val = kvm_lapic_get_reg(apic, offset); + /* TODO: optimize to just emulate side effect w/o one more write */ + kvm_lapic_reg_write(apic, offset, (u32)val); + } } EXPORT_SYMBOL_GPL(kvm_apic_write_nodecode); -- 2.27.0