Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp723102pxb; Wed, 25 Aug 2021 13:31:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyosQYAeOA2c0j5B7rM1kliyuZ6n8K8lw7CzZney1rv1TEh8WCfk449ENT0Xl3wZADc6I8a X-Received: by 2002:aa7:ccda:: with SMTP id y26mr375805edt.245.1629923515490; Wed, 25 Aug 2021 13:31:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629923515; cv=none; d=google.com; s=arc-20160816; b=sEVJNaN8nMKeBHmV+rQSObxX2ebRsFoh5pgwqY4tILzt9ux7AvA4Opm3ApXq9F0sjk nGYOe7IHJ4DMiSydH1HyA4vIg5C4EoPm0SF8aU8MmAwcWtiJG1xV2dqyZ8HFfy0Gb3+4 hda1wt0uUpDmhRPXxA+wswlykyUw2nuHqkpxZ5mDgPVSFYhSaaHo9Nx2hH/C1or6eyK3 XDba3x0ksHQr/nPJWLa4f7+L3cspUo1Q5fULVuF3vwZ6qOawZD95gJ5l/JuFzPn85N3U xldXEpPs0yap5i7C3tpg58b/RQPUU+H2qFnLGwBxz2807ZlcHybP4jbvBzgA3N8bal4g ZxhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:to:from; bh=Sp9E/wo2Ko6Y2NE9eHxMbp9+3erdyy5FSfdRPAo6F/o=; b=aBJCEU4uuSBtU7BvkkDBzBiU+Tc+uaCd1MU8u+WX23e8s2jZ6DtyyMz40w2KB1WSk4 Wr5us59ugejbNOQ1HFJlxfcH0zBPE+pR3dJVYEYsKE1i/3vO4dVevXQMiODlpKpRi0VH kySbaRLV/kWIIoHYuGbFpNQKYJn0CfVDLJiVeXJSeEtmNXGYyy0a1qDX+nLRc/W+NGiE WcSnygxUQ5JHwAYaJUI6Rml+yemT8tO7MTBE/oGQrkJ3n5IQQo89AewBh3XJ6p/leq/R Fqr/DdiC2ta4MZ2saghtuaF484AU9VmoyvNtIn2ix5/Ylls7lg2K9Dt9qPyDzrF+2SJf 1lEQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id do2si974832ejc.729.2021.08.25.13.31.32; Wed, 25 Aug 2021 13:31:55 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241740AbhHYQSw (ORCPT + 99 others); Wed, 25 Aug 2021 12:18:52 -0400 Received: from foss.arm.com ([217.140.110.172]:54726 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240593AbhHYQS2 (ORCPT ); Wed, 25 Aug 2021 12:18:28 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A439D113E; Wed, 25 Aug 2021 09:17:42 -0700 (PDT) Received: from monolith.cable.virginm.net (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 559F33F66F; Wed, 25 Aug 2021 09:17:41 -0700 (PDT) From: Alexandru Elisei To: maz@kernel.org, james.morse@arm.com, suzuki.poulose@arm.com, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, will@kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH v4 19/39] KVM: arm64: Do not emulate SPE on CPUs which don't have SPE Date: Wed, 25 Aug 2021 17:17:55 +0100 Message-Id: <20210825161815.266051-20-alexandru.elisei@arm.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210825161815.266051-1-alexandru.elisei@arm.com> References: <20210825161815.266051-1-alexandru.elisei@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The kernel allows heterogeneous systems where FEAT_SPE is not present on all CPUs. This presents a challenge for KVM, as it will have to touch the SPE registers when emulating SPE for a guest, and those accesses will cause an undefined exception if SPE is not present on the CPU. Avoid this situation by comparing the cpumask of the physical CPUs that support SPE with the cpu list provided by userspace via the KVM_ARM_VCPU_SUPPORTED_CPUS ioctl and refusing the run the VCPU if there is a mismatch. Signed-off-by: Alexandru Elisei --- arch/arm64/include/asm/kvm_spe.h | 2 ++ arch/arm64/kvm/arm.c | 3 +++ arch/arm64/kvm/spe.c | 12 ++++++++++++ 3 files changed, 17 insertions(+) diff --git a/arch/arm64/include/asm/kvm_spe.h b/arch/arm64/include/asm/kvm_spe.h index 328115ce0b48..ed67ddbf8132 100644 --- a/arch/arm64/include/asm/kvm_spe.h +++ b/arch/arm64/include/asm/kvm_spe.h @@ -16,11 +16,13 @@ static __always_inline bool kvm_supports_spe(void) void kvm_spe_init_supported_cpus(void); void kvm_spe_vm_init(struct kvm *kvm); +int kvm_spe_check_supported_cpus(struct kvm_vcpu *vcpu); #else #define kvm_supports_spe() (false) static inline void kvm_spe_init_supported_cpus(void) {} static inline void kvm_spe_vm_init(struct kvm *kvm) {} +static inline int kvm_spe_check_supported_cpus(struct kvm_vcpu *vcpu) { return -ENOEXEC; } #endif /* CONFIG_KVM_ARM_SPE */ #endif /* __ARM64_KVM_SPE_H__ */ diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 82cb7b5b3b45..8f7025f2e4a0 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -633,6 +633,9 @@ static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu) if (!kvm_arm_vcpu_is_finalized(vcpu)) return -EPERM; + if (kvm_vcpu_has_spe(vcpu) && kvm_spe_check_supported_cpus(vcpu)) + return -EPERM; + vcpu->arch.has_run_once = true; kvm_arm_vcpu_init_debug(vcpu); diff --git a/arch/arm64/kvm/spe.c b/arch/arm64/kvm/spe.c index 83f92245f881..8d2afc137151 100644 --- a/arch/arm64/kvm/spe.c +++ b/arch/arm64/kvm/spe.c @@ -30,3 +30,15 @@ void kvm_spe_vm_init(struct kvm *kvm) /* Set supported_cpus if it isn't already initialized. */ kvm_spe_init_supported_cpus(); } + +int kvm_spe_check_supported_cpus(struct kvm_vcpu *vcpu) +{ + /* SPE is supported on all CPUs, we don't care about the VCPU mask */ + if (cpumask_equal(supported_cpus, cpu_possible_mask)) + return 0; + + if (!cpumask_subset(&vcpu->arch.supported_cpus, supported_cpus)) + return -ENOEXEC; + + return 0; +} -- 2.33.0