void arm_kernel_startup(phys_mmap_t* mmap, lpaddr_t initrd_base, size_t initrd_bytes) { g_phys_mmap = mmap; STARTUP_PROGRESS(); #ifdef __XSCALE__ //Hardcoded because bootloader alter image if we pass the correct location //Size of image is obtained by header file which is generated during compilation initrd_base = 0x20000000; initrd_bytes = romfs_cpio_archive_size; #endif const uint8_t* initrd_cpio_base = (uint8_t*)local_phys_to_mem(initrd_base); if (!cpio_archive_valid(initrd_cpio_base, initrd_bytes)) { panic("Invalid initrd filesystem\n"); } /* allocate initial KCB */ kcb_current = (struct kcb *) local_phys_to_mem(alloc_phys(sizeof(*kcb_current))); memset(kcb_current, 0, sizeof(*kcb_current)); assert(kcb_current); spawn_init(BSP_INIT_MODULE_NAME, 0, initrd_cpio_base, initrd_bytes); }
static errval_t unpack_cpio(struct dirent *root, void *data, size_t len) { if (!cpio_archive_valid(data, len)) { USER_PANIC("invalid CPIO archive"); } cpio_generic_header_t h; cpio_visit(data, len, cpio_entry_handler, &h, root); return SYS_ERR_OK; }