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 */

Reply via email to