diff --git a/arch/avr/src/avr32/up_initialstate.c b/arch/avr/src/avr32/up_initialstate.c index c160270d907..48dc6c8ebfd 100644 --- a/arch/avr/src/avr32/up_initialstate.c +++ b/arch/avr/src/avr32/up_initialstate.c @@ -108,6 +108,17 @@ void up_initial_state(_TCB *tcb) xcp->regs[REG_PC] = (uint32_t)tcb->start; + /* Set supervisor- or user-mode, depending on how NuttX is configured and + * what kind of thread is being started. Disable FIQs in any event + * + * If the kernel build is not selected, then all threads run in + * supervisor-mode. + */ + +#ifdef CONFIG_NUTTX_KERNEL +# error "Missing logic for the CONFIG_NUTTX_KERNEL build" +#endif + /* Enable or disable interrupts, based on user configuration */ # ifdef CONFIG_SUPPRESS_INTERRUPTS diff --git a/arch/sh/src/sh1/sh1_initialstate.c b/arch/sh/src/sh1/sh1_initialstate.c index 692561e86bf..94b74c3abd5 100644 --- a/arch/sh/src/sh1/sh1_initialstate.c +++ b/arch/sh/src/sh1/sh1_initialstate.c @@ -99,8 +99,28 @@ void up_initial_state(_TCB *tcb) /* Initialize the initial exception register context structure */ memset(xcp, 0, sizeof(struct xcptcontext)); + + /* Set the initial stack pointer to the "base" of the allocated stack */ + xcp->regs[REG_SP] = (uint32_t)tcb->adj_stack_ptr; + + /* Save the task entry point */ + xcp->regs[REG_PC] = (uint32_t)tcb->start; + + /* Set supervisor- or user-mode, depending on how NuttX is configured and + * what kind of thread is being started. Disable FIQs in any event + * + * If the kernel build is not selected, then all threads run in + * supervisor-mode. + */ + +#ifdef CONFIG_NUTTX_KERNEL +# error "Missing logic for the CONFIG_NUTTX_KERNEL build" +#endif + + /* Enable or disable interrupts, based on user configuration */ + #ifdef CONFIG_SUPPRESS_INTERRUPTS xcp->regs[REG_SR] = up_getsr() | 0x000000f0; #else diff --git a/arch/x86/src/i486/up_initialstate.c b/arch/x86/src/i486/up_initialstate.c index 9ca40feb3c9..c1bb422da14 100644 --- a/arch/x86/src/i486/up_initialstate.c +++ b/arch/x86/src/i486/up_initialstate.c @@ -104,6 +104,17 @@ void up_initial_state(_TCB *tcb) xcp->regs[REG_CS] = up_getcs(); xcp->regs[REG_SS] = up_getss(); + /* Set supervisor- or user-mode, depending on how NuttX is configured and + * what kind of thread is being started. Disable FIQs in any event + * + * If the kernel build is not selected, then all threads run in + * supervisor-mode. + */ + +#ifdef CONFIG_NUTTX_KERNEL +# error "Missing logic for the CONFIG_NUTTX_KERNEL build" +#endif + /* Enable or disable interrupts, based on user configuration. If the IF * bit is set, maskable interrupts will be enabled. */