URI: 
       tarm - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit f51bf048784abd642dea4f033bc95acbd4468b6a
   DIR parent 48ca8d21f75b734a15091b77abf5ed4a92be90f2
  HTML Author: rsc <devnull@localhost>
       Date:   Tue,  1 Nov 2005 18:35:44 +0000
       
       arm
       
       Diffstat:
         M src/Makefile                        |      11 ++++++++++-
         A src/libthread/Linux-arm-asm.s       |      53 ++++++++++++++++++++++++++++++
         M src/libthread/Linux.c               |      40 +++++++++++++++++++++++++++++++
         M src/mkhdr                           |       2 ++
       
       4 files changed, 105 insertions(+), 1 deletion(-)
       ---
   DIR diff --git a/src/Makefile b/src/Makefile
       t@@ -1,6 +1,15 @@
        ../bin/mk: mkmk.sh
                SYSNAME=`uname` export SYSNAME; \
       -        OBJTYPE=`uname -m | sed 's;i.86;386;; s;amd64;x86_64;; s;/.*;;; s; ;;g; s/PowerMacintosh/power/; s/macppc/power/g; s/ppc64/power/g; s/ppc/power/g'` export OBJTYPE; \
       +        OBJTYPE=`uname -m | sed ' \
       +                s;i.86;386;; \
       +                s;amd64;x86_64;; \
       +                s;/.*;;; s; ;;g; \
       +                s;armv4l;arm;g; \
       +                s;PowerMacintosh;power;g; \
       +                s;macppc;power;g; \
       +                s;ppc64;power;g; \
       +                s;ppc;power;g; \
       +                '` export OBJTYPE; \
                PATH=/bin:/usr/bin:/usr/local/bin:`pwd`/../bin:$$PATH export PATH; \
                PLAN9=`pwd`/.. export PLAN9; \
                sh -x mkmk.sh
   DIR diff --git a/src/libthread/Linux-arm-asm.s b/src/libthread/Linux-arm-asm.s
       t@@ -0,0 +1,53 @@
       + 
       +.globl _tas
       +_tas:
       +        mov        r3, #0xCA000000
       +        add        r3, r3, #0xFE0000
       +        add        r3, r3, #0xBA00
       +        add        r3, r3, #0xBE
       +        swp        r3, r3, [r0]
       +        mov        r0, r3
       +        mov        pc, lr
       +
       +.globl getmcontext
       +getmcontext:
       +        /* r0 will be overwritten */
       +        str        r1, [r0,#4]!
       +        str        r2, [r0,#4]!
       +        str        r3, [r0,#4]!
       +        str        r4, [r0,#4]!
       +        str        r5, [r0,#4]!
       +        str        r6, [r0,#4]!
       +        str        r7, [r0,#4]!
       +        str        r8, [r0,#4]!
       +        str        r9, [r0,#4]!
       +        str        r10, [r0,#4]!
       +        str        r11, [r0,#4]!
       +        str        r12, [r0,#4]!
       +        str        r13, [r0,#4]!
       +        str        r14, [r0,#4]!
       +        /* r15 is pc */
       +        mov        r0, #0
       +        mov        pc, lr
       +
       +.globl setmcontext
       +setmcontext:
       +        /* r0 will be overwritten */
       +        ldr        r1, [r0,#4]!
       +        ldr        r2, [r0,#4]!
       +        ldr        r3, [r0,#4]!
       +        ldr        r4, [r0,#4]!
       +        ldr        r5, [r0,#4]!
       +        ldr        r6, [r0,#4]!
       +        ldr        r7, [r0,#4]!
       +        ldr        r8, [r0,#4]!
       +        ldr        r9, [r0,#4]!
       +        ldr        r10, [r0,#4]!
       +        ldr        r11, [r0,#4]!
       +        ldr        r12, [r0,#4]!
       +        ldr        r13, [r0,#4]!
       +        ldr        r14, [r0,#4]!
       +        /* r15 is pc */
       +        mov        r0, #1
       +        mov        pc, lr
       +
   DIR diff --git a/src/libthread/Linux.c b/src/libthread/Linux.c
       t@@ -436,3 +436,43 @@ _threadpexit(void)
                _exit(0);
        }
        
       +#ifdef __arm__
       +extern int getmcontext(mcontext_t*);
       +extern int setmcontext(const mcontext_t*);
       +
       +void
       +makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...)
       +{
       +        int i, *sp;
       +        va_list arg;
       +        
       +        sp = (int*)uc->uc_stack.ss_sp+uc->uc_stack.ss_size/4;
       +        va_start(arg, argc);
       +        for(i=0; i<4 && i<argc; i++)
       +                uc->uc_mcontext.gregs[0] = va_arg(arg, uint);
       +        uc->uc_mcontext.gregs[13] = (uint)sp;
       +        uc->uc_mcontext.gregs[14] = (uint)fn;
       +}
       +
       +int
       +getcontext(ucontext_t *uc)
       +{
       +        return getmcontext(&uc->uc_mcontext);
       +}
       +
       +int
       +setcontext(const ucontext_t *uc)
       +{
       +        setmcontext(&uc->uc_mcontext);
       +        return 0;        /* not reached */
       +}
       +
       +int
       +swapcontext(ucontext_t *oucp, const ucontext_t *ucp)
       +{
       +        if(getcontext(oucp) == 0)
       +                setcontext(ucp);
       +        return 0;
       +}
       +#endif
       +
   DIR diff --git a/src/mkhdr b/src/mkhdr
       t@@ -1,9 +1,11 @@
        SYSNAME=`uname`
       +# objtype rules also in Makefile
        OBJTYPE=`uname -m | sed '
                s;i.86;386;;
                s;amd64;x86_64;;
                s;/.*;;;
                s; ;;g;
       +        s;armv4l;arm;g;
                s;PowerMacintosh;power;g;
                s;macppc;power;g;
                s;ppc64;power;g;