Changeset View
Changeset View
Standalone View
Standalone View
head/sys/arm64/arm64/machdep_boot.c
Show First 20 Lines • Show All 78 Lines • ▼ Show 20 Lines | #define PRELOAD_PUSH_STRING(str) do { \ | ||||
size = roundup(size, sizeof(u_long)); \ | size = roundup(size, sizeof(u_long)); \ | ||||
} while (0) | } while (0) | ||||
/* Build minimal set of metatda. */ | /* Build minimal set of metatda. */ | ||||
static vm_offset_t | static vm_offset_t | ||||
fake_preload_metadata(void *dtb_ptr, size_t dtb_size) | fake_preload_metadata(void *dtb_ptr, size_t dtb_size) | ||||
{ | { | ||||
#ifdef DDB | |||||
vm_offset_t zstart = 0, zend = 0; | |||||
#endif | |||||
vm_offset_t lastaddr; | vm_offset_t lastaddr; | ||||
static char fake_preload[256]; | static char fake_preload[256]; | ||||
caddr_t preload_ptr; | caddr_t preload_ptr; | ||||
size_t size; | size_t size; | ||||
lastaddr = (vm_offset_t)&end; | |||||
preload_ptr = (caddr_t)&fake_preload[0]; | preload_ptr = (caddr_t)&fake_preload[0]; | ||||
size = 0; | size = 0; | ||||
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_NAME); | PRELOAD_PUSH_VALUE(uint32_t, MODINFO_NAME); | ||||
PRELOAD_PUSH_STRING("kernel"); | PRELOAD_PUSH_STRING("kernel"); | ||||
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_TYPE); | PRELOAD_PUSH_VALUE(uint32_t, MODINFO_TYPE); | ||||
PRELOAD_PUSH_STRING("elf kernel"); | PRELOAD_PUSH_STRING("elf kernel"); | ||||
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_ADDR); | PRELOAD_PUSH_VALUE(uint32_t, MODINFO_ADDR); | ||||
PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t)); | PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t)); | ||||
PRELOAD_PUSH_VALUE(uint64_t, VM_MIN_KERNEL_ADDRESS); | PRELOAD_PUSH_VALUE(uint64_t, VM_MIN_KERNEL_ADDRESS); | ||||
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_SIZE); | PRELOAD_PUSH_VALUE(uint32_t, MODINFO_SIZE); | ||||
PRELOAD_PUSH_VALUE(uint32_t, sizeof(size_t)); | PRELOAD_PUSH_VALUE(uint32_t, sizeof(size_t)); | ||||
PRELOAD_PUSH_VALUE(uint64_t, (size_t)(&end - VM_MIN_KERNEL_ADDRESS)); | PRELOAD_PUSH_VALUE(uint64_t, (size_t)(&end - VM_MIN_KERNEL_ADDRESS)); | ||||
#ifdef DDB | |||||
if (*(uint64_t *)VM_MIN_KERNEL_ADDRESS == MAGIC_TRAMP_NUMBER) { | |||||
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_METADATA|MODINFOMD_SSYM); | |||||
PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t)); | |||||
PRELOAD_PUSH_VALUE(uint64_t, | |||||
*(uint64_t *)(VM_MIN_KERNEL_ADDRESS + 4)); | |||||
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_METADATA | MODINFOMD_ESYM); | |||||
PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t)); | |||||
PRELOAD_PUSH_VALUE(uint64_t, | |||||
*(uint64_t *)(VM_MIN_KERNEL_ADDRESS + 8)); | |||||
lastaddr = *(uint64_t *)(VM_MIN_KERNEL_ADDRESS + 8); | |||||
zend = lastaddr; | |||||
zstart = *(uint64_t *)(VM_MIN_KERNEL_ADDRESS + 4); | |||||
db_fetch_ksymtab(zstart, zend); | |||||
} else | |||||
#endif | |||||
lastaddr = (vm_offset_t)&end; | |||||
if (dtb_ptr != NULL) { | if (dtb_ptr != NULL) { | ||||
/* Copy DTB to KVA space and insert it into module chain. */ | /* Copy DTB to KVA space and insert it into module chain. */ | ||||
lastaddr = roundup(lastaddr, sizeof(int)); | lastaddr = roundup(lastaddr, sizeof(int)); | ||||
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_METADATA | MODINFOMD_DTBP); | PRELOAD_PUSH_VALUE(uint32_t, MODINFO_METADATA | MODINFOMD_DTBP); | ||||
PRELOAD_PUSH_VALUE(uint32_t, sizeof(uint64_t)); | PRELOAD_PUSH_VALUE(uint32_t, sizeof(uint64_t)); | ||||
PRELOAD_PUSH_VALUE(uint64_t, (uint64_t)lastaddr); | PRELOAD_PUSH_VALUE(uint64_t, (uint64_t)lastaddr); | ||||
memmove((void *)lastaddr, dtb_ptr, dtb_size); | memmove((void *)lastaddr, dtb_ptr, dtb_size); | ||||
lastaddr += dtb_size; | lastaddr += dtb_size; | ||||
▲ Show 20 Lines • Show All 117 Lines • Show Last 20 Lines |