36#include <sys/linker.h>
38#include <sys/sysctl.h>
40#include <machine/metadata.h>
43#include <vm/vm_extern.h>
65 hdr = (uint32_t *)curp;
66 if (hdr[0] == 0 && hdr[1] == 0)
70 if ((hdr[0] == MODINFO_NAME) &&
71 !strcmp(
name, curp +
sizeof(uint32_t) * 2))
75 next =
sizeof(uint32_t) * 2 + hdr[1];
76 next = roundup(next,
sizeof(u_long));
97 hdr = (uint32_t *)curp;
98 if (hdr[0] == 0 && hdr[1] == 0)
102 if (hdr[0] == MODINFO_NAME)
106 if ((hdr[0] == MODINFO_TYPE) &&
107 !strcmp(
type, curp +
sizeof(uint32_t) * 2))
111 next =
sizeof(uint32_t) * 2 + hdr[1];
112 next = roundup(next,
sizeof(u_long));
134 hdr = (uint32_t *)curp;
135 next =
sizeof(uint32_t) * 2 + hdr[1];
136 next = roundup(next,
sizeof(u_long));
142 hdr = (uint32_t *)curp;
143 if (hdr[0] == 0 && hdr[1] == 0)
147 if (hdr[0] == MODINFO_NAME)
151 next =
sizeof(uint32_t) * 2 + hdr[1];
152 next = roundup(next,
sizeof(u_long));
176 hdr = (uint32_t *)curp;
178 if (hdr[0] == 0 && hdr[1] == 0)
197 return(curp + (
sizeof(uint32_t) * 2));
200 next =
sizeof(uint32_t) * 2 + hdr[1];
201 next = roundup(next,
sizeof(u_long));
225 hdr = (uint32_t *)curp;
226 if (hdr[0] == MODINFO_NAME || (hdr[0] == 0 && hdr[1] == 0)) {
228 if (
addr != 0 && sz != 0)
229 kmem_bootstrap_free((vm_offset_t)
addr, sz);
235 if (!strcmp(
name, curp +
sizeof(uint32_t) * 2))
242 if (hdr[0] == MODINFO_ADDR)
243 addr = *(caddr_t *)(curp +
sizeof(uint32_t) * 2);
244 else if (hdr[0] == MODINFO_SIZE)
245 sz = *(uint32_t *)(curp +
sizeof(uint32_t) * 2);
246 hdr[0] = MODINFO_EMPTY;
250 next =
sizeof(uint32_t) * 2 + hdr[1];
251 next = roundup(next,
sizeof(u_long));
291 hdr = (uint32_t *)curp;
292 if (hdr[0] == 0 && hdr[1] == 0)
298 case MODINFO_METADATA|MODINFOMD_FONT:
299 case MODINFO_METADATA|MODINFOMD_SSYM:
300 case MODINFO_METADATA|MODINFOMD_ESYM:
301 ptr = (vm_offset_t *)(curp + (
sizeof(uint32_t) * 2));
308 next =
sizeof(uint32_t) * 2 + hdr[1];
309 next = roundup(next,
sizeof(u_long));
322 if ((
type & MODINFO_METADATA) == 0) {
346 sbuf_cat(sbp,
"unrecognized modinfo attribute");
352 sbuf_cat(sbp,
"MODINFO_METADATA | ");
353 switch (
type & ~MODINFO_METADATA) {
354 case MODINFOMD_ELFHDR:
363 case MODINFOMD_DYNAMIC:
369 case MODINFOMD_HOWTO:
372 case MODINFOMD_KERNEND:
378 case MODINFOMD_CTORS_ADDR:
379 sbuf_cat(sbp,
"MODINFOMD_CTORS_ADDR");
381 case MODINFOMD_CTORS_SIZE:
382 sbuf_cat(sbp,
"MODINFOMD_CTORS_SIZE");
384 case MODINFOMD_FW_HANDLE:
385 sbuf_cat(sbp,
"MODINFOMD_FW_HANDLE");
387 case MODINFOMD_KEYBUF:
395#ifdef MODINFOMD_SMAP_XATTR
396 case MODINFOMD_SMAP_XATTR:
397 sbuf_cat(sbp,
"MODINFOMD_SMAP_XATTR");
405#ifdef MODINFOMD_EFI_MAP
406 case MODINFOMD_EFI_MAP:
410#ifdef MODINFOMD_EFI_FB
411 case MODINFOMD_EFI_FB:
415#ifdef MODINFOMD_MODULEP
416 case MODINFOMD_MODULEP:
420#ifdef MODINFOMD_VBE_FB
421 case MODINFOMD_VBE_FB:
431 sbuf_cat(sbp,
"unrecognized metadata type");
442#define sbuf_print_vmoffset(sb, o) sbuf_printf(sb, "0x%016lx", o);
444#define sbuf_print_vmoffset(sb, o) sbuf_printf(sb, "0x%08x", o);
454 case MODINFO_METADATA | MODINFOMD_CTORS_SIZE:
458 case MODINFO_METADATA | MODINFOMD_SSYM:
459 case MODINFO_METADATA | MODINFOMD_ESYM:
460 case MODINFO_METADATA | MODINFOMD_DYNAMIC:
461 case MODINFO_METADATA | MODINFOMD_KERNEND:
462 case MODINFO_METADATA | MODINFOMD_ENVP:
463 case MODINFO_METADATA | MODINFOMD_CTORS_ADDR:
465 case MODINFO_METADATA | MODINFOMD_SMAP:
467#ifdef MODINFOMD_SMAP_XATTR
468 case MODINFO_METADATA | MODINFOMD_SMAP_XATTR:
471 case MODINFO_METADATA | MODINFOMD_DTBP:
473#ifdef MODINFOMD_EFI_FB
474 case MODINFO_METADATA | MODINFOMD_EFI_FB:
476#ifdef MODINFOMD_VBE_FB
477 case MODINFO_METADATA | MODINFOMD_VBE_FB:
480 case MODINFO_METADATA | MODINFOMD_FONT:
484 case MODINFO_METADATA | MODINFOMD_HOWTO:
487 case MODINFO_METADATA | MODINFOMD_SHDR:
488 case MODINFO_METADATA | MODINFOMD_ELFHDR:
489 case MODINFO_METADATA | MODINFOMD_FW_HANDLE:
490 case MODINFO_METADATA | MODINFOMD_KEYBUF:
491#ifdef MODINFOMD_EFI_MAP
492 case MODINFO_METADATA | MODINFOMD_EFI_MAP:
495 sbuf_cat(sbp,
"buffer contents omitted");
500#undef sbuf_print_vmoffset
506 uint32_t *bptr,
type, len;
509 (
"%s called without setting up preload_metadata", __func__));
516 while (bptr[0] != MODINFO_END || bptr[1] != MODINFO_END) {
529 bptr += roundup(len,
sizeof(u_long)) /
sizeof(uint32_t);
573 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
575 "pretty-print the bootloader metadata");
device_property_type_t type
struct sbuf * sbuf_new_for_sysctl(struct sbuf *s, char *buf, int length, struct sysctl_req *req)
static void preload_dump_internal(struct sbuf *sbp)
static int sysctl_preload_dump(SYSCTL_HANDLER_ARGS)
static void preload_modinfo_type(struct sbuf *sbp, int type)
#define sbuf_print_vmoffset(sb, o)
caddr_t preload_search_info(caddr_t mod, int inf)
caddr_t preload_search_by_name(const char *name)
size_t preload_fetch_size(caddr_t mod)
void preload_delete_name(const char *name)
caddr_t preload_search_by_type(const char *type)
void preload_bootstrap_relocate(vm_offset_t offset)
vm_offset_t preload_addr_relocate
caddr_t preload_search_next_name(caddr_t base)
void * preload_fetch_addr(caddr_t mod)
SYSCTL_PROC(_debug, OID_AUTO, dump_modinfo, CTLTYPE_STRING|CTLFLAG_RD|CTLFLAG_MPSAFE, NULL, 0, sysctl_preload_dump, "A", "pretty-print the bootloader metadata")
static void preload_modinfo_value(struct sbuf *sbp, uint32_t *bptr, int type, int len)
int sbuf_printf_drain(void *arg, const char *data, int len)
int sbuf_finish(struct sbuf *s)
int sbuf_putc(struct sbuf *s, int c)
void sbuf_delete(struct sbuf *s)
int sbuf_printf(struct sbuf *s, const char *fmt,...)
void sbuf_set_drain(struct sbuf *s, sbuf_drain_func *func, void *ctx)
struct sbuf * sbuf_new(struct sbuf *s, char *buf, int length, int flags)
int sbuf_cat(struct sbuf *s, const char *str)