diff options
author | Joel Sing <jsing@google.com> | 2012-05-30 02:52:50 +1000 |
---|---|---|
committer | Joel Sing <jsing@google.com> | 2012-05-30 02:52:50 +1000 |
commit | ac4c92d42513b49e3578dfa4822c7d96fc9afcda (patch) | |
tree | 9f28eac140c872c69e2c5a5d186cccbcf1510b06 /src/pkg/runtime | |
parent | 2434c446b4cb7b76bdf721bda42d9ab7e5c9cc1d (diff) | |
download | go-ac4c92d42513b49e3578dfa4822c7d96fc9afcda.tar.gz |
runtime: make go work on netbsd/386
R=golang-dev, rsc
CC=golang-dev
http://codereview.appspot.com/6254055
Diffstat (limited to 'src/pkg/runtime')
-rw-r--r-- | src/pkg/runtime/signal_netbsd_386.c | 11 | ||||
-rw-r--r-- | src/pkg/runtime/sys_netbsd_386.s | 67 | ||||
-rw-r--r-- | src/pkg/runtime/sys_netbsd_amd64.s | 2 |
3 files changed, 28 insertions, 52 deletions
diff --git a/src/pkg/runtime/signal_netbsd_386.c b/src/pkg/runtime/signal_netbsd_386.c index f5eb913b6..e50c52678 100644 --- a/src/pkg/runtime/signal_netbsd_386.c +++ b/src/pkg/runtime/signal_netbsd_386.c @@ -7,6 +7,7 @@ #include "signals_GOOS.h" #include "os_GOOS.h" +extern void runtime·lwp_tramp(void); extern void runtime·sigtramp(void); typedef struct sigaction { @@ -136,3 +137,13 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart) sa._sa_u._sa_sigaction = (void*)fn; runtime·sigaction(i, &sa, nil); } + +void +runtime·lwp_mcontext_init(McontextT *mc, void *stack, M *m, G *g, void (*fn)(void)) +{ + mc->__gregs[REG_EIP] = (uint32)runtime·lwp_tramp; + mc->__gregs[REG_UESP] = (uint32)stack; + mc->__gregs[REG_EBX] = (uint32)m; + mc->__gregs[REG_EDX] = (uint32)g; + mc->__gregs[REG_ESI] = (uint32)fn; +} diff --git a/src/pkg/runtime/sys_netbsd_386.s b/src/pkg/runtime/sys_netbsd_386.s index d88467cef..1c1254dda 100644 --- a/src/pkg/runtime/sys_netbsd_386.s +++ b/src/pkg/runtime/sys_netbsd_386.s @@ -202,57 +202,22 @@ TEXT runtime·sigtramp(SB),7,$44 MOVL BX, g(CX) RET -// int32 rfork_thread(int32 flags, void *stack, M *m, G *g, void (*fn)(void)); -TEXT runtime·rfork_thread(SB),7,$8 - MOVL flags+8(SP), AX - MOVL stack+12(SP), CX - - // Copy m, g, fn off parent stack for use by child. - SUBL $16, CX - MOVL mm+16(SP), SI - MOVL SI, 0(CX) - MOVL gg+20(SP), SI - MOVL SI, 4(CX) - MOVL fn+24(SP), SI - MOVL SI, 8(CX) - MOVL $1234, 12(CX) - MOVL CX, SI - - MOVL $0, 0(SP) // syscall gap - MOVL AX, 4(SP) // arg 1 - flags - MOVL $251, AX // sys_rfork +// int32 lwp_create(void *context, uintptr flags, void *lwpid); +TEXT runtime·lwp_create(SB),7,$16 + MOVL $0, 0(SP) + MOVL context+0(FP), AX + MOVL AX, 4(SP) // arg 1 - context + MOVL flags+4(FP), AX + MOVL AX, 8(SP) // arg 2 - flags + MOVL lwpid+8(FP), AX + MOVL AX, 12(SP) // arg 3 - lwpid + MOVL $309, AX // sys__lwp_create INT $0x80 - - // Return if rfork syscall failed - JCC 4(PC) + JCC 2(PC) NEGL AX - MOVL AX, 48(SP) - RET - - // In parent, return. - CMPL AX, $0 - JEQ 3(PC) - MOVL AX, 48(SP) RET - // In child, on new stack. - MOVL SI, SP - - // Paranoia: check that SP is as we expect. - MOVL 12(SP), BP - CMPL BP, $1234 - JEQ 2(PC) - INT $3 - - // Reload registers - MOVL 0(SP), BX // m - MOVL 4(SP), DX // g - MOVL 8(SP), SI // fn - - // Initialize m->procid to thread ID - MOVL $299, AX // sys_getthrid - INT $0x80 - MOVL AX, m_procid(BX) +TEXT runtime·lwp_tramp(SB),7,$0 // Set FS to point at m->tls LEAL m_tls(BX), BP @@ -317,13 +282,13 @@ TEXT runtime·osyield(SB),7,$-4 INT $0x80 RET -TEXT runtime·thrsleep(SB),7,$-4 - MOVL $300, AX // sys_thrsleep +TEXT runtime·lwp_park(SB),7,$-4 + MOVL $434, AX // sys__lwp_park INT $0x80 RET -TEXT runtime·thrwakeup(SB),7,$-4 - MOVL $301, AX // sys_thrwakeup +TEXT runtime·lwp_unpark(SB),7,$-4 + MOVL $321, AX // sys__lwp_unpark INT $0x80 RET diff --git a/src/pkg/runtime/sys_netbsd_amd64.s b/src/pkg/runtime/sys_netbsd_amd64.s index d29d65a74..d0543c92a 100644 --- a/src/pkg/runtime/sys_netbsd_amd64.s +++ b/src/pkg/runtime/sys_netbsd_amd64.s @@ -8,7 +8,7 @@ #include "zasm_GOOS_GOARCH.h" -// int64 lwp_create(void *context, uintptr flags, void *lwpid) +// int32 lwp_create(void *context, uintptr flags, void *lwpid) TEXT runtime·lwp_create(SB),7,$0 MOVQ context+0(FP), DI |