My platform is imx6q sabrelite and I have run sel4-test successfully. Now I'm trying to create a new thread in the initial thread according to sel4 tutorial2. But it didn't run.
int main(void)
{
int error;
reservation_t virtual_reservation;
seL4_BootInfo *info = platsupport_get_bootinfo();
seL4_DebugNameThread(seL4_CapInitThreadTCB, "sel4test-driver");
/* initialise libsel4simple */
simple_default_init_bootinfo(&env.simple, info);
/* create an allocator */
allocman = bootstrap_use_current_simple(&env.simple, ALLOCATOR_STATIC_POOL_SIZE, allocator_mem_pool);
/* create a vka */
allocman_make_vka(&env.vka, allocman);
/* create a vspace */
error = sel4utils_bootstrap_vspace_with_bootinfo_leaky(&env.vspace,
&data, simple_get_pd(&env.simple),
&env.vka, platsupport_get_bootinfo());
/* fill the allocator with virtual memory */
void *vaddr;
virtual_reservation = vspace_reserve_range(&env.vspace,
ALLOCATOR_VIRTUAL_POOL_SIZE, seL4_AllRights, 1, &vaddr);
if (virtual_reservation.res == 0) {
ZF_LOGF("Failed to provide virtual memory for allocator");
}
bootstrap_configure_virtual_pool(allocman, vaddr,
ALLOCATOR_VIRTUAL_POOL_SIZE, simple_get_pd(&env.simple));
/* Allocate slots for, and obtain the caps for, the hardware we will be
* using, in the same function.
*/
sel4platsupport_init_default_serial_caps(&env.vka, &env.vspace, &env.simple, &env.serial_objects);
vka_t serial_vka = env.vka;
serial_vka.utspace_alloc_at = arch_get_serial_utspace_alloc_at(&env);
/* Construct a simple wrapper for returning the I/O ports. */
simple_t serial_simple = env.simple;
/* enable serial driver */
platsupport_serial_setup_simple(&env.vspace, &serial_simple, &serial_vka);
simple_print(&env.simple);
/* get our cspace root cnode */
seL4_CPtr cspace_cap;
cspace_cap = simple_get_cnode(&env.simple);
/* get our vspace root page diretory */
seL4_CPtr pd_cap;
pd_cap = simple_get_pd(&env.simple);
/* create a new TCB */
vka_object_t tcb_object = {0};
error = vka_alloc_tcb(&env.vka, &tcb_object);
/* initialise the new TCB */
error = seL4_TCB_Configure(tcb_object.cptr, seL4_CapNull, cspace_cap, seL4_NilData, pd_cap, seL4_NilData, 0, 0);
/* give the new thread a name */
name_thread(tcb_object.cptr, "hello-2: thread_2");
UNUSED seL4_UserContext regs = {0};
/* set instruction pointer where the thread shoud start running */
sel4utils_set_instruction_pointer(®s, (seL4_Word)thread_2);
error=sel4utils_get_instruction_pointer(regs);
/* check that stack is aligned correctly */
const int stack_alignment_requirement = sizeof(seL4_Word) * 2;
uintptr_t thread_2_stack_top = (uintptr_t)thread_2_stack + sizeof(thread_2_stack);
/* set stack pointer for the new thread */
sel4utils_set_stack_pointer(®s, thread_2_stack_top);
error=sel4utils_get_sp(regs);
/* actually write the TCB registers. */
error = seL4_TCB_WriteRegisters(tcb_object.cptr, 0, 0, 2, ®s);
/* start the new thread running */
error = seL4_TCB_Resume(tcb_object.cptr);
/* we are done, say hello */
printf("main: hello world \n");
return 0;
}