/** Handle loader connection. * * Receive and carry out commands (of which the last one should be * to execute the loaded program). */ static void ldr_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) { /* Already have a connection? */ if (connected) { async_answer_0(iid, ELIMIT); return; } connected = true; /* Accept the connection */ async_answer_0(iid, EOK); /* Ignore parameters, the connection is already open */ (void) icall; while (true) { int retval; ipc_call_t call; ipc_callid_t callid = async_get_call(&call); if (!IPC_GET_IMETHOD(call)) exit(0); switch (IPC_GET_IMETHOD(call)) { case LOADER_GET_TASKID: ldr_get_taskid(callid, &call); continue; case LOADER_SET_CWD: ldr_set_cwd(callid, &call); continue; case LOADER_SET_PATHNAME: ldr_set_pathname(callid, &call); continue; case LOADER_SET_ARGS: ldr_set_args(callid, &call); continue; case LOADER_SET_FILES: ldr_set_files(callid, &call); continue; case LOADER_LOAD: ldr_load(callid, &call); continue; case LOADER_RUN: ldr_run(callid, &call); /* Not reached */ default: retval = EINVAL; break; } async_answer_0(callid, retval); } }
/* * the bootldr command loads an address, checks to see if there * is a Boot stream that the on-chip BOOTROM can understand, * and loads it via the BOOTROM Callback. It is possible * to also add booting from SPI, or TWI, but this function does * not currently support that. */ int do_bootldr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { void *addr; /* Get the address */ if (argc < 2) addr = (void *)load_addr; else addr = (void *)simple_strtoul(argv[1], NULL, 16); /* Check if it is a LDR file */ if (ldr_valid_signature(addr)) { printf("## Booting ldr image at 0x%p ...\n", addr); ldr_load(addr); icache_disable(); dcache_disable(); ldr_exec(addr); } else printf("## No ldr image at address 0x%p\n", addr); return 0; }