aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/sys_linux_amd64.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/sys_linux_amd64.s')
-rw-r--r--src/runtime/sys_linux_amd64.s61
1 files changed, 25 insertions, 36 deletions
diff --git a/src/runtime/sys_linux_amd64.s b/src/runtime/sys_linux_amd64.s
index fe9c6bce85..8d90813589 100644
--- a/src/runtime/sys_linux_amd64.s
+++ b/src/runtime/sys_linux_amd64.s
@@ -33,10 +33,8 @@
#define SYS_clone 56
#define SYS_exit 60
#define SYS_kill 62
-#define SYS_uname 63
#define SYS_fcntl 72
#define SYS_sigaltstack 131
-#define SYS_mlock 149
#define SYS_arch_prctl 158
#define SYS_gettid 186
#define SYS_futex 202
@@ -214,7 +212,7 @@ TEXT runtime·walltime1(SB),NOSPLIT,$16-12
// due to stack probes inserted to avoid stack/heap collisions.
// See issue #20427.
- MOVQ SP, BP // Save old SP; BP unchanged by C code.
+ MOVQ SP, R12 // Save old SP; R12 unchanged by C code.
get_tls(CX)
MOVQ g(CX), AX
@@ -252,7 +250,7 @@ noswitch:
MOVQ 0(SP), AX // sec
MOVQ 8(SP), DX // nsec
ret:
- MOVQ BP, SP // Restore real SP
+ MOVQ R12, SP // Restore real SP
// Restore vdsoPC, vdsoSP
// We don't worry about being signaled between the two stores.
// If we are not in a signal handler, we'll restore vdsoSP to 0,
@@ -279,7 +277,7 @@ fallback:
TEXT runtime·nanotime1(SB),NOSPLIT,$16-8
// Switch to g0 stack. See comment above in runtime·walltime.
- MOVQ SP, BP // Save old SP; BP unchanged by C code.
+ MOVQ SP, R12 // Save old SP; R12 unchanged by C code.
get_tls(CX)
MOVQ g(CX), AX
@@ -317,7 +315,7 @@ noswitch:
MOVQ 0(SP), AX // sec
MOVQ 8(SP), DX // nsec
ret:
- MOVQ BP, SP // Restore real SP
+ MOVQ R12, SP // Restore real SP
// Restore vdsoPC, vdsoSP
// We don't worry about being signaled between the two stores.
// If we are not in a signal handler, we'll restore vdsoSP to 0,
@@ -594,13 +592,25 @@ TEXT runtime·clone(SB),NOSPLIT,$0
MOVQ stk+8(FP), SI
MOVQ $0, DX
MOVQ $0, R10
-
+ MOVQ $0, R8
// Copy mp, gp, fn off parent stack for use by child.
// Careful: Linux system call clobbers CX and R11.
- MOVQ mp+16(FP), R8
+ MOVQ mp+16(FP), R13
MOVQ gp+24(FP), R9
MOVQ fn+32(FP), R12
-
+ CMPQ R13, $0 // m
+ JEQ nog1
+ CMPQ R9, $0 // g
+ JEQ nog1
+ LEAQ m_tls(R13), R8
+#ifdef GOOS_android
+ // Android stores the TLS offset in runtime·tls_g.
+ SUBQ runtime·tls_g(SB), R8
+#else
+ ADDQ $8, R8 // ELF wants to use -8(FS)
+#endif
+ ORQ $0x00080000, DI //add flag CLONE_SETTLS(0x00080000) to call clone
+nog1:
MOVL $SYS_clone, AX
SYSCALL
@@ -614,27 +624,23 @@ TEXT runtime·clone(SB),NOSPLIT,$0
MOVQ SI, SP
// If g or m are nil, skip Go-related setup.
- CMPQ R8, $0 // m
- JEQ nog
+ CMPQ R13, $0 // m
+ JEQ nog2
CMPQ R9, $0 // g
- JEQ nog
+ JEQ nog2
// Initialize m->procid to Linux tid
MOVL $SYS_gettid, AX
SYSCALL
- MOVQ AX, m_procid(R8)
-
- // Set FS to point at m->tls.
- LEAQ m_tls(R8), DI
- CALL runtime·settls(SB)
+ MOVQ AX, m_procid(R13)
// In child, set up new stack
get_tls(CX)
- MOVQ R8, g_m(R9)
+ MOVQ R13, g_m(R9)
MOVQ R9, g(CX)
CALL runtime·stackcheck(SB)
-nog:
+nog2:
// Call fn
CALL R12
@@ -789,20 +795,3 @@ TEXT runtime·sbrk0(SB),NOSPLIT,$0-8
SYSCALL
MOVQ AX, ret+0(FP)
RET
-
-// func uname(utsname *new_utsname) int
-TEXT ·uname(SB),NOSPLIT,$0-16
- MOVQ utsname+0(FP), DI
- MOVL $SYS_uname, AX
- SYSCALL
- MOVQ AX, ret+8(FP)
- RET
-
-// func mlock(addr, len uintptr) int
-TEXT ·mlock(SB),NOSPLIT,$0-24
- MOVQ addr+0(FP), DI
- MOVQ len+8(FP), SI
- MOVL $SYS_mlock, AX
- SYSCALL
- MOVQ AX, ret+16(FP)
- RET