Changeset View
Changeset View
Standalone View
Standalone View
head/sys/arm/arm/machdep_boot.c
Show First 20 Lines • Show All 346 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* Fake up a boot descriptor table | * Fake up a boot descriptor table | ||||
*/ | */ | ||||
vm_offset_t | vm_offset_t | ||||
fake_preload_metadata(struct arm_boot_params *abp __unused, void *dtb_ptr, | fake_preload_metadata(struct arm_boot_params *abp __unused, void *dtb_ptr, | ||||
size_t dtb_size) | size_t dtb_size) | ||||
{ | { | ||||
#ifdef DDB | |||||
vm_offset_t zstart = 0, zend = 0; | |||||
#endif | |||||
vm_offset_t lastaddr; | vm_offset_t lastaddr; | ||||
int i = 0; | int i = 0; | ||||
static uint32_t fake_preload[35]; | static uint32_t fake_preload[35]; | ||||
lastaddr = (vm_offset_t)&end; | |||||
fake_preload[i++] = MODINFO_NAME; | fake_preload[i++] = MODINFO_NAME; | ||||
fake_preload[i++] = strlen("kernel") + 1; | fake_preload[i++] = strlen("kernel") + 1; | ||||
strcpy((char*)&fake_preload[i++], "kernel"); | strcpy((char*)&fake_preload[i++], "kernel"); | ||||
i += 1; | i += 1; | ||||
fake_preload[i++] = MODINFO_TYPE; | fake_preload[i++] = MODINFO_TYPE; | ||||
fake_preload[i++] = strlen("elf kernel") + 1; | fake_preload[i++] = strlen("elf kernel") + 1; | ||||
strcpy((char*)&fake_preload[i++], "elf kernel"); | strcpy((char*)&fake_preload[i++], "elf kernel"); | ||||
i += 2; | i += 2; | ||||
fake_preload[i++] = MODINFO_ADDR; | fake_preload[i++] = MODINFO_ADDR; | ||||
fake_preload[i++] = sizeof(vm_offset_t); | fake_preload[i++] = sizeof(vm_offset_t); | ||||
fake_preload[i++] = KERNVIRTADDR; | fake_preload[i++] = KERNVIRTADDR; | ||||
fake_preload[i++] = MODINFO_SIZE; | fake_preload[i++] = MODINFO_SIZE; | ||||
fake_preload[i++] = sizeof(uint32_t); | fake_preload[i++] = sizeof(uint32_t); | ||||
fake_preload[i++] = (uint32_t)&end - KERNVIRTADDR; | fake_preload[i++] = (uint32_t)&end - KERNVIRTADDR; | ||||
#ifdef DDB | |||||
if (*(uint32_t *)KERNVIRTADDR == MAGIC_TRAMP_NUMBER) { | |||||
fake_preload[i++] = MODINFO_METADATA|MODINFOMD_SSYM; | |||||
fake_preload[i++] = sizeof(vm_offset_t); | |||||
fake_preload[i++] = *(uint32_t *)(KERNVIRTADDR + 4); | |||||
fake_preload[i++] = MODINFO_METADATA|MODINFOMD_ESYM; | |||||
fake_preload[i++] = sizeof(vm_offset_t); | |||||
fake_preload[i++] = *(uint32_t *)(KERNVIRTADDR + 8); | |||||
lastaddr = *(uint32_t *)(KERNVIRTADDR + 8); | |||||
zend = lastaddr; | |||||
zstart = *(uint32_t *)(KERNVIRTADDR + 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)); | ||||
fake_preload[i++] = MODINFO_METADATA | MODINFOMD_DTBP; | fake_preload[i++] = MODINFO_METADATA | MODINFOMD_DTBP; | ||||
fake_preload[i++] = sizeof(uint32_t); | fake_preload[i++] = sizeof(uint32_t); | ||||
fake_preload[i++] = (uint32_t)lastaddr; | fake_preload[i++] = (uint32_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 119 Lines • Show Last 20 Lines |