diff options
Diffstat (limited to 'src/pkg/runtime/linux/amd64/sys.s')
-rw-r--r-- | src/pkg/runtime/linux/amd64/sys.s | 96 |
1 files changed, 71 insertions, 25 deletions
diff --git a/src/pkg/runtime/linux/amd64/sys.s b/src/pkg/runtime/linux/amd64/sys.s index dd0473158..170b659fc 100644 --- a/src/pkg/runtime/linux/amd64/sys.s +++ b/src/pkg/runtime/linux/amd64/sys.s @@ -8,19 +8,19 @@ #include "amd64/asm.h" -TEXT exit(SB),7,$0-8 +TEXT runtime·exit(SB),7,$0-8 MOVL 8(SP), DI MOVL $231, AX // exitgroup - force all os threads to exit SYSCALL RET -TEXT exit1(SB),7,$0-8 +TEXT runtime·exit1(SB),7,$0-8 MOVL 8(SP), DI MOVL $60, AX // exit - exit the current os thread SYSCALL RET -TEXT open(SB),7,$0-16 +TEXT runtime·open(SB),7,$0-16 MOVQ 8(SP), DI MOVL 16(SP), SI MOVL 20(SP), DX @@ -28,7 +28,7 @@ TEXT open(SB),7,$0-16 SYSCALL RET -TEXT write(SB),7,$0-24 +TEXT runtime·write(SB),7,$0-24 MOVL 8(SP), DI MOVQ 16(SP), SI MOVL 24(SP), DX @@ -36,7 +36,7 @@ TEXT write(SB),7,$0-24 SYSCALL RET -TEXT gettime(SB), 7, $32 +TEXT runtime·gettime(SB), 7, $32 LEAQ 8(SP), DI MOVQ $0, SI MOVQ $0xffffffffff600000, AX @@ -51,7 +51,7 @@ TEXT gettime(SB), 7, $32 MOVL BX, (DI) RET -TEXT rt_sigaction(SB),7,$0-32 +TEXT runtime·rt_sigaction(SB),7,$0-32 MOVL 8(SP), DI MOVQ 16(SP), SI MOVQ 24(SP), DX @@ -60,23 +60,38 @@ TEXT rt_sigaction(SB),7,$0-32 SYSCALL RET -TEXT sigtramp(SB),7,$24-16 - MOVQ m_gsignal(m), g +TEXT runtime·sigtramp(SB),7,$64 + get_tls(BX) + + // save g + MOVQ g(BX), BP + MOVQ BP, 40(SP) + + // g = m->gsignal + MOVQ m(BX), BP + MOVQ m_gsignal(BP), BP + MOVQ BP, g(BX) + MOVQ DI, 0(SP) MOVQ SI, 8(SP) MOVQ DX, 16(SP) - CALL sighandler(SB) + CALL runtime·sighandler(SB) + + // restore g + get_tls(BX) + MOVQ 40(SP), BP + MOVQ BP, g(BX) RET -TEXT sigignore(SB),7,$0 +TEXT runtime·sigignore(SB),7,$0 RET -TEXT sigreturn(SB),7,$0 +TEXT runtime·sigreturn(SB),7,$0 MOVL $15, AX // rt_sigreturn SYSCALL INT $3 // not reached -TEXT ·mmap(SB),7,$0 +TEXT runtime·mmap(SB),7,$0 MOVQ 8(SP), DI MOVQ $0, SI MOVQ 16(SP), SI @@ -85,7 +100,7 @@ TEXT ·mmap(SB),7,$0 MOVL 32(SP), R8 MOVL 36(SP), R9 - MOVL $9, AX // syscall entry + MOVL $9, AX // mmap SYSCALL CMPQ AX, $0xfffffffffffff001 JLS 3(PC) @@ -93,14 +108,24 @@ TEXT ·mmap(SB),7,$0 INCQ AX RET -TEXT notok(SB),7,$0 +TEXT runtime·munmap(SB),7,$0 + MOVQ 8(SP), DI + MOVQ 16(SP), SI + MOVQ $11, AX // munmap + SYSCALL + CMPQ AX, $0xfffffffffffff001 + JLS 2(PC) + CALL runtime·notok(SB) + RET + +TEXT runtime·notok(SB),7,$0 MOVQ $0xf1, BP MOVQ BP, (BP) RET // int64 futex(int32 *uaddr, int32 op, int32 val, // struct timespec *timeout, int32 *uaddr2, int32 val2); -TEXT futex(SB),7,$0 +TEXT runtime·futex(SB),7,$0 MOVQ 8(SP), DI MOVL 16(SP), SI MOVL 20(SP), DX @@ -112,7 +137,7 @@ TEXT futex(SB),7,$0 RET // int64 clone(int32 flags, void *stack, M *m, G *g, void (*fn)(void)); -TEXT clone(SB),7,$0 +TEXT runtime·clone(SB),7,$0 MOVL flags+8(SP), DI MOVQ stack+16(SP), SI @@ -129,17 +154,24 @@ TEXT clone(SB),7,$0 CMPQ AX, $0 JEQ 2(PC) RET - - // In child, set up new stack + + // In child, on new stack. MOVQ SI, SP - MOVQ R8, m - MOVQ R9, g - CALL stackcheck(SB) - + // Initialize m->procid to Linux tid MOVL $186, AX // gettid SYSCALL - MOVQ AX, m_procid(m) + MOVQ AX, m_procid(R8) + + // Set FS to point at m->tls. + LEAQ m_tls(R8), DI + CALL runtime·settls(SB) + + // In child, set up new stack + get_tls(CX) + MOVQ R8, m(CX) + MOVQ R9, g(CX) + CALL runtime·stackcheck(SB) // Call fn CALL R12 @@ -150,12 +182,26 @@ TEXT clone(SB),7,$0 SYSCALL JMP -3(PC) // keep exiting -TEXT sigaltstack(SB),7,$-8 +TEXT runtime·sigaltstack(SB),7,$-8 MOVQ new+8(SP), DI MOVQ old+16(SP), SI MOVQ $131, AX SYSCALL CMPQ AX, $0xfffffffffffff001 JLS 2(PC) - CALL notok(SB) + CALL runtime·notok(SB) + RET + +// set tls base to DI +TEXT runtime·settls(SB),7,$32 + ADDQ $16, DI // ELF wants to use -16(FS), -8(FS) + + MOVQ DI, SI + MOVQ $0x1002, DI // ARCH_SET_FS + MOVQ $158, AX // arch_prctl + SYSCALL + CMPQ AX, $0xfffffffffffff001 + JLS 2(PC) + CALL runtime·notok(SB) RET + |