Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp4240131pxv; Tue, 29 Jun 2021 02:16:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyZ6Gjd5JRyT4bF2l0hT71KYMU10J/0ARlzxsJeM1eNFbgyzThz1bLjZV7Pwgas5USy14RL X-Received: by 2002:a5d:914f:: with SMTP id y15mr3162191ioq.196.1624958212539; Tue, 29 Jun 2021 02:16:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624958212; cv=none; d=google.com; s=arc-20160816; b=LmjKy7bU5nm1ieurA6Htx5XJGGA9HCWLlgkDw3fx1HzwDsrIxnnRrMlhQJYPcr9TSg 7+CZ0JVWKSKCIIDS5s9+JyBR+QlYgUX4ynLkcV4o7DkTLfyCL4srYIX8zobBL8CNe/kh 5dk7JTeRpB6nAtX5tLmeDAsWNOJzKv0HKXRiw/DbZi8kLJFadHShRg4rdqtwHz2e8JQK ChXATT/eTpoKE8RR0lgVu3aCNSTLcCXZJfrgnC2A5WMKvLUW4inz3Y9licJj0d2LaVhk cTGZubudSibMxCP3bhMgShxX1QJOdwIIwo8IoP/x5xBUaYXHT8UYNtrToid/CkxxU9NL bp6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=NFvxK6d72wc8Ub/J8W+MV+DmOUQK6ZUZI6XFKRHWTMI=; b=vYJ/OBw9an62HnM8EDulsEEM0OJh+aZbbx9br1XbpP0By8mDCnCT3D4Ng+gtq4UCmc L8TxYqtHQbfuueXmOrwD51Hj15ZOtqUahUDSFLVR6YxbZC+X1qdpuKsvoOOuGwiYRCFd dw7Ye15+uvVxZHAjxMBvfNHIs2H8DNeqj0tCxBwSsTpeMrmZTglxBX9d/0iK5DwXgqjJ cwsH7bXzH3lZ6hXljNdHyed48X3AqAec4vNhqtaUgftMIG2nR+zFJaTsWfvx7OrXdRdw C/U3NU+7gYKueedj1dGhQCuCOv2DGOav+212ng+waK8zS+LCG27JjD4g9Pa3KmcJLPo9 daGQ== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f10si19793216jag.106.2021.06.29.02.16.41; Tue, 29 Jun 2021 02:16:52 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232755AbhF2JSe (ORCPT + 99 others); Tue, 29 Jun 2021 05:18:34 -0400 Received: from relay12.mail.gandi.net ([217.70.178.232]:37565 "EHLO relay12.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232653AbhF2JSc (ORCPT ); Tue, 29 Jun 2021 05:18:32 -0400 Received: (Authenticated sender: alex@ghiti.fr) by relay12.mail.gandi.net (Postfix) with ESMTPSA id 76C7E200012; Tue, 29 Jun 2021 09:16:02 +0000 (UTC) From: Alexandre Ghiti To: Paul Walmsley , Palmer Dabbelt , Albert Ou , Kefeng Wang , linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Alexandre Ghiti Subject: [PATCH 3/3] riscv: Make sure the kernel mapping does not overlap with IS_ERR_VALUE Date: Tue, 29 Jun 2021 11:13:48 +0200 Message-Id: <20210629091349.3802690-3-alex@ghiti.fr> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210629091349.3802690-1-alex@ghiti.fr> References: <20210629091349.3802690-1-alex@ghiti.fr> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The check that is done in setup_bootmem currently only works for 32-bit kernel since the kernel mapping has been moved outside of the linear mapping for 64-bit kernel. So make sure that for 64-bit kernel, the kernel mapping does not overlap with the last 4K of the addressable memory. Signed-off-by: Alexandre Ghiti --- arch/riscv/mm/init.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index a1a0c4afa80f..a90c41bc9485 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -156,7 +156,7 @@ static void __init setup_bootmem(void) { phys_addr_t vmlinux_end = __pa_symbol(&_end); phys_addr_t vmlinux_start = __pa_symbol(&_start); - phys_addr_t max_mapped_addr = __pa(~(ulong)0); + phys_addr_t __maybe_unused max_mapped_addr; phys_addr_t dram_end; #ifdef CONFIG_XIP_KERNEL @@ -179,14 +179,20 @@ static void __init setup_bootmem(void) memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start); dram_end = memblock_end_of_DRAM(); +#ifndef CONFIG_64BIT /* * memblock allocator is not aware of the fact that last 4K bytes of * the addressable memory can not be mapped because of IS_ERR_VALUE * macro. Make sure that last 4k bytes are not usable by memblock - * if end of dram is equal to maximum addressable memory. + * if end of dram is equal to maximum addressable memory. For 64-bit + * kernel, this problem can't happen here as the end of the virtual + * address space is occupied by the kernel mapping then this check must + * be done in create_kernel_page_table. */ + max_mapped_addr = __pa(~(ulong)0); if (max_mapped_addr == (dram_end - 1)) memblock_set_current_limit(max_mapped_addr - 4096); +#endif min_low_pfn = PFN_UP(memblock_start_of_DRAM()); max_low_pfn = max_pfn = PFN_DOWN(dram_end); @@ -556,6 +562,7 @@ static void __init create_kernel_page_table(pgd_t *pgdir, uintptr_t map_size, uintptr_t va, end_va; end_va = kernel_virt_addr + load_sz; + for (va = kernel_virt_addr; va < end_va; va += map_size) create_pgd_mapping(pgdir, va, load_pa + (va - kernel_virt_addr), @@ -602,6 +609,13 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) /* Sanity check alignment and size */ BUG_ON((PAGE_OFFSET % PGDIR_SIZE) != 0); BUG_ON((load_pa % map_size) != 0); +#ifdef CONFIG_64BIT + /* + * The last 4K bytes of the addressable memory can not be mapped because + * of IS_ERR_VALUE macro. + */ + BUG_ON((kernel_virt_addr + load_sz) > ADDRESS_SPACE_END - SZ_4K); +#endif pt_ops.alloc_pte = alloc_pte_early; pt_ops.get_pte_virt = get_pte_virt_early; -- 2.30.2