tuse macro for getcontext (setjmp) - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 1e05fdf92cf4c3ae32c52d6928f3e74000b76f6a
 (DIR) parent b4d5d19438106b3904185eb9ba7d6e1b8b0cfdf7
 (HTM) Author: rsc <devnull@localhost>
       Date:   Fri,  4 Nov 2005 16:34:19 +0000
       
       use macro for getcontext (setjmp)
       
       Diffstat:
         M src/libthread/386-ucontext.h        |       4 ++--
         M src/libthread/FreeBSD-386-asm.s     |      25 +++++++++++--------------
         M src/libthread/Linux-arm-asm.s       |      10 ++++------
         M src/libthread/Linux.c               |       4 ++--
         M src/libthread/OpenBSD-386.c         |      15 ---------------
         M src/libthread/OpenBSD-power.c       |      13 -------------
         M src/libthread/power-ucontext.h      |       4 ++--
         M src/libthread/threadimpl.h          |       6 ++++--
       
       8 files changed, 25 insertions(+), 56 deletions(-)
       ---
 (DIR) diff --git a/src/libthread/386-ucontext.h b/src/libthread/386-ucontext.h
       t@@ -1,8 +1,8 @@
       +#define        setcontext(u)        setmcontext(&(u)->uc_mcontext)
       +#define        getcontext(u)        getmcontext(&(u)->uc_mcontext)
        typedef struct mcontext mcontext_t;
        typedef struct ucontext ucontext_t;
        
       -extern        int                getcontext(ucontext_t*);
       -extern        void                setcontext(ucontext_t*);
        extern        int                swapcontext(ucontext_t*, ucontext_t*);
        extern        void                makecontext(ucontext_t*, void(*)(), int, ...);
        
 (DIR) diff --git a/src/libthread/FreeBSD-386-asm.s b/src/libthread/FreeBSD-386-asm.s
       t@@ -5,11 +5,10 @@ _tas:
                xchgl %eax, 0(%ecx)
                ret
        
       -.globl getcontext
       -getcontext:
       +.globl getmcontext
       +getmcontext:
                movl        4(%esp), %eax
       -        addl                $16, %eax        /* point to mcontext */
       -        
       +
                movl        %fs, 8(%eax)
                movl        %es, 12(%eax)
                movl        %ds, 16(%eax)
       t@@ -26,16 +25,15 @@ getcontext:
                movl        %ecx, 60(%eax)
                leal        4(%esp), %ecx        /* %esp */
                movl        %ecx, 72(%eax)
       -        
       +
                movl        44(%eax), %ecx        /* restore %ecx */
                movl        $0, %eax
                ret
        
       -.globl setcontext
       -setcontext:
       +.globl setmcontext
       +setmcontext:
                movl        4(%esp), %eax
       -        addl                $16, %eax        /* point to mcontext */
       -        
       +
                movl        8(%eax), %fs
                movl        12(%eax), %es
                movl        16(%eax), %ds
       t@@ -45,11 +43,10 @@ setcontext:
                movl        28(%eax), %ebp
                movl        36(%eax), %ebx
                movl        40(%eax), %edx
       -        movl        72(%eax), %esp
       -        
       -        movl        60(%eax), %ecx        /* push new %eip */
       -        pushl        %ecx
       -
                movl        44(%eax), %ecx
       +
       +        movl        72(%eax), %esp
       +        pushl        60(%eax)        /* new %eip */
                movl        48(%eax), %eax
                ret
       +
 (DIR) diff --git a/src/libthread/Linux-arm-asm.s b/src/libthread/Linux-arm-asm.s
       t@@ -9,9 +9,8 @@ _tas:
                mov        r0, r3
                mov        pc, lr
        
       -.globl getcontext
       -getcontext:
       -        add        r0, r0, #148        /* walk to mcontext */
       +.globl getmcontext
       +getmcontext:
                str        r1, [r0,#4]
                str        r2, [r0,#8]
                str        r3, [r0,#12]
       t@@ -33,9 +32,8 @@ getcontext:
                mov        r0, #0
                mov        pc, lr
        
       -.globl setcontext
       -setcontext:
       -        add        r0, r0, #148        /* walk to mcontext */
       +.globl setmcontext
       +setmcontext:
                ldr        r1, [r0,#4]
                ldr        r2, [r0,#8]
                ldr        r3, [r0,#12]
 (DIR) diff --git a/src/libthread/Linux.c b/src/libthread/Linux.c
       t@@ -437,8 +437,8 @@ _threadpexit(void)
        }
        
        #ifdef __arm__
       -extern int getmcontext(mcontext_t*);
       -extern int setmcontext(const mcontext_t*);
       +#define        setcontext(u)        setmcontext(&(u)->uc_mcontext)
       +#define        getcontext(u)        getmcontext(&(u)->uc_mcontext)
        
        void
        makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...)
 (DIR) diff --git a/src/libthread/OpenBSD-386.c b/src/libthread/OpenBSD-386.c
       t@@ -13,21 +13,6 @@ makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
                ucp->uc_mcontext.mc_esp = (int)sp;
        }
        
       -extern int getmcontext(mcontext_t*);
       -extern int setmcontext(mcontext_t*);
       -
       -int
       -getcontext(ucontext_t *uc)
       -{
       -        return getmcontext(&uc->uc_mcontext);
       -}
       -
       -void
       -setcontext(ucontext_t *uc)
       -{
       -        setmcontext(&uc->uc_mcontext);
       -}
       -
        int
        swapcontext(ucontext_t *oucp, ucontext_t *ucp)
        {
 (DIR) diff --git a/src/libthread/OpenBSD-power.c b/src/libthread/OpenBSD-power.c
       t@@ -16,19 +16,6 @@ makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
        }
        
        int
       -getcontext(ucontext_t *uc)
       -{
       -        return _getmcontext(&uc->mc);
       -}
       -
       -int
       -setcontext(ucontext_t *uc)
       -{
       -        _setmcontext(&uc->mc);
       -        return 0;
       -}
       -
       -int
        swapcontext(ucontext_t *oucp, ucontext_t *ucp)
        {
                if(getcontext(oucp) == 0)
 (DIR) diff --git a/src/libthread/power-ucontext.h b/src/libthread/power-ucontext.h
       t@@ -1,3 +1,5 @@
       +#define        setcontext(u)        _setmcontext(&(u)->uc_mcontext)
       +#define        getcontext(u)        _getmcontext(&(u)->uc_mcontext)
        typedef struct mcontext mcontext_t;
        typedef struct ucontext ucontext_t;
        struct mcontext
       t@@ -27,8 +29,6 @@ struct ucontext
        };
        
        void makecontext(ucontext_t*, void(*)(void), int, ...);
       -int getcontext(ucontext_t*);
       -int setcontext(ucontext_t*);
        int swapcontext(ucontext_t*, ucontext_t*);
        int _getmcontext(mcontext_t*);
        void _setmcontext(mcontext_t*);
 (DIR) diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h
       t@@ -13,8 +13,10 @@
        #include "thread.h"
        
        #if defined(__FreeBSD__) && __FreeBSD__ < 5
       -extern        int                getcontext(ucontext_t*);
       -extern        void                setcontext(ucontext_t*);
       +extern        int                getmcontext(mcontext_t*);
       +extern        void                setmcontext(mcontext_t*);
       +#define        setcontext(u)        setmcontext(&(u)->uc_mcontext)
       +#define        getcontext(u)        getmcontext(&(u)->uc_mcontext)
        extern        int                swapcontext(ucontext_t*, ucontext_t*);
        extern        void                makecontext(ucontext_t*, void(*)(), int, ...);
        #endif