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 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 C050FC07E98 for ; Wed, 29 Nov 2023 12:31:43 +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=xwHkk4ksK65UUzQ8XTUFpehDJFUNJHZXoxeYCghyQnM=; b=lyB3+VU4uAzVhTZxu+SPIi5S5h deqxao3BVW5jIQ2G17xyHHDCztnjbDjxkxyalZJ4vYrwQM2EMHetl+n16Xlows46XhZ+9hU153l1R 8pCjzF7o60CAdX8XIhWHJ7FaxNWgw0a0za6BfAweWBxW8EnSTulUFmtp3YLROOz8+yKAHbhQuAlce EpY3FYsabvZFz81M0ce41rXYhrjO/Opnty4p5yL5iUTCaPU2m+2HcIXd0eSGnLU+CQwLOpczYUJ3m ASSghU3Kl8DuRZUVV7JN1o9kRIAa/Z9UhNM1AeKBOZAhP13LL5IST1F6u1ZWvMTbOFgY072mZSk8Y tf07LzdA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r8Jiq-008KOd-0E; Wed, 29 Nov 2023 12:31:20 +0000 Received: from desiato.infradead.org ([2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1r8Ial-0080K8-1a for linux-arm-kernel@bombadil.infradead.org; Wed, 29 Nov 2023 11:18:55 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=Content-Type:Cc:To:From:Subject: Message-ID:References:Mime-Version:In-Reply-To:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=mJgEdoeKR1YMff1vw9Z8TUCFCAyrBcTVbGoDtrpkcs8=; b=TpM1H0CQES2dDinyD9I3UHFDcu hSGFJTXkNXxReAmFIe7d3nwbiTgSZodYzMpy3M7X94vyQl/yHOpXObO9Qw+RCuc20xFIGI0H+uJXe r6Ih6MEAYfJSDCB5Tz09m+T+66cacfZWESe1sYgYcN6N3Wk7dUWPotUFA2MI29SWCzr+E1UVO03bu F5wUD45y4uIa8k4gxxugQL0UyJT71MCeZuDUNXY/LNe/9gu77v43ssMeDvwz7nLS/Y5SMgnXEKb+F ZzMiTxvoG0yBa/sKTZIM9xLUziOnV3UvCNtXvh171IfqoaAqj/qBj06MN4RU+Mz8ibceDUl0XEZ+5 TW4Xs9+A==; Received: from mail-yw1-x114a.google.com ([2607:f8b0:4864:20::114a]) by desiato.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1r8IaZ-000KFH-1G for linux-arm-kernel@lists.infradead.org; Wed, 29 Nov 2023 11:18:53 +0000 Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-5cfd2325a06so55649607b3.1 for ; Wed, 29 Nov 2023 03:18:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1701256720; x=1701861520; 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=mJgEdoeKR1YMff1vw9Z8TUCFCAyrBcTVbGoDtrpkcs8=; b=WcDQqPOCbhi8vB5bAR36kItZa/2bgEM906mk3O9LhJudTO5u0XDM+hSgM+OtfK3lD6 wyDqTRzASBZG8WabdQvm30oqmoP1kQ5pUlPQm/0/q5mhONjqj/jQwXIMcl6zMcCtozKN 8M/067v+PRRig6q2bHWILjHsW7XE0eTKstxZSoWmKpf9Y7zcYmaUA+WDa6aw1o8/vbrA rshdCojMD4OYWeVkKqZtmi1BQI83up+bMOl4VpKQBnpM5vB+kSKEqoi9I06/3cBh30XW IbYikuul75wo/dl6YGVo3fCj7QTcxiQFI+WzwHIcoOz1Q09k+2PkMorMVxKhrKtyw24x 5OYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701256720; x=1701861520; 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=mJgEdoeKR1YMff1vw9Z8TUCFCAyrBcTVbGoDtrpkcs8=; b=f3LDlSsNs3JjDLk0c2RL7pVf1mqSnC+fqs5dsQqQLi6OBOQH40fop+1dlHQOJcJKrc KKeuulCbs37wcckAmrVtyg+nKXE8TeQXDNXJN4DeGjpjwnxmMEVJ/yJjOIBhyRM4Gz6h q2ptFsP5a/KTq6lWJ5YSY0L2ul/7a+pTiVumR0hn4S+IRVXvokL2uiSQQhYsN9Dn6BwL nwYRrRzO5YntQGA4UW859qjEmVoVuJA6uBb83SaKRFbyuoCuLSfakMMrwZLtVc3DWO6C wQnX76oc/mEan+JQQ3op2zGdt/BXbpOMLn8Se4zYWCbYV17XV0Op8JBe7BeyZZNyLPdd M2eA== X-Gm-Message-State: AOJu0YxNRismUFnuyCqhlmRk007Mq3lUwXFGzkVsMj+Jnkkav8eBQ0Y9 vNao0y9kZ9XRc69yvbOjSYsYDx+LQWx+RZMQ6a6NfldGK6AKcHwbURvJ8X8qsrV4ydqGOZ6XgSQ GcY7e/dS3Szpnpts+yEjtLpHk7fUR1dYOzOsozaPlr6fsDu36p2RSiwLOIVcjBTpLlvWk/EK5WU Q= X-Google-Smtp-Source: AGHT+IH5Rr48kZjK5rVAPu+D4o7vsur6xjNEnkwgoCOPlysBXUqx8fxqK3xej/G9Wf8dlwl+JgKW9R9o X-Received: from palermo.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:118a]) (user=ardb job=sendgmr) by 2002:a81:8416:0:b0:5d0:8fb3:55b2 with SMTP id u22-20020a818416000000b005d08fb355b2mr277281ywf.2.1701256720220; Wed, 29 Nov 2023 03:18:40 -0800 (PST) Date: Wed, 29 Nov 2023 12:16:33 +0100 In-Reply-To: <20231129111555.3594833-43-ardb@google.com> Mime-Version: 1.0 References: <20231129111555.3594833-43-ardb@google.com> X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 X-Developer-Signature: v=1; a=openpgp-sha256; l=5172; i=ardb@kernel.org; h=from:subject; bh=xUwSPPT81eaQTdUSndo82jx0GrRomul61QO77P+qcOg=; b=owGbwMvMwCFmkMcZplerG8N4Wi2JITVddmqwV+8rUefCBt4W3bOs/uVqbEVfhMMC+HZ9vL1zc 3Xb2dMdpSwMYhwMsmKKLAKz/77beXqiVK3zLFmYOaxMIEMYuDgFYCIbOBj+B4pwnbQW7rqgvtBo oWXays3SF/Vf2ZZ6WFUKvTBVYUwIYPjJuGzCy2tPfLetXNj4S9XkO6u9Cste4Q1pzrNnMnvXi35 kAgA= X-Mailer: git-send-email 2.43.0.rc1.413.gea7ed67945-goog Message-ID: <20231129111555.3594833-80-ardb@google.com> Subject: [PATCH v6 37/41] arm64: pgtable: Decouple PGDIR size macros from PGD/PUD/PMD levels 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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231129_111849_583877_33BD0B08 X-CRM114-Status: GOOD ( 19.11 ) 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 From: Ard Biesheuvel The mapping from PGD/PUD/PMD to levels and shifts is very confusing, given that, due to folding, the shifts may be equal for different levels, if the macros are even #define'd to begin with. In a subsequent patch, we will modify the ID mapping code to decouple the number of levels from the kernel's view of how these types are folded, so prepare for this by reformulating the macros without the use of these types. Instead, use SWAPPER_BLOCK_SHIFT as the base quantity, and derive it from either PAGE_SHIFT or PMD_SHIFT, which -if defined at all- are defined unambiguously for a given page size, regardless of the number of configured levels. Signed-off-by: Ard Biesheuvel --- arch/arm64/include/asm/kernel-pgtable.h | 65 ++++++-------------- 1 file changed, 19 insertions(+), 46 deletions(-) diff --git a/arch/arm64/include/asm/kernel-pgtable.h b/arch/arm64/include/asm/kernel-pgtable.h index 742a4b2778f7..f1fc98a233d5 100644 --- a/arch/arm64/include/asm/kernel-pgtable.h +++ b/arch/arm64/include/asm/kernel-pgtable.h @@ -13,27 +13,22 @@ #include /* - * The linear mapping and the start of memory are both 2M aligned (per - * the arm64 booting.txt requirements). Hence we can use section mapping - * with 4K (section size = 2M) but not with 16K (section size = 32M) or - * 64K (section size = 512M). + * The physical and virtual addresses of the start of the kernel image are + * equal modulo 2 MiB (per the arm64 booting.txt requirements). Hence we can + * use section mapping with 4K (section size = 2M) but not with 16K (section + * size = 32M) or 64K (section size = 512M). */ - -/* - * The idmap and swapper page tables need some space reserved in the kernel - * image. Both require pgd, pud (4 levels only) and pmd tables to (section) - * map the kernel. With the 64K page configuration, swapper and idmap need to - * map to pte level. The swapper also maps the FDT (see __create_page_tables - * for more information). Note that the number of ID map translation levels - * could be increased on the fly if system RAM is out of reach for the default - * VA range, so pages required to map highest possible PA are reserved in all - * cases. - */ -#ifdef CONFIG_ARM64_4K_PAGES -#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS - 1) +#if defined(PMD_SIZE) && PMD_SIZE <= MIN_KIMG_ALIGN +#define SWAPPER_BLOCK_SHIFT PMD_SHIFT +#define SWAPPER_SKIP_LEVEL 1 #else -#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS) +#define SWAPPER_BLOCK_SHIFT PAGE_SHIFT +#define SWAPPER_SKIP_LEVEL 0 #endif +#define SWAPPER_BLOCK_SIZE (UL(1) << SWAPPER_BLOCK_SHIFT) +#define SWAPPER_TABLE_SHIFT (SWAPPER_BLOCK_SHIFT + PAGE_SHIFT - 3) + +#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS - SWAPPER_SKIP_LEVEL) #define IDMAP_VA_BITS 48 #define IDMAP_LEVELS ARM64_HW_PGTABLE_LEVELS(IDMAP_VA_BITS) @@ -53,24 +48,13 @@ #define EARLY_ENTRIES(vstart, vend, shift, add) \ (SPAN_NR_ENTRIES(vstart, vend, shift) + (add)) -#define EARLY_PGDS(vstart, vend, add) (EARLY_ENTRIES(vstart, vend, PGDIR_SHIFT, add)) - -#if SWAPPER_PGTABLE_LEVELS > 3 -#define EARLY_PUDS(vstart, vend, add) (EARLY_ENTRIES(vstart, vend, PUD_SHIFT, add)) -#else -#define EARLY_PUDS(vstart, vend, add) (0) -#endif +#define EARLY_LEVEL(lvl, vstart, vend, add) \ + (SWAPPER_PGTABLE_LEVELS > lvl ? EARLY_ENTRIES(vstart, vend, SWAPPER_BLOCK_SHIFT + lvl * (PAGE_SHIFT - 3), add) : 0) -#if SWAPPER_PGTABLE_LEVELS > 2 -#define EARLY_PMDS(vstart, vend, add) (EARLY_ENTRIES(vstart, vend, SWAPPER_TABLE_SHIFT, add)) -#else -#define EARLY_PMDS(vstart, vend, add) (0) -#endif - -#define EARLY_PAGES(vstart, vend, add) ( 1 /* PGDIR page */ \ - + EARLY_PGDS((vstart), (vend), add) /* each PGDIR needs a next level page table */ \ - + EARLY_PUDS((vstart), (vend), add) /* each PUD needs a next level page table */ \ - + EARLY_PMDS((vstart), (vend), add)) /* each PMD needs a next level page table */ +#define EARLY_PAGES(vstart, vend, add) (1 /* PGDIR page */ \ + + EARLY_LEVEL(3, (vstart), (vend), add) /* each entry needs a next level page table */ \ + + EARLY_LEVEL(2, (vstart), (vend), add) /* each entry needs a next level page table */ \ + + EARLY_LEVEL(1, (vstart), (vend), add))/* each entry needs a next level page table */ #define INIT_DIR_SIZE (PAGE_SIZE * (EARLY_PAGES(KIMAGE_VADDR, _end, EXTRA_PAGE) + EARLY_SEGMENT_EXTRA_PAGES)) /* the initial ID map may need two extra pages if it needs to be extended */ @@ -81,17 +65,6 @@ #endif #define INIT_IDMAP_DIR_PAGES EARLY_PAGES(KIMAGE_VADDR, _end + MAX_FDT_SIZE + SWAPPER_BLOCK_SIZE, 1) -/* Initial memory map size */ -#ifdef CONFIG_ARM64_4K_PAGES -#define SWAPPER_BLOCK_SHIFT PMD_SHIFT -#define SWAPPER_BLOCK_SIZE PMD_SIZE -#define SWAPPER_TABLE_SHIFT PUD_SHIFT -#else -#define SWAPPER_BLOCK_SHIFT PAGE_SHIFT -#define SWAPPER_BLOCK_SIZE PAGE_SIZE -#define SWAPPER_TABLE_SHIFT PMD_SHIFT -#endif - /* The number of segments in the kernel image (text, rodata, inittext, initdata, data+bss) */ #define KERNEL_SEGMENT_COUNT 5 -- 2.43.0.rc1.413.gea7ed67945-goog _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel