Changeset View
Changeset View
Standalone View
Standalone View
head/sys/riscv/riscv/machdep.c
Show First 20 Lines • Show All 723 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* Fake up a boot descriptor table. | * Fake up a boot descriptor table. | ||||
* RISCVTODO: This needs to be done via loader (when it's available). | * RISCVTODO: This needs to be done via loader (when it's available). | ||||
*/ | */ | ||||
vm_offset_t | vm_offset_t | ||||
fake_preload_metadata(struct riscv_bootparams *rvbp) | fake_preload_metadata(struct riscv_bootparams *rvbp) | ||||
{ | { | ||||
static uint32_t fake_preload[35]; | static uint32_t fake_preload[35]; | ||||
#ifdef DDB | |||||
vm_offset_t zstart = 0, zend = 0; | |||||
#endif | |||||
vm_offset_t lastaddr; | vm_offset_t lastaddr; | ||||
size_t fake_size, dtb_size; | size_t fake_size, dtb_size; | ||||
#define PRELOAD_PUSH_VALUE(type, value) do { \ | #define PRELOAD_PUSH_VALUE(type, value) do { \ | ||||
*(type *)((char *)fake_preload + fake_size) = (value); \ | *(type *)((char *)fake_preload + fake_size) = (value); \ | ||||
fake_size += sizeof(type); \ | fake_size += sizeof(type); \ | ||||
} while (0) | } while (0) | ||||
#define PRELOAD_PUSH_STRING(str) do { \ | #define PRELOAD_PUSH_STRING(str) do { \ | ||||
uint32_t ssize; \ | uint32_t ssize; \ | ||||
ssize = strlen(str) + 1; \ | ssize = strlen(str) + 1; \ | ||||
PRELOAD_PUSH_VALUE(uint32_t, ssize); \ | PRELOAD_PUSH_VALUE(uint32_t, ssize); \ | ||||
strcpy(((char *)fake_preload + fake_size), str); \ | strcpy(((char *)fake_preload + fake_size), str); \ | ||||
fake_size += ssize; \ | fake_size += ssize; \ | ||||
fake_size = roundup(fake_size, sizeof(u_long)); \ | fake_size = roundup(fake_size, sizeof(u_long)); \ | ||||
} while (0) | } while (0) | ||||
fake_size = 0; | fake_size = 0; | ||||
lastaddr = (vm_offset_t)&end; | |||||
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, KERNBASE); | PRELOAD_PUSH_VALUE(uint64_t, KERNBASE); | ||||
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)((vm_offset_t)&end - KERNBASE)); | PRELOAD_PUSH_VALUE(uint64_t, (size_t)((vm_offset_t)&end - KERNBASE)); | ||||
#ifdef DDB | |||||
#if 0 | |||||
/* RISCVTODO */ | |||||
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 | |||||
#endif | |||||
lastaddr = (vm_offset_t)&end; | |||||
/* Copy the DTB to KVA space. */ | /* Copy the DTB to KVA space. */ | ||||
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(vm_offset_t)); | PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t)); | ||||
PRELOAD_PUSH_VALUE(vm_offset_t, lastaddr); | PRELOAD_PUSH_VALUE(vm_offset_t, lastaddr); | ||||
dtb_size = fdt_totalsize(rvbp->dtbp_virt); | dtb_size = fdt_totalsize(rvbp->dtbp_virt); | ||||
memmove((void *)lastaddr, (const void *)rvbp->dtbp_virt, dtb_size); | memmove((void *)lastaddr, (const void *)rvbp->dtbp_virt, dtb_size); | ||||
▲ Show 20 Lines • Show All 126 Lines • Show Last 20 Lines |