diff options
Diffstat (limited to 'src/runtime/sys_linux_386.s')
-rw-r--r-- | src/runtime/sys_linux_386.s | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/src/runtime/sys_linux_386.s b/src/runtime/sys_linux_386.s index 1a3aaf0104..4a74196032 100644 --- a/src/runtime/sys_linux_386.s +++ b/src/runtime/sys_linux_386.s @@ -12,16 +12,17 @@ // Most linux systems use glibc's dynamic linker, which puts the // __kernel_vsyscall vdso helper at 0x10(GS) for easy access from position -// independent code and setldt in this file does the same in the statically -// linked case. Android, however, uses bionic's dynamic linker, which does not -// save the helper anywhere, and so the only way to invoke a syscall from -// position independent code is boring old int $0x80 (which is also what -// bionic's syscall wrappers use). -#ifdef GOOS_android +// independent code and setldt in runtime does the same in the statically +// linked case. However, systems that use alternative libc such as Android's +// bionic and musl, do not save the helper anywhere, and so the only way to +// invoke a syscall from position independent code is boring old int $0x80 +// (which is also what syscall wrappers in bionic/musl use). +// +// The benchmarks also showed that using int $0x80 is as fast as calling +// *%gs:0x10 except on AMD Opteron. See https://golang.org/cl/19833 +// for the benchmark program and raw data. +//#define INVOKE_SYSCALL CALL 0x10(GS) // non-portable #define INVOKE_SYSCALL INT $0x80 -#else -#define INVOKE_SYSCALL CALL 0x10(GS) -#endif TEXT runtime·exit(SB),NOSPLIT,$0 MOVL $252, AX // syscall number @@ -434,12 +435,6 @@ TEXT runtime·setldt(SB),NOSPLIT,$32 */ ADDL $0x4, DX // address MOVL DX, 0(DX) - // We copy the glibc dynamic linker behaviour of storing the - // __kernel_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(DX) #endif // set up user_desc |