Received: by 2002:a05:7412:da14:b0:e2:908c:2ebd with SMTP id fe20csp2186524rdb; Mon, 9 Oct 2023 16:13:12 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEQNL5Hs8OGYOjX53GZ6B5sC+UC74oACag4/twrTLpOT+zBEpsaHvrfsc0lfd+EnEIQtdQg X-Received: by 2002:a05:6358:910:b0:13a:bd3:3f85 with SMTP id r16-20020a056358091000b0013a0bd33f85mr18223028rwi.23.1696893191866; Mon, 09 Oct 2023 16:13:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696893191; cv=none; d=google.com; s=arc-20160816; b=xS02+1p14y8XV9LzczVUESXWgqjvm7LPEtF4R/LWq8oU8dElT+d9yGk21hhVpPlnEo 3eWC1Fk2qqXMln8G+wa649KkhkpB01a7gb1ru2zGdRv8XBjbg3cKTMK6K8rFWMlizuNr VCovogE664NCWCTV34hPNa/lI1ArORbGteUIq64N13/ueqBxaoCorUBAgIqa1qVVmGz8 k6inLiileU1kfC+VIbLUZENE0wSTaTy6kAi2Oxq9Xrj3pnMpzG29d4N8134lFMq0JWEt T1dRubhJp7534YFi2lns1bhXEI+la/TKeYpUrW+V24CDm2J6LVpZ6nwGkXYWJcPUneDe xrmw== 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:dkim-signature; bh=WVPLom817QijAmu2ToM6KNwT4YXyplIKJbzjUf63Skc=; fh=nSGf6E5bqeZ4+WG1wtUl4dHMM2T+/oX4atvC7v39NTU=; b=xDoiR95RGc9Bd8WddDiybQbJAllnWBgtE6PptufP7mVQtFEkYhgRu7qu8spSWo1ZdY hx+nDRJ/yNUmqxlURDJdy9QCdb5IKIRInPgfzsbglgNOjK3TDXRkefeqRQGbS7gHj+37 geOs9s2wEmkBMkAtek02HhZUtFY2EJrEXm3T1+61l0kuUsX2VfA88QKX0KOLHme+CkrP hzP1nmH/FBqYlHovnfxIluaQceBvjnReHC2woNSJYyGMmuWiUvd8rVjpqTz9sq8l/g6M OOkNeUNiYu+6u3im+gO0vIWcIUg3K5q7+A7hBDf8Uh7YATkebyP87jSIsNTJRwUGefmq KYYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=OxoSC0kI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 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 howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id np8-20020a17090b4c4800b0027cd3d6e08esi1823371pjb.65.2023.10.09.16.13.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Oct 2023 16:13:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=OxoSC0kI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 0866F80AF811; Mon, 9 Oct 2023 16:13:02 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1379100AbjJIXKj (ORCPT + 99 others); Mon, 9 Oct 2023 19:10:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60058 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1379155AbjJIXKG (ORCPT ); Mon, 9 Oct 2023 19:10:06 -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 3DE192120 for ; Mon, 9 Oct 2023 16:09:12 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id 3f1490d57ef6-d81e9981ff4so6623807276.3 for ; Mon, 09 Oct 2023 16:09:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1696892952; x=1697497752; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=WVPLom817QijAmu2ToM6KNwT4YXyplIKJbzjUf63Skc=; b=OxoSC0kIC2tM7yj6oB7INmcei2Zyace6vqK7POSLLwVgZuOTkxHjy97WppcuGY3JjH +A0lMgF1kPr602w41/FUuBLgQgBAQCEbjPJnrYIRYgBJMYTJYuZSNmXjc6ymu/lhXfMc Vv8pxUGUMX9E59T2D9/bP3zARX+wgK/cq1wDbhGpb2zvpPUB3bhn+zJcvwh5sIK0FixL 6MXwMCgIjBx7iJVHlwXDrQRRBesJODOSlXHs4+XTQjMkUWzTS3k7vwpyt9fta9T0Iqa2 VSXwUzhExSMoYPEI2Ey6B6SRPJ7xGQ0BoDkHmORkvU8Zr+quGxBJr9jD9MshWhmg0QSb kTIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696892952; x=1697497752; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=WVPLom817QijAmu2ToM6KNwT4YXyplIKJbzjUf63Skc=; b=UEv04x0fS1ak+ZnoFgT924KGx4IozGjLGJsuabwaeBRuCLzpNs+sahqQBuInN3ElSS jjrCo9Cu+I2u63d2xUl72HBZ8rF2FzGRYgasH2NGkBp1X4u5l3mbl7Pz8q+pmaannn8E 27r1do5G81GSQH7F5ufOhgh9Cdhr62PWaxH77W+SQz/qQ+YvmBixiFx1YAfanTqvuI9L dEDjuTpHSHMJ0ej8zveNMPAANbP1mNkGD7F+3uFX3/ly1cW3M19OPjhR0fPvagXQHXaa rWgTdjVgpU7bNystzg4pUmmzH62oOUimv3xgXbEHWhM6VTs+OmJAwx6HkN3JLtqS5Nj1 IkLA== X-Gm-Message-State: AOJu0Yy5olZrydZpNbTfWxpTP3dUnFkFTHbElElAkUNjB6+LBnOIAI2v w3SsXO1+fN2lJknrq3YEEe9Cw7rT9l/k X-Received: from rananta-linux.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:20a1]) (user=rananta job=sendgmr) by 2002:a25:5057:0:b0:d9a:5e8f:1562 with SMTP id e84-20020a255057000000b00d9a5e8f1562mr1171ybb.6.1696892951907; Mon, 09 Oct 2023 16:09:11 -0700 (PDT) Date: Mon, 9 Oct 2023 23:08:54 +0000 In-Reply-To: <20231009230858.3444834-1-rananta@google.com> Mime-Version: 1.0 References: <20231009230858.3444834-1-rananta@google.com> X-Mailer: git-send-email 2.42.0.609.gbb76f46606-goog Message-ID: <20231009230858.3444834-9-rananta@google.com> Subject: [PATCH v7 08/12] KVM: arm64: PMU: Allow userspace to limit PMCR_EL0.N for the guest From: Raghavendra Rao Ananta To: Oliver Upton , Marc Zyngier Cc: Alexandru Elisei , James Morse , Suzuki K Poulose , Paolo Bonzini , Zenghui Yu , Shaoqin Huang , Jing Zhang , Reiji Watanabe , Colton Lewis , Raghavendra Rao Anata , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-4.8 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_SBL_CSS,SPF_HELO_NONE,SPF_PASS, USER_IN_DEF_DKIM_WL autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on howler.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Mon, 09 Oct 2023 16:13:03 -0700 (PDT) From: Reiji Watanabe KVM does not yet support userspace modifying PMCR_EL0.N (With the previous patch, KVM ignores what is written by userspace). Add support userspace limiting PMCR_EL0.N. Disallow userspace to set PMCR_EL0.N to a value that is greater than the host value as KVM doesn't support more event counters than what the host HW implements. Also, make this register immutable after the VM has started running. To maintain the existing expectations, instead of returning an error, KVM returns a success for these two cases. Finally, ignore writes to read-only bits that are cleared on vCPU reset, and RES{0,1} bits (including writable bits that KVM doesn't support yet), as those bits shouldn't be modified (at least with the current KVM). Signed-off-by: Reiji Watanabe Signed-off-by: Raghavendra Rao Ananta --- arch/arm64/kvm/sys_regs.c | 57 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index c750722fbe4a..0c8d337b0370 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c @@ -1087,6 +1087,59 @@ static int get_pmcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, return 0; } +static int set_pmcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, + u64 val) +{ + struct kvm *kvm = vcpu->kvm; + u64 new_n, mutable_mask; + + mutex_lock(&kvm->arch.config_lock); + + /* + * Make PMCR immutable once the VM has started running, but do + * not return an error (-EBUSY) to meet the existing expectations. + */ + if (kvm_vm_has_ran_once(vcpu->kvm)) { + mutex_unlock(&kvm->arch.config_lock); + return 0; + } + + new_n = (val >> ARMV8_PMU_PMCR_N_SHIFT) & ARMV8_PMU_PMCR_N_MASK; + if (new_n != kvm->arch.pmcr_n) { + u8 pmcr_n_limit = kvm_arm_get_num_counters(kvm); + + /* + * The vCPU can't have more counters than the PMU hardware + * implements. Ignore this error to maintain compatibility + * with the existing KVM behavior. + */ + if (new_n <= pmcr_n_limit) + kvm->arch.pmcr_n = new_n; + } + mutex_unlock(&kvm->arch.config_lock); + + /* + * Ignore writes to RES0 bits, read only bits that are cleared on + * vCPU reset, and writable bits that KVM doesn't support yet. + * (i.e. only PMCR.N and bits [7:0] are mutable from userspace) + * The LP bit is RES0 when FEAT_PMUv3p5 is not supported on the vCPU. + * But, we leave the bit as it is here, as the vCPU's PMUver might + * be changed later (NOTE: the bit will be cleared on first vCPU run + * if necessary). + */ + mutable_mask = (ARMV8_PMU_PMCR_MASK | + (ARMV8_PMU_PMCR_N_MASK << ARMV8_PMU_PMCR_N_SHIFT)); + val &= mutable_mask; + val |= (__vcpu_sys_reg(vcpu, r->reg) & ~mutable_mask); + + /* The LC bit is RES1 when AArch32 is not supported */ + if (!kvm_supports_32bit_el0()) + val |= ARMV8_PMU_PMCR_LC; + + __vcpu_sys_reg(vcpu, r->reg) = val; + return 0; +} + /* Silly macro to expand the DBG{BCR,BVR,WVR,WCR}n_EL1 registers in one go */ #define DBG_BCR_BVR_WCR_WVR_EL1(n) \ { SYS_DESC(SYS_DBGBVRn_EL1(n)), \ @@ -2150,8 +2203,8 @@ static const struct sys_reg_desc sys_reg_descs[] = { { SYS_DESC(SYS_CTR_EL0), access_ctr }, { SYS_DESC(SYS_SVCR), undef_access }, - { PMU_SYS_REG(PMCR_EL0), .access = access_pmcr, - .reset = reset_pmcr, .reg = PMCR_EL0, .get_user = get_pmcr }, + { PMU_SYS_REG(PMCR_EL0), .access = access_pmcr, .reset = reset_pmcr, + .reg = PMCR_EL0, .get_user = get_pmcr, .set_user = set_pmcr }, { PMU_SYS_REG(PMCNTENSET_EL0), .access = access_pmcnten, .reg = PMCNTENSET_EL0 }, { PMU_SYS_REG(PMCNTENCLR_EL0), -- 2.42.0.609.gbb76f46606-goog