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 X-Spam-Level: X-Spam-Status: No, score=-14.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A85C0C07E9C for ; Wed, 14 Jul 2021 14:55:06 +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 7CDDE600D4 for ; Wed, 14 Jul 2021 14:55:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7CDDE600D4 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=VR6AuDdJBbmZ2JhNL7ZBTkxVWAv8VqNXFXVHEh8rxoo=; b=M4kuGcA0ZsiDx6 tJ/4Z3R1WL17lP+pMXHa8gXdGwXVcTQtf8zKCSwtAb4FRRfJCYF+U7eku77bzBnKyA6ui6LUxn/ti NiHI3ZOAvag4JRY+QoxP9nV6P1eEuw4HUNOBpA91sb5EbFv4sb2e8ykb5bzXf4yAaKjxFWs/aUCni hHjs2t01V19JiYKP5BzuPRI8O9pyBJrUv2OzcBiGJgT/XZbFJ+xiCzH25Q3Hxu9JkvdS2PsdhrDX0 /heDVTG0KydL+yBL7rWaOk4odKrnlC8ZI3ZJ+AbZo2i031hURYysjXSqNx6E2YzL8BuYFcDNPBaHC rSPw28gnjUEQ+yTnElUw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m3gGH-00DuR4-4s; Wed, 14 Jul 2021 14:53:21 +0000 Received: from mail-io1-f41.google.com ([209.85.166.41]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1m3gGD-00DuQ5-8F; Wed, 14 Jul 2021 14:53:19 +0000 Received: by mail-io1-f41.google.com with SMTP id k11so2434694ioa.5; Wed, 14 Jul 2021 07:53:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=BwxSFbLgKWQgLIZuiUqRuKMKvZuG6jXDVbbJMI4fKZQ=; b=n3Mic/trjlC8Z1N6KUsDCyFKEIdq5Cpehve5d9Yp/WSK8Z+F8BRwxgm/7CtYRov3ee 5qeecLa3uOT4sECPLQL4Wrw5BbZpCQgTuE0ND3YCIQDCU+W1OxLSxOhw7un59VAuSXDY jOH5XVrCDOZxIRBZpeuMOlJD1BCdUgfh8tkF3cFB++SjWi/ytpaWuaQVPu/C4C7ugNyq IBXFH5Q7BeT0vQ3YhOphuDCZoKvdGA5Xsc8VaUjx8uagjQq+c8baNCWGAwbk9E5yazj7 Scw+ljUY+eXaLeClOr0sRxXn3Y+kld0hyANNdQPIaX1mKpZewhy8opCJMGic6PpprQ7A PElQ== X-Gm-Message-State: AOAM53033y+5e/OtHDLa2yvvTjSooSM226YbXhsbzGqwpSq3QkKthi/P oumAOuVAftFvGFwxXJb5wA== X-Google-Smtp-Source: ABdhPJyH3lufhfX1XMNyJYC7/+LlYLvP6+EB8uzvbQksP2PDthAIkNWPm6H7BCQv4VXYffEHYLcH+Q== X-Received: by 2002:a05:6602:1544:: with SMTP id h4mr7531945iow.76.1626274393946; Wed, 14 Jul 2021 07:53:13 -0700 (PDT) Received: from robh.at.kernel.org ([64.188.179.248]) by smtp.gmail.com with ESMTPSA id q186sm1414370ioq.1.2021.07.14.07.53.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Jul 2021 07:53:13 -0700 (PDT) Received: (nullmailer pid 2553523 invoked by uid 1000); Wed, 14 Jul 2021 14:53:08 -0000 Date: Wed, 14 Jul 2021 08:53:08 -0600 From: Rob Herring To: Geert Uytterhoeven Cc: Russell King , Nicolas Pitre , Ard Biesheuvel , Linus Walleij , Catalin Marinas , Will Deacon , Nick Kossifidis , Paul Walmsley , Palmer Dabbelt , Albert Ou , Frank Rowand , Dave Young , Mike Rapoport , Baoquan He , Vivek Goyal , Andrew Morton , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-riscv@lists.infradead.org, kexec@lists.infradead.org, linux-mm@kvack.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v4 10/10] ARM: Parse kdump DT properties Message-ID: <20210714145308.GC2441138@robh.at.kernel.org> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210714_075317_370376_B9F27478 X-CRM114-Status: GOOD ( 49.66 ) 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 On Wed, Jul 14, 2021 at 02:50:20PM +0200, Geert Uytterhoeven wrote: > Parse the following DT properties in the crash dump kernel, to provide a > modern interface between kexec and the crash dump kernel: > - linux,elfcorehdr: ELF core header segment, similar to the > "elfcorehdr=" kernel parameter. > - linux,usable-memory-range: Usable memory reserved for the crash dump > kernel. > This makes the memory reservation explicit. If present, Linux no > longer needs to mask the program counter, and rely on the "mem=" > kernel parameter to obtain the start and size of usable memory. > > For backwards compatibility, the traditional method to derive the start > of memory is still used if "linux,usable-memory-range" is absent, and > the "elfcorehdr=" and "mem=" kernel parameters are still parsed. > > Loosely based on the ARM64 version by Akashi Takahiro. > > Signed-off-by: Geert Uytterhoeven > --- > The corresponding patch for kexec-tools is "[PATCH] arm: kdump: Add DT > properties to crash dump kernel's DTB", which is still valid: > https://lore.kernel.org/linux-arm-kernel/20200902154129.6358-1-geert+renesas@glider.be/ > > v4: > - Remove references to architectures in chosen.txt, to avoid having to > change this again when more architectures copy kdump support, > - Remove the architecture-specific code for parsing > "linux,usable-memory-range" and "linux,elfcorehdr", as the FDT core > code now takes care of this, > - Move chosen.txt change to patch changing the FDT core, > - Use IS_ENABLED(CONFIG_CRASH_DUMP) instead of #ifdef, > > v3: > - Rebase on top of accepted solution for DTB memory information > handling, which is part of v5.12-rc1, > > v2: > - Rebase on top of reworked DTB memory information handling. > --- > .../arm/boot/compressed/fdt_check_mem_start.c | 48 ++++++++++++++++--- > arch/arm/mm/init.c | 30 ++++++++++++ > 2 files changed, 72 insertions(+), 6 deletions(-) > > diff --git a/arch/arm/boot/compressed/fdt_check_mem_start.c b/arch/arm/boot/compressed/fdt_check_mem_start.c > index 62450d824c3ca180..9291a2661bdfe57f 100644 > --- a/arch/arm/boot/compressed/fdt_check_mem_start.c > +++ b/arch/arm/boot/compressed/fdt_check_mem_start.c > @@ -55,16 +55,17 @@ static uint64_t get_val(const fdt32_t *cells, uint32_t ncells) > * DTB, and, if out-of-range, replace it by the real start address. > * To preserve backwards compatibility (systems reserving a block of memory > * at the start of physical memory, kdump, ...), the traditional method is > - * always used if it yields a valid address. > + * used if it yields a valid address, unless the "linux,usable-memory-range" > + * property is present. > * > * Return value: start address of physical memory to use > */ > uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt) > { > - uint32_t addr_cells, size_cells, base; > + uint32_t addr_cells, size_cells, usable_base, base; > uint32_t fdt_mem_start = 0xffffffff; > - const fdt32_t *reg, *endp; > - uint64_t size, end; > + const fdt32_t *usable, *reg, *endp; > + uint64_t size, usable_end, end; > const char *type; > int offset, len; > > @@ -80,6 +81,27 @@ uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt) > if (addr_cells > 2 || size_cells > 2) > return mem_start; > > + /* > + * Usable memory in case of a crash dump kernel > + * This property describes a limitation: memory within this range is > + * only valid when also described through another mechanism > + */ > + usable = get_prop(fdt, "/chosen", "linux,usable-memory-range", > + (addr_cells + size_cells) * sizeof(fdt32_t)); > + if (usable) { > + size = get_val(usable + addr_cells, size_cells); > + if (!size) > + return mem_start; > + > + if (addr_cells > 1 && fdt32_ld(usable)) { > + /* Outside 32-bit address space */ > + return mem_start; > + } > + > + usable_base = fdt32_ld(usable + addr_cells - 1); > + usable_end = usable_base + size; > + } > + > /* Walk all memory nodes and regions */ > for (offset = fdt_next_node(fdt, -1, NULL); offset >= 0; > offset = fdt_next_node(fdt, offset, NULL)) { > @@ -107,7 +129,20 @@ uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt) > > base = fdt32_ld(reg + addr_cells - 1); > end = base + size; > - if (mem_start >= base && mem_start < end) { > + if (usable) { > + /* > + * Clip to usable range, which takes precedence > + * over mem_start > + */ > + if (base < usable_base) > + base = usable_base; > + > + if (end > usable_end) > + end = usable_end; > + > + if (end <= base) > + continue; > + } else if (mem_start >= base && mem_start < end) { > /* Calculated address is valid, use it */ > return mem_start; > } > @@ -123,7 +158,8 @@ uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt) > } > > /* > - * The calculated address is not usable. > + * The calculated address is not usable, or was overridden by the > + * "linux,usable-memory-range" property. > * Use the lowest usable physical memory address from the DTB instead, > * and make sure this is a multiple of 2 MiB for phys/virt patching. > */ > diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c > index 6162a070a4104a26..dfaee199554dda97 100644 > --- a/arch/arm/mm/init.c > +++ b/arch/arm/mm/init.c > @@ -4,6 +4,7 @@ > * > * Copyright (C) 1995-2005 Russell King > */ > +#include > #include > #include > #include > @@ -221,8 +222,35 @@ void check_cpu_icache_size(int cpuid) > } > #endif > > +/* > + * reserve_elfcorehdr() - reserves memory for elf core header > + * > + * This function reserves the memory occupied by an elf core header > + * described in the device tree. This region contains all the > + * information about primary kernel's core image and is used by a dump > + * capture kernel to access the system memory on primary kernel. > + */ > +static void __init reserve_elfcorehdr(void) > +{ > + if (!IS_ENABLED(CONFIG_CRASH_DUMP) || !elfcorehdr_size) > + return; > + > + if (memblock_is_region_reserved(elfcorehdr_addr, elfcorehdr_size)) { > + pr_warn("elfcorehdr is overlapped\n"); > + return; > + } > + > + memblock_reserve(elfcorehdr_addr, elfcorehdr_size); Can't this be in common code? > + > + pr_info("Reserving %llu KiB of memory at 0x%llx for elfcorehdr\n", > + elfcorehdr_size >> 10, elfcorehdr_addr); > +} > + > void __init arm_memblock_init(const struct machine_desc *mdesc) > { > + /* Handle linux,usable-memory-range property */ > + memblock_cap_memory_range(cap_mem_addr, cap_mem_size); > + > /* Register the kernel text, kernel data and initrd with memblock. */ > memblock_reserve(__pa(KERNEL_START), KERNEL_END - KERNEL_START); > > @@ -236,6 +264,8 @@ void __init arm_memblock_init(const struct machine_desc *mdesc) > > early_init_fdt_scan_reserved_mem(); > > + reserve_elfcorehdr(); > + > /* reserve memory for DMA contiguous allocations */ > dma_contiguous_reserve(arm_dma_limit); > > -- > 2.25.1 > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel