]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: update openbsd runtime to use new tfork syscall
authorJoel Sing <jsing@google.com>
Wed, 21 Nov 2012 14:25:53 +0000 (01:25 +1100)
committerJoel Sing <jsing@google.com>
Wed, 21 Nov 2012 14:25:53 +0000 (01:25 +1100)
Update OpenBSD runtime to use the new version of the sys___tfork
syscall and switch TLS initialisation from sys_arch to sys___set_tcb
(note that both of these syscalls are available in OpenBSD 5.2).

R=golang-dev, minux.ma
CC=golang-dev
https://golang.org/cl/6843058

src/pkg/runtime/defs_openbsd_386.h
src/pkg/runtime/defs_openbsd_amd64.h
src/pkg/runtime/sys_openbsd_386.s
src/pkg/runtime/sys_openbsd_amd64.s
src/pkg/runtime/thread_openbsd.c

index 0527ef1fc50507e41bc6990f0c4231bdee416e50..965e05e217a9c2feea5d8f237fea755253756309 100644 (file)
@@ -85,7 +85,7 @@ typedef struct Itimerval Itimerval;
 struct Tfork {
        byte    *tf_tcb;
        int32   *tf_tid;
-       int32   tf_flags;
+       byte    *tf_stack;
 };
 
 struct Sigaltstack {
index 0a4334951911cf6194a10d87547527c44b306b6d..159bbd8fdc1b5aa301296db2420dd96ed66f7363 100644 (file)
@@ -85,8 +85,7 @@ typedef struct Itimerval Itimerval;
 struct Tfork {
        byte    *tf_tcb;
        int32   *tf_tid;
-       int32   tf_flags;
-       byte    Pad_cgo_0[4];
+       byte    *tf_stack;
 };
 
 struct Sigaltstack {
index 7888638dff981803c80c8af8f82e704428bbc581..43a8dac62cc68d039857d70dcac8bfb5cb03c747 100644 (file)
@@ -190,12 +190,14 @@ TEXT runtime·sigtramp(SB),7,$44
        MOVL    $0xf1, 0xf1             // crash
        RET
 
-// int32 tfork_thread(void *param, void *stack, M *m, G *g, void (*fn)(void));
-TEXT runtime·tfork_thread(SB),7,$8
+// int32 tfork(void *param, uintptr psize, M *m, G *g, void (*fn)(void));
+TEXT runtime·tfork(SB),7,$12
 
-       // Copy m, g, fn off parent stack and onto the child stack.
-       MOVL    stack+8(FP), CX
+       // Copy m, g and fn from the parent stack onto the child stack.
+       MOVL    params+4(FP), AX
+       MOVL    8(AX), CX               // tf_stack
        SUBL    $16, CX
+       MOVL    CX, 8(AX)
        MOVL    mm+12(FP), SI
        MOVL    SI, 0(CX)
        MOVL    gg+16(FP), SI
@@ -203,12 +205,13 @@ TEXT runtime·tfork_thread(SB),7,$8
        MOVL    fn+20(FP), SI
        MOVL    SI, 8(CX)
        MOVL    $1234, 12(CX)
-       MOVL    CX, SI
 
        MOVL    $0, 0(SP)               // syscall gap
        MOVL    params+4(FP), AX
        MOVL    AX, 4(SP)               // arg 1 - param
-       MOVL    $328, AX                // sys___tfork
+       MOVL    psize+8(FP), AX
+       MOVL    AX, 8(SP)               // arg 2 - psize
+       MOVL    $8, AX                  // sys___tfork
        INT     $0x80
 
        // Return if tfork syscall failed.
@@ -225,9 +228,6 @@ TEXT runtime·tfork_thread(SB),7,$8
        MOVL    AX, 0(DX)
        RET
 
-       // In child, switch to new stack.
-       MOVL    SI, SP
-
        // Paranoia: check that SP is as we expect.
        MOVL    12(SP), BP
        CMPL    BP, $1234
@@ -278,22 +278,20 @@ TEXT runtime·sigaltstack(SB),7,$-8
        INT     $3
        RET
 
-TEXT runtime·setldt(SB),7,$8
+TEXT runtime·setldt(SB),7,$4
        // Under OpenBSD we set the GS base instead of messing with the LDT.
-       MOVL    16(SP), AX              // tls0
+       MOVL    tls0+4(FP), AX
        MOVL    AX, 0(SP)
        CALL    runtime·settls(SB)
        RET
 
-TEXT runtime·settls(SB),7,$16
+TEXT runtime·settls(SB),7,$8
        // adjust for ELF: wants to use -8(GS) and -4(GS) for g and m
-       MOVL    20(SP), CX
+       MOVL    tlsbase+0(FP), CX
        ADDL    $8, CX
-       MOVL    CX, 0(CX)
        MOVL    $0, 0(SP)               // syscall gap
-       MOVL    $9, 4(SP)               // I386_SET_GSBASE (machine/sysarch.h)
-       MOVL    CX, 8(SP)               // pointer to base
-       MOVL    $165, AX                // sys_sysarch
+       MOVL    CX, 4(SP)               // arg 1 - tcb
+       MOVL    $329, AX                // sys___set_tcb
        INT     $0x80
        JCC     2(PC)
        MOVL    $0xf1, 0xf1             // crash
index ad7de11f841700dfdda1a6f725d068d74500901d..9717725d99437e9570aff541904e87a90e5e363c 100644 (file)
@@ -8,17 +8,17 @@
 
 #include "zasm_GOOS_GOARCH.h"
 
-// int64 tfork_thread(void *param, void *stack, M *m, G *g, void (*fn)(void));
-TEXT runtime·tfork_thread(SB),7,$32
+// int64 tfork(void *param, uintptr psize, M *m, G *g, void (*fn)(void));
+TEXT runtime·tfork(SB),7,$32
 
-       // Copy stack, m, g and fn off parent stack for use by child.
-       MOVQ    stack+8(FP), SI
+       // Copy m, g and fn off parent stack for use by child.
        MOVQ    mm+16(FP), R8
        MOVQ    gg+24(FP), R9
        MOVQ    fn+32(FP), R12
 
        MOVQ    param+0(FP), DI
-       MOVL    $328, AX                // sys___tfork
+       MOVQ    psize+8(FP), SI
+       MOVL    $8, AX                  // sys___tfork
        SYSCALL
 
        // Return if tfork syscall failed.
@@ -31,9 +31,6 @@ TEXT runtime·tfork_thread(SB),7,$32
        JEQ     2(PC)
        RET
 
-       // In child, switch to new stack.
-       MOVQ    SI, SP
-
        // Set FS to point at m->tls.
        LEAQ    m_tls(R8), DI
        CALL    runtime·settls(SB)
@@ -54,7 +51,7 @@ TEXT runtime·tfork_thread(SB),7,$32
        JMP     -3(PC)                  // keep exiting
 
 TEXT runtime·osyield(SB),7,$0
-       MOVL $298, AX                   // sys_sched_yield
+       MOVL    $298, AX                // sys_sched_yield
        SYSCALL
        RET
 
@@ -249,13 +246,10 @@ TEXT runtime·sigaltstack(SB),7,$-8
        RET
 
 // set tls base to DI
-TEXT runtime·settls(SB),7,$8
+TEXT runtime·settls(SB),7,$0
        // adjust for ELF: wants to use -16(FS) and -8(FS) for g and m
        ADDQ    $16, DI
-       MOVQ    DI, 0(SP)
-       MOVQ    SP, SI
-       MOVQ    $12, DI                 // AMD64_SET_FSBASE (machine/sysarch.h)
-       MOVQ    $165, AX                // sys_sysarch
+       MOVQ    $329, AX                // sys___settcb
        SYSCALL
        JCC     2(PC)
        MOVL    $0xf1, 0xf1             // crash
index f479e2c3e98fd2bc65fd49e922e989b0692e0108..b696534e79374843a0f9b493a1a9ee783e3b7205 100644 (file)
@@ -23,7 +23,7 @@ extern SigTab runtime·sigtab[];
 static Sigset sigset_all = ~(Sigset)0;
 static Sigset sigset_none;
 
-extern int64 runtime·tfork_thread(void *param, void *stack, M *m, G *g, void (*fn)(void));
+extern int64 runtime·tfork(void *param, uintptr psize, M *m, G *g, void (*fn)(void));
 extern int32 runtime·thrsleep(void *ident, int32 clock_id, void *tsp, void *lock, const int32 *abort);
 extern int32 runtime·thrwakeup(void *ident, int32 n);
 
@@ -139,10 +139,10 @@ runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void))
 
        param.tf_tcb = (byte*)&m->tls[0];
        param.tf_tid = (int32*)&m->procid;
-       param.tf_flags = (int32)0;
+       param.tf_stack = stk;
 
        oset = runtime·sigprocmask(SIG_SETMASK, sigset_all);
-       ret = runtime·tfork_thread((byte*)&param, stk, m, g, fn);
+       ret = runtime·tfork((byte*)&param, sizeof(param), m, g, fn);
        runtime·sigprocmask(SIG_SETMASK, oset);
 
        if(ret < 0) {