diff --git a/arch/c5471/src/up_sigdeliver.c b/arch/c5471/src/up_sigdeliver.c index 528a2864e2..8ec10599a1 100644 --- a/arch/c5471/src/up_sigdeliver.c +++ b/arch/c5471/src/up_sigdeliver.c @@ -80,6 +80,13 @@ void up_sigdeliver(void) uint32 regs[XCPTCONTEXT_REGS]; sig_deliver_t sigdeliver; + /* Save the errno. This must be preserved throughout the + * signal handling so that the the user code final gets + * the correct errno value (probably EINTR). + */ + + int saved_errno = rtcb->errno; + up_ledon(LED_SIGNAL); dbg("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", @@ -110,11 +117,19 @@ void up_sigdeliver(void) sigdeliver(rtcb); + /* Output any debug messaged BEFORE restoreing errno + * (becuase they may alter errno), then restore the + * original errno that is needed by the user logic + * (it is probably EINTR). + */ + + dbg("Resuming\n"); + rtcb->errno = saved_errno; + /* Then restore the correct state for this thread of * execution. */ up_ledoff(LED_SIGNAL); - dbg("Resuming\n"); up_fullcontextrestore(regs); } diff --git a/arch/dm320/src/up_sigdeliver.c b/arch/dm320/src/up_sigdeliver.c index 847ca8a844..3d4e98bc16 100644 --- a/arch/dm320/src/up_sigdeliver.c +++ b/arch/dm320/src/up_sigdeliver.c @@ -77,9 +77,16 @@ void up_sigdeliver(void) { _TCB *rtcb = (_TCB*)g_readytorun.head; - uint32 regs[XCPTCONTEST_REGS]; + uint32 regs[XCPTCONTEXT_REGS]; sig_deliver_t sigdeliver; + /* Save the errno. This must be preserved throughout the + * signal handling so that the the user code final gets + * the correct errno value (probably EINTR). + */ + + int saved_errno = rtcb->errno; + dbg("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", rtcb, rtcb->xcp.sigdeliver, rtcb->sigpendactionq.head); ASSERT(rtcb->xcp.sigdeliver != NULL); @@ -108,10 +115,18 @@ void up_sigdeliver(void) sigdeliver(rtcb); + /* Output any debug messaged BEFORE restoreing errno + * (becuase they may alter errno), then restore the + * original errno that is needed by the user logic + * (it is probably EINTR). + */ + + dbg("Resuming\n"); + rtcb->errno = saved_errno; + /* Then restore the correct state for this thread of * execution. */ - dbg("Resuming\n"); up_fullcontextrestore(regs); }