Commit fb32d60c authored by Joel Sing's avatar Joel Sing

runtime: make go work on netbsd/386

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6254055
parent 992a11b8
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "signals_GOOS.h" #include "signals_GOOS.h"
#include "os_GOOS.h" #include "os_GOOS.h"
extern void runtime·lwp_tramp(void);
extern void runtime·sigtramp(void); extern void runtime·sigtramp(void);
typedef struct sigaction { typedef struct sigaction {
...@@ -136,3 +137,13 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart) ...@@ -136,3 +137,13 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
sa._sa_u._sa_sigaction = (void*)fn; sa._sa_u._sa_sigaction = (void*)fn;
runtime·sigaction(i, &sa, nil); 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;
}
...@@ -202,57 +202,22 @@ TEXT runtime·sigtramp(SB),7,$44 ...@@ -202,57 +202,22 @@ TEXT runtime·sigtramp(SB),7,$44
MOVL BX, g(CX) MOVL BX, g(CX)
RET RET
// int32 rfork_thread(int32 flags, void *stack, M *m, G *g, void (*fn)(void)); // int32 lwp_create(void *context, uintptr flags, void *lwpid);
TEXT runtime·rfork_thread(SB),7,$8 TEXT runtime·lwp_create(SB),7,$16
MOVL flags+8(SP), AX MOVL $0, 0(SP)
MOVL stack+12(SP), CX MOVL context+0(FP), AX
MOVL AX, 4(SP) // arg 1 - context
// Copy m, g, fn off parent stack for use by child. MOVL flags+4(FP), AX
SUBL $16, CX MOVL AX, 8(SP) // arg 2 - flags
MOVL mm+16(SP), SI MOVL lwpid+8(FP), AX
MOVL SI, 0(CX) MOVL AX, 12(SP) // arg 3 - lwpid
MOVL gg+20(SP), SI MOVL $309, AX // sys__lwp_create
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
INT $0x80 INT $0x80
JCC 2(PC)
// Return if rfork syscall failed
JCC 4(PC)
NEGL AX NEGL AX
MOVL AX, 48(SP)
RET
// In parent, return.
CMPL AX, $0
JEQ 3(PC)
MOVL AX, 48(SP)
RET RET
// In child, on new stack. TEXT runtime·lwp_tramp(SB),7,$0
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)
// Set FS to point at m->tls // Set FS to point at m->tls
LEAL m_tls(BX), BP LEAL m_tls(BX), BP
...@@ -317,13 +282,13 @@ TEXT runtime·osyield(SB),7,$-4 ...@@ -317,13 +282,13 @@ TEXT runtime·osyield(SB),7,$-4
INT $0x80 INT $0x80
RET RET
TEXT runtime·thrsleep(SB),7,$-4 TEXT runtime·lwp_park(SB),7,$-4
MOVL $300, AX // sys_thrsleep MOVL $434, AX // sys__lwp_park
INT $0x80 INT $0x80
RET RET
TEXT runtime·thrwakeup(SB),7,$-4 TEXT runtime·lwp_unpark(SB),7,$-4
MOVL $301, AX // sys_thrwakeup MOVL $321, AX // sys__lwp_unpark
INT $0x80 INT $0x80
RET RET
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include "zasm_GOOS_GOARCH.h" #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 TEXT runtime·lwp_create(SB),7,$0
MOVQ context+0(FP), DI MOVQ context+0(FP), DI
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment