From patchwork Wed Oct 13 15:58:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Perret X-Patchwork-Id: 12556225 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 E2C08C433FE for ; Wed, 13 Oct 2021 16:01:52 +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 AF69261168 for ; Wed, 13 Oct 2021 16:01:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org AF69261168 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=LPlcYWtGvvxiOqHjjQ6aNKuPAOMNVN1PnjunhIzFh4w=; b=hdYHs1uw65aL3oG+fmi9NVW6bN xsrGs/75Am4F7Uvtbj/4VL+5ND7g1vhDjqsK1cxxVc5PeANnslLaqIW9k/nUmgK5uTw0GCNIfKSoW xbrbFPLvsbJUZR9sp31xzR4tX1ru+zjtyjExMVPA7SYbXvT1hfhjnmjded+gJxF39bLdWCGwz/Neb OagmRjmAI6L3TwD8MMhYZDkm+b2c6XifiHxkN80wWUZ8YMQ9Okre+t/i/YHk7r4ZEsK8bSU6PUvVi Sl8Xu4gmabGiv1r1Ns5eEyKZe5HBq6m3ydZ6wF2qcA09oH7mPZv/lulSJ7kSEOjGCDhGdfYbhcivh GbisoLDw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1magfd-00HTgK-QT; Wed, 13 Oct 2021 15:59:58 +0000 Received: from mail-wr1-x449.google.com ([2a00:1450:4864:20::449]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mageT-00HTKt-CS for linux-arm-kernel@lists.infradead.org; Wed, 13 Oct 2021 15:58:47 +0000 Received: by mail-wr1-x449.google.com with SMTP id r16-20020adfb1d0000000b00160bf8972ceso2339646wra.13 for ; Wed, 13 Oct 2021 08:58:44 -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=PKsT+7mjWWd9o2mzLnA84Fl0AOzVFe9DHpCA6EEH4ck=; b=K59g1PkrmD+1jJFreVZEOcaqgBIuuI69x/2EfncZknIv0Ug4ZU5q/hQgMHuN7BMY/u bXLS4NOjIfrihuVvivfeqdskI7kAcv0EldfrFBgzFKfb6FALdO1GhVsgV45ue4RRYo60 zkkXEre44C5pIpEvGJ3+IaTFDDYOQdEV0ShsoRukTPcMj3Q+U+EI5BOxng8P5pjy/6Vs GExkIm8uvhTZGqM35NG93X/Z2/kVqzNvPwK/aeLDQSpiITTBo0JKFxjcrIrykmR/DWUo EUkBCUb7yNLm8+UFbj4VoE0rnH4JuyaMIw6KQXmAJyM76lxBojGFz2/xJuq+YqaBCLI9 SL4g== 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=PKsT+7mjWWd9o2mzLnA84Fl0AOzVFe9DHpCA6EEH4ck=; b=PS/u8hcrOG3Bhbzchs2gwBjUkFdWopOTMKVX41rNI7MYjsBl0/82uKoaelCl/uEUpn l+6h5kMA/gZa6ganUzdIjyde3eB1l1YPzChzLbwrG3MUy+az7fyLMI3CPr2cL61KLfYN 77B5b1BditsIxIlXCGF8Io6B9EL/53M8bZBjef/YGbBqwwXHkGGghZh6oP5KDWaiZRVD JCg+wZFoFezqFYIvwetY2KkMRrZ11FhF+PjapSiyqonMiYN7iNrF841HUc28ktKwyrY4 0hKilBNiPHIRJ9XXlrFT/PskhB+avLJs0mTyjlQTV4in0iEWtG4piGgXWEDJnoew5VYo RFKA== X-Gm-Message-State: AOAM533CpDbdPo9Y7PrjtH9pOkH+lRC4cmw1IpDnZL5HYe6oD6biZZ62 3Eipb/8tHM+wH64MdZcNP7vlXIT53lYr X-Google-Smtp-Source: ABdhPJw3f6Eb2tt9fOVR32uwn3rCbLrDxsHBoLvwAPqLBi7eN5NfRbqKMHsaNjIwI/pfQ2jQ5pyBrCx0Fr38 X-Received: from luke.lon.corp.google.com ([2a00:79e0:d:210:65b5:73d3:1558:b9ae]) (user=qperret job=sendgmr) by 2002:a1c:4484:: with SMTP id r126mr13590383wma.150.1634140723470; Wed, 13 Oct 2021 08:58:43 -0700 (PDT) Date: Wed, 13 Oct 2021 16:58:19 +0100 In-Reply-To: <20211013155831.943476-1-qperret@google.com> Message-Id: <20211013155831.943476-5-qperret@google.com> Mime-Version: 1.0 References: <20211013155831.943476-1-qperret@google.com> X-Mailer: git-send-email 2.33.0.882.g93a45727a2-goog Subject: [PATCH 04/16] 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 Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org, kernel-team@android.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211013_085845_474636_61082E25 X-CRM114-Status: GOOD ( 17.34 ) 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: , 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 | 7 +++---- arch/arm64/kvm/fpsimd.c | 4 ++-- arch/arm64/kvm/mmu.c | 19 +++++++++++++------ 4 files changed, 19 insertions(+), 12 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 c33d8c073820..f2e74635332b 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; @@ -341,7 +341,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) @@ -623,8 +623,7 @@ static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu) sve_end = vcpu->arch.sve_state + vcpu_sve_state_size(vcpu); - ret = create_hyp_mappings(vcpu->arch.sve_state, sve_end, - PAGE_HYP); + ret = kvm_share_hyp(vcpu->arch.sve_state, sve_end); if (ret) return ret; } 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 1a94a7ca48f2..f80673e863ac 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -296,6 +296,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 @@ -316,12 +327,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 (WARN_ON(!kvm_host_owns_hyp_mappings())) + return -EPERM; start = start & PAGE_MASK; end = PAGE_ALIGN(end);