Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3530035pxf; Mon, 15 Mar 2021 11:36:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxnROewywYNLZwB2/YOVnAPGxd9zbsC88K2uafJUZ6iWsiwfpm/y2AQolYJD7Vh0ecMgzij X-Received: by 2002:a17:906:2ac1:: with SMTP id m1mr15291375eje.472.1615833374855; Mon, 15 Mar 2021 11:36:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1615833374; cv=none; d=google.com; s=arc-20160816; b=0PngIW1KjilkLPWpSSfaDurYs0LXVyLZnO6gs37SA0f6TUcnnEF1bFieDJVvq5Y56T bnIzHaoBbSg/mPFNiUtWcz14eYfY+c2wkpdbwR0quBTT8IBcX/pDdlQDd2WMML4fvRRM dIZNrhnSgr+uGhggJYscQhm/SHpLXmbf0ewL0618pzbUXQb5x85F0bnInreSP/94YT9d I0eAIJF8sC2Bus3qm4EcFLhbPyQoHB7juFxhS3/h3IUKZgd4qteolxBCRAhEslI7L3xk EQ4ouGxnopq3swsWvO7AFShuxwtN2d3yhVznJI/JPIqeFtmSkpHzbY+GQbHcAK803jZM HBOQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:references:mime-version :message-id:in-reply-to:date:dkim-signature; bh=/O7aUiBDNsDlC5JEdHFVg6as0eZObhOTRgLXX/tsqoQ=; b=ruWOhfjL191E7SSVJB17mhdiwilem25Ogi46oQMD+cspf5uzRnuYWgifH3Te4jdCBr 8PPETfMu358s0ExKg74UGA+MADsN/h2DEgZuokRiHnHSnz6FHQK20NCJYlYEnIaCWvE3 4vKyKtwbkJeUgC68Y/KlM2WGfI6yHOzbEDEYgFI7wTwxcVRS8HsdD2yoCRq+rqW+O0LP MVlWmlBivc8rJjb+weADz3tdOGlzbpW8v1i990XfMj5sYh522wFPIEQB5wrV+I8+vKF4 xtQz34kSmX7QhfTtq0BV0FjM7+kkmlfEaWL4wNgc4Vl/vscxXOlXLgwkwrtQtkxHJEgK 8PDw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=ETUD6W4O; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id k15si12429890eji.582.2021.03.15.11.35.52; Mon, 15 Mar 2021 11:36:14 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=ETUD6W4O; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240926AbhCOOwo (ORCPT + 99 others); Mon, 15 Mar 2021 10:52:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52426 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239369AbhCOOgU (ORCPT ); Mon, 15 Mar 2021 10:36:20 -0400 Received: from mail-wr1-x449.google.com (mail-wr1-x449.google.com [IPv6:2a00:1450:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A7464C0613DC for ; Mon, 15 Mar 2021 07:36:02 -0700 (PDT) Received: by mail-wr1-x449.google.com with SMTP id y5so15186694wrp.2 for ; Mon, 15 Mar 2021 07:36:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=/O7aUiBDNsDlC5JEdHFVg6as0eZObhOTRgLXX/tsqoQ=; b=ETUD6W4OHAAyzX/GM5CxIxQMLQU7y6dXlK4NsnCQXR0wFSfmk7mA9BM6wY3oIKm0tg 4ixsXzhuUY4UE+jKH4xIrqHY0UmxSOHale2crRPVCzs2xOosGQVWHa8Yn9tBAhBHR/Wq zdFBUuXRpKuIyK8oEDtDkk3i0n7b1rXGJHbCJb7xpiJwdLRIYNAVEkmtamJXyQW7lIq2 r/mtwJXrozgPTYCUtw9eaiDTYbTv8qFGgdC62206rmx4LAvy4N+F3idIcU+Ky5dMpVq4 /Irg7iNb5d/4oaM8OBwCGBAY7fFpk1Q6mQgw7paIHKSOWvK7BHFyJVj7dQzErJ9v14i/ 9SQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=/O7aUiBDNsDlC5JEdHFVg6as0eZObhOTRgLXX/tsqoQ=; b=AcDZ+6j0KczpHxuoqB8w8RsAAZsD54er4a3vwSNTEAuvSWSla0IsDN5cx1lW6O5nIk GBKLwwPiih1fc/fQ2vVnIEWBxfiH8hg7PcC3ZFcjAkD2Qudq9YM2uzmtWy72I4YVB4Lj bXpzx02Q8ufv6hTQRmxyw+nrxnvfrAcKwvUHnkOK3NalbNltOCOrN1kFJq8EmS+Ij8tJ yxpqtMaMZJ2U9kVhW5DfZvvlXlJqxwShdRhWOMnmGgHaC6i3YvqZTcFQQ3k0CnHHEDhf a2eK0VNAQbNuDu4BO/+nrhQXEqTnNg4YdydxHUbNQtLJGwAhJM3XCGvKtCx3ICAPBNSW E5Mg== X-Gm-Message-State: AOAM530/GOERXDEQovIsZfcKIFp6n20yNjCFCp9VJy/dDK7JgUrN9Egz SaoHaEZ0R1XlTJ6st7UXmpK7GGmvNgoE X-Received: from r2d2-qp.c.googlers.com ([fda3:e722:ac3:10:28:9cb1:c0a8:1652]) (user=qperret job=sendgmr) by 2002:a7b:ca50:: with SMTP id m16mr25689522wml.113.1615818961201; Mon, 15 Mar 2021 07:36:01 -0700 (PDT) Date: Mon, 15 Mar 2021 14:35:10 +0000 In-Reply-To: <20210315143536.214621-1-qperret@google.com> Message-Id: <20210315143536.214621-11-qperret@google.com> Mime-Version: 1.0 References: <20210315143536.214621-1-qperret@google.com> X-Mailer: git-send-email 2.31.0.rc2.261.g7f71774620-goog Subject: [PATCH v5 10/36] KVM: arm64: Introduce an early Hyp page allocator From: Quentin Perret To: catalin.marinas@arm.com, will@kernel.org, maz@kernel.org, james.morse@arm.com, julien.thierry.kdev@gmail.com, suzuki.poulose@arm.com Cc: android-kvm@google.com, seanjc@google.com, mate.toth-pal@arm.com, linux-kernel@vger.kernel.org, robh+dt@kernel.org, linux-arm-kernel@lists.infradead.org, kernel-team@android.com, kvmarm@lists.cs.columbia.edu, tabba@google.com, ardb@kernel.org, mark.rutland@arm.com, dbrazdil@google.com, qperret@google.com Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org With nVHE, the host currently creates all stage 1 hypervisor mappings at EL1 during boot, installs them at EL2, and extends them as required (e.g. when creating a new VM). But in a world where the host is no longer trusted, it cannot have full control over the code mapped in the hypervisor. In preparation for enabling the hypervisor to create its own stage 1 mappings during boot, introduce an early page allocator, with minimal functionality. This allocator is designed to be used only during early bootstrap of the hyp code when memory protection is enabled, which will then switch to using a full-fledged page allocator after init. Acked-by: Will Deacon Signed-off-by: Quentin Perret --- arch/arm64/kvm/hyp/include/nvhe/early_alloc.h | 14 +++++ arch/arm64/kvm/hyp/include/nvhe/memory.h | 24 +++++++++ arch/arm64/kvm/hyp/nvhe/Makefile | 2 +- arch/arm64/kvm/hyp/nvhe/early_alloc.c | 54 +++++++++++++++++++ arch/arm64/kvm/hyp/nvhe/psci-relay.c | 4 +- 5 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 arch/arm64/kvm/hyp/include/nvhe/early_alloc.h create mode 100644 arch/arm64/kvm/hyp/include/nvhe/memory.h create mode 100644 arch/arm64/kvm/hyp/nvhe/early_alloc.c diff --git a/arch/arm64/kvm/hyp/include/nvhe/early_alloc.h b/arch/arm64/kvm/hyp/include/nvhe/early_alloc.h new file mode 100644 index 000000000000..dc61aaa56f31 --- /dev/null +++ b/arch/arm64/kvm/hyp/include/nvhe/early_alloc.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __KVM_HYP_EARLY_ALLOC_H +#define __KVM_HYP_EARLY_ALLOC_H + +#include + +void hyp_early_alloc_init(void *virt, unsigned long size); +unsigned long hyp_early_alloc_nr_used_pages(void); +void *hyp_early_alloc_page(void *arg); +void *hyp_early_alloc_contig(unsigned int nr_pages); + +extern struct kvm_pgtable_mm_ops hyp_early_alloc_mm_ops; + +#endif /* __KVM_HYP_EARLY_ALLOC_H */ diff --git a/arch/arm64/kvm/hyp/include/nvhe/memory.h b/arch/arm64/kvm/hyp/include/nvhe/memory.h new file mode 100644 index 000000000000..3e49eaa7e682 --- /dev/null +++ b/arch/arm64/kvm/hyp/include/nvhe/memory.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __KVM_HYP_MEMORY_H +#define __KVM_HYP_MEMORY_H + +#include + +#include + +extern s64 hyp_physvirt_offset; + +#define __hyp_pa(virt) ((phys_addr_t)(virt) + hyp_physvirt_offset) +#define __hyp_va(phys) ((void *)((phys_addr_t)(phys) - hyp_physvirt_offset)) + +static inline void *hyp_phys_to_virt(phys_addr_t phys) +{ + return __hyp_va(phys); +} + +static inline phys_addr_t hyp_virt_to_phys(void *addr) +{ + return __hyp_pa(addr); +} + +#endif /* __KVM_HYP_MEMORY_H */ diff --git a/arch/arm64/kvm/hyp/nvhe/Makefile b/arch/arm64/kvm/hyp/nvhe/Makefile index bc98f8e3d1da..24ff99e2eac5 100644 --- a/arch/arm64/kvm/hyp/nvhe/Makefile +++ b/arch/arm64/kvm/hyp/nvhe/Makefile @@ -13,7 +13,7 @@ lib-objs := clear_page.o copy_page.o memcpy.o memset.o lib-objs := $(addprefix ../../../lib/, $(lib-objs)) obj-y := timer-sr.o sysreg-sr.o debug-sr.o switch.o tlb.o hyp-init.o host.o \ - hyp-main.o hyp-smp.o psci-relay.o + hyp-main.o hyp-smp.o psci-relay.o early_alloc.o obj-y += ../vgic-v3-sr.o ../aarch32.o ../vgic-v2-cpuif-proxy.o ../entry.o \ ../fpsimd.o ../hyp-entry.o ../exception.o obj-y += $(lib-objs) diff --git a/arch/arm64/kvm/hyp/nvhe/early_alloc.c b/arch/arm64/kvm/hyp/nvhe/early_alloc.c new file mode 100644 index 000000000000..1306c430ab87 --- /dev/null +++ b/arch/arm64/kvm/hyp/nvhe/early_alloc.c @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2020 Google LLC + * Author: Quentin Perret + */ + +#include + +#include +#include + +struct kvm_pgtable_mm_ops hyp_early_alloc_mm_ops; +s64 __ro_after_init hyp_physvirt_offset; + +static unsigned long base; +static unsigned long end; +static unsigned long cur; + +unsigned long hyp_early_alloc_nr_used_pages(void) +{ + return (cur - base) >> PAGE_SHIFT; +} + +void *hyp_early_alloc_contig(unsigned int nr_pages) +{ + unsigned long size = (nr_pages << PAGE_SHIFT); + void *ret = (void *)cur; + + if (!nr_pages) + return NULL; + + if (end - cur < size) + return NULL; + + cur += size; + memset(ret, 0, size); + + return ret; +} + +void *hyp_early_alloc_page(void *arg) +{ + return hyp_early_alloc_contig(1); +} + +void hyp_early_alloc_init(void *virt, unsigned long size) +{ + base = cur = (unsigned long)virt; + end = base + size; + + hyp_early_alloc_mm_ops.zalloc_page = hyp_early_alloc_page; + hyp_early_alloc_mm_ops.phys_to_virt = hyp_phys_to_virt; + hyp_early_alloc_mm_ops.virt_to_phys = hyp_virt_to_phys; +} diff --git a/arch/arm64/kvm/hyp/nvhe/psci-relay.c b/arch/arm64/kvm/hyp/nvhe/psci-relay.c index 63de71c0481e..08508783ec3d 100644 --- a/arch/arm64/kvm/hyp/nvhe/psci-relay.c +++ b/arch/arm64/kvm/hyp/nvhe/psci-relay.c @@ -11,6 +11,7 @@ #include #include +#include #include void kvm_hyp_cpu_entry(unsigned long r0); @@ -20,9 +21,6 @@ void __noreturn __host_enter(struct kvm_cpu_context *host_ctxt); /* Config options set by the host. */ struct kvm_host_psci_config __ro_after_init kvm_host_psci_config; -s64 __ro_after_init hyp_physvirt_offset; - -#define __hyp_pa(x) ((phys_addr_t)((x)) + hyp_physvirt_offset) #define INVALID_CPU_ID UINT_MAX -- 2.31.0.rc2.261.g7f71774620-goog