diff options
Diffstat (limited to 'src/runtime/sys_linux_386.s')
| -rw-r--r-- | src/runtime/sys_linux_386.s | 96 |
1 files changed, 48 insertions, 48 deletions
diff --git a/src/runtime/sys_linux_386.s b/src/runtime/sys_linux_386.s index d26b25e987..98626d14c8 100644 --- a/src/runtime/sys_linux_386.s +++ b/src/runtime/sys_linux_386.s @@ -10,23 +10,17 @@ #include "go_tls.h" #include "textflag.h" -#ifdef GOBUILDMODE_shared -#define INVOKE_SYSINFO CALL 0x10(GS) -#else -#define INVOKE_SYSINFO CALL *runtime·_vdso(SB) -#endif - TEXT runtime·exit(SB),NOSPLIT,$0 MOVL $252, AX // syscall number MOVL code+0(FP), BX - INVOKE_SYSINFO + CALL 0x10(GS) INT $3 // not reached RET TEXT runtime·exit1(SB),NOSPLIT,$0 MOVL $1, AX // exit - exit the current os thread MOVL code+0(FP), BX - INVOKE_SYSINFO + CALL 0x10(GS) INT $3 // not reached RET @@ -35,7 +29,7 @@ TEXT runtime·open(SB),NOSPLIT,$0 MOVL name+0(FP), BX MOVL mode+4(FP), CX MOVL perm+8(FP), DX - INVOKE_SYSINFO + CALL 0x10(GS) CMPL AX, $0xfffff001 JLS 2(PC) MOVL $-1, AX @@ -45,7 +39,7 @@ TEXT runtime·open(SB),NOSPLIT,$0 TEXT runtime·closefd(SB),NOSPLIT,$0 MOVL $6, AX // syscall - close MOVL fd+0(FP), BX - INVOKE_SYSINFO + CALL 0x10(GS) CMPL AX, $0xfffff001 JLS 2(PC) MOVL $-1, AX @@ -57,7 +51,7 @@ TEXT runtime·write(SB),NOSPLIT,$0 MOVL fd+0(FP), BX MOVL p+4(FP), CX MOVL n+8(FP), DX - INVOKE_SYSINFO + CALL 0x10(GS) CMPL AX, $0xfffff001 JLS 2(PC) MOVL $-1, AX @@ -69,7 +63,7 @@ TEXT runtime·read(SB),NOSPLIT,$0 MOVL fd+0(FP), BX MOVL p+4(FP), CX MOVL n+8(FP), DX - INVOKE_SYSINFO + CALL 0x10(GS) CMPL AX, $0xfffff001 JLS 2(PC) MOVL $-1, AX @@ -80,7 +74,7 @@ TEXT runtime·getrlimit(SB),NOSPLIT,$0 MOVL $191, AX // syscall - ugetrlimit MOVL kind+0(FP), BX MOVL limit+4(FP), CX - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+8(FP) RET @@ -99,31 +93,31 @@ TEXT runtime·usleep(SB),NOSPLIT,$8 MOVL $0, DX MOVL $0, SI LEAL 0(SP), DI - INVOKE_SYSINFO + CALL 0x10(GS) RET TEXT runtime·gettid(SB),NOSPLIT,$0-4 MOVL $224, AX // syscall - gettid - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+0(FP) RET TEXT runtime·raise(SB),NOSPLIT,$12 MOVL $224, AX // syscall - gettid - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, BX // arg 1 tid MOVL sig+0(FP), CX // arg 2 signal MOVL $238, AX // syscall - tkill - INVOKE_SYSINFO + CALL 0x10(GS) RET TEXT runtime·raiseproc(SB),NOSPLIT,$12 MOVL $20, AX // syscall - getpid - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, BX // arg 1 pid MOVL sig+0(FP), CX // arg 2 signal MOVL $37, AX // syscall - kill - INVOKE_SYSINFO + CALL 0x10(GS) RET TEXT runtime·setitimer(SB),NOSPLIT,$0-12 @@ -131,7 +125,7 @@ TEXT runtime·setitimer(SB),NOSPLIT,$0-12 MOVL mode+0(FP), BX MOVL new+4(FP), CX MOVL old+8(FP), DX - INVOKE_SYSINFO + CALL 0x10(GS) RET TEXT runtime·mincore(SB),NOSPLIT,$0-16 @@ -139,7 +133,7 @@ TEXT runtime·mincore(SB),NOSPLIT,$0-16 MOVL addr+0(FP), BX MOVL n+4(FP), CX MOVL dst+8(FP), DX - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+12(FP) RET @@ -149,7 +143,7 @@ TEXT time·now(SB), NOSPLIT, $32 MOVL $0, BX // CLOCK_REALTIME LEAL 8(SP), CX MOVL $0, DX - INVOKE_SYSINFO + CALL 0x10(GS) MOVL 8(SP), AX // sec MOVL 12(SP), BX // nsec @@ -166,7 +160,7 @@ TEXT runtime·nanotime(SB), NOSPLIT, $32 MOVL $1, BX // CLOCK_MONOTONIC LEAL 8(SP), CX MOVL $0, DX - INVOKE_SYSINFO + CALL 0x10(GS) MOVL 8(SP), AX // sec MOVL 12(SP), BX // nsec @@ -187,7 +181,7 @@ TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0 MOVL new+4(FP), CX MOVL old+8(FP), DX MOVL size+12(FP), SI - INVOKE_SYSINFO + CALL 0x10(GS) CMPL AX, $0xfffff001 JLS 2(PC) INT $3 @@ -199,7 +193,7 @@ TEXT runtime·rt_sigaction(SB),NOSPLIT,$0 MOVL new+4(FP), CX MOVL old+8(FP), DX MOVL size+12(FP), SI - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+16(FP) RET @@ -227,9 +221,9 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$12 TEXT runtime·sigreturn(SB),NOSPLIT,$0 MOVL $173, AX // rt_sigreturn // Sigreturn expects same SP as signal handler, - // so cannot CALL *runtime._vsdo(SB) here. + // so cannot CALL 0x10(GS) here. INT $0x80 - INT $3 // not reached + INT $3 // not reached RET TEXT runtime·mmap(SB),NOSPLIT,$0 @@ -241,7 +235,7 @@ TEXT runtime·mmap(SB),NOSPLIT,$0 MOVL fd+16(FP), DI MOVL off+20(FP), BP SHRL $12, BP - INVOKE_SYSINFO + CALL 0x10(GS) CMPL AX, $0xfffff001 JLS 3(PC) NOTL AX @@ -253,7 +247,7 @@ TEXT runtime·munmap(SB),NOSPLIT,$0 MOVL $91, AX // munmap MOVL addr+0(FP), BX MOVL n+4(FP), CX - INVOKE_SYSINFO + CALL 0x10(GS) CMPL AX, $0xfffff001 JLS 2(PC) INT $3 @@ -264,7 +258,7 @@ TEXT runtime·madvise(SB),NOSPLIT,$0 MOVL addr+0(FP), BX MOVL n+4(FP), CX MOVL flags+8(FP), DX - INVOKE_SYSINFO + CALL 0x10(GS) // ignore failure - maybe pages are locked RET @@ -278,7 +272,7 @@ TEXT runtime·futex(SB),NOSPLIT,$0 MOVL ts+12(FP), SI MOVL addr2+16(FP), DI MOVL val3+20(FP), BP - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+24(FP) RET @@ -300,10 +294,9 @@ TEXT runtime·clone(SB),NOSPLIT,$0 MOVL SI, 8(CX) MOVL $1234, 12(CX) - // cannot use CALL *runtime·_vdso(SB) here, because - // the stack changes during the system call (after - // CALL *runtime·_vdso(SB), the child is still using - // the parent's stack when executing its RET instruction). + // cannot use CALL 0x10(GS) here, because the stack changes during the + // system call (after CALL 0x10(GS), the child is still using the + // parent's stack when executing its RET instruction). INT $0x80 // In parent, return. @@ -320,7 +313,7 @@ TEXT runtime·clone(SB),NOSPLIT,$0 // Initialize AX to Linux tid MOVL $224, AX - INVOKE_SYSINFO + CALL 0x10(GS) MOVL 0(SP), BX // m MOVL 4(SP), DX // g @@ -371,7 +364,7 @@ TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 MOVL $186, AX // sigaltstack MOVL new+4(SP), BX MOVL old+8(SP), CX - INVOKE_SYSINFO + CALL 0x10(GS) CMPL AX, $0xfffff001 JLS 2(PC) INT $3 @@ -429,6 +422,12 @@ TEXT runtime·setldt(SB),NOSPLIT,$32 ADDL $0x4, CX // address MOVL CX, 0(CX) #endif + // We copy the dynamic linker behaviour of storing the vsyscall entry point + // at 0x10(GS) so that it can be invoked by "CALL 0x10(GS)" in all + // situations, not only those where the binary is actually dynamically + // linked. + MOVL runtime·_vdso(SB), AX + MOVL AX, 0x10(CX) // set up user_desc LEAL 16(SP), AX // struct user_desc @@ -442,7 +441,8 @@ TEXT runtime·setldt(SB),NOSPLIT,$32 MOVL AX, CX // user_desc MOVL $16, DX // sizeof(user_desc) MOVL $123, AX // syscall - modify_ldt - INVOKE_SYSINFO + // We can't call this via 0x10(GS) because this is called from setldt0 to set that up. + INT $0x80 // breakpoint on error CMPL AX, $0xfffff001 @@ -459,7 +459,7 @@ TEXT runtime·setldt(SB),NOSPLIT,$32 TEXT runtime·osyield(SB),NOSPLIT,$0 MOVL $158, AX - INVOKE_SYSINFO + CALL 0x10(GS) RET TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 @@ -467,7 +467,7 @@ TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 MOVL pid+0(FP), BX MOVL len+4(FP), CX MOVL buf+8(FP), DX - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+12(FP) RET @@ -475,7 +475,7 @@ TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 TEXT runtime·epollcreate(SB),NOSPLIT,$0 MOVL $254, AX MOVL size+0(FP), BX - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+4(FP) RET @@ -483,7 +483,7 @@ TEXT runtime·epollcreate(SB),NOSPLIT,$0 TEXT runtime·epollcreate1(SB),NOSPLIT,$0 MOVL $329, AX MOVL flags+0(FP), BX - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+4(FP) RET @@ -494,7 +494,7 @@ TEXT runtime·epollctl(SB),NOSPLIT,$0 MOVL op+4(FP), CX MOVL fd+8(FP), DX MOVL ev+12(FP), SI - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+16(FP) RET @@ -505,7 +505,7 @@ TEXT runtime·epollwait(SB),NOSPLIT,$0 MOVL ev+4(FP), CX MOVL nev+8(FP), DX MOVL timeout+12(FP), SI - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+16(FP) RET @@ -515,7 +515,7 @@ TEXT runtime·closeonexec(SB),NOSPLIT,$0 MOVL fd+0(FP), BX // fd MOVL $2, CX // F_SETFD MOVL $1, DX // FD_CLOEXEC - INVOKE_SYSINFO + CALL 0x10(GS) RET // int access(const char *name, int mode) @@ -523,7 +523,7 @@ TEXT runtime·access(SB),NOSPLIT,$0 MOVL $33, AX // syscall - access MOVL name+0(FP), BX MOVL mode+4(FP), CX - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+8(FP) RET @@ -534,7 +534,7 @@ TEXT runtime·connect(SB),NOSPLIT,$0-16 MOVL $102, AX // syscall - socketcall MOVL $3, BX // connect LEAL fd+0(FP), CX - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+12(FP) RET @@ -545,6 +545,6 @@ TEXT runtime·socket(SB),NOSPLIT,$0-16 MOVL $102, AX // syscall - socketcall MOVL $1, BX // socket LEAL domain+0(FP), CX - INVOKE_SYSINFO + CALL 0x10(GS) MOVL AX, ret+12(FP) RET |
