git: 136d2dc09310 - main - kboot: Start to move efi common routines to libkboot
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 09 Apr 2025 21:17:58 UTC
The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=136d2dc093105625e943466384efa1e1c16afad3 commit 136d2dc093105625e943466384efa1e1c16afad3 Author: Warner Losh <imp@FreeBSD.org> AuthorDate: 2025-04-09 21:16:57 +0000 Commit: Warner Losh <imp@FreeBSD.org> 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 <sys/efi.h> +#include <machine/metadata.h> + +/* 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 <sys/param.h> -#include <sys/efi.h> #include <machine/metadata.h> #include <sys/linker.h> #include <fdt_platform.h> @@ -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 = "<INVALID>"; - 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 <bsd.lib.mk> 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 <sys/param.h> +#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 = "<INVALID>"; + 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); +}