From nobody Tue Dec 16 16:38:54 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 67EE21EF36E for ; Mon, 21 Apr 2025 18:53:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745261589; cv=none; b=bi5gOZIu/mBfJhFG/HR1oZINdql37CKZTgAyyRHvnKdRRKdgyj+oREaVeR68PtVuwGT1kfWmSeuLzlpoO8Mnk+r+PViMBBvB6cT0gGXrkP0pGN6CWsan7BL28PR+X17EqrfMkSBSdl5norMLwJOwNgbqNxsiH8xqfYveZrHUMMY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745261589; c=relaxed/simple; bh=YQ8Vkp7xUxca1fHWy6XPMau4fK6VgAz+OileZil+wic=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TvJETCsfM5770/iNCiltLgHBX/32u5MWO7K0OFeR/0lNT/7pDLP6tfLnaH85kzt93AZr+DHc4i2sT12kGVHzmSctYPwq8u1lB1+NwE3mbZ7GQsckfbmR0hZQeLaqHbPvk3CkmhnedxzPBD1HS/ZXA7c+6UxrrzREXdWtJ/Kns3Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WVia2pXo; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="WVia2pXo" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D1794C4CEF2; Mon, 21 Apr 2025 18:53:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745261589; bh=YQ8Vkp7xUxca1fHWy6XPMau4fK6VgAz+OileZil+wic=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WVia2pXoQlMwQuxWQqGOLHs3v9g1GnXOcFJaExlhwK2ds+MU3lKcVUheLf/m4H5iJ EAbcWgjp/arxhdIhFc7vYx9UpIKDXotf2wu35l2bGlV1hzNkBWK0pTtJK/wCHhMFGa 8/lBt6r3Wn/C0nRyRuFjmzpqyflc8ou+Bom59AD7M3WFsd+lqYC7QcgyMka2e29oGY 35N95AW6HYcT77iJ33L/R/1AOLipdxxWjtL+FfhfzIS98rcO0hIZZ8m9qJUzw4xiab JGABTBJoJKm1G8DfuRCRHwmbtiFowzXpzpJbWtKHIPw7hCyB1RP3vtotNE75V3LaQn a/dhU4+hjY7eg== From: Ingo Molnar To: linux-kernel@vger.kernel.org Cc: Andy Shevchenko , Arnd Bergmann , Borislav Petkov , Juergen Gross , "H . Peter Anvin" , Kees Cook , Linus Torvalds , Mike Rapoport , Paul Menzel , Peter Zijlstra , Thomas Gleixner , Ingo Molnar , David Woodhouse Subject: [PATCH 07/29] x86/boot/e820: Print out sizes of E820 memory ranges Date: Mon, 21 Apr 2025 20:51:47 +0200 Message-ID: <20250421185210.3372306-8-mingo@kernel.org> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250421185210.3372306-1-mingo@kernel.org> References: <20250421185210.3372306-1-mingo@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before: BIOS-provided physical RAM map: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved BIOS-e820: [mem 0x0000000000100000-0x000000007ffdbfff] usable BIOS-e820: [mem 0x000000007ffdc000-0x000000007fffffff] reserved BIOS-e820: [mem 0x00000000b0000000-0x00000000bfffffff] reserved BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed1ffff] reserved BIOS-e820: [mem 0x00000000feffc000-0x00000000feffffff] reserved BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved BIOS-e820: [mem 0x000000fd00000000-0x000000ffffffffff] reserved After: BIOS-provided physical RAM map: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] 639 KB kernel us= able RAM BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] 1 KB reserved BIOS-e820: [gap 0x00000000000a0000-0x00000000000effff] 320 KB ... BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] 64 KB reserved BIOS-e820: [mem 0x0000000000100000-0x000000007ffdbfff] 1.9 GB kernel us= able RAM BIOS-e820: [mem 0x000000007ffdc000-0x000000007fffffff] 144 KB reserved BIOS-e820: [gap 0x0000000080000000-0x00000000afffffff] 768 MB ... BIOS-e820: [mem 0x00000000b0000000-0x00000000bfffffff] 256 MB reserved BIOS-e820: [gap 0x00000000c0000000-0x00000000fed1bfff] 1005.1 MB ... BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed1ffff] 16 KB reserved BIOS-e820: [gap 0x00000000fed20000-0x00000000feffbfff] 2.8 MB ... BIOS-e820: [mem 0x00000000feffc000-0x00000000feffffff] 16 KB reserved BIOS-e820: [gap 0x00000000ff000000-0x00000000fffbffff] 15.7 MB ... BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] 256 KB reserved BIOS-e820: [gap 0x0000000100000000-0x000000fcffffffff] 1008 GB ... BIOS-e820: [mem 0x000000fd00000000-0x000000ffffffffff] 12 GB reserved Note how a 1-digit precision field is printed out if a range is fractional in its largest-enclosing natural size unit. So the "256 MB" and "12 GB" fields above denote exactly 256 MB and 12 GB regions, while "1.9 GB" signals the region's fractional nature and it being just below 2GB. Printing E820 maps with such details visualizes 'weird' ranges at a glance, and gives users a better understanding of how large the various ranges are, without having to perform hexadecimal subtraction in their minds. Signed-off-by: Ingo Molnar Cc: Andy Shevchenko Cc: Arnd Bergmann Cc: David Woodhouse Cc: H. Peter Anvin Cc: Kees Cook Cc: Linus Torvalds Cc: Mike Rapoport (Microsoft) (cherry picked from commit d1ac6b8718575a7ea2f0a1ff347835a8879df673) --- arch/x86/kernel/e820.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 10bd10bd5672..8ee89962fcbf 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c @@ -199,6 +199,41 @@ static void __init e820_print_type(enum e820_type type) } } =20 +/* + * Print out the size of a E820 region, in human-readable + * fashion, going from KB, MB, GB to TB units. + * + * Print out fractional sizes with a single digit of precision. + */ +static void e820_print_size(u64 size) +{ + if (size < SZ_1M) { + if (size & (SZ_1K-1)) + pr_cont(" %4llu.%01llu KB", size/SZ_1K, 10*(size & (SZ_1K-1))/SZ_1K); + else + pr_cont(" %4llu KB", size/SZ_1K); + return; + } + if (size < SZ_1G) { + if (size & (SZ_1M-1)) + pr_cont(" %4llu.%01llu MB", size/SZ_1M, 10*(size & (SZ_1M-1))/SZ_1M); + else + pr_cont(" %4llu MB", size/SZ_1M); + return; + } + if (size < SZ_1T) { + if (size & (SZ_1G-1)) + pr_cont(" %4llu.%01llu GB", size/SZ_1G, 10*(size & (SZ_1G-1))/SZ_1G); + else + pr_cont(" %4llu GB", size/SZ_1G); + return; + } + if (size & (SZ_1T-1)) + pr_cont(" %4llu.%01llu TB", size/SZ_1T, 10*(size & (SZ_1T-1))/SZ_1T); + else + pr_cont(" %4llu TB", size/SZ_1T); +} + static void __init e820__print_table(const char *who) { u64 range_end_prev =3D 0; @@ -215,14 +250,22 @@ static void __init e820__print_table(const char *who) if (range_start < range_end_prev) pr_info("BUG: out of order E820 entry!\n"); =20 + /* Print gaps, if any: */ if (range_start > range_end_prev) { - pr_info("%s: [gap %#018Lx-%#018Lx]\n", + u64 gap_size =3D range_start - range_end_prev; + + pr_info("%s: [gap %#018Lx-%#018Lx]", who, range_end_prev, range_start-1); + + e820_print_size(gap_size); + pr_cont(" ...\n"); } =20 - pr_info("%s: [mem %#018Lx-%#018Lx] ", who, range_start, range_end-1); + /* Print allocated ranges: */ + pr_info("%s: [mem %#018Lx-%#018Lx]", who, range_start, range_end-1); + e820_print_size(entry->size); e820_print_type(entry->type); pr_cont("\n"); =20 --=20 2.45.2