runtime: merge clone0 and clone
We initially added clone0 to handle the case when G or M don't exist, but
it turns out that we could have just modified clone. (It also helps that
the function we're invoking in clone0 no longer needs arguments.)
As a side-effect, newosproc0 is now supported on all linux archs.
Change-Id: Ie603af75d8f164310fc16446052d83743961f3ca
Reviewed-on: https://go-review.googlesource.com/9164
Reviewed-by: David Crawshaw <crawshaw@golang.org>
diff --git a/src/runtime/sys_linux_arm.s b/src/runtime/sys_linux_arm.s
index bbd7eb9..9d21eae 100644
--- a/src/runtime/sys_linux_arm.s
+++ b/src/runtime/sys_linux_arm.s
@@ -241,7 +241,6 @@
MOVW R0, ret+24(FP)
RET
-
// int32 clone(int32 flags, void *stack, M *mp, G *gp, void (*fn)(void));
TEXT runtime·clone(SB),NOSPLIT,$0
MOVW flags+0(FP), R0
@@ -279,8 +278,15 @@
BEQ 2(PC)
BL runtime·abort(SB)
- MOVW 4(R13), g
- MOVW 0(R13), R8
+ MOVW 0(R13), R8 // m
+ MOVW 4(R13), R0 // g
+
+ CMP $0, R8
+ BEQ nog
+ CMP $0, R0
+ BEQ nog
+
+ MOVW R0, g
MOVW R8, g_m(g)
// paranoia; check they are not nil
@@ -295,54 +301,17 @@
MOVW g_m(g), R8
MOVW R0, m_procid(R8)
+nog:
// Call fn
MOVW 8(R13), R0
MOVW $16(R13), R13
BL (R0)
+ // It shouldn't return
MOVW $0, R0
MOVW R0, 4(R13)
BL runtime·exit1(SB)
- // It shouldn't return
- MOVW $1234, R0
- MOVW $1005, R1
- MOVW R0, (R1)
-
-// int32 clone0(int32 flags, void *stack, void* fn, void* fnarg);
-TEXT runtime·clone0(SB),NOSPLIT,$0-20
- MOVW flags+0(FP), R0
- MOVW stack+4(FP), R1
- // Update child's future stack and save fn and fnarg on it.
- MOVW $-8(R1), R1
- MOVW fn+8(FP), R6
- MOVW R6, 0(R1)
- MOVW fnarg+12(FP), R6
- MOVW R6, 4(R1)
- MOVW $0, R2 // parent tid ptr
- MOVW $0, R3 // tls_val
- MOVW $0, R4 // child tid ptr
- MOVW $0, R5
- MOVW $SYS_clone, R7
- SWI $0
-
- // In parent, return.
- CMP $0, R0
- BEQ 3(PC)
- MOVW R0, ret+16(FP)
- RET
-
- // In child.
- MOVW 0(R13), R6 // fn
- MOVW 4(R13), R0 // fnarg
- MOVW $8(R13), R13
- BL (R6)
-
- MOVW $0, R0
- MOVW R0, 4(R13)
- BL runtime·exit1(SB)
-
- // It shouldn't return
MOVW $1234, R0
MOVW $1005, R1
MOVW R0, (R1)