From e9ce76b0eca8fa95dddb90b0a72aadab58de2ffc Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Sat, 17 Jan 2015 21:09:15 -0800 Subject: [PATCH] runtime, syscall: use SYSCALL instruction on FreeBSD. This manually reverts 555da73 from #6372 which implies a minimum FreeBSD version of 8-STABLE. Updates docs to mention new minimum requirement. Fixes #9627 Change-Id: I40ae64be3682d79dd55024e32581e3e5e2be8aa7 Reviewed-on: https://go-review.googlesource.com/3020 Reviewed-by: Minux Ma Reviewed-by: Brad Fitzpatrick --- doc/install.html | 9 +++++---- src/runtime/sys_freebsd_amd64.s | 25 ------------------------- src/syscall/asm_freebsd_amd64.s | 5 ----- 3 files changed, 5 insertions(+), 34 deletions(-) diff --git a/doc/install.html b/doc/install.html index 9561fdde21063c..8c9322fd53bd16 100644 --- a/doc/install.html +++ b/doc/install.html @@ -14,9 +14,10 @@

Download the Go distribution

Official binary -distributions are available for the FreeBSD (release 8 and above), Linux, Mac OS X (Snow Leopard -and above), and Windows operating systems and the 32-bit (386) and -64-bit (amd64) x86 processor architectures. +distributions are available for the FreeBSD (release 8-STABLE and above), +Linux, Mac OS X (Snow Leopard and above), and Windows operating systems and +the 32-bit (386) and 64-bit (amd64) x86 processor +architectures.

@@ -44,7 +45,7 @@

System requirements

Notes
-FreeBSD 8 or later amd64, 386, arm Debian GNU/kFreeBSD not supported; FreeBSD/ARM needs FreeBSD 10 or later +FreeBSD 8-STABLE or later amd64, 386, arm Debian GNU/kFreeBSD not supported; FreeBSD/ARM needs FreeBSD 10 or later Linux 2.6.23 or later with glibc amd64, 386, arm CentOS/RHEL 5.x not supported; no binary distribution for ARM yet Mac OS X 10.6 or later amd64, 386 use the gcc that comes with Xcode Windows XP or later amd64, 386 use MinGW gcc. No need for cygwin or msys. diff --git a/src/runtime/sys_freebsd_amd64.s b/src/runtime/sys_freebsd_amd64.s index 84cee51d8c1c29..400c1845be68a1 100644 --- a/src/runtime/sys_freebsd_amd64.s +++ b/src/runtime/sys_freebsd_amd64.s @@ -10,31 +10,6 @@ #include "go_tls.h" #include "textflag.h" -// FreeBSD 8, FreeBSD 9, and older versions that I have checked -// do not restore R10 on exit from a "restarted" system call -// if you use the SYSCALL instruction. This means that, for example, -// if a signal arrives while the wait4 system call is executing, -// the wait4 internally returns ERESTART, which makes the kernel -// back up the PC to execute the SYSCALL instruction a second time. -// However, since the kernel does not restore R10, the fourth -// argument to the system call has been lost. (FreeBSD 9 also fails -// to restore the fifth and sixth arguments, R8 and R9, although -// some earlier versions did restore those correctly.) -// The broken code is in fast_syscall in FreeBSD's amd64/amd64/exception.S. -// It restores only DI, SI, DX, AX, and RFLAGS on system call return. -// http://fxr.watson.org/fxr/source/amd64/amd64/exception.S?v=FREEBSD91#L399 -// -// The INT $0x80 system call path (int0x80_syscall in FreeBSD's -// amd64/ia32/ia32_exception.S) does not have this problem, -// but it expects the third argument in R10. Instead of rewriting -// all the assembly in this file, #define SYSCALL to a safe simulation -// using INT $0x80. -// -// INT $0x80 is a little slower than SYSCALL, but correctness wins. -// -// See golang.org/issue/6372. -#define SYSCALL MOVQ R10, CX; INT $0x80 - TEXT runtime·sys_umtx_op(SB),NOSPLIT,$0 MOVQ addr+0(FP), DI MOVL mode+8(FP), SI diff --git a/src/syscall/asm_freebsd_amd64.s b/src/syscall/asm_freebsd_amd64.s index c52519098e7565..c6988c94b3d5d1 100644 --- a/src/syscall/asm_freebsd_amd64.s +++ b/src/syscall/asm_freebsd_amd64.s @@ -12,11 +12,6 @@ // System call support for AMD64, FreeBSD // -// The SYSCALL variant for invoking system calls is broken in FreeBSD. -// See comment at top of ../runtime/sys_freebsd_amd64.c and -// golang.org/issue/6372. -#define SYSCALL MOVQ R10, CX; INT $0x80 - // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64); // func Syscall6(trap int64, a1, a2, a3, a4, a5, a6 int64) (r1, r2, err int64); // func Syscall9(trap int64, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int64)