From patchwork Thu Sep 23 19:16:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 12513585 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A3931C433EF for ; Thu, 23 Sep 2021 19:16:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 881AC61260 for ; Thu, 23 Sep 2021 19:16:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242841AbhIWTRu (ORCPT ); Thu, 23 Sep 2021 15:17:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58578 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242840AbhIWTRt (ORCPT ); Thu, 23 Sep 2021 15:17:49 -0400 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0B4D6C061574 for ; Thu, 23 Sep 2021 12:16:18 -0700 (PDT) Received: by mail-qv1-xf49.google.com with SMTP id q17-20020a0cf5d1000000b00380e60ef363so22581798qvm.9 for ; Thu, 23 Sep 2021 12:16:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=UCMYJurTFuTkCi0HgTfCB5voS1kc3wFR2T934tFa/Zw=; b=G3IeFE8bm7uUZsbXeSdob1ZhW9vy4lEwxbjMoMnJ/ggdGOjHFYeJBlrZ/BOqXzzZEM qX0u7YyYBe+/t26r2VKhI4LV5MqNOSqU3Tr8XzBJxQzRn7WfNy0EW3bxwaPxKS7LSqsm xZ7UIeodcMbXCGBuooPK+dt2KM+fgHg9519qV8DOah6lvf0UQp9tTXrIVsJbv68LeyTw ABS2jjrhuCXB8Yv2T9ZsW6OzsThl6b1xmGWcFdJUxOFpGqD00dLdZjdUU74XoXTOW8CG oBC+NucSCfdJpw6rfS+bS9SqwXichjKwCGbo5PnWQbUOZPSMFJfkO8xDyDmhLMnRHztd Fr+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=UCMYJurTFuTkCi0HgTfCB5voS1kc3wFR2T934tFa/Zw=; b=V9vn/se/L10ZPRawQQ/55KXgguicZJ/IhFoB5jbdt2bwl3kUGFD/Js5BPm8NDblSfv XiKFPsnJkW6VNdN9IWTPvFLD6+qMN1ECmVS58xztXQCsU95+vY6UeBZAPxp4cVb8R9Oj sWxlHoXhft2jhRJWU2YTatoSd7wL70DFylJvRDxxrNdFA/2eygTm5U/U7c0QDVrAjoIX WKiQwXQN7cJ7WUDWzbgnqpixihPjX9dRd0v5zILFdCOP6pR7gubsxEA05vKpZ7+oWITC qMGkyYLapAgqLRziBwsGNMR9opyY4hS3KTXq4ywGo6+evjK6UPAZp+eYT+tBLZe7KB+H mAnA== X-Gm-Message-State: AOAM5327RGLyQ61jjyZtQaS4IooH/4uQixMteDm/FSHNNXMHsEO25cB5 IJs/ICqx/X2V13pSMnZ6IJxVxh9tRiQ= X-Google-Smtp-Source: ABdhPJxVi0BHEjOTgazTwOWIFtWnIaijjz0Tm9HsTJFcwKzjrq0cP/UG+fQwEF7wSEN7ptIoNhJ0GWQQG30= X-Received: from oupton.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:404]) (user=oupton job=sendgmr) by 2002:a05:6214:13e3:: with SMTP id ch3mr6061613qvb.35.1632424577208; Thu, 23 Sep 2021 12:16:17 -0700 (PDT) Date: Thu, 23 Sep 2021 19:16:00 +0000 In-Reply-To: <20210923191610.3814698-1-oupton@google.com> Message-Id: <20210923191610.3814698-2-oupton@google.com> Mime-Version: 1.0 References: <20210923191610.3814698-1-oupton@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v2 01/11] KVM: arm64: Drop unused vcpu param to kvm_psci_valid_affinity() From: Oliver Upton To: kvmarm@lists.cs.columbia.edu Cc: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Andrew Jones , Peter Shier , Ricardo Koller , Reiji Watanabe , Raghavendra Rao Anata , kvm@vger.kernel.org, Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org The helper function does not need a pointer to the vCPU, as it only consults a constant mask; drop the unused vcpu parameter. Signed-off-by: Oliver Upton Reviewed-by: Reiji Watanabe Reviewed-by: Andrew Jones --- arch/arm64/kvm/psci.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/arch/arm64/kvm/psci.c b/arch/arm64/kvm/psci.c index 74c47d420253..d46842f45b0a 100644 --- a/arch/arm64/kvm/psci.c +++ b/arch/arm64/kvm/psci.c @@ -59,8 +59,7 @@ static void kvm_psci_vcpu_off(struct kvm_vcpu *vcpu) kvm_vcpu_kick(vcpu); } -static inline bool kvm_psci_valid_affinity(struct kvm_vcpu *vcpu, - unsigned long affinity) +static inline bool kvm_psci_valid_affinity(unsigned long affinity) { return !(affinity & ~MPIDR_HWID_BITMASK); } @@ -73,7 +72,7 @@ static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu) unsigned long cpu_id; cpu_id = smccc_get_arg1(source_vcpu); - if (!kvm_psci_valid_affinity(source_vcpu, cpu_id)) + if (!kvm_psci_valid_affinity(cpu_id)) return PSCI_RET_INVALID_PARAMS; vcpu = kvm_mpidr_to_vcpu(kvm, cpu_id); @@ -132,7 +131,7 @@ static unsigned long kvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu) target_affinity = smccc_get_arg1(vcpu); lowest_affinity_level = smccc_get_arg2(vcpu); - if (!kvm_psci_valid_affinity(vcpu, target_affinity)) + if (!kvm_psci_valid_affinity(target_affinity)) return PSCI_RET_INVALID_PARAMS; /* Determine target affinity mask */ From patchwork Thu Sep 23 19:16:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 12513587 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1381CC4332F for ; Thu, 23 Sep 2021 19:16:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F1C4161267 for ; Thu, 23 Sep 2021 19:16:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242844AbhIWTRv (ORCPT ); Thu, 23 Sep 2021 15:17:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58584 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242823AbhIWTRu (ORCPT ); Thu, 23 Sep 2021 15:17:50 -0400 Received: from mail-io1-xd4a.google.com (mail-io1-xd4a.google.com [IPv6:2607:f8b0:4864:20::d4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0572DC061574 for ; Thu, 23 Sep 2021 12:16:19 -0700 (PDT) Received: by mail-io1-xd4a.google.com with SMTP id j7-20020a0566022cc700b005d65f61a95fso427926iow.9 for ; Thu, 23 Sep 2021 12:16:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=wuhjwc3cWbjk5tU/NeZeTgW/a/HXaQKuoN5QMNZMGeo=; b=NW8v62EkiXXa/7jVpmzPJkblutKY6sFQQtlrPHUh/urfKOecQh+LY5D8kM6u7PPiWK 0oly2o5b/4LbqN+NIplDvevj7Cn/th27ZuwZgEi10MtixmOenyMM05kj0nrSpUes04bw PO7kEWOWJCJZri+aNKHQk6SxmvMsNxOcvAgqk+00DbZfsyzbeEIf/7YXhOTlO8kTeuiZ pq15LOw3gPdO6YKDTMwsdTYROADLZhHQBhYN7It3etPcpx1ASAmzXpG+1q2IN4u2fpR+ /MmDb4XK28dvfXRL+evkK+1tr6W+pyL+tfA8StOQQbxdOUwOZ2Y6u924RyVvgx1KXmHK Bq7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=wuhjwc3cWbjk5tU/NeZeTgW/a/HXaQKuoN5QMNZMGeo=; b=OLi7jhfi/R9B7SsQNBNdmaQnRT6Ak7OUajsbATK5ivDwK9PfRssjnjTPtD5nQgGlVK GniGksH0IV/mBpkcXdC9KU9w+2mJcfrf/2o/TauQVxikQFvCHa+Jm2EQJ/h6o4/cg24A hHRsv9qogiuC4dF/4Pmvo6cWOpwqLVDxn5YPCCr9FZ1BbNk0ntqT3PThz2w6zM+zOUPp IV3uk45RakJvvJ7aV3mQ4uM21Eisvj04cJjCSSISQyThFPDJJjDBKXrWKT3bDLnvEwdm rvi5EVvlTYL8wYU10iSayUsXpIP7nLvqt2UG+iE/vL605W48pTuSgmeADhj2Ffi+6g6o 3mKw== X-Gm-Message-State: AOAM532g+vKo3ffx1jpT4lCkOF5YunPlra8PjWExDd5/N4qsFCgJbXav c0rp9MPSA+0PPX6RKQ61sa6/LOdqfcs= X-Google-Smtp-Source: ABdhPJzwGEX23UIo4CYuNKmMK206kckBCE8dVTHHtaVtRij6igKpJLs0Yao5aVSEMfyGpu3eSFezGo0/Qb0= X-Received: from oupton.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:404]) (user=oupton job=sendgmr) by 2002:a6b:7710:: with SMTP id n16mr5290999iom.101.1632424578398; Thu, 23 Sep 2021 12:16:18 -0700 (PDT) Date: Thu, 23 Sep 2021 19:16:01 +0000 In-Reply-To: <20210923191610.3814698-1-oupton@google.com> Message-Id: <20210923191610.3814698-3-oupton@google.com> Mime-Version: 1.0 References: <20210923191610.3814698-1-oupton@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v2 02/11] KVM: arm64: Clean up SMC64 PSCI filtering for AArch32 guests From: Oliver Upton To: kvmarm@lists.cs.columbia.edu Cc: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Andrew Jones , Peter Shier , Ricardo Koller , Reiji Watanabe , Raghavendra Rao Anata , kvm@vger.kernel.org, Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org The only valid calling SMC calling convention from an AArch32 state is SMC32. Disallow any PSCI function that sets the SMC64 function ID bit when called from AArch32 rather than comparing against known SMC64 PSCI functions. Signed-off-by: Oliver Upton Reviewed-by: Reiji Watanabe Reviewed-by: Andrew Jones --- arch/arm64/kvm/psci.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/arch/arm64/kvm/psci.c b/arch/arm64/kvm/psci.c index d46842f45b0a..310b9cb2b32b 100644 --- a/arch/arm64/kvm/psci.c +++ b/arch/arm64/kvm/psci.c @@ -208,15 +208,11 @@ static void kvm_psci_narrow_to_32bit(struct kvm_vcpu *vcpu) static unsigned long kvm_psci_check_allowed_function(struct kvm_vcpu *vcpu, u32 fn) { - switch(fn) { - case PSCI_0_2_FN64_CPU_SUSPEND: - case PSCI_0_2_FN64_CPU_ON: - case PSCI_0_2_FN64_AFFINITY_INFO: - /* Disallow these functions for 32bit guests */ - if (vcpu_mode_is_32bit(vcpu)) - return PSCI_RET_NOT_SUPPORTED; - break; - } + /* + * Prevent 32 bit guests from calling 64 bit PSCI functions. + */ + if ((fn & PSCI_0_2_64BIT) && vcpu_mode_is_32bit(vcpu)) + return PSCI_RET_NOT_SUPPORTED; return 0; } From patchwork Thu Sep 23 19:16:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 12513589 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 14F7BC433FE for ; Thu, 23 Sep 2021 19:16:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F301261260 for ; Thu, 23 Sep 2021 19:16:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242861AbhIWTRx (ORCPT ); Thu, 23 Sep 2021 15:17:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58588 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242823AbhIWTRv (ORCPT ); Thu, 23 Sep 2021 15:17:51 -0400 Received: from mail-il1-x149.google.com (mail-il1-x149.google.com [IPv6:2607:f8b0:4864:20::149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1B19AC061574 for ; Thu, 23 Sep 2021 12:16:20 -0700 (PDT) Received: by mail-il1-x149.google.com with SMTP id s8-20020a92cbc8000000b002582a281a7bso3698351ilq.10 for ; Thu, 23 Sep 2021 12:16:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=2asC0Rqx18RgPRLiSzHgbr40dKQc4/+1utoD7s7ji4c=; b=qmWxJl8N7VPhQwq1iVzn7zIRiLfz55FQdBAPpXmcXjkncp+qy2dX9MWloQCvvPvJ2z YFltQyoEZ2XVmE7ByBDa1hXpmU190EeKmxQ01GuRis1+KDUgCJhksdK/AT4Zsgu7uRlo 61YkmElQFogLLTpS+8vqdwrxCTpI/gjiG/Ws1sg8imVHPNwAFTXsfxN323raR1jtS2/n C+7976GUVrs4rJGi+8G/C2drf3/B7JW6x6epW2KCoBr1JmAMeXzisIfVCwdPI1lJbymA M1bdRQZOgpd0+6zVtD9ESuWnW/gx7eJ74K55G6T0LgY7pikP7ONSGqjZynj9wVJGZZvv Mmsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=2asC0Rqx18RgPRLiSzHgbr40dKQc4/+1utoD7s7ji4c=; b=SiZFL/Du9NuzIeAcPc4Ud+ZB6EWRHAY/tz1sLxR9xJe+Lx9Q68GQPaHnMw23DPQeiV kYf2W2MlahPQicEManQt/A/pAKZ9xgnUG/7Q3fOoeaTcoB5GXewqFkF8ayu5vIhrT0yp FYUc3+No26oTKCEmaVkTk9q8AvQqLxIWExs0ZcYd6ULa4EeoBLZ1nBG5iMoEnqCKHLNw srdJH2W+xafIuuXFiIpPeC/28YZ5DEafyK8w7n+wfE5yXD31A+TOWa6cbeCuFsGd82VJ T7VX936Nu82z0jKEkBxTAM3GN2GBx0GOyp1Efwo5yllc4S2ddA49HMOo+RslQsNUJUu9 Y6Mg== X-Gm-Message-State: AOAM530boY5XWvOQanYTW6dRhHawKBXFqLJ0Ch1t05jXnqQj6rSlwhye 1rZn0h5soM6pPn8urg2I+HzA8sZisu0= X-Google-Smtp-Source: ABdhPJxtuC86c4seq0Yi0ytSDi5No4IEOB4Xjc6doIoIAtU4XvjZFliTDgFtlqolEDhlMd3rYKHr6CIkr9A= X-Received: from oupton.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:404]) (user=oupton job=sendgmr) by 2002:a02:b0d5:: with SMTP id w21mr5489320jah.45.1632424579479; Thu, 23 Sep 2021 12:16:19 -0700 (PDT) Date: Thu, 23 Sep 2021 19:16:02 +0000 In-Reply-To: <20210923191610.3814698-1-oupton@google.com> Message-Id: <20210923191610.3814698-4-oupton@google.com> Mime-Version: 1.0 References: <20210923191610.3814698-1-oupton@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v2 03/11] KVM: arm64: Encapsulate reset request logic in a helper function From: Oliver Upton To: kvmarm@lists.cs.columbia.edu Cc: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Andrew Jones , Peter Shier , Ricardo Koller , Reiji Watanabe , Raghavendra Rao Anata , kvm@vger.kernel.org, Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org In its implementation of the PSCI function, KVM needs to request that a target vCPU resets before its next entry into the guest. Wrap the logic for requesting a reset in a function for later use by other implemented PSCI calls. No functional change intended. Signed-off-by: Oliver Upton Reviewed-by: Reiji Watanabe Reviewed-by: Andrew Jones --- arch/arm64/kvm/psci.c | 59 +++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/arch/arm64/kvm/psci.c b/arch/arm64/kvm/psci.c index 310b9cb2b32b..bb59b692998b 100644 --- a/arch/arm64/kvm/psci.c +++ b/arch/arm64/kvm/psci.c @@ -64,9 +64,40 @@ static inline bool kvm_psci_valid_affinity(unsigned long affinity) return !(affinity & ~MPIDR_HWID_BITMASK); } -static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu) +static void kvm_psci_vcpu_request_reset(struct kvm_vcpu *vcpu, + unsigned long entry_addr, + unsigned long context_id, + bool big_endian) { struct vcpu_reset_state *reset_state; + + lockdep_assert_held(&vcpu->kvm->lock); + + reset_state = &vcpu->arch.reset_state; + reset_state->pc = entry_addr; + + /* Propagate caller endianness */ + reset_state->be = big_endian; + + /* + * NOTE: We always update r0 (or x0) because for PSCI v0.1 + * the general purpose registers are undefined upon CPU_ON. + */ + reset_state->r0 = context_id; + + WRITE_ONCE(reset_state->reset, true); + kvm_make_request(KVM_REQ_VCPU_RESET, vcpu); + + /* + * Make sure the reset request is observed if the change to + * power_state is observed. + */ + smp_wmb(); + vcpu->arch.power_off = false; +} + +static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu) +{ struct kvm *kvm = source_vcpu->kvm; struct kvm_vcpu *vcpu = NULL; unsigned long cpu_id; @@ -90,29 +121,9 @@ static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu) return PSCI_RET_INVALID_PARAMS; } - reset_state = &vcpu->arch.reset_state; - - reset_state->pc = smccc_get_arg2(source_vcpu); - - /* Propagate caller endianness */ - reset_state->be = kvm_vcpu_is_be(source_vcpu); - - /* - * NOTE: We always update r0 (or x0) because for PSCI v0.1 - * the general purpose registers are undefined upon CPU_ON. - */ - reset_state->r0 = smccc_get_arg3(source_vcpu); - - WRITE_ONCE(reset_state->reset, true); - kvm_make_request(KVM_REQ_VCPU_RESET, vcpu); - - /* - * Make sure the reset request is observed if the change to - * power_state is observed. - */ - smp_wmb(); - - vcpu->arch.power_off = false; + kvm_psci_vcpu_request_reset(vcpu, smccc_get_arg2(source_vcpu), + smccc_get_arg3(source_vcpu), + kvm_vcpu_is_be(source_vcpu)); kvm_vcpu_wake_up(vcpu); return PSCI_RET_SUCCESS; From patchwork Thu Sep 23 19:16:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 12513591 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 50454C4332F for ; Thu, 23 Sep 2021 19:16:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 341586124D for ; Thu, 23 Sep 2021 19:16:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242871AbhIWTRy (ORCPT ); Thu, 23 Sep 2021 15:17:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58596 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242870AbhIWTRx (ORCPT ); Thu, 23 Sep 2021 15:17:53 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 68354C061574 for ; Thu, 23 Sep 2021 12:16:21 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id x185-20020a25e0c2000000b005b53ab9f5e9so298551ybg.22 for ; Thu, 23 Sep 2021 12:16:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=dkhhhARdJNItMKxiO8fcGRSgRnnWwiZ+q9GZvF1SajQ=; b=fSTmJxItQ0Esp6edjHZ8XsCfQWYHWKgn2MDQr6xhIU/ioCwoXCgLyZPcUWoOb7i8i7 4X97ySbmn8RyA0zkhhXz1njQPPCykyZyalZLQqQsLLyUfNrazWj5Dr/dSCDZDipWFeOZ afxmhjQ8lo8oLO+HlThsMGn6g+hmC8AIP7jl/E0d/fAu91N/vJpQGLIcwRf31aCSFfMV M62AMOTGVsRa7mldVqkgUXLTCcXTgx6GLJxJyIn8jno3AmK6Ovp9nbjAzJNkxpXr7P4z VpoCpRzO1LByDRPW3pWWB8Iv1Z2XMpaXrJETCelkEsp9RdY4DYRFtPYrOjSQz+C1ZD16 vZZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=dkhhhARdJNItMKxiO8fcGRSgRnnWwiZ+q9GZvF1SajQ=; b=Rb1/4fVJZ887sac/V9nDdD8wwGaM9/pNa7GQpZyUORGG48tGtWf+wZEeYnZTBiEE3N YfYFfnkT8cYFjDIZeKXA2fHBbrVUGLq3G8GZNTaPCQH+iis+hHUJl+HFKByJR57TmILx PmaR8pyemmkrQ3UPcTJGhvOj5SEIaH6cO6Ul9+L9hgmzWS93jhXdoYM3J+niZcBFkDIT g8iOo84g+tem59v5VHIOdYx92QOYGbCiWmY/WmmvUzBer1bC6eoz5xmAkL9l9TcDtBKh t7fqE+XUbiVXsRJ1QxDE/hCFPyd6mW4WG5PK4qnQ52SVRIDxJZVOGp6LX3G/wLxG0W4Q 9TdA== X-Gm-Message-State: AOAM532I4MaoI3DD5FG+WkvgPjXclHVidq87JJw4f8Czo/fKJBWhE1VE gVzu6oGYO3ZIxqZoz8wRIy4sKNEjv6A= X-Google-Smtp-Source: ABdhPJx9mCky5M8FDvxeXJD6cDUieD2bDPTUWqI3NhMeXKbuooMw9pu1tjzha9gnLbeS3TGZ0fVM66DuUw0= X-Received: from oupton.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:404]) (user=oupton job=sendgmr) by 2002:a25:61c8:: with SMTP id v191mr7593036ybb.472.1632424580561; Thu, 23 Sep 2021 12:16:20 -0700 (PDT) Date: Thu, 23 Sep 2021 19:16:03 +0000 In-Reply-To: <20210923191610.3814698-1-oupton@google.com> Message-Id: <20210923191610.3814698-5-oupton@google.com> Mime-Version: 1.0 References: <20210923191610.3814698-1-oupton@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v2 04/11] KVM: arm64: Rename the KVM_REQ_SLEEP handler From: Oliver Upton To: kvmarm@lists.cs.columbia.edu Cc: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Andrew Jones , Peter Shier , Ricardo Koller , Reiji Watanabe , Raghavendra Rao Anata , kvm@vger.kernel.org, Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org The naming of the kvm_req_sleep function is confusing: the function itself sleeps the vCPU, it does not request such an event. Rename the function to make its purpose more clear. No functional change intended. Signed-off-by: Oliver Upton Reviewed-by: Andrew Jones --- arch/arm64/kvm/arm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index fe102cd2e518..3d4acd354f94 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -649,7 +649,7 @@ void kvm_arm_resume_guest(struct kvm *kvm) } } -static void vcpu_req_sleep(struct kvm_vcpu *vcpu) +static void kvm_vcpu_sleep(struct kvm_vcpu *vcpu) { struct rcuwait *wait = kvm_arch_vcpu_get_wait(vcpu); @@ -679,7 +679,7 @@ static void check_vcpu_requests(struct kvm_vcpu *vcpu) { if (kvm_request_pending(vcpu)) { if (kvm_check_request(KVM_REQ_SLEEP, vcpu)) - vcpu_req_sleep(vcpu); + kvm_vcpu_sleep(vcpu); if (kvm_check_request(KVM_REQ_VCPU_RESET, vcpu)) kvm_reset_vcpu(vcpu); From patchwork Thu Sep 23 19:16:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 12513593 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id F12B5C433F5 for ; Thu, 23 Sep 2021 19:16:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E0EC361267 for ; Thu, 23 Sep 2021 19:16:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242880AbhIWTRz (ORCPT ); Thu, 23 Sep 2021 15:17:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58600 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242823AbhIWTRy (ORCPT ); Thu, 23 Sep 2021 15:17:54 -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 73037C061574 for ; Thu, 23 Sep 2021 12:16:22 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id m16-20020a25d410000000b005ab243aaaf4so300568ybf.20 for ; Thu, 23 Sep 2021 12:16:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=YX6wLWSIJTG38D0JCJDYsCJb2+sCdnlZJoLOpE40P6M=; b=Igy6VVMKWdhPbPXq1S7BSk4Zo0tnmp6XkOd5OoVhvbxZfpbMMdSjLKLrVZQfDwkijt Gid6Wob2mCp9b9SwnyLnbx06l3w1bICa2ctn4n6NANLSLTQSfnclob8KsMXrr5CL7F/D J0NefWfn8S8LKdSN+qJJgpBc5NH36yiRxOp85vnJChbIFKT7LcWaX7GP26tnUU3CtKyK avfHaoIlf2XKDDeBLpSQhEQrrc/eZ0OjtOGpFnqD7LyWSexSfd/IUPHQWjv2Uxjsik/L 0rxFMjqae0jVCJEdLx+HqyPqqpTs839lVDhapYnYePAoM79WsF90TOhK/RrMmzA4+Czl LyKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=YX6wLWSIJTG38D0JCJDYsCJb2+sCdnlZJoLOpE40P6M=; b=Z5/wkiKpkjDK0/lLQYusk5PHbLJeyQ7U+7QI16z/MozAo56MPdAQmin7BkSu8reF0Q WXsnnuTt29T2zqYXX6sA0AeMsnFR2VSKW8MfC3YerDN1KcVxxgHOSmOFsWLmdl04GUpj ywdwdBr/z01betW8O8yem5FVOBfdlEHXT7sqoAmtadkeeK+mO9qNuE9/J+0XbjqoN3kf GQVJj4CgFpypwZAUvgwWAAKbmTzWsFVO3OIOu/qkoSAz7IAP5IdXHS3I/mufKIl6D3iU S21Jxr2aVmRoxpY/KXXrxzAkwjYp9aA5joc3tNoJ8k7va8dfP+K9Yia/fQbuIsWZVAN5 KdCw== X-Gm-Message-State: AOAM5317zzqYs9GpwnddpWGVdgeyZFvOy9Vaw9o13ld1t42roKcbvrsH KqbGNPSMgFIC1ExNonCPiE54Q0QBbc0= X-Google-Smtp-Source: ABdhPJz1tbWEEs1Gv4kYcRNWO/op3Eino71+uPo4QLG2oDpchkCrTFHJgIB2O8EyPAJDVKVyWcqX4trvHyo= X-Received: from oupton.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:404]) (user=oupton job=sendgmr) by 2002:a25:12d6:: with SMTP id 205mr8004600ybs.441.1632424581627; Thu, 23 Sep 2021 12:16:21 -0700 (PDT) Date: Thu, 23 Sep 2021 19:16:04 +0000 In-Reply-To: <20210923191610.3814698-1-oupton@google.com> Message-Id: <20210923191610.3814698-6-oupton@google.com> Mime-Version: 1.0 References: <20210923191610.3814698-1-oupton@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v2 05/11] KVM: arm64: Defer WFI emulation as a requested event From: Oliver Upton To: kvmarm@lists.cs.columbia.edu Cc: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Andrew Jones , Peter Shier , Ricardo Koller , Reiji Watanabe , Raghavendra Rao Anata , kvm@vger.kernel.org, Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org The emulation of WFI-like instructions (WFI, PSCI CPU_SUSPEND) is done by calling kvm_vcpu_block() directly from the respective exit handlers. A subsequent change to KVM will allow userspace to request a vCPU be suspended on the next KVM_RUN, necessitating a deferral mechanism for WFI emulation. Refactor such that there is a single WFI implementation which may be requested with KVM_REQ_SUSPEND. Request WFI emulation from the aforementioned handlers by making this request. Signed-off-by: Oliver Upton --- arch/arm64/include/asm/kvm_host.h | 1 + arch/arm64/kvm/arm.c | 9 +++++++++ arch/arm64/kvm/handle_exit.c | 3 +-- arch/arm64/kvm/psci.c | 4 +--- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index f8be56d5342b..1beda1189a15 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -47,6 +47,7 @@ #define KVM_REQ_RECORD_STEAL KVM_ARCH_REQ(3) #define KVM_REQ_RELOAD_GICv4 KVM_ARCH_REQ(4) #define KVM_REQ_RELOAD_PMU KVM_ARCH_REQ(5) +#define KVM_REQ_SUSPEND KVM_ARCH_REQ(6) #define KVM_DIRTY_LOG_MANUAL_CAPS (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE | \ KVM_DIRTY_LOG_INITIALLY_SET) diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 3d4acd354f94..f1a375648e25 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -670,6 +670,12 @@ static void kvm_vcpu_sleep(struct kvm_vcpu *vcpu) smp_rmb(); } +static void kvm_vcpu_suspend(struct kvm_vcpu *vcpu) +{ + kvm_vcpu_block(vcpu); + kvm_clear_request(KVM_REQ_UNHALT, vcpu); +} + static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu) { return vcpu->arch.target >= 0; @@ -681,6 +687,9 @@ static void check_vcpu_requests(struct kvm_vcpu *vcpu) if (kvm_check_request(KVM_REQ_SLEEP, vcpu)) kvm_vcpu_sleep(vcpu); + if (kvm_check_request(KVM_REQ_SUSPEND, vcpu)) + kvm_vcpu_suspend(vcpu); + if (kvm_check_request(KVM_REQ_VCPU_RESET, vcpu)) kvm_reset_vcpu(vcpu); diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c index 275a27368a04..5e5ef9ff4fba 100644 --- a/arch/arm64/kvm/handle_exit.c +++ b/arch/arm64/kvm/handle_exit.c @@ -95,8 +95,7 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu) } else { trace_kvm_wfx_arm64(*vcpu_pc(vcpu), false); vcpu->stat.wfi_exit_stat++; - kvm_vcpu_block(vcpu); - kvm_clear_request(KVM_REQ_UNHALT, vcpu); + kvm_make_request(KVM_REQ_SUSPEND, vcpu); } kvm_incr_pc(vcpu); diff --git a/arch/arm64/kvm/psci.c b/arch/arm64/kvm/psci.c index bb59b692998b..d453666ddb83 100644 --- a/arch/arm64/kvm/psci.c +++ b/arch/arm64/kvm/psci.c @@ -46,9 +46,7 @@ static unsigned long kvm_psci_vcpu_suspend(struct kvm_vcpu *vcpu) * specification (ARM DEN 0022A). This means all suspend states * for KVM will preserve the register state. */ - kvm_vcpu_block(vcpu); - kvm_clear_request(KVM_REQ_UNHALT, vcpu); - + kvm_make_request(KVM_REQ_SUSPEND, vcpu); return PSCI_RET_SUCCESS; } From patchwork Thu Sep 23 19:16:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 12513595 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0DE4AC4332F for ; Thu, 23 Sep 2021 19:16:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F0F9D61269 for ; Thu, 23 Sep 2021 19:16:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242889AbhIWTR4 (ORCPT ); Thu, 23 Sep 2021 15:17:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58606 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242823AbhIWTRz (ORCPT ); Thu, 23 Sep 2021 15:17:55 -0400 Received: from mail-qt1-x84a.google.com (mail-qt1-x84a.google.com [IPv6:2607:f8b0:4864:20::84a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 76D0AC061574 for ; Thu, 23 Sep 2021 12:16:23 -0700 (PDT) Received: by mail-qt1-x84a.google.com with SMTP id w10-20020ac87e8a000000b002a68361412bso19546784qtj.7 for ; Thu, 23 Sep 2021 12:16:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=H3vkV6rNI9KUdmftteDleGzJenrkHySSJn/1Y/5guuQ=; b=LasEUuDwQp5Zav61DshsF2WqKM9enZgWNq/a3BGwody5/zVv0VJzBCQVeT584d4abS P23ZKVqU11j5gQh5rAJzcG5BUueustHitzc4zXp8xcCnCbQGICjDdmE2QB+Y+nTsWjjW 6pfJbE0FOonXtk5Cxzs0zwy3QWLcSgIO8aV6nxaG9iB5qj15bSsVgXkUfBg7VstRZUlh 5kNXvs71c2CxAyU/dwGHn9S0DH2/k16jk7a2J+CrvD619D/bkRV6d1CMGzu9ugzbCR4B j51hNXAwcMrXhaBtdi8FzL82w6Q2a7P8fgAk5cxM1aEbtZMEHOK4O32iN0avetd+0NJ0 INwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=H3vkV6rNI9KUdmftteDleGzJenrkHySSJn/1Y/5guuQ=; b=P47QJ2c2cQpDBbgKtm+VBcTDfkqayPsYZ6u7ncOXp0eLRh7GG0hpey9+WWgQEXPIkH WOio3HPvAG2dczCv0Y+l3iKMOt08NVhZRoDM84EHWEJQCQMU8cmyiHvsXwfPqJ5jjZH2 SO9Bch8KsdWkDHWD89wwaDSESDIVoHXFnVajbWqOSXxCJ9Eh31IwaZ+bsdzwH/eXo5It CBdaWGs2gGdsffsyFjh6iYdTg93Fw49zmQk3KwZhWI5fIp0b7O0Dpv/7xqeNLoMR6+dB dAb8F9N0Yq0Q0iXElXzXcTtZq82nTM0i/hnhblqIj7CzjppkdBYOkjUIpiO78SkPCroI tsKg== X-Gm-Message-State: AOAM530QDyqGVYZN698z8PwfWaz2U8wVjn1CA8yhQHgHKEsNYiOL2FMZ sZcmiQkIHb1DuCUS9qHI5j2bfVleB6E= X-Google-Smtp-Source: ABdhPJwu/QbnVYK8a/ZiJZYOCCOiDf8v/2TBSwHDemfAVDn2FGRxLNaNjB8Ttdmu9oHrHDj4s1NfhAwwAsg= X-Received: from oupton.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:404]) (user=oupton job=sendgmr) by 2002:ad4:5147:: with SMTP id g7mr3186004qvq.29.1632424582642; Thu, 23 Sep 2021 12:16:22 -0700 (PDT) Date: Thu, 23 Sep 2021 19:16:05 +0000 In-Reply-To: <20210923191610.3814698-1-oupton@google.com> Message-Id: <20210923191610.3814698-7-oupton@google.com> Mime-Version: 1.0 References: <20210923191610.3814698-1-oupton@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v2 06/11] KVM: arm64: Add support for SYSTEM_SUSPEND PSCI call From: Oliver Upton To: kvmarm@lists.cs.columbia.edu Cc: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Andrew Jones , Peter Shier , Ricardo Koller , Reiji Watanabe , Raghavendra Rao Anata , kvm@vger.kernel.org, Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org ARM DEN0022D 5.19 "SYSTEM_SUSPEND" describes a PSCI call that may be used to request a system be suspended. This is optional for PSCI v1.0 and to date KVM has elected to not implement the call. However, a VMM/operator may wish to provide their guests with the ability to suspend/resume, necessitating this PSCI call. Implement support for SYSTEM_SUSPEND according to the prescribed behavior in the specification. Add a new system event exit type, KVM_SYSTEM_EVENT_SUSPEND, to notify userspace when a VM has requested a system suspend. Make KVM_MP_STATE_HALTED a valid state on arm64. Userspace can set this to request an in-kernel emulation of the suspend. Signed-off-by: Oliver Upton --- Documentation/virt/kvm/api.rst | 6 ++++ arch/arm64/include/asm/kvm_host.h | 3 ++ arch/arm64/kvm/arm.c | 8 +++++ arch/arm64/kvm/psci.c | 60 +++++++++++++++++++++++++++++++ include/uapi/linux/kvm.h | 2 ++ 5 files changed, 79 insertions(+) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index a6729c8cf063..361a57061b8f 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -5656,6 +5656,7 @@ should put the acknowledged interrupt vector into the 'epr' field. #define KVM_SYSTEM_EVENT_SHUTDOWN 1 #define KVM_SYSTEM_EVENT_RESET 2 #define KVM_SYSTEM_EVENT_CRASH 3 + #define KVM_SYSTEM_EVENT_SUSPEND 4 __u32 type; __u64 flags; } system_event; @@ -5680,6 +5681,11 @@ Valid values for 'type' are: has requested a crash condition maintenance. Userspace can choose to ignore the request, or to gather VM memory core dump and/or reset/shutdown of the VM. + - KVM_SYSTEM_EVENT_SUSPEND -- the guest has requested that the VM + suspends. Userspace is not obliged to honor this, and may call KVM_RUN + again. Doing so will cause the guest to resume at its requested entry + point. For ARM64, userspace can request in-kernel suspend emulation + by setting the vCPU's MP state to KVM_MP_STATE_HALTED. :: diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 1beda1189a15..441eb6fa7adc 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -137,6 +137,9 @@ struct kvm_arch { /* Memory Tagging Extension enabled for the guest */ bool mte_enabled; + + /* PSCI SYSTEM_SUSPEND call enabled for the guest */ + bool suspend_enabled; }; struct kvm_vcpu_fault_info { diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index f1a375648e25..d875d3bcf3c5 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -101,6 +101,10 @@ int kvm_vm_ioctl_enable_cap(struct kvm *kvm, } mutex_unlock(&kvm->lock); break; + case KVM_CAP_ARM_SYSTEM_SUSPEND: + r = 0; + kvm->arch.suspend_enabled = true; + break; default: r = -EINVAL; break; @@ -215,6 +219,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) case KVM_CAP_SET_GUEST_DEBUG: case KVM_CAP_VCPU_ATTRIBUTES: case KVM_CAP_PTP_KVM: + case KVM_CAP_ARM_SYSTEM_SUSPEND: r = 1; break; case KVM_CAP_SET_GUEST_DEBUG2: @@ -470,6 +475,9 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, int ret = 0; switch (mp_state->mp_state) { + case KVM_MP_STATE_HALTED: + kvm_make_request(KVM_REQ_SUSPEND, vcpu); + fallthrough; case KVM_MP_STATE_RUNNABLE: vcpu->arch.power_off = false; break; diff --git a/arch/arm64/kvm/psci.c b/arch/arm64/kvm/psci.c index d453666ddb83..cf869f1f8615 100644 --- a/arch/arm64/kvm/psci.c +++ b/arch/arm64/kvm/psci.c @@ -203,6 +203,46 @@ static void kvm_psci_system_reset(struct kvm_vcpu *vcpu) kvm_prepare_system_event(vcpu, KVM_SYSTEM_EVENT_RESET); } +static int kvm_psci_system_suspend(struct kvm_vcpu *vcpu) +{ + unsigned long entry_addr, context_id; + struct kvm *kvm = vcpu->kvm; + unsigned long psci_ret = 0; + struct kvm_vcpu *tmp; + int ret = 0; + int i; + + /* + * The SYSTEM_SUSPEND PSCI call requires that all vCPUs (except the + * calling vCPU) be in an OFF state, as determined by the + * implementation. + * + * See ARM DEN0022D, 5.19 "SYSTEM_SUSPEND" for more details. + */ + mutex_lock(&kvm->lock); + kvm_for_each_vcpu(i, tmp, kvm) { + if (tmp != vcpu && !tmp->arch.power_off) { + psci_ret = PSCI_RET_DENIED; + ret = 1; + goto out; + } + } + + entry_addr = smccc_get_arg1(vcpu); + context_id = smccc_get_arg2(vcpu); + + kvm_psci_vcpu_request_reset(vcpu, entry_addr, context_id, + kvm_vcpu_is_be(vcpu)); + + memset(&vcpu->run->system_event, 0, sizeof(vcpu->run->system_event)); + vcpu->run->system_event.type = KVM_SYSTEM_EVENT_SUSPEND; + vcpu->run->exit_reason = KVM_EXIT_SYSTEM_EVENT; +out: + mutex_unlock(&kvm->lock); + smccc_set_retval(vcpu, psci_ret, 0, 0, 0); + return ret; +} + static void kvm_psci_narrow_to_32bit(struct kvm_vcpu *vcpu) { int i; @@ -223,6 +263,14 @@ static unsigned long kvm_psci_check_allowed_function(struct kvm_vcpu *vcpu, u32 if ((fn & PSCI_0_2_64BIT) && vcpu_mode_is_32bit(vcpu)) return PSCI_RET_NOT_SUPPORTED; + switch (fn) { + case PSCI_1_0_FN_SYSTEM_SUSPEND: + case PSCI_1_0_FN64_SYSTEM_SUSPEND: + if (!vcpu->kvm->arch.suspend_enabled) + return PSCI_RET_NOT_SUPPORTED; + break; + } + return 0; } @@ -316,6 +364,10 @@ static int kvm_psci_1_0_call(struct kvm_vcpu *vcpu) unsigned long val; int ret = 1; + val = kvm_psci_check_allowed_function(vcpu, psci_fn); + if (val) + goto out; + switch(psci_fn) { case PSCI_0_2_FN_PSCI_VERSION: val = KVM_ARM_PSCI_1_0; @@ -339,6 +391,8 @@ static int kvm_psci_1_0_call(struct kvm_vcpu *vcpu) case PSCI_0_2_FN_SYSTEM_OFF: case PSCI_0_2_FN_SYSTEM_RESET: case PSCI_1_0_FN_PSCI_FEATURES: + case PSCI_1_0_FN_SYSTEM_SUSPEND: + case PSCI_1_0_FN64_SYSTEM_SUSPEND: case ARM_SMCCC_VERSION_FUNC_ID: val = 0; break; @@ -347,10 +401,16 @@ static int kvm_psci_1_0_call(struct kvm_vcpu *vcpu) break; } break; + case PSCI_1_0_FN_SYSTEM_SUSPEND: + kvm_psci_narrow_to_32bit(vcpu); + fallthrough; + case PSCI_1_0_FN64_SYSTEM_SUSPEND: + return kvm_psci_system_suspend(vcpu); default: return kvm_psci_0_2_call(vcpu); } +out: smccc_set_retval(vcpu, val, 0, 0, 0); return ret; } diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index a067410ebea5..052b0e717b08 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -433,6 +433,7 @@ struct kvm_run { #define KVM_SYSTEM_EVENT_SHUTDOWN 1 #define KVM_SYSTEM_EVENT_RESET 2 #define KVM_SYSTEM_EVENT_CRASH 3 +#define KVM_SYSTEM_EVENT_SUSPEND 4 __u32 type; __u64 flags; } system_event; @@ -1112,6 +1113,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_BINARY_STATS_FD 203 #define KVM_CAP_EXIT_ON_EMULATION_FAILURE 204 #define KVM_CAP_ARM_MTE 205 +#define KVM_CAP_ARM_SYSTEM_SUSPEND 206 #ifdef KVM_CAP_IRQ_ROUTING From patchwork Thu Sep 23 19:16:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 12513597 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 45D73C433F5 for ; Thu, 23 Sep 2021 19:16:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2D3EF61267 for ; Thu, 23 Sep 2021 19:16:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242901AbhIWTR5 (ORCPT ); Thu, 23 Sep 2021 15:17:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58612 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242823AbhIWTR4 (ORCPT ); Thu, 23 Sep 2021 15:17:56 -0400 Received: from mail-qk1-x749.google.com (mail-qk1-x749.google.com [IPv6:2607:f8b0:4864:20::749]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 725F8C061574 for ; Thu, 23 Sep 2021 12:16:24 -0700 (PDT) Received: by mail-qk1-x749.google.com with SMTP id bj32-20020a05620a192000b00433162e24d3so22122632qkb.8 for ; Thu, 23 Sep 2021 12:16:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=v6kM0fZgFnMyPqKLqGMM9XheburKn9OIi6ceURW+v10=; b=SxvLmQcN/i/qz9DPGEK003POrfs0mMcW82MLGenxyYOgKsjnbvZtZQ6Wpgks5XGJOE W5asMYsTjt+s3OgBeqJ2/1yKPGljqkXFAywEZ5hwj1p7R/XU1oh6zk2GtVfHXXFI0FE6 ZvXmp5RhKJ1e2Lm/7c8z2l1DhzVC9T2fsO7DHaJi3H3c+3TvoGK8wy7SodQzP26Hv5L4 jmO1VTEJLN9+zfEISbyg9chov7GbnmmMpRX3gpIqPrW8t0UkHQqf73l6CwsXApPsVoO9 V37FzJS89cVsBUauJ9ca3SeLYfUom+mQRXoI6m9PNVKiDipyUpSU/M+9AEPlHUrPdLTi cMkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=v6kM0fZgFnMyPqKLqGMM9XheburKn9OIi6ceURW+v10=; b=IRQWlq1NOy0xnK7Got1VbBIYV6c1ATuLGVwh1kx2GuAnv+6H1U6oryNik4EgP+ugJI pJBwqZaVVo8xVriQBi0JTjqFS0OU7H8IwzBBJOnzgznpO8s3q1isEJCphsAEXWj73DKX UgLydoVlxhgxwwKizwqgOgXIACRKxcHfI5YqREnUu0crao8OhQ/03F3MYv6vW3WeDOUA G41gNZo1JGV9Fy/O+nBo5zutYihrwoLd5AV76/q89s1npAFuDFEFfdc0qTvP9mS8pqus zxxGBgQYrUTOj/t9i6SrHdZWVcdHHTK9L9ns4AzPSCjhHwwI4uCNFqF/8WwtXi8l8frX bQ6A== X-Gm-Message-State: AOAM530qLejHYupQiE0zAu5y/gmvK1rrNqxUGW7F9XTDZ1Z5+ci0ZKxg A30w5hnG1xwYQLXeNhQsTVrQLalBdfA= X-Google-Smtp-Source: ABdhPJzkNSt2TQe/+BhleFUDyUx1HG5HAWzMvUvoxORmPFlzErhgqo3pu+ogu/d1eiq9Dtg0dRjls5m0EPU= X-Received: from oupton.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:404]) (user=oupton job=sendgmr) by 2002:a05:6214:1271:: with SMTP id r17mr5988466qvv.48.1632424583699; Thu, 23 Sep 2021 12:16:23 -0700 (PDT) Date: Thu, 23 Sep 2021 19:16:06 +0000 In-Reply-To: <20210923191610.3814698-1-oupton@google.com> Message-Id: <20210923191610.3814698-8-oupton@google.com> Mime-Version: 1.0 References: <20210923191610.3814698-1-oupton@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v2 07/11] selftests: KVM: Rename psci_cpu_on_test to psci_test From: Oliver Upton To: kvmarm@lists.cs.columbia.edu Cc: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Andrew Jones , Peter Shier , Ricardo Koller , Reiji Watanabe , Raghavendra Rao Anata , kvm@vger.kernel.org, Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org There are other interactions with PSCI worth testing; rename the PSCI test to make it more generic. No functional change intended. Signed-off-by: Oliver Upton Reviewed-by: Andrew Jones --- tools/testing/selftests/kvm/.gitignore | 2 +- tools/testing/selftests/kvm/Makefile | 2 +- .../selftests/kvm/aarch64/{psci_cpu_on_test.c => psci_test.c} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename tools/testing/selftests/kvm/aarch64/{psci_cpu_on_test.c => psci_test.c} (100%) diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore index 98053d3afbda..a11b89be744b 100644 --- a/tools/testing/selftests/kvm/.gitignore +++ b/tools/testing/selftests/kvm/.gitignore @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only /aarch64/debug-exceptions /aarch64/get-reg-list -/aarch64/psci_cpu_on_test +/aarch64/psci_test /aarch64/vgic_init /s390x/memop /s390x/resets diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index 5d05801ab816..6907ee8f3239 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -86,7 +86,7 @@ TEST_GEN_PROGS_x86_64 += kvm_binary_stats_test TEST_GEN_PROGS_aarch64 += aarch64/debug-exceptions TEST_GEN_PROGS_aarch64 += aarch64/get-reg-list -TEST_GEN_PROGS_aarch64 += aarch64/psci_cpu_on_test +TEST_GEN_PROGS_aarch64 += aarch64/psci_test TEST_GEN_PROGS_aarch64 += aarch64/vgic_init TEST_GEN_PROGS_aarch64 += demand_paging_test TEST_GEN_PROGS_aarch64 += dirty_log_test diff --git a/tools/testing/selftests/kvm/aarch64/psci_cpu_on_test.c b/tools/testing/selftests/kvm/aarch64/psci_test.c similarity index 100% rename from tools/testing/selftests/kvm/aarch64/psci_cpu_on_test.c rename to tools/testing/selftests/kvm/aarch64/psci_test.c From patchwork Thu Sep 23 19:16:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 12513599 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5BA98C4332F for ; Thu, 23 Sep 2021 19:16:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3B7E561267 for ; Thu, 23 Sep 2021 19:16:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242914AbhIWTR6 (ORCPT ); Thu, 23 Sep 2021 15:17:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58622 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242893AbhIWTR5 (ORCPT ); Thu, 23 Sep 2021 15:17:57 -0400 Received: from mail-il1-x149.google.com (mail-il1-x149.google.com [IPv6:2607:f8b0:4864:20::149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5DC90C061574 for ; Thu, 23 Sep 2021 12:16:25 -0700 (PDT) Received: by mail-il1-x149.google.com with SMTP id l15-20020a92700f000000b0024a1248ff32so6429828ilc.3 for ; Thu, 23 Sep 2021 12:16:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=28XapU7Qy1HFML0bBbt9WPb9dnxO7sUl2xbsppEhQxg=; b=RRnRDt//vAwv4swuk1T7oNePDf9EWQ5rz//8fj83VdXDurw1W6FMRd2Ask1PWespLp yNgM5gnnCy1Idg5Px3SknnBN8X3QC9rem95N+0RE/mrFBxrXnP86GYeVEbHM/AsWUupz HW14c2yPJmTbtCVlBd6vGfMVhoNaI+ySSWNJqPnpEqiBYBbwSEafXC6MzXLVkQCgVtNm wbVw5SIuLsUHuB4G5qkYg2IK36YrMVV/gGQFzsVztIiTFqs5Z8O78NXoAGuX6v8E2wPd AWFoKeQq2T+kkqbvxm1qvrVNwzpiBl3TiWOFDFY3GJxaUQaHokYU9w0SYxpJusUs+CIy nIJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=28XapU7Qy1HFML0bBbt9WPb9dnxO7sUl2xbsppEhQxg=; b=GeSMSGnQXuBrRiw6b2Dxohfp0DEOl2OWj8U4LnnsWqHWJl8Dw7Z6AohJOoW60Ospr7 Zx+mRuNi55sQlYUqGtcKoVaRGCq4J2rqgV3sueYqDXBaPZcVTjzjQacJSpMpN5QBf82y qfe99NBFjBFhaZ8KTAYEPbZ3HwbhANUiO2Xz/DAQstTbg/UDOmF1A+s634pZqq8TltWZ 2eckOhFsCQz0tRg6vpHL3BHVcWfgYcM/cG8mMcKaGywuMy10rXnrhw2VQyJL7OfNLjUQ OtQ/6u6aGtJVQXa1JKhoNRG9CL8zb7A+5Qkye7yITuG3Yxuoz42wdGoO/0TEaItkkF+X GhhA== X-Gm-Message-State: AOAM530BOg/bvIUm8hPZM5qbcKDYaN3iVYHNvG+ohk9PUCe8+bhRdv5m 1m8JqOpDcZUU+/NmZcgJXhDCbRUcLUk= X-Google-Smtp-Source: ABdhPJxGFgrdkgX9nD2aNrum//BG+HOZx6Kp3J98KdfJ27C88ZOISaxVhgqEuvnNvEOBgrwdhwn5fhca0QI= X-Received: from oupton.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:404]) (user=oupton job=sendgmr) by 2002:a6b:7710:: with SMTP id n16mr5291423iom.101.1632424584726; Thu, 23 Sep 2021 12:16:24 -0700 (PDT) Date: Thu, 23 Sep 2021 19:16:07 +0000 In-Reply-To: <20210923191610.3814698-1-oupton@google.com> Message-Id: <20210923191610.3814698-9-oupton@google.com> Mime-Version: 1.0 References: <20210923191610.3814698-1-oupton@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v2 08/11] selftests: KVM: Create helper for making SMCCC calls From: Oliver Upton To: kvmarm@lists.cs.columbia.edu Cc: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Andrew Jones , Peter Shier , Ricardo Koller , Reiji Watanabe , Raghavendra Rao Anata , kvm@vger.kernel.org, Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org The PSCI and PV stolen time tests both need to make SMCCC calls within the guest. Create a helper for making SMCCC calls and rework the existing tests to use the library function. Signed-off-by: Oliver Upton Reviewed-by: Andrew Jones --- .../testing/selftests/kvm/aarch64/psci_test.c | 25 ++++++------------- .../selftests/kvm/include/aarch64/processor.h | 22 ++++++++++++++++ .../selftests/kvm/lib/aarch64/processor.c | 25 +++++++++++++++++++ tools/testing/selftests/kvm/steal_time.c | 13 +++------- 4 files changed, 58 insertions(+), 27 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/psci_test.c b/tools/testing/selftests/kvm/aarch64/psci_test.c index 018c269990e1..cebea7356e5a 100644 --- a/tools/testing/selftests/kvm/aarch64/psci_test.c +++ b/tools/testing/selftests/kvm/aarch64/psci_test.c @@ -26,32 +26,23 @@ static uint64_t psci_cpu_on(uint64_t target_cpu, uint64_t entry_addr, uint64_t context_id) { - register uint64_t x0 asm("x0") = PSCI_0_2_FN64_CPU_ON; - register uint64_t x1 asm("x1") = target_cpu; - register uint64_t x2 asm("x2") = entry_addr; - register uint64_t x3 asm("x3") = context_id; + struct arm_smccc_res res; - asm("hvc #0" - : "=r"(x0) - : "r"(x0), "r"(x1), "r"(x2), "r"(x3) - : "memory"); + smccc_hvc(PSCI_0_2_FN64_CPU_ON, target_cpu, entry_addr, context_id, + 0, 0, 0, 0, &res); - return x0; + return res.a0; } static uint64_t psci_affinity_info(uint64_t target_affinity, uint64_t lowest_affinity_level) { - register uint64_t x0 asm("x0") = PSCI_0_2_FN64_AFFINITY_INFO; - register uint64_t x1 asm("x1") = target_affinity; - register uint64_t x2 asm("x2") = lowest_affinity_level; + struct arm_smccc_res res; - asm("hvc #0" - : "=r"(x0) - : "r"(x0), "r"(x1), "r"(x2) - : "memory"); + smccc_hvc(PSCI_0_2_FN64_AFFINITY_INFO, target_affinity, lowest_affinity_level, + 0, 0, 0, 0, 0, &res); - return x0; + return res.a0; } static void guest_main(uint64_t target_cpu) diff --git a/tools/testing/selftests/kvm/include/aarch64/processor.h b/tools/testing/selftests/kvm/include/aarch64/processor.h index c0273aefa63d..e6b7cb65d158 100644 --- a/tools/testing/selftests/kvm/include/aarch64/processor.h +++ b/tools/testing/selftests/kvm/include/aarch64/processor.h @@ -132,4 +132,26 @@ void vm_install_sync_handler(struct kvm_vm *vm, #define isb() asm volatile("isb" : : : "memory") +/** + * struct arm_smccc_res - Result from SMC/HVC call + * @a0-a3 result values from registers 0 to 3 + */ +struct arm_smccc_res { + unsigned long a0; + unsigned long a1; + unsigned long a2; + unsigned long a3; +}; + +/** + * smccc_hvc - Invoke a SMCCC function using the hvc conduit + * @function_id: the SMCCC function to be called + * @arg0-arg6: SMCCC function arguments, corresponding to registers x1-x7 + * @res: pointer to write the return values from registers x0-x3 + * + */ +void smccc_hvc(uint32_t function_id, uint64_t arg0, uint64_t arg1, + uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, + uint64_t arg6, struct arm_smccc_res *res); + #endif /* SELFTEST_KVM_PROCESSOR_H */ diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c index 632b74d6b3ca..f77430e2d688 100644 --- a/tools/testing/selftests/kvm/lib/aarch64/processor.c +++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c @@ -426,3 +426,28 @@ void vm_install_exception_handler(struct kvm_vm *vm, int vector, assert(vector < VECTOR_NUM); handlers->exception_handlers[vector][0] = handler; } + +void smccc_hvc(uint32_t function_id, uint64_t arg0, uint64_t arg1, + uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, + uint64_t arg6, struct arm_smccc_res *res) +{ + asm volatile("mov w0, %w[function_id]\n" + "mov x1, %[arg0]\n" + "mov x2, %[arg1]\n" + "mov x3, %[arg2]\n" + "mov x4, %[arg3]\n" + "mov x5, %[arg4]\n" + "mov x6, %[arg5]\n" + "mov x7, %[arg6]\n" + "hvc #0\n" + "mov %[res0], x0\n" + "mov %[res1], x1\n" + "mov %[res2], x2\n" + "mov %[res3], x3\n" + : [res0] "=r"(res->a0), [res1] "=r"(res->a1), + [res2] "=r"(res->a2), [res3] "=r"(res->a3) + : [function_id] "r"(function_id), [arg0] "r"(arg0), + [arg1] "r"(arg1), [arg2] "r"(arg2), [arg3] "r"(arg3), + [arg4] "r"(arg4), [arg5] "r"(arg5), [arg6] "r"(arg6) + : "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7"); +} diff --git a/tools/testing/selftests/kvm/steal_time.c b/tools/testing/selftests/kvm/steal_time.c index ecec30865a74..5d52b82226c5 100644 --- a/tools/testing/selftests/kvm/steal_time.c +++ b/tools/testing/selftests/kvm/steal_time.c @@ -120,17 +120,10 @@ struct st_time { static int64_t smccc(uint32_t func, uint32_t arg) { - unsigned long ret; + struct arm_smccc_res res; - asm volatile( - "mov x0, %1\n" - "mov x1, %2\n" - "hvc #0\n" - "mov %0, x0\n" - : "=r" (ret) : "r" (func), "r" (arg) : - "x0", "x1", "x2", "x3"); - - return ret; + smccc_hvc(func, arg, 0, 0, 0, 0, 0, 0, &res); + return res.a0; } static void check_status(struct st_time *st) From patchwork Thu Sep 23 19:16:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 12513601 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 64976C433F5 for ; Thu, 23 Sep 2021 19:16:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4DEF061269 for ; Thu, 23 Sep 2021 19:16:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242884AbhIWTR7 (ORCPT ); Thu, 23 Sep 2021 15:17:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58638 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242905AbhIWTR6 (ORCPT ); Thu, 23 Sep 2021 15:17:58 -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 836BDC061760 for ; Thu, 23 Sep 2021 12:16:26 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id b5-20020a251b05000000b005b575f23711so299297ybb.4 for ; Thu, 23 Sep 2021 12:16:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=U2ldqwBk17qF8sMmjm/VY0u4QjSaXwIWBiVrOhl2aZs=; b=aEtYZFNlk3fZGcGLyul66+37tVVs2OtdlmTMOFzR2aXZyttrz3WoXvPMSl5r59JVyr lIofk16aP6VLef+gS0F9CkKgZ7hABCK+Rh/V2Q+sWPWMS+M9XxMjtl7tcNtzpH/L+9Ga kGqqY7A9jcOtnmWYAO7yMEtvU5mkYU18D5imyfI12VJ7u3J0LuQ00migBbwJ2pCVXJYl 5nB5RpbcYqwQw63BrLFwNwTf77KzNWCJfFpdtlHyTeTJ2WGrfUIHUxaTI7SKZ9auWh5z rH7CwUiKVqJwjr35Q8nYg2SrDlg2hIQxRq5uu25QIr15QI4z7yYrQyG5ITq+tTcqrKIP ogNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=U2ldqwBk17qF8sMmjm/VY0u4QjSaXwIWBiVrOhl2aZs=; b=YBhtSjxOZAqb+C7zXfxHY0LA7/NoVJV05khbxO/76pCU9lpkhe89yTGP/dxjBumbgO flVIIrzRt8ld3V8ek2LbqJdpt0fzAxJAGetfxupmTYyK5NoCxAxfdkQ0Fra4NRwUQtLC afy134mktT5ncF9GH4azciKajB2FbAVvoyEBxUE0RH5G282d9IA5fStu5wRNMckQnBKR oCwkkkjZ48og4wizBfiv8LlGPFiXYcjWvP7KlWeJz5Y+8MJmqhWEhWNyTJd84w1Jpe/p 8yBa7wBRM9ojZYpn4UUOFf92j61exlv01DDQBF2FSj1UBmz6l2aXfUMn+yhq/dMvXOuM +z0A== X-Gm-Message-State: AOAM530WYzL7V9eD+KZSBox+1PasNfoIa18BfGjx24pvHj3GNOdU7uzN UjLIL6iDMkwHJclszStlFT/n+2PNJ78= X-Google-Smtp-Source: ABdhPJyqHXosu+dqAJLT4LzmBg3B50Oe9S3R7psdBVQf0KyXF99CbnJiJj78oOxsVMiagI2g5lP3Ar5SRqI= X-Received: from oupton.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:404]) (user=oupton job=sendgmr) by 2002:a25:c753:: with SMTP id w80mr7792105ybe.245.1632424585769; Thu, 23 Sep 2021 12:16:25 -0700 (PDT) Date: Thu, 23 Sep 2021 19:16:08 +0000 In-Reply-To: <20210923191610.3814698-1-oupton@google.com> Message-Id: <20210923191610.3814698-10-oupton@google.com> Mime-Version: 1.0 References: <20210923191610.3814698-1-oupton@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v2 09/11] selftests: KVM: Use KVM_SET_MP_STATE to power off vCPU in psci_test From: Oliver Upton To: kvmarm@lists.cs.columbia.edu Cc: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Andrew Jones , Peter Shier , Ricardo Koller , Reiji Watanabe , Raghavendra Rao Anata , kvm@vger.kernel.org, Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Setting a vCPU's MP state to KVM_MP_STATE_STOPPED has the effect of powering off the vCPU. Rather than using the vCPU init feature flag, use the KVM_SET_MP_STATE ioctl to power off the target vCPU. Signed-off-by: Oliver Upton --- tools/testing/selftests/kvm/aarch64/psci_test.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/psci_test.c b/tools/testing/selftests/kvm/aarch64/psci_test.c index cebea7356e5a..8d043e12b137 100644 --- a/tools/testing/selftests/kvm/aarch64/psci_test.c +++ b/tools/testing/selftests/kvm/aarch64/psci_test.c @@ -60,6 +60,15 @@ static void guest_main(uint64_t target_cpu) GUEST_DONE(); } +static void vcpu_power_off(struct kvm_vm *vm, uint32_t vcpuid) +{ + struct kvm_mp_state mp_state = { + .mp_state = KVM_MP_STATE_STOPPED, + }; + + vcpu_set_mp_state(vm, vcpuid, &mp_state); +} + int main(void) { uint64_t target_mpidr, obs_pc, obs_x0; @@ -75,12 +84,12 @@ int main(void) init.features[0] |= (1 << KVM_ARM_VCPU_PSCI_0_2); aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_main); + aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_main); /* * make sure the target is already off when executing the test. */ - init.features[0] |= (1 << KVM_ARM_VCPU_POWER_OFF); - aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_main); + vcpu_power_off(vm, VCPU_ID_TARGET); get_reg(vm, VCPU_ID_TARGET, ARM64_SYS_REG(MPIDR_EL1), &target_mpidr); vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK); From patchwork Thu Sep 23 19:16:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 12513603 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CCCD1C43217 for ; Thu, 23 Sep 2021 19:16:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BAFCA61269 for ; Thu, 23 Sep 2021 19:16:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242935AbhIWTSA (ORCPT ); Thu, 23 Sep 2021 15:18:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58646 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242917AbhIWTR7 (ORCPT ); Thu, 23 Sep 2021 15:17:59 -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 C046EC061574 for ; Thu, 23 Sep 2021 12:16:27 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id 63-20020a250d42000000b0059dc43162c9so298999ybn.23 for ; Thu, 23 Sep 2021 12:16:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=RpCaoc9NjAjS8EPpoMHzceVcM/1k9Q8w60NaBShbdjk=; b=co+l9oAZ6355c5KhVTyfzYGWYP4Nz4ZFxvDXKSvChvxDr80DIEgkapPvd97PPbdvea VOZss+k6ebLGG56OKre3eSslEiClTm8WuzSWmupPzatR6i0tjpNlx5ocuWQPAIwGisvC ZUo8fhiOkMNAHNBGjLsjxvkmyAAAXyXzsd/cdzxRVBqRtps4eqF5BzcPy81nrqx6/bH6 sBcJqbW1Sy4SinO0XY0qnxlxnSNSAakTfL+Bry8VNLW66ZM5XfDwH7xMgN9RzCDzvkMU PdiANmn/wMNAHVhRhoNTb6qWJBxiYdXY14otq5o+X9aKtS3x21wgZQXTulAAN7RCtrDZ Yrlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=RpCaoc9NjAjS8EPpoMHzceVcM/1k9Q8w60NaBShbdjk=; b=TJBk/AcdWIwgyhrdkuwiRkmRHWxpawhqsfbCikpoQV1nQyMV1A+2ozaS46RmlEC6/d d0LcX1LCzBzPDn/5Db/WA3qh3UN76vGTwG3v/MUkFTMitOaj0DtF3R5zfWe6mtEQ5TDZ 6DlIQkC556fRtWwYvfxKZ9+rHgOXL6HdvEHSt+NFaOS6jqzZ04jP8ztDoeO0QkDjnw2X 4b7uPYrtczJy2ZxlRxprlaLDuZIVlIdcZJh0YSvwyQJYxH57OLh4K7qxcpPHF27dLKoI snt4DuxxEmXsKd4NB1ai9d1Y7yMoqZPraAphcmSXzDc2se/fgC0bqju/f7S3YqEO6PQW 2Iew== X-Gm-Message-State: AOAM532qP0EYyfTJreXjIx3fYOKq9Y/qkTQUf4vaBB2InhPhp/suzzUw CmZYIhPerSkcW5Am2sScTg4nnO3cIJQ= X-Google-Smtp-Source: ABdhPJwtQ6SLPk6GlotikeJMiXCr9jbW1lJ4tjuIL9GlrCgGr5LzgSgMMJ90sHZpVANG5pT8u15504jtnvM= X-Received: from oupton.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:404]) (user=oupton job=sendgmr) by 2002:a25:dd6:: with SMTP id 205mr7437042ybn.82.1632424586935; Thu, 23 Sep 2021 12:16:26 -0700 (PDT) Date: Thu, 23 Sep 2021 19:16:09 +0000 In-Reply-To: <20210923191610.3814698-1-oupton@google.com> Message-Id: <20210923191610.3814698-11-oupton@google.com> Mime-Version: 1.0 References: <20210923191610.3814698-1-oupton@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v2 10/11] selftests: KVM: Refactor psci_test to make it amenable to new tests From: Oliver Upton To: kvmarm@lists.cs.columbia.edu Cc: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Andrew Jones , Peter Shier , Ricardo Koller , Reiji Watanabe , Raghavendra Rao Anata , kvm@vger.kernel.org, Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Split up the current test into several helpers that will be useful to subsequent test cases added to the PSCI test suite. Signed-off-by: Oliver Upton Reviewed-by: Andrew Jones --- .../testing/selftests/kvm/aarch64/psci_test.c | 68 ++++++++++++------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/psci_test.c b/tools/testing/selftests/kvm/aarch64/psci_test.c index 8d043e12b137..90312be335da 100644 --- a/tools/testing/selftests/kvm/aarch64/psci_test.c +++ b/tools/testing/selftests/kvm/aarch64/psci_test.c @@ -45,7 +45,7 @@ static uint64_t psci_affinity_info(uint64_t target_affinity, return res.a0; } -static void guest_main(uint64_t target_cpu) +static void guest_test_cpu_on(uint64_t target_cpu) { GUEST_ASSERT(!psci_cpu_on(target_cpu, CPU_ON_ENTRY_ADDR, CPU_ON_CONTEXT_ID)); uint64_t target_state; @@ -69,12 +69,10 @@ static void vcpu_power_off(struct kvm_vm *vm, uint32_t vcpuid) vcpu_set_mp_state(vm, vcpuid, &mp_state); } -int main(void) +static struct kvm_vm *setup_vm(void *guest_code) { - uint64_t target_mpidr, obs_pc, obs_x0; struct kvm_vcpu_init init; struct kvm_vm *vm; - struct ucall uc; vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES, O_RDWR); kvm_vm_elf_load(vm, program_invocation_name); @@ -83,31 +81,28 @@ int main(void) vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init); init.features[0] |= (1 << KVM_ARM_VCPU_PSCI_0_2); - aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_main); - aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_main); + aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_code); + aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_code); - /* - * make sure the target is already off when executing the test. - */ - vcpu_power_off(vm, VCPU_ID_TARGET); + return vm; +} - get_reg(vm, VCPU_ID_TARGET, ARM64_SYS_REG(MPIDR_EL1), &target_mpidr); - vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK); - vcpu_run(vm, VCPU_ID_SOURCE); +static void enter_guest(struct kvm_vm *vm, uint32_t vcpuid) +{ + struct ucall uc; - switch (get_ucall(vm, VCPU_ID_SOURCE, &uc)) { - case UCALL_DONE: - break; - case UCALL_ABORT: + vcpu_run(vm, vcpuid); + if (get_ucall(vm, vcpuid, &uc) == UCALL_ABORT) TEST_FAIL("%s at %s:%ld", (const char *)uc.args[0], __FILE__, uc.args[1]); - break; - default: - TEST_FAIL("Unhandled ucall: %lu", uc.cmd); - } +} - get_reg(vm, VCPU_ID_TARGET, ARM64_CORE_REG(regs.pc), &obs_pc); - get_reg(vm, VCPU_ID_TARGET, ARM64_CORE_REG(regs.regs[0]), &obs_x0); +static void assert_vcpu_reset(struct kvm_vm *vm, uint32_t vcpuid) +{ + uint64_t obs_pc, obs_x0; + + get_reg(vm, vcpuid, ARM64_CORE_REG(regs.pc), &obs_pc); + get_reg(vm, vcpuid, ARM64_CORE_REG(regs.regs[0]), &obs_x0); TEST_ASSERT(obs_pc == CPU_ON_ENTRY_ADDR, "unexpected target cpu pc: %lx (expected: %lx)", @@ -115,7 +110,34 @@ int main(void) TEST_ASSERT(obs_x0 == CPU_ON_CONTEXT_ID, "unexpected target context id: %lx (expected: %lx)", obs_x0, CPU_ON_CONTEXT_ID); +} +static void host_test_cpu_on(void) +{ + uint64_t target_mpidr; + struct kvm_vm *vm; + struct ucall uc; + + vm = setup_vm(guest_test_cpu_on); + + /* + * make sure the target is already off when executing the test. + */ + vcpu_power_off(vm, VCPU_ID_TARGET); + + get_reg(vm, VCPU_ID_TARGET, ARM64_SYS_REG(MPIDR_EL1), &target_mpidr); + vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK); + enter_guest(vm, VCPU_ID_SOURCE); + + if (get_ucall(vm, VCPU_ID_SOURCE, &uc) != UCALL_DONE) + TEST_FAIL("Unhandled ucall: %lu", uc.cmd); + + assert_vcpu_reset(vm, VCPU_ID_TARGET); kvm_vm_free(vm); +} + +int main(void) +{ + host_test_cpu_on(); return 0; } From patchwork Thu Sep 23 19:16:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Upton X-Patchwork-Id: 12513605 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 414B5C4332F for ; Thu, 23 Sep 2021 19:16:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3074D6126A for ; Thu, 23 Sep 2021 19:16:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242911AbhIWTSB (ORCPT ); Thu, 23 Sep 2021 15:18:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58650 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242929AbhIWTSA (ORCPT ); Thu, 23 Sep 2021 15:18:00 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C43B2C061574 for ; Thu, 23 Sep 2021 12:16:28 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id i77-20020a25d150000000b005b1d20152b0so299874ybg.14 for ; Thu, 23 Sep 2021 12:16:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=iaLxJyQl/R2XLxgbK/Yc9KCKg/FcSd6fsVvahhw1gbk=; b=MqZIRMrNmbaHF93vIL8MIjYz2FQMq964YhsWtPj5J9/0PZjaTBZpanOXfeFLtiaHD6 Hsgb+G10pPVRL3jFu9SHOfUQVSQ7fGYx/a82WtqnoWdfGLYU2XoGYrqILas2jRPIB+/E kmYvDT8rmmUHm2NSVM0jhH3pOM6ZobF3TeTwVtJtYZKa9pvK+gVSBWawg72Bvnql/ZaW jnudsfUiXLzKsyUzFN8yATBQoCq2+iJdo2ChUcjejGtjDrjsCYIVX1iLmpqv2SVDf9/r WOpKinDu5OyTWsFnWFIcnGYP9vXMkQFAcN6ygsEvgfxniC2rcaMQlYG0BigOBa9xfF8s uPdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=iaLxJyQl/R2XLxgbK/Yc9KCKg/FcSd6fsVvahhw1gbk=; b=m7QDqGMT8MPLkjzGHs4sy38ADFDwffNZ0J4X0gfqam3aH9x1KKbKxsJ5EryrhCwZuZ 0ZFQF4oPECCsr/E4H3qdgqkYH/cp/NGAJ4DC8UeEWTr/eMzuYQ+n2lxjN7tC/qfb5AwO qFN9X0EDmX05JQzLhmEVjDbGbi2O/0bcjbaHLxsRJTcWU5DO0GDd0xZXs2MLMerJ/OCR qa2TFIukXPf+I+zQ+bQDLuYW7V5WJ0GZv50G6oSodUsZIP3WOr6FqptRp1hh1Y4E/qVN nA+gDhn0DuEuU1cHktzp5QK+L2XSXQknRcSU7F2nPjBN/Qb8bWjT9DLamcMBfLbKuxQm HXUQ== X-Gm-Message-State: AOAM531hXPSWiKb5m+GJc2NzxTQGie8FF3SK81158Yoz8z4mGI5r/kyK lPXtiNw+nXgn7ys87Q42fAdedCbFuLo= X-Google-Smtp-Source: ABdhPJyjXGf6r7078NOSI+fwirDQAYTFCKMH/ZKp0jWghQ7m5qJfBJ9PqydzFMi5FrxM+rw+lmH3oJ2XpIA= X-Received: from oupton.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:404]) (user=oupton job=sendgmr) by 2002:a25:2d4c:: with SMTP id s12mr7301465ybe.350.1632424587972; Thu, 23 Sep 2021 12:16:27 -0700 (PDT) Date: Thu, 23 Sep 2021 19:16:10 +0000 In-Reply-To: <20210923191610.3814698-1-oupton@google.com> Message-Id: <20210923191610.3814698-12-oupton@google.com> Mime-Version: 1.0 References: <20210923191610.3814698-1-oupton@google.com> X-Mailer: git-send-email 2.33.0.685.g46640cef36-goog Subject: [PATCH v2 11/11] selftests: KVM: Test SYSTEM_SUSPEND PSCI call From: Oliver Upton To: kvmarm@lists.cs.columbia.edu Cc: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Andrew Jones , Peter Shier , Ricardo Koller , Reiji Watanabe , Raghavendra Rao Anata , kvm@vger.kernel.org, Oliver Upton Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Assert that the vCPU exits to userspace with KVM_SYSTEM_EVENT_SUSPEND if it correctly executes the SYSTEM_SUSPEND PSCI call. Additionally, assert that the guest PSCI call fails if preconditions are not met (more than 1 running vCPU). Signed-off-by: Oliver Upton --- .../testing/selftests/kvm/aarch64/psci_test.c | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tools/testing/selftests/kvm/aarch64/psci_test.c b/tools/testing/selftests/kvm/aarch64/psci_test.c index 90312be335da..5b881ca4d102 100644 --- a/tools/testing/selftests/kvm/aarch64/psci_test.c +++ b/tools/testing/selftests/kvm/aarch64/psci_test.c @@ -45,6 +45,16 @@ static uint64_t psci_affinity_info(uint64_t target_affinity, return res.a0; } +static uint64_t psci_system_suspend(uint64_t entry_addr, uint64_t context_id) +{ + struct arm_smccc_res res; + + smccc_hvc(PSCI_1_0_FN64_SYSTEM_SUSPEND, entry_addr, context_id, + 0, 0, 0, 0, 0, &res); + + return res.a0; +} + static void guest_test_cpu_on(uint64_t target_cpu) { GUEST_ASSERT(!psci_cpu_on(target_cpu, CPU_ON_ENTRY_ADDR, CPU_ON_CONTEXT_ID)); @@ -69,6 +79,13 @@ static void vcpu_power_off(struct kvm_vm *vm, uint32_t vcpuid) vcpu_set_mp_state(vm, vcpuid, &mp_state); } +static void guest_test_system_suspend(void) +{ + uint64_t r = psci_system_suspend(CPU_ON_ENTRY_ADDR, CPU_ON_CONTEXT_ID); + + GUEST_SYNC(r); +} + static struct kvm_vm *setup_vm(void *guest_code) { struct kvm_vcpu_init init; @@ -136,8 +153,66 @@ static void host_test_cpu_on(void) kvm_vm_free(vm); } +static void enable_system_suspend(struct kvm_vm *vm) +{ + struct kvm_enable_cap cap = { + .cap = KVM_CAP_ARM_SYSTEM_SUSPEND, + }; + + vm_enable_cap(vm, &cap); +} + +static void host_test_system_suspend(void) +{ + struct kvm_run *run; + struct kvm_vm *vm; + + vm = setup_vm(guest_test_system_suspend); + enable_system_suspend(vm); + + vcpu_power_off(vm, VCPU_ID_TARGET); + run = vcpu_state(vm, VCPU_ID_SOURCE); + + enter_guest(vm, VCPU_ID_SOURCE); + + TEST_ASSERT(run->exit_reason == KVM_EXIT_SYSTEM_EVENT, + "Unhandled exit reason: %u (%s)", + run->exit_reason, exit_reason_str(run->exit_reason)); + TEST_ASSERT(run->system_event.type == KVM_SYSTEM_EVENT_SUSPEND, + "Unhandled system event: %u (expected: %u)", + run->system_event.type, KVM_SYSTEM_EVENT_SUSPEND); + + assert_vcpu_reset(vm, VCPU_ID_SOURCE); + kvm_vm_free(vm); +} + +static void host_test_system_suspend_fails(void) +{ + struct kvm_vm *vm; + struct ucall uc; + + vm = setup_vm(guest_test_system_suspend); + enable_system_suspend(vm); + + enter_guest(vm, VCPU_ID_SOURCE); + TEST_ASSERT(get_ucall(vm, VCPU_ID_SOURCE, &uc) == UCALL_SYNC, + "Unhandled ucall: %lu", uc.cmd); + TEST_ASSERT(uc.args[1] == PSCI_RET_DENIED, + "Unrecognized PSCI return code: %lu (expected: %u)", + uc.args[1], PSCI_RET_DENIED); + + kvm_vm_free(vm); +} + int main(void) { + if (!kvm_check_cap(KVM_CAP_ARM_SYSTEM_SUSPEND)) { + print_skip("KVM_CAP_ARM_SYSTEM_SUSPEND not supported"); + exit(KSFT_SKIP); + } + host_test_cpu_on(); + host_test_system_suspend(); + host_test_system_suspend_fails(); return 0; }