diff --git a/ChangeLog b/ChangeLog index 9074c2895b..10201d7a1d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4342,6 +4342,18 @@ * tools/mkconfig.c: Logic that attempts to suppressed buffered I/O within the kernel is wrong. sizeof(struct file_struct) must be the same in both kernel- and user-spaces (2013-03-16). - * arch/arm/src/common/up_pthread_start.c, nuttx/libc/pthread/pthread_startup.c, + * arch/arm/src/common/up_pthread_start.c, libc/pthread/pthread_startup.c, and related files: Implement switch to user-space and user-space - pthread start-up function (2013-03-16). + pthread start-up function (2013-03-16). + * arch/arm/src/common/up_signal_handler.c, libc/pthread/pthread_startup.c, + and related files: Implement switch to user-space and user-space + pthread start-up function (2013-03-16). + * arch/arm/src/common/up_signal_handler.c, libc/signal/signal_handler.c, + arch/arm/src/armv[6|7]-m/up_svcall.c, arch/arm/include/armv[6|7]-m/svcall.h, + include/nuttx/userspace.h, and sched/sig_deliver.c: Implement switch + to user-space from kernel signal delivery trampoline before calling user- + space signal handler. Return from user-space signal handler using a + system call (2013-03-16). + * arch/arm/src/armv[6|7]-m/up_schedulesigaction.c: Need make sure we are + in kernel mode before switching to kernel-mode signal handler + trampoline. diff --git a/arch/arm/src/armv6-m/up_schedulesigaction.c b/arch/arm/src/armv6-m/up_schedulesigaction.c index aa85d56f08..fa12327043 100644 --- a/arch/arm/src/armv6-m/up_schedulesigaction.c +++ b/arch/arm/src/armv6-m/up_schedulesigaction.c @@ -46,6 +46,7 @@ #include #include "psr.h" +#include "exc_return.h" #include "os_internal.h" #include "up_internal.h" #include "up_arch.h" @@ -159,12 +160,16 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) tcb->xcp.saved_xpsr = current_regs[REG_XPSR]; /* Then set up to vector to the trampoline with interrupts - * disabled + * disabled. The kernel-space trampoline must run in + * privileged thread mode. */ current_regs[REG_PC] = (uint32_t)up_sigdeliver; current_regs[REG_BASEPRI] = NVIC_SYSH_DISABLE_PRIORITY; current_regs[REG_XPSR] = ARMV6M_XPSR_T; +#ifdef CONFIG_NUTTX_KERNEL + current_regs[REG_XPSR] = EXC_RETURN_PRIVTHR; +#endif /* And make sure that the saved context in the TCB * is the same as the interrupt return context. @@ -193,7 +198,8 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) tcb->xcp.saved_xpsr = tcb->xcp.regs[REG_XPSR]; /* Then set up to vector to the trampoline with interrupts - * disabled + * disabled. We must already be in privileged thread mode + * to be here. */ tcb->xcp.regs[REG_PC] = (uint32_t)up_sigdeliver; diff --git a/arch/arm/src/armv7-m/up_schedulesigaction.c b/arch/arm/src/armv7-m/up_schedulesigaction.c index 32f7082b3c..f4cde206a3 100644 --- a/arch/arm/src/armv7-m/up_schedulesigaction.c +++ b/arch/arm/src/armv7-m/up_schedulesigaction.c @@ -46,6 +46,7 @@ #include #include "psr.h" +#include "exc_return.h" #include "os_internal.h" #include "up_internal.h" #include "up_arch.h" @@ -163,7 +164,8 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) tcb->xcp.saved_xpsr = current_regs[REG_XPSR]; /* Then set up to vector to the trampoline with interrupts - * disabled + * disabled. The kernel-space trampoline must run in + * privileged thread mode. */ current_regs[REG_PC] = (uint32_t)up_sigdeliver; @@ -173,6 +175,9 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) current_regs[REG_PRIMASK] = 1; #endif current_regs[REG_XPSR] = ARMV7M_XPSR_T; +#ifdef CONFIG_NUTTX_KERNEL + current_regs[REG_XPSR] = EXC_RETURN_PRIVTHR; +#endif /* And make sure that the saved context in the TCB * is the same as the interrupt return context. @@ -205,7 +210,8 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) tcb->xcp.saved_xpsr = tcb->xcp.regs[REG_XPSR]; /* Then set up to vector to the trampoline with interrupts - * disabled + * disabled. We must already be in privileged thread mode + * to be here. */ tcb->xcp.regs[REG_PC] = (uint32_t)up_sigdeliver;