From mboxrd@z Thu Jan 1 00:00:00 1970 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 345E1C433EF for ; Tue, 19 Oct 2021 12:13:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1DC146137C for ; Tue, 19 Oct 2021 12:13:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235606AbhJSMPn (ORCPT ); Tue, 19 Oct 2021 08:15:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33246 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235632AbhJSMPh (ORCPT ); Tue, 19 Oct 2021 08:15:37 -0400 Received: from mail-wm1-x34a.google.com (mail-wm1-x34a.google.com [IPv6:2a00:1450:4864:20::34a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B5A46C061768 for ; Tue, 19 Oct 2021 05:13:24 -0700 (PDT) Received: by mail-wm1-x34a.google.com with SMTP id c5-20020a05600c0ac500b0030dba7cafc9so2492642wmr.5 for ; Tue, 19 Oct 2021 05:13: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=ty9iYiagMI0gH20pET1Xndb3iV+CDb06dji5ebe9K8w=; b=SpQpP/yRjdUQxoyHPN7C8cqP88mZaVeLPJ8bNLz3pg1pqcyqLiVJsbc0K2Vjc2jhuQ 2PGXAA+SI+BFXG8WCVUEkCOMHE+olMIAfl/O7rw9/CpMKQ3ycyZbyiqIcqOGev1xjX0N PEgg90LPzx39+XnWldfpg31ucLbcIg1wmtCGmYpSObuVrI1qzD3SzeruVAF1hfcCy/+8 Ij2iODxEL4liU9qZb81s8tlJZ9rIM548MRcoLUE2LPbZmNK/kzfgWJDQYll1z/vSSj11 aZZZauk73uQCoiVzVIT69awzlL+qtPyGpzwKXNXuMBJn77bMEeYOM1FBhCrmd0l57ide dvEQ== 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=ty9iYiagMI0gH20pET1Xndb3iV+CDb06dji5ebe9K8w=; b=iGVMx8VpbfY8gbSiJYf5vLUVp9n+NIJYj4ZPlUxrgfKueSR8oE2bLBn72emtGtYtcI i0BtWgtAYWnP1AZXbdlsDYRYkMiZHCSxkxR6BA0z7Tppi5ffHxR5mgbMPXHuOYU/QL+Q VrYsL4Yw4asqc+lJHzZeqFXHzx6meyKcsQ10PcBBURiRUmcfCoo6A68trA5sm4cg1i7P UDtp3vzzboCgN44OweJr/WOw1Dn9VljQNwEOqGvXBb17RlaJDHaQtZCg1cNvpMclMdXr JvBWv3buFbFNzR4nxzk0cdaKBcXQ2iO7d7lXwBFIW9zp2BOW5bFYXTsfoPO/LN6v4Xfx Z8MA== X-Gm-Message-State: AOAM531VYjjH2VhVYGlleSKYWpio6qiP8lFVXi8NzQ0qhGzBCHBml1Yp gc+OVvyNpMHMS7aHaysoSpKwUDvI3+kO X-Google-Smtp-Source: ABdhPJwYQAu9x65aeAB6QkD0CZV58F2ousV/0NfyOsnnHv4pwVmmNZyY52hWDmpVRmvp0zkLy2sxMRWr0PHi X-Received: from luke.lon.corp.google.com ([2a00:79e0:d:210:59ca:401f:83a8:de6d]) (user=qperret job=sendgmr) by 2002:a7b:c442:: with SMTP id l2mr5662234wmi.131.1634645603276; Tue, 19 Oct 2021 05:13:23 -0700 (PDT) Date: Tue, 19 Oct 2021 13:12:56 +0100 In-Reply-To: <20211019121304.2732332-1-qperret@google.com> Message-Id: <20211019121304.2732332-8-qperret@google.com> Mime-Version: 1.0 References: <20211019121304.2732332-1-qperret@google.com> X-Mailer: git-send-email 2.33.0.1079.g6e70778dc9-goog Subject: [PATCH v2 07/15] KVM: arm64: Introduce kvm_share_hyp() From: Quentin Perret To: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Catalin Marinas , Will Deacon , Fuad Tabba , David Brazdil , Andrew Walbran Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org, kernel-team@android.com, qperret@google.com Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The create_hyp_mappings() function can currently be called at any point in time. However, its behaviour in protected mode changes widely depending on when it is being called. Prior to KVM init, it is used to create the temporary page-table used to bring-up the hypervisor, and later on it is transparently turned into a 'share' hypercall when the kernel has lost control over the hypervisor stage-1. In order to prepare the ground for also unsharing pages with the hypervisor during guest teardown, introduce a kvm_share_hyp() function to make it clear in which places a share hypercall should be expected, as we will soon need a matching unshare hypercall in all those places. Signed-off-by: Quentin Perret --- arch/arm64/include/asm/kvm_mmu.h | 1 + arch/arm64/kvm/arm.c | 4 ++-- arch/arm64/kvm/fpsimd.c | 4 ++-- arch/arm64/kvm/mmu.c | 19 +++++++++++++------ arch/arm64/kvm/reset.c | 2 +- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index 02d378887743..185d0f62b724 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h @@ -150,6 +150,7 @@ static __always_inline unsigned long __kern_hyp_va(unsigned long v) #include #include +int kvm_share_hyp(void *from, void *to); int create_hyp_mappings(void *from, void *to, enum kvm_pgtable_prot prot); int create_hyp_io_mappings(phys_addr_t phys_addr, size_t size, void __iomem **kaddr, diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index e1cc3f8560e7..5312d5a2ef69 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -146,7 +146,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) if (ret) return ret; - ret = create_hyp_mappings(kvm, kvm + 1, PAGE_HYP); + ret = kvm_share_hyp(kvm, kvm + 1); if (ret) goto out_free_stage2_pgd; @@ -343,7 +343,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) if (err) return err; - return create_hyp_mappings(vcpu, vcpu + 1, PAGE_HYP); + return kvm_share_hyp(vcpu, vcpu + 1); } void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) diff --git a/arch/arm64/kvm/fpsimd.c b/arch/arm64/kvm/fpsimd.c index 62c0d78da7be..2fe1128d9f3d 100644 --- a/arch/arm64/kvm/fpsimd.c +++ b/arch/arm64/kvm/fpsimd.c @@ -35,11 +35,11 @@ int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu) * Make sure the host task thread flags and fpsimd state are * visible to hyp: */ - ret = create_hyp_mappings(ti, ti + 1, PAGE_HYP); + ret = kvm_share_hyp(ti, ti + 1); if (ret) goto error; - ret = create_hyp_mappings(fpsimd, fpsimd + 1, PAGE_HYP); + ret = kvm_share_hyp(fpsimd, fpsimd + 1); if (ret) goto error; diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 0019b2309f70..0cc4b295e525 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -299,6 +299,17 @@ static int pkvm_share_hyp(phys_addr_t start, phys_addr_t end) return 0; } +int kvm_share_hyp(void *from, void *to) +{ + if (is_kernel_in_hyp_mode()) + return 0; + + if (kvm_host_owns_hyp_mappings()) + return create_hyp_mappings(from, to, PAGE_HYP); + + return pkvm_share_hyp(kvm_kaddr_to_phys(from), kvm_kaddr_to_phys(to)); +} + /** * create_hyp_mappings - duplicate a kernel virtual address range in Hyp mode * @from: The virtual kernel start address of the range @@ -319,12 +330,8 @@ int create_hyp_mappings(void *from, void *to, enum kvm_pgtable_prot prot) if (is_kernel_in_hyp_mode()) return 0; - if (!kvm_host_owns_hyp_mappings()) { - if (WARN_ON(prot != PAGE_HYP)) - return -EPERM; - return pkvm_share_hyp(kvm_kaddr_to_phys(from), - kvm_kaddr_to_phys(to)); - } + if (!kvm_host_owns_hyp_mappings()) + return -EPERM; start = start & PAGE_MASK; end = PAGE_ALIGN(end); diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c index 59e4c6e819e9..cf781ec9212a 100644 --- a/arch/arm64/kvm/reset.c +++ b/arch/arm64/kvm/reset.c @@ -113,7 +113,7 @@ static int kvm_vcpu_finalize_sve(struct kvm_vcpu *vcpu) if (!buf) return -ENOMEM; - ret = create_hyp_mappings(buf, buf + reg_sz, PAGE_HYP); + ret = kvm_share_hyp(buf, buf + reg_sz); if (ret) { kfree(buf); return ret; -- 2.33.0.1079.g6e70778dc9-goog From mboxrd@z Thu Jan 1 00:00:00 1970 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4DAC1C433EF for ; Tue, 19 Oct 2021 12:13:28 +0000 (UTC) Received: from mm01.cs.columbia.edu (mm01.cs.columbia.edu [128.59.11.253]) by mail.kernel.org (Postfix) with ESMTP id F01376137D for ; Tue, 19 Oct 2021 12:13:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org F01376137D Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.cs.columbia.edu Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id A1CB44B128; Tue, 19 Oct 2021 08:13:27 -0400 (EDT) X-Virus-Scanned: at lists.cs.columbia.edu Authentication-Results: mm01.cs.columbia.edu (amavisd-new); dkim=softfail (fail, message has been altered) header.i=@google.com Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ktNvDlZ4yCw7; Tue, 19 Oct 2021 08:13:26 -0400 (EDT) Received: from mm01.cs.columbia.edu (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 7FABC4B1B2; Tue, 19 Oct 2021 08:13:26 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 33CE54B0CC for ; Tue, 19 Oct 2021 08:13:25 -0400 (EDT) X-Virus-Scanned: at lists.cs.columbia.edu Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 6d0NaDIhaVWJ for ; Tue, 19 Oct 2021 08:13:24 -0400 (EDT) Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) by mm01.cs.columbia.edu (Postfix) with ESMTPS id 1B4E84B0DD for ; Tue, 19 Oct 2021 08:13:24 -0400 (EDT) Received: by mail-wr1-f73.google.com with SMTP id 41-20020adf812c000000b00160dfbfe1a2so10117726wrm.3 for ; Tue, 19 Oct 2021 05:13: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=ty9iYiagMI0gH20pET1Xndb3iV+CDb06dji5ebe9K8w=; b=SpQpP/yRjdUQxoyHPN7C8cqP88mZaVeLPJ8bNLz3pg1pqcyqLiVJsbc0K2Vjc2jhuQ 2PGXAA+SI+BFXG8WCVUEkCOMHE+olMIAfl/O7rw9/CpMKQ3ycyZbyiqIcqOGev1xjX0N PEgg90LPzx39+XnWldfpg31ucLbcIg1wmtCGmYpSObuVrI1qzD3SzeruVAF1hfcCy/+8 Ij2iODxEL4liU9qZb81s8tlJZ9rIM548MRcoLUE2LPbZmNK/kzfgWJDQYll1z/vSSj11 aZZZauk73uQCoiVzVIT69awzlL+qtPyGpzwKXNXuMBJn77bMEeYOM1FBhCrmd0l57ide dvEQ== 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=ty9iYiagMI0gH20pET1Xndb3iV+CDb06dji5ebe9K8w=; b=HF+J5REN3WmAbbEXd7uRVe4vMjNpCvMAxVFaxCAiCcYt8t470NncUt6efqV5GmLnfH iTZgIMwZpSUYNIOmr7VzkI1NtDuKXY9YG217+OPLcA84/raLoa8Z59y+RH8XOqjux5y2 WoCDCsyPR1XNoUvBAh5hJlkegB6IV72Otz/fRtiuh+ZkUYJHbkEED3KDiGr1sgsbON2U VtoTO3bd3i7aobRjTRUKkMjUsxj8kJWnNcdJGgvJWjqpICF2hQhUx+20ID+qiDDl9k1G taOnmntNHJh2dGQJysKoOcQwFKzgtnOa9QYg4m3OGxakoWcMrnCSJjX9xV1hibNgJx/4 4Ppg== X-Gm-Message-State: AOAM533H7Eemi7erZOO/vRJUKhUlQ93hdJEm1/7HIdUAfp4qat7BTjJR tpIavBXrNoRJiQxOCGXlv759mCK4gktr X-Google-Smtp-Source: ABdhPJwYQAu9x65aeAB6QkD0CZV58F2ousV/0NfyOsnnHv4pwVmmNZyY52hWDmpVRmvp0zkLy2sxMRWr0PHi X-Received: from luke.lon.corp.google.com ([2a00:79e0:d:210:59ca:401f:83a8:de6d]) (user=qperret job=sendgmr) by 2002:a7b:c442:: with SMTP id l2mr5662234wmi.131.1634645603276; Tue, 19 Oct 2021 05:13:23 -0700 (PDT) Date: Tue, 19 Oct 2021 13:12:56 +0100 In-Reply-To: <20211019121304.2732332-1-qperret@google.com> Message-Id: <20211019121304.2732332-8-qperret@google.com> Mime-Version: 1.0 References: <20211019121304.2732332-1-qperret@google.com> X-Mailer: git-send-email 2.33.0.1079.g6e70778dc9-goog Subject: [PATCH v2 07/15] KVM: arm64: Introduce kvm_share_hyp() From: Quentin Perret To: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Catalin Marinas , Will Deacon , Fuad Tabba , David Brazdil , Andrew Walbran Cc: kernel-team@android.com, kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org X-BeenThere: kvmarm@lists.cs.columbia.edu X-Mailman-Version: 2.1.14 Precedence: list List-Id: Where KVM/ARM decisions are made List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu The create_hyp_mappings() function can currently be called at any point in time. However, its behaviour in protected mode changes widely depending on when it is being called. Prior to KVM init, it is used to create the temporary page-table used to bring-up the hypervisor, and later on it is transparently turned into a 'share' hypercall when the kernel has lost control over the hypervisor stage-1. In order to prepare the ground for also unsharing pages with the hypervisor during guest teardown, introduce a kvm_share_hyp() function to make it clear in which places a share hypercall should be expected, as we will soon need a matching unshare hypercall in all those places. Signed-off-by: Quentin Perret --- arch/arm64/include/asm/kvm_mmu.h | 1 + arch/arm64/kvm/arm.c | 4 ++-- arch/arm64/kvm/fpsimd.c | 4 ++-- arch/arm64/kvm/mmu.c | 19 +++++++++++++------ arch/arm64/kvm/reset.c | 2 +- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index 02d378887743..185d0f62b724 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h @@ -150,6 +150,7 @@ static __always_inline unsigned long __kern_hyp_va(unsigned long v) #include #include +int kvm_share_hyp(void *from, void *to); int create_hyp_mappings(void *from, void *to, enum kvm_pgtable_prot prot); int create_hyp_io_mappings(phys_addr_t phys_addr, size_t size, void __iomem **kaddr, diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index e1cc3f8560e7..5312d5a2ef69 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -146,7 +146,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) if (ret) return ret; - ret = create_hyp_mappings(kvm, kvm + 1, PAGE_HYP); + ret = kvm_share_hyp(kvm, kvm + 1); if (ret) goto out_free_stage2_pgd; @@ -343,7 +343,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) if (err) return err; - return create_hyp_mappings(vcpu, vcpu + 1, PAGE_HYP); + return kvm_share_hyp(vcpu, vcpu + 1); } void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) diff --git a/arch/arm64/kvm/fpsimd.c b/arch/arm64/kvm/fpsimd.c index 62c0d78da7be..2fe1128d9f3d 100644 --- a/arch/arm64/kvm/fpsimd.c +++ b/arch/arm64/kvm/fpsimd.c @@ -35,11 +35,11 @@ int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu) * Make sure the host task thread flags and fpsimd state are * visible to hyp: */ - ret = create_hyp_mappings(ti, ti + 1, PAGE_HYP); + ret = kvm_share_hyp(ti, ti + 1); if (ret) goto error; - ret = create_hyp_mappings(fpsimd, fpsimd + 1, PAGE_HYP); + ret = kvm_share_hyp(fpsimd, fpsimd + 1); if (ret) goto error; diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 0019b2309f70..0cc4b295e525 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -299,6 +299,17 @@ static int pkvm_share_hyp(phys_addr_t start, phys_addr_t end) return 0; } +int kvm_share_hyp(void *from, void *to) +{ + if (is_kernel_in_hyp_mode()) + return 0; + + if (kvm_host_owns_hyp_mappings()) + return create_hyp_mappings(from, to, PAGE_HYP); + + return pkvm_share_hyp(kvm_kaddr_to_phys(from), kvm_kaddr_to_phys(to)); +} + /** * create_hyp_mappings - duplicate a kernel virtual address range in Hyp mode * @from: The virtual kernel start address of the range @@ -319,12 +330,8 @@ int create_hyp_mappings(void *from, void *to, enum kvm_pgtable_prot prot) if (is_kernel_in_hyp_mode()) return 0; - if (!kvm_host_owns_hyp_mappings()) { - if (WARN_ON(prot != PAGE_HYP)) - return -EPERM; - return pkvm_share_hyp(kvm_kaddr_to_phys(from), - kvm_kaddr_to_phys(to)); - } + if (!kvm_host_owns_hyp_mappings()) + return -EPERM; start = start & PAGE_MASK; end = PAGE_ALIGN(end); diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c index 59e4c6e819e9..cf781ec9212a 100644 --- a/arch/arm64/kvm/reset.c +++ b/arch/arm64/kvm/reset.c @@ -113,7 +113,7 @@ static int kvm_vcpu_finalize_sve(struct kvm_vcpu *vcpu) if (!buf) return -ENOMEM; - ret = create_hyp_mappings(buf, buf + reg_sz, PAGE_HYP); + ret = kvm_share_hyp(buf, buf + reg_sz); if (ret) { kfree(buf); return ret; -- 2.33.0.1079.g6e70778dc9-goog _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm From mboxrd@z Thu Jan 1 00:00:00 1970 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6C813C433EF for ; Tue, 19 Oct 2021 12:17:48 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3784A6135E for ; Tue, 19 Oct 2021 12:17:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 3784A6135E Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject:References: Mime-Version:Message-Id:In-Reply-To:Date:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=Qg8H02eq1q5vtg+HVmS+INLweITDKhwj8eWCoY5E8bY=; b=KP7QpXmyxio4sDVWgqdZnkQ31Z hsWbz9DMDPl2hlVyNulrfuJXSpzmDwY0C2pqnRr7d2NhjvNqUs+KvikBZ/lwm1v4fUlBEIoyrB63Q X9N1kM2GA3CaFcZC4wKEsIFeVJjLraMERYGAkBTUnpWc5F8KW0qA08AS5d30AbiOguP1Krrb7boU6 Q0xNtFvrnrT9nuyCdHGGaodrSAm7v6ZwM33o/a0tFMgJd6mdmOp04C6mNTgg53/4Y6sogrUdUYFia nq7hXIPQ/DXlca6KD4oiCSOjHRnpG6uLgx98eP7/4HISh6uwkQyGfKMCv7uhxcdQklYXh4mZc/soo m0kve8Ag==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mco2K-0016bA-Fq; Tue, 19 Oct 2021 12:16:08 +0000 Received: from mail-wm1-x349.google.com ([2a00:1450:4864:20::349]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mcnzh-0015GH-9M for linux-arm-kernel@lists.infradead.org; Tue, 19 Oct 2021 12:13:26 +0000 Received: by mail-wm1-x349.google.com with SMTP id l39-20020a05600c1d2700b0030dba1dc6eeso1068303wms.7 for ; Tue, 19 Oct 2021 05:13: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=ty9iYiagMI0gH20pET1Xndb3iV+CDb06dji5ebe9K8w=; b=SpQpP/yRjdUQxoyHPN7C8cqP88mZaVeLPJ8bNLz3pg1pqcyqLiVJsbc0K2Vjc2jhuQ 2PGXAA+SI+BFXG8WCVUEkCOMHE+olMIAfl/O7rw9/CpMKQ3ycyZbyiqIcqOGev1xjX0N PEgg90LPzx39+XnWldfpg31ucLbcIg1wmtCGmYpSObuVrI1qzD3SzeruVAF1hfcCy/+8 Ij2iODxEL4liU9qZb81s8tlJZ9rIM548MRcoLUE2LPbZmNK/kzfgWJDQYll1z/vSSj11 aZZZauk73uQCoiVzVIT69awzlL+qtPyGpzwKXNXuMBJn77bMEeYOM1FBhCrmd0l57ide dvEQ== 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=ty9iYiagMI0gH20pET1Xndb3iV+CDb06dji5ebe9K8w=; b=WHbLs3wFbG22+QFeyaIHK4CPN7WyWN8dVQrJ3ExzeAlgKjf1kbViW/tfPi1FA8I7qk l541+yc9QWuhTqhLajwqHoAqFoGI8HdtKKGTJnqLJ4uRoEK6PtNc8KYc4ZwXLHV/12u6 CIEyqGxZjcy0VtSuXSy+RP4O3NwkutJLAuuJeWs7wA+XgEHHLpKVuNn+VO2MQQ8WaO69 cgc1CAVxLNXSg/oxM5S/PFrdgedjy/v+5sQBKRzhluvTcu8qlVpWOqSIAzkls7yUF4sA EOevpDHiUSgapHUNEIdopkTzrfVmOqQPh6D0kHtxNwfL1CdwYjp8l97AYtckBMN/rcfx 9a3Q== X-Gm-Message-State: AOAM530P7V8UoZW7808HFxDrWvFcZ8VPWf4p90E0EGjh6DmPNXRDPREI GpOe/7SfQ1nrGKnV4oPJlWloPcMYB6Bz X-Google-Smtp-Source: ABdhPJwYQAu9x65aeAB6QkD0CZV58F2ousV/0NfyOsnnHv4pwVmmNZyY52hWDmpVRmvp0zkLy2sxMRWr0PHi X-Received: from luke.lon.corp.google.com ([2a00:79e0:d:210:59ca:401f:83a8:de6d]) (user=qperret job=sendgmr) by 2002:a7b:c442:: with SMTP id l2mr5662234wmi.131.1634645603276; Tue, 19 Oct 2021 05:13:23 -0700 (PDT) Date: Tue, 19 Oct 2021 13:12:56 +0100 In-Reply-To: <20211019121304.2732332-1-qperret@google.com> Message-Id: <20211019121304.2732332-8-qperret@google.com> Mime-Version: 1.0 References: <20211019121304.2732332-1-qperret@google.com> X-Mailer: git-send-email 2.33.0.1079.g6e70778dc9-goog Subject: [PATCH v2 07/15] KVM: arm64: Introduce kvm_share_hyp() From: Quentin Perret To: Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Catalin Marinas , Will Deacon , Fuad Tabba , David Brazdil , Andrew Walbran Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org, kernel-team@android.com, qperret@google.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211019_051325_363520_031E8F65 X-CRM114-Status: GOOD ( 18.41 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The create_hyp_mappings() function can currently be called at any point in time. However, its behaviour in protected mode changes widely depending on when it is being called. Prior to KVM init, it is used to create the temporary page-table used to bring-up the hypervisor, and later on it is transparently turned into a 'share' hypercall when the kernel has lost control over the hypervisor stage-1. In order to prepare the ground for also unsharing pages with the hypervisor during guest teardown, introduce a kvm_share_hyp() function to make it clear in which places a share hypercall should be expected, as we will soon need a matching unshare hypercall in all those places. Signed-off-by: Quentin Perret --- arch/arm64/include/asm/kvm_mmu.h | 1 + arch/arm64/kvm/arm.c | 4 ++-- arch/arm64/kvm/fpsimd.c | 4 ++-- arch/arm64/kvm/mmu.c | 19 +++++++++++++------ arch/arm64/kvm/reset.c | 2 +- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index 02d378887743..185d0f62b724 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h @@ -150,6 +150,7 @@ static __always_inline unsigned long __kern_hyp_va(unsigned long v) #include #include +int kvm_share_hyp(void *from, void *to); int create_hyp_mappings(void *from, void *to, enum kvm_pgtable_prot prot); int create_hyp_io_mappings(phys_addr_t phys_addr, size_t size, void __iomem **kaddr, diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index e1cc3f8560e7..5312d5a2ef69 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -146,7 +146,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) if (ret) return ret; - ret = create_hyp_mappings(kvm, kvm + 1, PAGE_HYP); + ret = kvm_share_hyp(kvm, kvm + 1); if (ret) goto out_free_stage2_pgd; @@ -343,7 +343,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) if (err) return err; - return create_hyp_mappings(vcpu, vcpu + 1, PAGE_HYP); + return kvm_share_hyp(vcpu, vcpu + 1); } void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) diff --git a/arch/arm64/kvm/fpsimd.c b/arch/arm64/kvm/fpsimd.c index 62c0d78da7be..2fe1128d9f3d 100644 --- a/arch/arm64/kvm/fpsimd.c +++ b/arch/arm64/kvm/fpsimd.c @@ -35,11 +35,11 @@ int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu) * Make sure the host task thread flags and fpsimd state are * visible to hyp: */ - ret = create_hyp_mappings(ti, ti + 1, PAGE_HYP); + ret = kvm_share_hyp(ti, ti + 1); if (ret) goto error; - ret = create_hyp_mappings(fpsimd, fpsimd + 1, PAGE_HYP); + ret = kvm_share_hyp(fpsimd, fpsimd + 1); if (ret) goto error; diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 0019b2309f70..0cc4b295e525 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -299,6 +299,17 @@ static int pkvm_share_hyp(phys_addr_t start, phys_addr_t end) return 0; } +int kvm_share_hyp(void *from, void *to) +{ + if (is_kernel_in_hyp_mode()) + return 0; + + if (kvm_host_owns_hyp_mappings()) + return create_hyp_mappings(from, to, PAGE_HYP); + + return pkvm_share_hyp(kvm_kaddr_to_phys(from), kvm_kaddr_to_phys(to)); +} + /** * create_hyp_mappings - duplicate a kernel virtual address range in Hyp mode * @from: The virtual kernel start address of the range @@ -319,12 +330,8 @@ int create_hyp_mappings(void *from, void *to, enum kvm_pgtable_prot prot) if (is_kernel_in_hyp_mode()) return 0; - if (!kvm_host_owns_hyp_mappings()) { - if (WARN_ON(prot != PAGE_HYP)) - return -EPERM; - return pkvm_share_hyp(kvm_kaddr_to_phys(from), - kvm_kaddr_to_phys(to)); - } + if (!kvm_host_owns_hyp_mappings()) + return -EPERM; start = start & PAGE_MASK; end = PAGE_ALIGN(end); diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c index 59e4c6e819e9..cf781ec9212a 100644 --- a/arch/arm64/kvm/reset.c +++ b/arch/arm64/kvm/reset.c @@ -113,7 +113,7 @@ static int kvm_vcpu_finalize_sve(struct kvm_vcpu *vcpu) if (!buf) return -ENOMEM; - ret = create_hyp_mappings(buf, buf + reg_sz, PAGE_HYP); + ret = kvm_share_hyp(buf, buf + reg_sz); if (ret) { kfree(buf); return ret; -- 2.33.0.1079.g6e70778dc9-goog _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel