| tarm - plan9port - [fork] Plan 9 from user space | |
| git clone git://src.adamsgaard.dk/plan9port | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit f51bf048784abd642dea4f033bc95acbd4468b6a | |
| parent 48ca8d21f75b734a15091b77abf5ed4a92be90f2 | |
| 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(-) | |
| --- | |
| 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… | |
| + 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 | |
| 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 | |
| + | |
| 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 | |
| + | |
| 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; |