From patchwork Tue Sep 12 14:16:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 13381815 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 5D9B9CA0EED for ; Tue, 12 Sep 2023 14:21:26 +0000 (UTC) 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:Message-ID: References:Mime-Version: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=YQXVEZg8Tqr/3JqDrnyn2hZ0M8Wh7KARHkyL48fgMHY=; b=gP2cf7lMpVHce8lEP3K4zg/lyH FF2CLVWEhnyTmCEFuVpMVED+dXvXrSQ1/pghGfAIhqQCBPMoEkM6ZoVCZlZ1397iPtZ85wNUY12+r EQw7PYWuQz47gvPsOpGo6Gzc/bN0mTOkbuimE8m+EWNaBL7NsTU887VwNqZnivk6oGJhcDqc4AsvS k1BIncYOHxgmi/AhJe3Hi3E9hm3x0qXrD5CW0MgPkg2CAPQtWP09N1EZSVsb41yVWc92wdgZdgADF oYHX1bqC8w4tQf9ijuBQQ0jMBrstmXrh/VeZmiQ1TH93NcmMtKeCUB0dQ12rgTYdlGW6cNxSq77x5 lnIXFiIQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qg4GE-003Yor-1Q; Tue, 12 Sep 2023 14:21:02 +0000 Received: from mail-wr1-x449.google.com ([2a00:1450:4864:20::449]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qg4Eq-003Xb1-04 for linux-arm-kernel@lists.infradead.org; Tue, 12 Sep 2023 14:19:48 +0000 Received: by mail-wr1-x449.google.com with SMTP id ffacd0b85a97d-31400956ce8so3740213f8f.3 for ; Tue, 12 Sep 2023 07:19:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1694528373; x=1695133173; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=QvpTwx/Nd7dA3fA7kGsBe/fNVtDfk/DIbpcHK3Zb5VQ=; b=3QjTnC13EzuedxyMaMZxaDEJ8orQwtjPrxn9Iz51N5oHXP079HJy7D3Ji1oXcvKSUb ycK/xwWUHnyVIsoP/Gkn5P3b77ctclnA1loVL5o3VNpPP2b2V1eYKyDUzoaa3HA32VY5 EbfM7hjHOXvTjNjIfdM5pDrLf/g2GezwbtwK+G2fgwC0dZHE1VAvu9ubEoqmODfa4i2f mns+TkOx+KHKDNWo5PIL57O2f/M0gVdsmcrlmjNbOUFndhbZZiw4BNqOZk+mDha6AgAC Li/4p0SewhV59Wf/Jg8mbzCHdP4YCX6X13i8qhCUimug5+7SAcsJd/pr8c1D6WE+cu+m 5HJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694528373; x=1695133173; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=QvpTwx/Nd7dA3fA7kGsBe/fNVtDfk/DIbpcHK3Zb5VQ=; b=kvV8/qKxSJpwppMeVjUXmZA6WHgxNy9471JBIuEs74QVNadXObcOKF3gFy1T3ZgDd2 hLSYCiplu6XDLKEnf1Hng0ceo+hvpqdj9uIQTUfChPHJNP5S2dk7xsnImxCnmSJRIlBR ZzRhNaoopGHg6FKlKeaHGft8rw9PKD5hzqzA4hcM8vvuYCZLabcklfVWtYs6oGKn4fuh vqhIuq3/vJO2D6f/rSmOA1CW7ZcpIlkbtJRvt8xE7h2oN/s9HZHd/vuhqle5e1Hqwmmf 66pLpFsMyd9HMKw/HtxbcQAhRsz3RvMat8qkF0IxJFCJ35jjAxpvhqko36wkvOfWsV6H anDw== X-Gm-Message-State: AOJu0YyIZ4scLXN8SooF84od8KiNqPfZqncF3SfIpxDIzI40GUY/S65D R0NU8zHvoevlbCFONlSGhK71l6xVP3dlzHxsqbkosX7I8gzeJFyTDGF+NXsN8uglIW1PdxQjw75 /5zUA2mOj1ZuUuLSCJzJueKHZ9BTz+JBYONronZv3gcMpe0O0fnZeJW5JqhrstHx/GhLvztcXrv o= X-Google-Smtp-Source: AGHT+IFDKViqnIq3SFDvfOjS/eTUMOqc6+LOauQcTp1xFygHgkS/RPv0PWRngp9Uf97ktS6qzGiO65Kz X-Received: from palermo.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:118a]) (user=ardb job=sendgmr) by 2002:a5d:4388:0:b0:317:6b94:b700 with SMTP id i8-20020a5d4388000000b003176b94b700mr147715wrq.9.1694528373532; Tue, 12 Sep 2023 07:19:33 -0700 (PDT) Date: Tue, 12 Sep 2023 14:16:47 +0000 In-Reply-To: <20230912141549.278777-63-ardb@google.com> Mime-Version: 1.0 References: <20230912141549.278777-63-ardb@google.com> X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 X-Developer-Signature: v=1; a=openpgp-sha256; l=3412; i=ardb@kernel.org; h=from:subject; bh=cVjIidelPGG/9vaT00c2L45Zm3C6Gec7qO0syN6KS1E=; b=owGbwMvMwCFmkMcZplerG8N4Wi2JIZWh6JK7+w1lkdUzBGOte1nDr7ffr19z77FE/V0xEc7u+ e5Zuns6SlkYxDgYZMUUWQRm/3238/REqVrnWbIwc1iZQIYwcHEKwES28TL8Lw6/sHDmVf7sucWz zUQ26K3euaJXw93svaHlRiXRn6d3bWJkWDxTgUn77dH50Rt7hC2dNxUEeEWlS7hfuh/HwnCW+7s HBwA= X-Mailer: git-send-email 2.42.0.283.g2d96d420d3-goog Message-ID: <20230912141549.278777-120-ardb@google.com> Subject: [PATCH v4 57/61] arm64: kvm: Limit HYP VA and host S2 range to 48 bits when LPA2 is in effect From: Ard Biesheuvel To: linux-arm-kernel@lists.infradead.org Cc: Ard Biesheuvel , Catalin Marinas , Will Deacon , Marc Zyngier , Mark Rutland , Ryan Roberts , Anshuman Khandual , Kees Cook , Joey Gouly X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230912_071936_078489_4F3A4C79 X-CRM114-Status: GOOD ( 17.98 ) 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 From: Ard Biesheuvel The KVM code needs more work to support 5 level paging with LPA2, so for the time being, limit KVM to 48 bit addressing on 4k and 16k pagesize configurations. This can be reverted once the LPA2 support for KVM is merged. Signed-off-by: Ard Biesheuvel Acked-by: Marc Zyngier Acked-by: Oliver Upton --- arch/arm64/kvm/hyp/nvhe/mem_protect.c | 2 ++ arch/arm64/kvm/mmu.c | 5 ++++- arch/arm64/kvm/va_layout.c | 9 +++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c index 9d703441278b..c20b08cf1f03 100644 --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c @@ -128,6 +128,8 @@ static void prepare_host_vtcr(void) /* The host stage 2 is id-mapped, so use parange for T0SZ */ parange = kvm_get_parange(id_aa64mmfr0_el1_sys_val); phys_shift = id_aa64mmfr0_parange_to_phys_shift(parange); + if (IS_ENABLED(CONFIG_ARM64_LPA2) && phys_shift > 48) + phys_shift = 48; // not implemented yet host_mmu.arch.vtcr = kvm_get_vtcr(id_aa64mmfr0_el1_sys_val, id_aa64mmfr1_el1_sys_val, phys_shift); diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index a4c5d7f44e32..1cac302b92e4 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -800,7 +800,8 @@ static int get_user_mapping_size(struct kvm *kvm, u64 addr) { struct kvm_pgtable pgt = { .pgd = (kvm_pteref_t)kvm->mm->pgd, - .ia_bits = vabits_actual, + .ia_bits = IS_ENABLED(CONFIG_ARM64_LPA2) ? 48 + : vabits_actual, .start_level = (KVM_PGTABLE_MAX_LEVELS - ARM64_HW_PGTABLE_LEVELS(pgt.ia_bits)), .mm_ops = &kvm_user_mm_ops, @@ -1905,6 +1906,8 @@ int __init kvm_mmu_init(u32 *hyp_va_bits) idmap_bits = IDMAP_VA_BITS; kernel_bits = vabits_actual; *hyp_va_bits = max(idmap_bits, kernel_bits); + if (IS_ENABLED(CONFIG_ARM64_LPA2)) + *hyp_va_bits = 48; // LPA2 is not yet supported in KVM kvm_debug("Using %u-bit virtual addresses at EL2\n", *hyp_va_bits); kvm_debug("IDMAP page: %lx\n", hyp_idmap_start); diff --git a/arch/arm64/kvm/va_layout.c b/arch/arm64/kvm/va_layout.c index 91b22a014610..796ffc1cc529 100644 --- a/arch/arm64/kvm/va_layout.c +++ b/arch/arm64/kvm/va_layout.c @@ -59,12 +59,13 @@ static void init_hyp_physvirt_offset(void) */ __init void kvm_compute_layout(void) { + u64 vabits = IS_ENABLED(CONFIG_ARM64_LPA2) ? 48 : vabits_actual; // not yet phys_addr_t idmap_addr = __pa_symbol(__hyp_idmap_text_start); u64 hyp_va_msb; /* Where is my RAM region? */ - hyp_va_msb = idmap_addr & BIT(vabits_actual - 1); - hyp_va_msb ^= BIT(vabits_actual - 1); + hyp_va_msb = idmap_addr & BIT(vabits - 1); + hyp_va_msb ^= BIT(vabits - 1); tag_lsb = fls64((u64)phys_to_virt(memblock_start_of_DRAM()) ^ (u64)(high_memory - 1)); @@ -72,9 +73,9 @@ __init void kvm_compute_layout(void) va_mask = GENMASK_ULL(tag_lsb - 1, 0); tag_val = hyp_va_msb; - if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && tag_lsb != (vabits_actual - 1)) { + if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && tag_lsb != (vabits - 1)) { /* We have some free bits to insert a random tag. */ - tag_val |= get_random_long() & GENMASK_ULL(vabits_actual - 2, tag_lsb); + tag_val |= get_random_long() & GENMASK_ULL(vabits - 2, tag_lsb); } tag_val >>= tag_lsb;