Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp111914rwb; Fri, 30 Sep 2022 18:29:19 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4P6OieNC4SsQa/oDGe+N2+nCwUsQxOIVShiEWfD8yEI4mmJrKRAsYylFZdc2Tku2gIl0d8 X-Received: by 2002:a17:906:ee86:b0:741:89bc:27a1 with SMTP id wt6-20020a170906ee8600b0074189bc27a1mr8457552ejb.725.1664587759303; Fri, 30 Sep 2022 18:29:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664587759; cv=none; d=google.com; s=arc-20160816; b=WzWKLAU/Kw1je0632ylj0oCZGKyaps0v/1duLmVmPn2Da8ws5eYbzPWU3Yiyr9O42A j0TjCIO85QBiubfzZM9A8HqmB/aSIoawo1A4w9Qtuv1Js0WDpGVR4mqFdGpOOCjcnurk UxMBs7r2/NOGJyxJ4Nj4PDJuAX8ylavwWDGUEEPqCDoYiPSzEJtrCaDDXrPn3BLSVvVV gjT+oV/25ZGlyY+k4mX3+Ig6GcLnX/MfhWWO6I37VVbHcm1EQx6xDfkSCJsavG3b8hwa Co0fFE90eKNuwRw5t6CULs8w8/gdQQUGC/7EJQt4ZSf1tmWlXVJV/F8SHuGKhqiE2qgQ w9qw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:reply-to:dkim-signature; bh=nUyKM2pzOQLrRGLlm654j+76cYaRMmTuDJ0UvD4UD8Q=; b=XEakRzhOzMluCFECG9XZY7F6hFJltfntjHUMsnovH4EZgKe6+PiR7iadSJxVG/+9vz vdw9g0lYJEhEB1eTrMmIQ1z0BNrRNEp3YZlvvmQ09Ja1EKPnRH37Q55qRpvq1L+ppYLy rcfCkxC2cj8cYVSC70CNlF7MC03f6YenjzcX3jrCOWygcxs+hlyTsIdcIrCuqvWwWlgf BXmp3umgZfQftjAE4mTwIFrnUe6uxeGvoI1j4RSxeTQKN/pHXwTDc5DARG0epAycitEb 1+I8gNieKwvMYcbjcZjY7QFYnn7SpN1X3tqzmfYRiRGc4zCvcG9IlUrYiMT78OBcGE1q cKnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b="B9W/qzV4"; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s16-20020a508d10000000b0045157a1991bsi2848729eds.323.2022.09.30.18.28.52; Fri, 30 Sep 2022 18:29:19 -0700 (PDT) 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=@google.com header.s=20210112 header.b="B9W/qzV4"; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233053AbiJABCS (ORCPT + 99 others); Fri, 30 Sep 2022 21:02:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43082 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232884AbiJABB1 (ORCPT ); Fri, 30 Sep 2022 21:01:27 -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 71648B4EAC for ; Fri, 30 Sep 2022 18:00:06 -0700 (PDT) Received: by mail-pg1-x54a.google.com with SMTP id x23-20020a634857000000b0043c700f6441so3729453pgk.21 for ; Fri, 30 Sep 2022 18:00:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date; bh=nUyKM2pzOQLrRGLlm654j+76cYaRMmTuDJ0UvD4UD8Q=; b=B9W/qzV4dQC/CdcbWv3QfbqzmJcMMkm/9VR3lXIqt/GKJak7moqdjAjWuteO/a5ji7 iUxoOlyiYS6lKBRx67amtbyddD3VhD8zNnBBLkHFraDW39sD1RVVxfpv1dnTFAOlYUCu hN/K5FfrHqMunJ9R2LPo0zEEoYThwJGPCjDnvNas9kkEmjlWlk0IM5NpV4VookejGlzF S8qzc063fnhL1DD0wGsUjjG4wCamSAeC2VxPOx1wT56KhOx7HAJ3DT968jDhAyVcjNXc W0413T+2MLyO5fOs3yyC8+wDNDSpdhK7fQRH3FClBV2Lew2GbnyL1kLLDBAlqfgt4ArG 3piw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date; bh=nUyKM2pzOQLrRGLlm654j+76cYaRMmTuDJ0UvD4UD8Q=; b=3ZItYQszoWUxA5S0mqXQP5NcDftJcFZzx06rAFQBQVV8WxcBLbHc3s/1uDZ68ObM2J Tb8csxE8vpx29XXuwZ8rnGtC73BIORiishlBOaKjnKMpngEY1rPrgsb+yVY7ZJHt0gxH UhyXnmtCMOwDcsxE2m9NxZm0ByCQZEEZwOqErqE/9x8DzUUVV5+AsbE1gokoiaFI7z2t Q7ISHKKslcaML+Rr7GPI0NKMOkmz2G9qiXMUAselaytxyVYBTakHWoP+5N67JBCaSRtv ZtvfHI52tnN3rNcO2vfegXxFT8vCPSaEZA6FJXS/datKMTA81/u0uIa8ac3DC/mvktC3 YRPg== X-Gm-Message-State: ACrzQf0rM1+oeQrax5k6wF+UhfvoLAcS0OVIPnGMSZ9nKvX1wrnt6MKs BnsfUxaeCQDz/+t8ZkVf18lfFtGpsTw= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:90a:cd06:b0:203:ae0e:6a21 with SMTP id d6-20020a17090acd0600b00203ae0e6a21mr515981pju.0.1664586005501; Fri, 30 Sep 2022 18:00:05 -0700 (PDT) Reply-To: Sean Christopherson Date: Sat, 1 Oct 2022 00:59:11 +0000 In-Reply-To: <20221001005915.2041642-1-seanjc@google.com> Mime-Version: 1.0 References: <20221001005915.2041642-1-seanjc@google.com> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog Message-ID: <20221001005915.2041642-29-seanjc@google.com> Subject: [PATCH v4 28/32] KVM: SVM: Require logical ID to be power-of-2 for AVIC entry From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Alejandro Jimenez , Suravee Suthikulpanit , Maxim Levitsky , Li RongQing Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL 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 Do not modify AVIC's logical ID table if the logical ID portion of the LDR is not a power-of-2, i.e. if the LDR has multiple bits set. Taking only the first bit means that KVM will fail to match MDAs that intersect with "higher" bits in the "ID" The "ID" acts as a bitmap, but is referred to as an ID because theres an implicit, unenforced "requirement" that software only set one bit. This edge case is arguably out-of-spec behavior, but KVM cleanly handles it in all other cases, e.g. the optimized logical map (and AVIC!) is also disabled in this scenario. Refactor the code to consolidate the checks, and so that the code looks more like avic_kick_target_vcpus_fast(). Fixes: 18f40c53e10f ("svm: Add VMEXIT handlers for AVIC") Cc: Suravee Suthikulpanit Cc: Maxim Levitsky Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/avic.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 4b6fc9d64f4d..a9e4e09f83fc 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -513,26 +513,26 @@ unsigned long avic_vcpu_get_apicv_inhibit_reasons(struct kvm_vcpu *vcpu) static u32 *avic_get_logical_id_entry(struct kvm_vcpu *vcpu, u32 ldr, bool flat) { struct kvm_svm *kvm_svm = to_kvm_svm(vcpu->kvm); - int index; u32 *logical_apic_id_table; - int dlid = GET_APIC_LOGICAL_ID(ldr); + u32 cluster, index; - if (!dlid) - return NULL; + ldr = GET_APIC_LOGICAL_ID(ldr); - if (flat) { /* flat */ - index = ffs(dlid) - 1; - if (index > 7) + if (flat) { + cluster = 0; + } else { + cluster = (ldr >> 4) << 2; + if (cluster >= 0xf) return NULL; - } else { /* cluster */ - int cluster = (dlid & 0xf0) >> 4; - int apic = ffs(dlid & 0x0f) - 1; - - if ((apic < 0) || (apic > 7) || - (cluster >= 0xf)) - return NULL; - index = (cluster << 2) + apic; + ldr &= 0xf; } + if (!ldr || !is_power_of_2(ldr)) + return NULL; + + index = __ffs(ldr); + if (WARN_ON_ONCE(index > 7)) + return NULL; + index += (cluster << 2); logical_apic_id_table = (u32 *) page_address(kvm_svm->avic_logical_id_table_page); -- 2.38.0.rc1.362.ged0d419d3c-goog