mirror of
https://git.freebsd.org/ports.git
synced 2025-06-05 04:46:28 -04:00
- patch-syscall Use SYSCALL assembly instead of INT 0x80 for syscalls on amd64. Using INT 0x80 as syscall gate on amd64 is an accidential and undocumented feature of COMPAT_FREEBSD32. It allows to use 64-bit ABI, but run syscalls through i386 gate. Go used this "feature" to workaround a bug in FreeBSD 8, which is no longer relevant. The patch is exact e9ce76b0eca8fa95dddb90b0a72aadab58de2ffc from go repo. Now lang/go14 doesn't need COMPAT_FREEBSD32 to build and run. - patch-pipe2 The pipe2 syscall is present in all supported versions of FreeBSD, but pipe was removed from FreeBSD 11. With the patch go14 can be built and run on a system without COMPAT_FREEBSD10. Reviewed by: jlaffaye
48 lines
2.2 KiB
Text
48 lines
2.2 KiB
Text
--- src/runtime/sys_freebsd_amd64.s.orig 2017-03-17 20:08:29.000000000 +0000
|
|
+++ src/runtime/sys_freebsd_amd64.s 2017-03-17 20:08:29.000000000 +0000
|
|
@@ -9,31 +9,6 @@
|
|
#include "zasm_GOOS_GOARCH.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
|
|
--- src/syscall/asm_freebsd_amd64.s.orig 2017-03-17 20:20:07.000000000 +0000
|
|
+++ src/syscall/asm_freebsd_amd64.s 2017-03-17 20:20:07.000000000 +0000
|
|
@@ -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)
|