diff options
| author | Russ Cox <rsc@golang.org> | 2009-06-17 15:15:55 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2009-06-17 15:15:55 -0700 |
| commit | 8522a478bb5b85dd78c361f104b82326cd71ee1b (patch) | |
| tree | c4340870b36a757777af842491c76d749e95de3d /src/pkg/runtime/linux | |
| parent | 7343e03c433ebb0c302ed97bf832ad3bd3170de6 (diff) | |
| download | go-8522a478bb5b85dd78c361f104b82326cd71ee1b.tar.xz | |
update 386 to new runtime (CL 30381)
R=r
DELTA=298 (119 added, 81 deleted, 98 changed)
OCL=30427
CL=30443
Diffstat (limited to 'src/pkg/runtime/linux')
| -rwxr-xr-x | src/pkg/runtime/linux/386/sys.s | 126 | ||||
| -rw-r--r-- | src/pkg/runtime/linux/os.h | 4 | ||||
| -rw-r--r-- | src/pkg/runtime/linux/thread.c | 19 |
3 files changed, 76 insertions, 73 deletions
diff --git a/src/pkg/runtime/linux/386/sys.s b/src/pkg/runtime/linux/386/sys.s index 419973a5ca..fa056c075d 100755 --- a/src/pkg/runtime/linux/386/sys.s +++ b/src/pkg/runtime/linux/386/sys.s @@ -6,6 +6,8 @@ // System calls and other sys.stuff for 386, Linux // +#include "386/asm.h" + TEXT syscall(SB),7,$0 MOVL 4(SP), AX // syscall number MOVL 8(SP), BX // arg1 @@ -42,26 +44,6 @@ TEXT write(SB),7,$0 INT $0x80 RET -TEXT getpid(SB),7,$0 - MOVL $20, AX - INT $0x80 - RET - -TEXT kill(SB),7,$0 - MOVL $37, AX - MOVL 4(SP), BX - MOVL 8(SP), CX - INT $0x80 - RET - -TEXT sys·write(SB),7,$0 - MOVL $4, AX // syscall - write - MOVL 4(SP), BX - MOVL 8(SP), CX - MOVL 12(SP), DX - INT $0x80 - RET - TEXT rt_sigaction(SB),7,$0 MOVL $174, AX // syscall - rt_sigaction MOVL 4(SP), BX @@ -72,18 +54,19 @@ TEXT rt_sigaction(SB),7,$0 RET TEXT sigtramp(SB),7,$0 - MOVL 4(FS), BP // m - MOVL 20(BP), AX // m->gsignal - MOVL AX, 0(FS) // g = m->gsignal + MOVL m, BP + MOVL m_gsignal(BP), AX + MOVL AX, g JMP sighandler(SB) TEXT sigignore(SB),7,$0 RET TEXT sigreturn(SB),7,$0 - MOVL 4(FS), BP // m - MOVL 32(BP), BP // m->curg - MOVL BP, 0(FS) // g = m->curg + // g = m->curg + MOVL m, BP + MOVL m_curg(BP), BP + MOVL BP, g MOVL $173, AX // rt_sigreturn INT $0x80 INT $3 // not reached @@ -104,7 +87,7 @@ TEXT sys·mmap(SB),7,$0 INT $3 RET -// int64 futex(int32 *uaddr, int32 op, int32 val, +// int32 futex(int32 *uaddr, int32 op, int32 val, // struct timespec *timeout, int32 *uaddr2, int32 val2); TEXT futex(SB),7,$0 MOVL $240, AX // futex @@ -117,22 +100,24 @@ TEXT futex(SB),7,$0 INT $0x80 RET -// int64 clone(int32 flags, void *stack, M *m, G *g, void (*fn)(void)); +// int32 clone(int32 flags, void *stack, M *m, G *g, void (*fn)(void)); TEXT clone(SB),7,$0 MOVL $120, AX // clone MOVL flags+4(SP), BX MOVL stack+8(SP), CX + MOVL $0, DX // parent tid ptr + MOVL $0, DI // child tid ptr // Copy m, g, fn off parent stack for use by child. - SUBL $12, CX - MOVL m+12(SP), DX - MOVL DX, 0(CX) - MOVL g+16(SP), DX - MOVL DX, 4(CX) - MOVL fn+20(SP), DX - MOVL DX, 8(CX) + SUBL $16, CX + MOVL mm+12(SP), SI + MOVL SI, 0(CX) + MOVL gg+16(SP), SI + MOVL SI, 4(CX) + MOVL fn+20(SP), SI + MOVL SI, 8(CX) + MOVL $1234, 12(CX) - MOVL $120, AX INT $0x80 // In parent, return. @@ -140,29 +125,58 @@ TEXT clone(SB),7,$0 JEQ 2(PC) RET - // In child, set up new stack, etc. - MOVL 0(CX), BX // m - MOVL 12(AX), AX // fs (= m->cret) - MOVW AX, FS - MOVL 8(CX), DX // fn - ADDL $12, CX - MOVL CX, SP - - // fn is now on top of stack. + // Paranoia: check that SP is as we expect. + MOVL 12(SP), BP + CMPL BP, $1234 + JEQ 2(PC) + INT $3 - // initialize m->procid to Linux tid + // Initialize AX to Linux tid MOVL $224, AX INT $0x80 - MOVL AX, 20(BX) - // call fn - CALL DX + // In child on new stack. Reload registers (paranoia). + MOVL 0(SP), BX // m + MOVL 4(SP), DX // g + MOVL 8(SP), CX // fn - // It shouldn't return; if it does, exit. - MOVL $111, DI - MOVL $1, AX - INT $0x80 - JMP -3(PC) // keep exiting + MOVL AX, m_procid(BX) // save tid as m->procid + + // set up ldt 7+id to point at m->tls. + // m->tls is at m+40. newosproc left the id in tls[0]. + LEAL m_tls(BX), BP + MOVL 0(BP), DI + ADDL $7, DI // m0 is LDT#7. count up. + // setldt(tls#, &tls, sizeof tls) + PUSHAL // save registers + PUSHL $32 // sizeof tls + PUSHL BP // &tls + PUSHL DI // tls # + CALL setldt(SB) + POPL AX + POPL AX + POPL AX + POPAL + SHLL $3, DI // segment# is ldt*8 + 7 (different 7 than above) + ADDL $7, DI + MOVW DI, FS + + // Now segment is established. Initialize m, g. + MOVL DX, g + MOVL BX, m + + MOVL 0(DX), DX // paranoia; check they are not nil + MOVL 0(BX), BX + + // more paranoia; check that stack splitting code works + PUSHAL + CALL emptyfunc(SB) + POPAL + + CALL CX // fn() + CALL exit1(SB) + MOVL $0x1234, 0x1005 + RET TEXT sigaltstack(SB),7,$-8 MOVL $186, AX // sigaltstack @@ -174,10 +188,6 @@ TEXT sigaltstack(SB),7,$-8 INT $3 RET -// // fake the per-goroutine and per-mach registers -// LEAL m0(SB), - -// TODO(rsc): move to linux.s // <asm-i386/ldt.h> // struct user_desc { // unsigned int entry_number; diff --git a/src/pkg/runtime/linux/os.h b/src/pkg/runtime/linux/os.h index c616193676..c36813a9bf 100644 --- a/src/pkg/runtime/linux/os.h +++ b/src/pkg/runtime/linux/os.h @@ -3,8 +3,8 @@ // license that can be found in the LICENSE file. // Linux-specific system calls -int64 futex(uint32*, int32, uint32, Timespec*, uint32*, uint32); -int64 clone(int32, void*, M*, G*, void(*)(void)); +int32 futex(uint32*, int32, uint32, Timespec*, uint32*, uint32); +int32 clone(int32, void*, M*, G*, void(*)(void)); struct Sigaction; void rt_sigaction(int64, struct Sigaction*, void*, uint64); diff --git a/src/pkg/runtime/linux/thread.c b/src/pkg/runtime/linux/thread.c index cc9ba161bf..a1d927c7bb 100644 --- a/src/pkg/runtime/linux/thread.c +++ b/src/pkg/runtime/linux/thread.c @@ -42,7 +42,7 @@ static Timespec longtime = static void futexsleep(uint32 *addr, uint32 val) { - int64 ret; + int32 ret; ret = futex(addr, FUTEX_WAIT, val, &longtime, nil, 0); if(ret >= 0 || ret == -EAGAIN || ret == -EINTR) @@ -234,7 +234,7 @@ enum void newosproc(M *m, G *g, void *stk, void (*fn)(void)) { - int64 ret; + int32 ret; int32 flags; /* @@ -248,21 +248,14 @@ newosproc(M *m, G *g, void *stk, void (*fn)(void)) | CLONE_THREAD /* revisit - okay for now */ ; + m->tls[0] = m->id; // so 386 asm can find it if(0){ - prints("newosproc stk="); - sys·printpointer(stk); - prints(" m="); - sys·printpointer(m); - prints(" g="); - sys·printpointer(g); - prints(" fn="); - sys·printpointer(fn); - prints(" clone="); - sys·printpointer(clone); - prints("\n"); + printf("newosproc stk=%p m=%p g=%p fn=%p clone=%p id=%d/%d ostk=%p\n", + stk, m, g, fn, clone, m->id, m->tls[0], &m); } ret = clone(flags, stk, m, g, fn); + if(ret < 0) *(int32*)123 = 123; } |
