Since the rfork syscall has gone away, we need to switch lang/go to tfork,
as is done by the following diff. Passes 'make regress' on both amd64 and
i386.
ok?
Index: patches/patch-src_pkg_runtime_sys_openbsd_386_s
===================================================================
RCS file: /cvs/ports/lang/go/patches/patch-src_pkg_runtime_sys_openbsd_386_s,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 patch-src_pkg_runtime_sys_openbsd_386_s
--- patches/patch-src_pkg_runtime_sys_openbsd_386_s 31 Mar 2012 12:37:16
-0000 1.1.1.1
+++ patches/patch-src_pkg_runtime_sys_openbsd_386_s 15 Apr 2012 04:48:26
-0000
@@ -1,6 +1,6 @@
$OpenBSD$
---- src/pkg/runtime/sys_openbsd_386.s.orig Mon Mar 19 00:13:54 2012
-+++ src/pkg/runtime/sys_openbsd_386.s Mon Mar 19 00:13:54 2012
+--- src/pkg/runtime/sys_openbsd_386.s.orig Wed Mar 28 15:49:26 2012
++++ src/pkg/runtime/sys_openbsd_386.s Fri Mar 2 02:14:56 2012
@@ -12,14 +12,16 @@
TEXT runtime·exit(SB),7,$-4
MOVL $1, AX
@@ -50,7 +50,7 @@ $OpenBSD$
TEXT runtime·sigtramp(SB),7,$44
get_tls(CX)
-@@ -174,7 +184,7 @@ TEXT runtime·sigtramp(SB),7,$44
+@@ -174,40 +184,46 @@ TEXT runtime·sigtramp(SB),7,$44
MOVL AX, 4(SP) // arg 1 - sigcontext
MOVL $103, AX // sys_sigreturn
INT $0x80
@@ -58,8 +58,61 @@ $OpenBSD$
+ MOVL $0xf1, 0xf1 // crash
RET
- // int32 rfork_thread(int32 flags, void *stack, M *m, G *g, void (*fn)(void));
-@@ -286,7 +296,7 @@ TEXT runtime·settls(SB),7,$16
+-// 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
++// int32 tfork_thread(void *stack, M *m, G *g, void (*fn)(void));
++TEXT runtime·tfork_thread(SB),7,$20
+
+ // Copy m, g, fn off parent stack for use by child.
++ MOVL stack+4(FP), CX
+ SUBL $16, CX
+- MOVL mm+16(SP), SI
++ MOVL mm+8(FP), SI
+ MOVL SI, 0(CX)
+- MOVL gg+20(SP), SI
++ MOVL gg+12(FP), SI
+ MOVL SI, 4(CX)
+- MOVL fn+24(SP), SI
++ MOVL fn+16(FP), SI
+ MOVL SI, 8(CX)
+ MOVL $1234, 12(CX)
+ MOVL CX, SI
+
++ LEAL 8(SP), AX
++ MOVL $0, 0(AX) // tf_tcb
++ MOVL $0, 4(AX) // tf_tid
++ MOVL $0, 8(AX) // tf_flags
++
+ MOVL $0, 0(SP) // syscall gap
+- MOVL AX, 4(SP) // arg 1 - flags
+- MOVL $251, AX // sys_rfork
++ MOVL AX, 4(SP) // arg 1 - params
++ MOVL $328, AX // sys_tfork
+ INT $0x80
+
+- // Return if rfork syscall failed
+- JCC 4(PC)
++ // Return if tfork syscall failed.
++ JCC 5(PC)
+ NEGL AX
+- MOVL AX, 48(SP)
++ MOVL ret+0(FP), DX
++ MOVL AX, 0(DX)
+ RET
+
+ // In parent, return.
+ CMPL AX, $0
+- JEQ 3(PC)
+- MOVL AX, 48(SP)
++ JEQ 4(PC)
++ MOVL ret+0(FP), DX
++ MOVL AX, 0(DX)
+ RET
+
+ // In child, on new stack.
+@@ -286,7 +302,7 @@ TEXT runtime·settls(SB),7,$16
MOVL $165, AX // sys_sysarch
INT $0x80
JCC 2(PC)
@@ -68,7 +121,7 @@ $OpenBSD$
RET
TEXT runtime·osyield(SB),7,$-4
-@@ -295,12 +305,12 @@ TEXT runtime·osyield(SB),7,$-4
+@@ -295,12 +311,12 @@ TEXT runtime·osyield(SB),7,$-4
RET
TEXT runtime·thrsleep(SB),7,$-4
Index: patches/patch-src_pkg_runtime_sys_openbsd_amd64_s
===================================================================
RCS file: /cvs/ports/lang/go/patches/patch-src_pkg_runtime_sys_openbsd_amd64_s,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 patch-src_pkg_runtime_sys_openbsd_amd64_s
--- patches/patch-src_pkg_runtime_sys_openbsd_amd64_s 31 Mar 2012 12:37:16
-0000 1.1.1.1
+++ patches/patch-src_pkg_runtime_sys_openbsd_amd64_s 15 Apr 2012 04:48:26
-0000
@@ -1,7 +1,41 @@
$OpenBSD$
---- src/pkg/runtime/sys_openbsd_amd64.s.orig Mon Mar 19 00:13:54 2012
-+++ src/pkg/runtime/sys_openbsd_amd64.s Mon Mar 19 00:13:54 2012
-@@ -53,7 +53,8 @@ TEXT runtime·rfork_thread(SB),7,$0
+--- src/pkg/runtime/sys_openbsd_amd64.s.orig Wed Mar 28 15:49:26 2012
++++ src/pkg/runtime/sys_openbsd_amd64.s Fri Mar 2 02:03:18 2012
+@@ -8,20 +8,23 @@
+
+ #include "zasm_GOOS_GOARCH.h"
+
+-// int64 rfork_thread(int32 flags, void *stack, M *m, G *g, void (*fn)(void));
+-TEXT runtime·rfork_thread(SB),7,$0
+- MOVL flags+8(SP), DI
+- MOVQ stack+16(SP), SI
++// int64 tfork_thread(void *stack, M *m, G *g, void (*fn)(void));
++TEXT runtime·tfork_thread(SB),7,$32
+
+- // Copy m, g, fn off parent stack for use by child.
+- MOVQ mm+24(SP), R8
+- MOVQ gg+32(SP), R9
+- MOVQ fn+40(SP), R12
++ // Copy stack, m, g, fn off parent stack for use by child.
++ MOVQ stack+0(FP), SI
++ MOVQ mm+8(FP), R8
++ MOVQ gg+16(FP), R9
++ MOVQ fn+24(FP), R12
+
+- MOVL $251, AX // sys_rfork
++ LEAQ 8(SP), DI
++ MOVQ $0, 0(DI) // tf_tcb
++ MOVQ $0, 8(DI) // tf_tid
++ MOVL $0, 16(DI) // tf_flags
++ MOVL $328, AX // sys___tfork
+ SYSCALL
+
+- // Return if rfork syscall failed
++ // Return if tfork syscall failed
+ JCC 3(PC)
+ NEGL AX
+ RET
+@@ -53,7 +56,8 @@ TEXT runtime·rfork_thread(SB),7,$0
CALL R12
// It shouldn't return. If it does, exit
@@ -11,7 +45,7 @@ $OpenBSD$
SYSCALL
JMP -3(PC) // keep exiting
-@@ -67,14 +68,15 @@ TEXT runtime·thrsleep(SB),7,$0
+@@ -67,14 +71,15 @@ TEXT runtime·thrsleep(SB),7,$0
MOVL 16(SP), SI // arg 2 - clock_id
MOVQ 24(SP), DX // arg 3 - tp
MOVQ 32(SP), R10 // arg 4 - lock
@@ -29,7 +63,7 @@ $OpenBSD$
SYSCALL
RET
-@@ -83,13 +85,14 @@ TEXT runtime·exit(SB),7,$-8
+@@ -83,13 +88,14 @@ TEXT runtime·exit(SB),7,$-8
MOVL 8(SP), DI // arg 1 - exit status
MOVL $1, AX // sys_exit
SYSCALL
@@ -47,7 +81,7 @@ $OpenBSD$
RET
TEXT runtime·write(SB),7,$-8
-@@ -140,7 +143,7 @@ TEXT time·now(SB), 7, $32
+@@ -140,7 +146,7 @@ TEXT time·now(SB), 7, $32
MOVL $116, AX // sys_gettimeofday
SYSCALL
MOVQ 8(SP), AX // sec
@@ -56,7 +90,7 @@ $OpenBSD$
// sec is in AX, usec in DX
MOVQ AX, sec+0(FP)
-@@ -154,7 +157,7 @@ TEXT runtime·nanotime(SB),7,$32
+@@ -154,7 +160,7 @@ TEXT runtime·nanotime(SB),7,$32
MOVL $116, AX // sys_gettimeofday
SYSCALL
MOVQ 8(SP), AX // sec
@@ -65,7 +99,7 @@ $OpenBSD$
// sec is in AX, usec in DX
// return nsec in AX
-@@ -170,9 +173,19 @@ TEXT runtime·sigaction(SB),7,$-8
+@@ -170,9 +176,19 @@ TEXT runtime·sigaction(SB),7,$-8
MOVL $46, AX
SYSCALL
JCC 2(PC)
@@ -86,7 +120,7 @@ $OpenBSD$
TEXT runtime·sigtramp(SB),7,$64
get_tls(BX)
-@@ -226,7 +239,7 @@ TEXT runtime·munmap(SB),7,$0
+@@ -226,7 +242,7 @@ TEXT runtime·munmap(SB),7,$0
MOVL $73, AX // sys_munmap
SYSCALL
JCC 2(PC)
@@ -95,7 +129,7 @@ $OpenBSD$
RET
TEXT runtime·sigaltstack(SB),7,$-8
-@@ -235,7 +248,7 @@ TEXT runtime·sigaltstack(SB),7,$-8
+@@ -235,7 +251,7 @@ TEXT runtime·sigaltstack(SB),7,$-8
MOVQ $288, AX // sys_sigaltstack
SYSCALL
JCC 2(PC)
@@ -104,7 +138,7 @@ $OpenBSD$
RET
// set tls base to DI
-@@ -248,7 +261,7 @@ TEXT runtime·settls(SB),7,$8
+@@ -248,7 +264,7 @@ TEXT runtime·settls(SB),7,$8
MOVQ $165, AX // sys_sysarch
SYSCALL
JCC 2(PC)
@@ -113,7 +147,7 @@ $OpenBSD$
RET
TEXT runtime·sysctl(SB),7,$0
-@@ -260,7 +273,7 @@ TEXT runtime·sysctl(SB),7,$0
+@@ -260,7 +276,7 @@ TEXT runtime·sysctl(SB),7,$0
MOVQ 48(SP), R9 // arg 6 - newlen
MOVQ $202, AX // sys___sysctl
SYSCALL
Index: patches/patch-src_pkg_runtime_thread_openbsd_c
===================================================================
RCS file: /cvs/ports/lang/go/patches/patch-src_pkg_runtime_thread_openbsd_c,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 patch-src_pkg_runtime_thread_openbsd_c
--- patches/patch-src_pkg_runtime_thread_openbsd_c 31 Mar 2012 12:37:16
-0000 1.1.1.1
+++ patches/patch-src_pkg_runtime_thread_openbsd_c 15 Apr 2012 04:48:26
-0000
@@ -1,15 +1,16 @@
$OpenBSD$
---- src/pkg/runtime/thread_openbsd.c.orig Mon Mar 19 00:13:54 2012
-+++ src/pkg/runtime/thread_openbsd.c Mon Mar 19 00:13:54 2012
+--- src/pkg/runtime/thread_openbsd.c.orig Wed Mar 28 15:49:26 2012
++++ src/pkg/runtime/thread_openbsd.c Fri Mar 2 02:03:18 2012
@@ -20,8 +20,11 @@ enum
extern SigTab runtime·sigtab[];
+-extern int64 runtime·rfork_thread(int32 flags, void *stack, M *m, G *g, void
(*fn)(void));
+-extern int32 runtime·thrsleep(void *ident, int32 clock_id, void *tsp, void
*lock);
+static Sigset sigset_all = ~(Sigset)0;
+static Sigset sigset_none;
+
- extern int64 runtime·rfork_thread(int32 flags, void *stack, M *m, G *g, void
(*fn)(void));
--extern int32 runtime·thrsleep(void *ident, int32 clock_id, void *tsp, void
*lock);
++extern int64 runtime·tfork_thread(void *stack, 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);
@@ -29,28 +30,44 @@ $OpenBSD$
}
// reacquire lock
while(runtime·xchg(&m->waitsemalock, 1))
-@@ -128,6 +131,7 @@ runtime·semawakeup(M *mp)
+@@ -119,21 +122,13 @@ runtime·semawakeup(M *mp)
+ runtime·atomicstore(&mp->waitsemalock, 0);
+ }
+
+-// From OpenBSD's sys/param.h
+-#define RFPROC (1<<4) /* change child (else changes curproc)
*/
+-#define RFMEM (1<<5) /* share `address space' */
+-#define RFNOWAIT (1<<6) /* parent need not wait() on child */
+-#define RFTHREAD (1<<13) /* create a thread, not a process */
+-
void
runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void))
{
+- int32 flags;
+ Sigset oset;
- int32 flags;
int32 ret;
-@@ -141,7 +145,11 @@ runtime·newosproc(M *m, G *g, void *stk, void (*fn)(v
+- flags = RFPROC | RFTHREAD | RFMEM | RFNOWAIT;
+-
+- if (0) {
++ if(0) {
+ runtime·printf(
+ "newosproc stk=%p m=%p g=%p fn=%p id=%d/%d ostk=%p\n",
+ stk, m, g, fn, m->id, m->tls[0], &m);
+@@ -141,7 +136,11 @@ runtime·newosproc(M *m, G *g, void *stk, void (*fn)(v
m->tls[0] = m->id; // so 386 asm can find it
- if((ret = runtime·rfork_thread(flags, stk, m, g, fn)) < 0) {
+ oset = runtime·sigprocmask(SIG_SETMASK, sigset_all);
-+ ret = runtime·rfork_thread(flags, stk, m, g, fn);
++ ret = runtime·tfork_thread(stk, m, g, fn);
+ runtime·sigprocmask(SIG_SETMASK, oset);
+
+ if(ret < 0) {
runtime·printf("runtime: failed to create new OS thread (have
%d already; errno=%d)\n", runtime·mcount() - 1, -ret);
if (ret == -ENOTSUP)
runtime·printf("runtime: is kern.rthreads
disabled?\n");
-@@ -168,6 +176,7 @@ runtime·minit(void)
+@@ -168,6 +167,7 @@ runtime·minit(void)
// Initialize signal handling
m->gsignal = runtime·malg(32*1024);
runtime·signalstack(m->gsignal->stackguard - StackGuard, 32*1024);
--
"Reason is not automatic. Those who deny it cannot be conquered by it.
Do not count on them. Leave them alone." -- Ayn Rand