aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/linux
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-06-17 15:15:55 -0700
committerRuss Cox <rsc@golang.org>2009-06-17 15:15:55 -0700
commit8522a478bb5b85dd78c361f104b82326cd71ee1b (patch)
treec4340870b36a757777af842491c76d749e95de3d /src/pkg/runtime/linux
parent7343e03c433ebb0c302ed97bf832ad3bd3170de6 (diff)
downloadgo-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-xsrc/pkg/runtime/linux/386/sys.s126
-rw-r--r--src/pkg/runtime/linux/os.h4
-rw-r--r--src/pkg/runtime/linux/thread.c19
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;
}