From patchwork Fri May 26 22:19:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 13257393 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F3E51C7EE23 for ; Fri, 26 May 2023 22:20:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230370AbjEZWUi (ORCPT ); Fri, 26 May 2023 18:20:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38716 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243688AbjEZWU3 (ORCPT ); Fri, 26 May 2023 18:20:29 -0400 Received: from out-44.mta0.migadu.com (out-44.mta0.migadu.com [91.218.175.44]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 95904E76 for ; Fri, 26 May 2023 15:20:09 -0700 (PDT) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1685139557; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2FqhtMmKGmZl4KHXt11WnsOMNvOZmFxz6xEVgV93OUg=; b=Run5F849rhkAj5AvoY7XDPO4sOE6qAgcbhMz3fu5Rk9RX3O0nww17Vgwit2Ym2CqJkx7La Ze7G6mJ8Oxi0Rb19Yn+sDjn5r7tRk+4xn2KliREvYprYjal8BfjuZJa5d787VLatnhnOPR zADnXYditu+aSsyVDIideKcmKFtg1xw= From: Oliver Upton To: kvmarm@lists.linux.dev Cc: kvm@vger.kernel.org, Marc Zyngier , James Morse , Suzuki K Poulose , Zenghui Yu , Will Deacon , Julien Thierry , Salil Mehta , Oliver Upton Subject: [PATCH kvmtool 21/21] aarch64: smccc: Start sending PSCI to userspace Date: Fri, 26 May 2023 22:19:09 +0000 Message-ID: <20230526221909.317511-1-oliver.upton@linux.dev> In-Reply-To: <20230526221712.317287-1-oliver.upton@linux.dev> References: <20230526221712.317287-1-oliver.upton@linux.dev> MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org kvmtool now has a PSCI implementation that complies with v1.0 of the specification. Use the SMCCC filter to start sending these calls out to userspace for further handling. While at it, shut the door on the legacy, KVM-specific v0.1 functions. Signed-off-by: Oliver Upton --- arm/aarch64/include/kvm/kvm-config-arch.h | 6 +++- arm/aarch64/smccc.c | 37 +++++++++++++++++++++++ arm/include/arm-common/kvm-config-arch.h | 1 + 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/arm/aarch64/include/kvm/kvm-config-arch.h b/arm/aarch64/include/kvm/kvm-config-arch.h index eae8080d3fd9..1c40bbac70f5 100644 --- a/arm/aarch64/include/kvm/kvm-config-arch.h +++ b/arm/aarch64/include/kvm/kvm-config-arch.h @@ -19,7 +19,11 @@ int vcpu_affinity_parser(const struct option *opt, const char *arg, int unset); "Specify random seed for Kernel Address Space " \ "Layout Randomization (KASLR)"), \ OPT_BOOLEAN('\0', "no-pvtime", &(cfg)->no_pvtime, "Disable" \ - " stolen time"), + " stolen time"), \ + OPT_BOOLEAN('\0', "in-kernel-smccc", &(cfg)->in_kernel_smccc, \ + "Disable userspace handling of SMCCC, instead" \ + " relying on the in-kernel implementation"), + #include "arm-common/kvm-config-arch.h" #endif /* KVM__KVM_CONFIG_ARCH_H */ diff --git a/arm/aarch64/smccc.c b/arm/aarch64/smccc.c index b95077305ffa..13aa39c927b7 100644 --- a/arm/aarch64/smccc.c +++ b/arm/aarch64/smccc.c @@ -39,7 +39,44 @@ out: return true; } +static struct kvm_smccc_filter filter_ranges[] = { + { + .base = KVM_PSCI_FN_BASE, + .nr_functions = 4, + .action = KVM_SMCCC_FILTER_DENY, + }, + { + .base = PSCI_0_2_FN_BASE, + .nr_functions = 0x20, + .action = KVM_SMCCC_FILTER_FWD_TO_USER, + }, + { + .base = PSCI_0_2_FN64_BASE, + .nr_functions = 0x20, + .action = KVM_SMCCC_FILTER_FWD_TO_USER, + }, +}; + void kvm__setup_smccc(struct kvm *kvm) { + struct kvm_device_attr attr = { + .group = KVM_ARM_VM_SMCCC_CTRL, + .attr = KVM_ARM_VM_SMCCC_FILTER, + }; + unsigned int i; + if (kvm->cfg.arch.in_kernel_smccc) + return; + + if (ioctl(kvm->vm_fd, KVM_HAS_DEVICE_ATTR, &attr)) { + pr_debug("KVM SMCCC filter not supported"); + return; + } + + for (i = 0; i < ARRAY_SIZE(filter_ranges); i++) { + attr.addr = (u64)&filter_ranges[i]; + + if (ioctl(kvm->vm_fd, KVM_SET_DEVICE_ATTR, &attr)) + die_perror("KVM_SET_DEVICE_ATTR failed"); + } } diff --git a/arm/include/arm-common/kvm-config-arch.h b/arm/include/arm-common/kvm-config-arch.h index 87f50352e60f..fa9c34519bd9 100644 --- a/arm/include/arm-common/kvm-config-arch.h +++ b/arm/include/arm-common/kvm-config-arch.h @@ -14,6 +14,7 @@ struct kvm_config_arch { enum irqchip_type irqchip; u64 fw_addr; bool no_pvtime; + bool in_kernel_smccc; }; int irqchip_parser(const struct option *opt, const char *arg, int unset);