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
This commit is contained in:
@@ -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);
|
||||
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user