The behavior of 'setjmp()' is not portable across different UNIX systems. BSD derived systems including OS X will the signal mask whereas Linux and Solaris do not (POSIX doesn't specify behavior of setjmp/longjmp with respect to signal masks).
'sigsetjmp()' on the other hand takes an additional argument 'savemask' that indicates whether the caller wants to save the signal mask or not. In addition this function has the same behavior across all UNIX systems so use this instead of '_setjmp()'. Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/948d9055 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/948d9055 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/948d9055 Branch: refs/heads/master Commit: 948d9055a03216c57bae2b521e38ab16db802faa Parents: 701930d Author: Neel Natu <n...@nahannisys.com> Authored: Sun Mar 6 22:56:49 2016 -0800 Committer: Neel Natu <n...@nahannisys.com> Committed: Sun Mar 6 22:56:49 2016 -0800 ---------------------------------------------------------------------- libs/os/src/arch/sim/os_arch_sim.c | 6 +++--- libs/os/src/arch/sim/os_arch_stack_frame.s | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/948d9055/libs/os/src/arch/sim/os_arch_sim.c ---------------------------------------------------------------------- diff --git a/libs/os/src/arch/sim/os_arch_sim.c b/libs/os/src/arch/sim/os_arch_sim.c index 03975ce..18e40a1 100644 --- a/libs/os/src/arch/sim/os_arch_sim.c +++ b/libs/os/src/arch/sim/os_arch_sim.c @@ -35,7 +35,7 @@ struct stack_frame { int sf_mainsp; /* stack on which main() is executing */ - jmp_buf sf_jb; + sigjmp_buf sf_jb; int sf_sigsblocked; struct os_task *sf_task; }; @@ -55,8 +55,8 @@ extern void os_arch_frame_init(struct stack_frame *sf); #define ISR_BLOCK_OFF (0) #define ISR_BLOCK_ON (1) -#define sim_setjmp(__jb) _setjmp(__jb) -#define sim_longjmp(__jb, __ret) _longjmp(__jb, __ret) +#define sim_setjmp(__jb) sigsetjmp(__jb, 0) +#define sim_longjmp(__jb, __ret) siglongjmp(__jb, __ret) sigset_t g_sigset; volatile int g_block_isr = ISR_BLOCK_OFF; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/948d9055/libs/os/src/arch/sim/os_arch_stack_frame.s ---------------------------------------------------------------------- diff --git a/libs/os/src/arch/sim/os_arch_stack_frame.s b/libs/os/src/arch/sim/os_arch_stack_frame.s index 91c9338..81ce68b 100644 --- a/libs/os/src/arch/sim/os_arch_stack_frame.s +++ b/libs/os/src/arch/sim/os_arch_stack_frame.s @@ -40,15 +40,18 @@ _os_arch_frame_init: * ---------------- * alignment padding variable (0 to 12 bytes) * ---------------- - * pointer to sf_jb %esp + * savemask (0) 0x4(%esp) + * ---------------- + * pointer to sf_jb 0x0(%esp) * ---------------- */ movl %esi,%esp - subl $0x4,%esp /* make room for setjmp() argument */ + subl $0x8,%esp /* make room for sigsetjmp() arguments */ andl $0xfffffff0,%esp /* align %esp on 16-byte boundary */ leal 0x4(%esi),%eax /* %eax = &sf->sf_jb */ movl %eax,0x0(%esp) - call __setjmp /* _setjmp(sf->sf_jb) */ + movl $0, 0x4(%esp) + call _sigsetjmp /* _setjmp(sf->sf_jb, 0) */ test %eax,%eax jne 1f movl 0x0(%esi),%esp /* switch back to the main() stack */