/* Return starting address of stack segment. */ long stack_start_addr() { jmp_buf env; unsigned long addr; (void)SETJMP(env); addr = (long)JMP_BUF_SP(env); PTR_DECRYPT(addr); return addr & PAGE_MASK; }
thread_id uthread_create(UTHREAD_START_ROUTINE start_routine,void* arg) { thread_t *thread; if(threads == 0) { if(uthread_init() == UTHREAD_FAIL) return UTHREAD_FAIL; } uthread_disable(); thread = uthread_alloc(start_routine,arg); /* We save this point as new thread execution start. When we return here, * we spawn the thread and start it's execution. */ /* JMP_BUF_SP(thread->stack) = ((long)uthread_stack_alloc())+UTHREAD_DEF_STACK_SIZE; */ if(sigsetjmp(thread->stack,1)) { /* Execute this if we returned with siglongjmp. This will happen when * jumping from alarm handler. */ uthread_spawn(current); } JMP_BUF_SP(thread->stack) = ((long)uthread_stack_alloc())+UTHREAD_DEF_STACK_SIZE; uthread_enable(); return thread->id; }