diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2013-03-17 01:10:23 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2013-03-17 01:10:23 +0000 |
commit | db8769c0dbd3a9c33b60863a62f33cc5158bf7bd (patch) | |
tree | 24531e144c76b9766f17065c7acb87f6d183e5f8 /nuttx/arch/arm/src/armv7-m/up_schedulesigaction.c | |
parent | e6dc1927ce61a16359477bb93a2292caade5df75 (diff) | |
download | px4-nuttx-db8769c0dbd3a9c33b60863a62f33cc5158bf7bd.tar.gz px4-nuttx-db8769c0dbd3a9c33b60863a62f33cc5158bf7bd.tar.bz2 px4-nuttx-db8769c0dbd3a9c33b60863a62f33cc5158bf7bd.zip |
There kernel-side signal handler trampoline needs to run in privileged mode
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5751 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/armv7-m/up_schedulesigaction.c')
-rw-r--r-- | nuttx/arch/arm/src/armv7-m/up_schedulesigaction.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/nuttx/arch/arm/src/armv7-m/up_schedulesigaction.c b/nuttx/arch/arm/src/armv7-m/up_schedulesigaction.c index 32f7082b3..f4cde206a 100644 --- a/nuttx/arch/arm/src/armv7-m/up_schedulesigaction.c +++ b/nuttx/arch/arm/src/armv7-m/up_schedulesigaction.c @@ -46,6 +46,7 @@ #include <nuttx/arch.h> #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; |