char *thread_stack_init(thread_task_func_t task_func, void *arg, void *stack_start, int stacksize) { char *stk; ucontext_t *p; VALGRIND_STACK_REGISTER(stack_start, (char *) stack_start + stacksize); VALGRIND_DEBUG("VALGRIND_STACK_REGISTER(%p, %p)\n", stack_start, (void*)((int)stack_start + stacksize)); DEBUG("thread_stack_init\n"); stk = stack_start; p = (ucontext_t *)(stk + ((stacksize - sizeof(ucontext_t)) / sizeof(void *))); stacksize -= sizeof(ucontext_t); if (getcontext(p) == -1) { err(EXIT_FAILURE, "thread_stack_init: getcontext"); } p->uc_stack.ss_sp = stk; p->uc_stack.ss_size = stacksize; p->uc_stack.ss_flags = 0; p->uc_link = &end_context; if (sigemptyset(&(p->uc_sigmask)) == -1) { err(EXIT_FAILURE, "thread_stack_init: sigemptyset"); } makecontext(p, (void (*)(void)) task_func, 1, arg); return (char *) p; }
void native_cpu_init(void) { if (getcontext(&end_context) == -1) { err(EXIT_FAILURE, "native_cpu_init: getcontext"); } end_context.uc_stack.ss_sp = __end_stack; end_context.uc_stack.ss_size = SIGSTKSZ; end_context.uc_stack.ss_flags = 0; makecontext(&end_context, sched_task_exit, 0); VALGRIND_STACK_REGISTER(__end_stack, __end_stack + sizeof(__end_stack)); VALGRIND_DEBUG("VALGRIND_STACK_REGISTER(%p, %p)\n", __end_stack, (void*)((int)__end_stack + sizeof(__end_stack))); DEBUG("RIOT native cpu initialized.\n"); }
char *thread_stack_init(void (*task_func)(void), void *stack_start, int stacksize) { unsigned int *stk; ucontext_t *p; VALGRIND_STACK_REGISTER(stack_start, stack_start + stacksize); VALGRIND_DEBUG("VALGRIND_STACK_REGISTER(%p, %p)\n", stack_start, (void*)((int)stack_start + stacksize)); DEBUG("thread_stack_init()\n"); stk = stack_start; #ifdef NATIVESPONTOP p = (ucontext_t *)stk; stk += sizeof(ucontext_t) / sizeof(void *); stacksize -= sizeof(ucontext_t); #else p = (ucontext_t *)(stk + ((stacksize - sizeof(ucontext_t)) / sizeof(void *))); stacksize -= sizeof(ucontext_t); #endif if (getcontext(p) == -1) { err(EXIT_FAILURE, "thread_stack_init(): getcontext()"); } p->uc_stack.ss_sp = stk; p->uc_stack.ss_size = stacksize; p->uc_stack.ss_flags = 0; p->uc_link = &end_context; if (sigemptyset(&(p->uc_sigmask)) == -1) { err(EXIT_FAILURE, "thread_stack_init(): sigemptyset()"); } makecontext(p, task_func, 0); return (char *) p; }
/** * register internal signal handler, * initalize local variables * * TODO: see register_interrupt */ void native_interrupt_init(void) { struct sigaction sa; DEBUG("native_interrupt_init\n"); VALGRIND_STACK_REGISTER(__isr_stack, __isr_stack + sizeof(__isr_stack)); VALGRIND_DEBUG("VALGRIND_STACK_REGISTER(%p, %p)\n", __isr_stack, (void*)((int)__isr_stack + sizeof(__isr_stack))); native_interrupts_enabled = 1; _native_sigpend = 0; for (int i = 0; i < 255; i++) { native_irq_handlers[i] = NULL; } sa.sa_sigaction = native_isr_entry; if (sigfillset(&sa.sa_mask) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigfillset"); } sa.sa_flags = SA_RESTART | SA_SIGINFO | SA_ONSTACK; /* We want to white list authorized signals */ if (sigfillset(&_native_sig_set) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigprocmask"); } /* we need to disable all signals during our signal handler as it * can not cope with interrupted signals ... */ if (sigfillset(&_native_sig_set_dint) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigfillset"); } /* SIGUSR1 is intended for debugging purposes and shall always be * enabled */ if (sigdelset(&_native_sig_set, SIGUSR1) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigdelset"); } if (sigdelset(&_native_sig_set_dint, SIGUSR1) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigdelset"); } /* SIGUSR1 is handled like a regular interrupt */ if (sigaction(SIGUSR1, &sa, NULL)) { err(EXIT_FAILURE, "native_interrupt_init: sigaction"); } if (getcontext(&native_isr_context) == -1) { err(EXIT_FAILURE, "native_interrupt_init: getcontext"); } native_isr_context.uc_stack.ss_sp = __isr_stack; native_isr_context.uc_stack.ss_size = SIGSTKSZ; native_isr_context.uc_stack.ss_flags = 0; _native_isr_ctx = &native_isr_context; static stack_t sigstk; sigstk.ss_sp = sigalt_stk; sigstk.ss_size = SIGSTKSZ; sigstk.ss_flags = 0; if (sigaltstack(&sigstk, NULL) < 0) { err(EXIT_FAILURE, "native_interrupt_init: sigaltstack"); } makecontext(&native_isr_context, native_irq_handler, 0); _native_in_syscall = 0; if (real_pipe(_sig_pipefd) == -1) { err(EXIT_FAILURE, "native_interrupt_init: pipe"); } /* allow for ctrl+c to shut down gracefully always */ //register_interrupt(SIGINT, native_shutdown); sa.sa_sigaction = native_shutdown; if (sigdelset(&_native_sig_set, SIGINT) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigdelset"); } if (sigdelset(&_native_sig_set_dint, SIGINT) == -1) { err(EXIT_FAILURE, "native_interrupt_init: sigdelset"); } if (sigaction(SIGINT, &sa, NULL)) { err(EXIT_FAILURE, "native_interrupt_init: sigaction"); } puts("RIOT native interrupts/signals initialized."); }