From nobody Wed Apr 09 21:17:58 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ZXwlV3P1tz5sPMZ; Wed, 09 Apr 2025 21:17:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZXwlV1s7Zz3tGT; Wed, 09 Apr 2025 21:17:58 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744233478; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=hv0+f9JTFpOEeaj2caBaAe6usxcye6CgNfqJWVKS8r8=; b=me2qg9ZHkhpTE4bSHtmeYPayJaXy4rtxN3EUzYUrM/BP9GpYGgR6fLi8Z2MwUvKpKs4Dmv NyDdo/5Q8ooi5F7rNU2ahgK3nG8qgcQq+1rf4ErXn3rZp4xEA6R3Jayl7YaEYvPANKy+rc 9o87Tpk58EksFr5Xf6PAnHfLq6i0/K3oD3Geo7PVxAS4l/QENujKio533O7vzJzt3dW4nb afipjnUasD0b7xjYKFRl03W/hFcm5qrMK6p+wErd8ynN2hXu1VG+s0cn/AJPcqUcUdzbzh QFAfhBU/+0EjlfIpmEcO6OBcM5j2GjnuEQ+BUrApjPoBY5Nf7sWa6p3T2jL7Bg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1744233478; a=rsa-sha256; cv=none; b=uEsI106cmamzX8sBu5l+Gu1eNK2BwtIpwxfZV3wiA82O0Rh0kPpNJ70F3KEftyk5dS0Pyv s4F7oOGsQ8zq1nhoEXxjzzKgQ1yB+pnwZRt2SfPZ2K5U0Xdo2pa63EeBDiX/jNWEKVYKsN eSMt8TlJraRz7kYnnefNpAM4+9wcqjhdOyhj7aBUJonYzwGWrjFWcuFOepnYHYY/BDww2S 1RhLqxcRVnbNTm575kU4BepgLkav+P5UxGR2xuSscdOep1B9ECHfEQKIDgMJeLOVFgwMhl NCuh8XesqhGvBr7qSLdbwM+YJvV6i2EeRVD8La2yeBNY0XgCdL0OunM1kuA3ug== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744233478; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=hv0+f9JTFpOEeaj2caBaAe6usxcye6CgNfqJWVKS8r8=; b=BMuhVJzpREk4x4nVTyL8KteOoI3B4VJss6lwp2fep9XttanzEHGOX65yvDElquECMh7k2s 4fIslGzKSat1jBma9Gs4GjW6gE4PWadaBM0G1hz+A1H1xdIzOTwPuvkmPwAAL3Q+HbhscM HLMkjZcU2KA7tdy36A3dzvxm40Q2KjA41ZRUOvWdlulnU5hncvMHoXXckfRRnzzv9Cbe0X 3IKJwzDLm2oOLeBO2PKogI88/XCY0qF5wesxkvsRFq2q0eS3ev5PU1BzFnSbp8YcscrYHq +qsE/a30oOXSbEJXsRFj5Uzle58iM2g48g0qJoW0kyTHtAATjT6z2/SjqCKrGw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ZXwlV1RQ1zZlj; Wed, 09 Apr 2025 21:17:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 539LHwnJ078138; Wed, 9 Apr 2025 21:17:58 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 539LHwlE078135; Wed, 9 Apr 2025 21:17:58 GMT (envelope-from git) Date: Wed, 9 Apr 2025 21:17:58 GMT Message-Id: <202504092117.539LHwlE078135@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 136d2dc09310 - main - kboot: Start to move efi common routines to libkboot List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 136d2dc093105625e943466384efa1e1c16afad3 Auto-Submitted: auto-generated The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=136d2dc093105625e943466384efa1e1c16afad3 commit 136d2dc093105625e943466384efa1e1c16afad3 Author: Warner Losh AuthorDate: 2025-04-09 21:16:57 +0000 Commit: Warner Losh CommitDate: 2025-04-09 21:16:57 +0000 kboot: Start to move efi common routines to libkboot Start to move the common efi routines into libkboot by moving the efi memory map walking and implementing a printing routine around it. Sponsored by: Netflix --- stand/kboot/include/efi.h | 17 ++++++ stand/kboot/kboot/arch/aarch64/load_addr.c | 87 +-------------------------- stand/kboot/libkboot/Makefile | 4 ++ stand/kboot/libkboot/efi.c | 97 ++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 85 deletions(-) diff --git a/stand/kboot/include/efi.h b/stand/kboot/include/efi.h new file mode 100644 index 000000000000..10368bd4a829 --- /dev/null +++ b/stand/kboot/include/efi.h @@ -0,0 +1,17 @@ +/*- + * Copyright (c) 2024, Netflix, Inc. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +/* Note, we mix and match FreeBSD types and EFI standard defined types */ + +typedef void (*efi_map_entry_cb)(struct efi_md *, void *argp); + +void foreach_efi_map_entry(struct efi_map_header *efihdr, efi_map_entry_cb cb, void *argp); +void print_efi_map(struct efi_map_header *efihdr); diff --git a/stand/kboot/kboot/arch/aarch64/load_addr.c b/stand/kboot/kboot/arch/aarch64/load_addr.c index 9d6f23a9d344..8ceb21007c45 100644 --- a/stand/kboot/kboot/arch/aarch64/load_addr.c +++ b/stand/kboot/kboot/arch/aarch64/load_addr.c @@ -5,7 +5,6 @@ */ #include -#include #include #include #include @@ -13,6 +12,7 @@ #include "kboot.h" #include "bootstrap.h" +#include "efi.h" /* * Info from dtb about the EFI system @@ -23,87 +23,6 @@ uint32_t efi_map_size; vm_paddr_t efi_map_phys_src; /* From DTB */ vm_paddr_t efi_map_phys_dst; /* From our memory map metadata module */ -typedef void (*efi_map_entry_cb)(struct efi_md *, void *argp); - -static void -foreach_efi_map_entry(struct efi_map_header *efihdr, efi_map_entry_cb cb, void *argp) -{ - struct efi_md *map, *p; - size_t efisz; - int ndesc, i; - - /* - * Memory map data provided by UEFI via the GetMemoryMap - * Boot Services API. - */ - efisz = roundup2(sizeof(struct efi_map_header), 16); - map = (struct efi_md *)((uint8_t *)efihdr + efisz); - - if (efihdr->descriptor_size == 0) - return; - ndesc = efihdr->memory_size / efihdr->descriptor_size; - - for (i = 0, p = map; i < ndesc; i++, - p = efi_next_descriptor(p, efihdr->descriptor_size)) { - cb(p, argp); - } -} - -static void -print_efi_map_entry(struct efi_md *p, void *argp __unused) -{ - const char *type; - static const char *types[] = { - "Reserved", - "LoaderCode", - "LoaderData", - "BootServicesCode", - "BootServicesData", - "RuntimeServicesCode", - "RuntimeServicesData", - "ConventionalMemory", - "UnusableMemory", - "ACPIReclaimMemory", - "ACPIMemoryNVS", - "MemoryMappedIO", - "MemoryMappedIOPortSpace", - "PalCode", - "PersistentMemory" - }; - - if (p->md_type < nitems(types)) - type = types[p->md_type]; - else - type = ""; - printf("%23s %012lx %012lx %08lx ", type, p->md_phys, - p->md_virt, p->md_pages); - if (p->md_attr & EFI_MD_ATTR_UC) - printf("UC "); - if (p->md_attr & EFI_MD_ATTR_WC) - printf("WC "); - if (p->md_attr & EFI_MD_ATTR_WT) - printf("WT "); - if (p->md_attr & EFI_MD_ATTR_WB) - printf("WB "); - if (p->md_attr & EFI_MD_ATTR_UCE) - printf("UCE "); - if (p->md_attr & EFI_MD_ATTR_WP) - printf("WP "); - if (p->md_attr & EFI_MD_ATTR_RP) - printf("RP "); - if (p->md_attr & EFI_MD_ATTR_XP) - printf("XP "); - if (p->md_attr & EFI_MD_ATTR_NV) - printf("NV "); - if (p->md_attr & EFI_MD_ATTR_MORE_RELIABLE) - printf("MORE_RELIABLE "); - if (p->md_attr & EFI_MD_ATTR_RO) - printf("RO "); - if (p->md_attr & EFI_MD_ATTR_RT) - printf("RUNTIME"); - printf("\n"); -} - static bool do_memory_from_fdt(int fd) { @@ -212,9 +131,7 @@ do_memory_from_fdt(int fd) efi_map_phys_src = 0; /* Mark MODINFOMD_EFI_MAP as valid */ close(fd2); printf("UEFI MAP:\n"); - printf("%23s %12s %12s %8s %4s\n", - "Type", "Physical", "Virtual", "#Pages", "Attr"); - foreach_efi_map_entry(efihdr, print_efi_map_entry, NULL); + print_efi_map(efihdr); return true; /* OK, we really have the memory map */ no_read: diff --git a/stand/kboot/libkboot/Makefile b/stand/kboot/libkboot/Makefile index 249bfef817c5..e23ae9bb9215 100644 --- a/stand/kboot/libkboot/Makefile +++ b/stand/kboot/libkboot/Makefile @@ -13,6 +13,10 @@ SRCS+= seg.c SRCS+= termios.c SRCS+= util.c +.if ${MACHINE_ARCH} != "powerpc64" +SRCS+= efi.c +.endif + .sinclude "${.CURDIR}/arch/${MACHINE_ARCH}/Makefile.inc" .include diff --git a/stand/kboot/libkboot/efi.c b/stand/kboot/libkboot/efi.c new file mode 100644 index 000000000000..1f7f28093819 --- /dev/null +++ b/stand/kboot/libkboot/efi.c @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2024 Netflix, Inc + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include "stand.h" +#include "efi.h" + +void +foreach_efi_map_entry(struct efi_map_header *efihdr, efi_map_entry_cb cb, void *argp) +{ + struct efi_md *map, *p; + size_t efisz; + int ndesc, i; + + /* + * Memory map data provided by UEFI via the GetMemoryMap + * Boot Services API. + */ + efisz = roundup2(sizeof(struct efi_map_header), 16); + map = (struct efi_md *)((uint8_t *)efihdr + efisz); + + if (efihdr->descriptor_size == 0) + return; + ndesc = efihdr->memory_size / efihdr->descriptor_size; + + for (i = 0, p = map; i < ndesc; i++, + p = efi_next_descriptor(p, efihdr->descriptor_size)) { + cb(p, argp); + } +} + +static void +print_efi_map_entry(struct efi_md *p, void *argp __unused) +{ + const char *type; + static const char *types[] = { + "Reserved", + "LoaderCode", + "LoaderData", + "BootServicesCode", + "BootServicesData", + "RuntimeServicesCode", + "RuntimeServicesData", + "ConventionalMemory", + "UnusableMemory", + "ACPIReclaimMemory", + "ACPIMemoryNVS", + "MemoryMappedIO", + "MemoryMappedIOPortSpace", + "PalCode", + "PersistentMemory" + }; + + if (p->md_type < nitems(types)) + type = types[p->md_type]; + else + type = ""; + printf("%23s %012lx %012lx %08lx ", type, p->md_phys, + p->md_virt, p->md_pages); + if (p->md_attr & EFI_MD_ATTR_UC) + printf("UC "); + if (p->md_attr & EFI_MD_ATTR_WC) + printf("WC "); + if (p->md_attr & EFI_MD_ATTR_WT) + printf("WT "); + if (p->md_attr & EFI_MD_ATTR_WB) + printf("WB "); + if (p->md_attr & EFI_MD_ATTR_UCE) + printf("UCE "); + if (p->md_attr & EFI_MD_ATTR_WP) + printf("WP "); + if (p->md_attr & EFI_MD_ATTR_RP) + printf("RP "); + if (p->md_attr & EFI_MD_ATTR_XP) + printf("XP "); + if (p->md_attr & EFI_MD_ATTR_NV) + printf("NV "); + if (p->md_attr & EFI_MD_ATTR_MORE_RELIABLE) + printf("MORE_RELIABLE "); + if (p->md_attr & EFI_MD_ATTR_RO) + printf("RO "); + if (p->md_attr & EFI_MD_ATTR_RT) + printf("RUNTIME"); + printf("\n"); +} + +void +print_efi_map(struct efi_map_header *efihdr) +{ + printf("%23s %12s %12s %8s %4s\n", + "Type", "Physical", "Virtual", "#Pages", "Attr"); + + foreach_efi_map_entry(efihdr, print_efi_map_entry, NULL); +}