aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/sys_darwin.go11
-rw-r--r--src/runtime/sys_darwin_32.go11
-rw-r--r--src/runtime/sys_darwin_386.s37
-rw-r--r--src/runtime/sys_darwin_64.go11
-rw-r--r--src/runtime/sys_darwin_amd64.s37
-rw-r--r--src/runtime/sys_darwin_arm.s2
-rw-r--r--src/runtime/sys_darwin_arm64.s6
7 files changed, 84 insertions, 31 deletions
diff --git a/src/runtime/sys_darwin.go b/src/runtime/sys_darwin.go
index f34ac88352..434fa5f588 100644
--- a/src/runtime/sys_darwin.go
+++ b/src/runtime/sys_darwin.go
@@ -89,6 +89,17 @@ func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
}
func syscall6X()
+//go:linkname syscall_syscallPtr syscall.syscallPtr
+//go:nosplit
+//go:cgo_unsafe_args
+func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
+ entersyscallblock()
+ libcCall(unsafe.Pointer(funcPC(syscallPtr)), unsafe.Pointer(&fn))
+ exitsyscall()
+ return
+}
+func syscallPtr()
+
//go:linkname syscall_rawSyscall syscall.rawSyscall
//go:nosplit
//go:cgo_unsafe_args
diff --git a/src/runtime/sys_darwin_32.go b/src/runtime/sys_darwin_32.go
index 2f17091327..f126be83e5 100644
--- a/src/runtime/sys_darwin_32.go
+++ b/src/runtime/sys_darwin_32.go
@@ -19,14 +19,3 @@ func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, e
return
}
func syscall9()
-
-//go:linkname syscall_syscallPtr syscall.syscallPtr
-//go:nosplit
-//go:cgo_unsafe_args
-func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
- entersyscallblock()
- libcCall(unsafe.Pointer(funcPC(syscallPtr)), unsafe.Pointer(&fn))
- exitsyscall()
- return
-}
-func syscallPtr()
diff --git a/src/runtime/sys_darwin_386.s b/src/runtime/sys_darwin_386.s
index 1bc1a63c28..d318509e0a 100644
--- a/src/runtime/sys_darwin_386.s
+++ b/src/runtime/sys_darwin_386.s
@@ -675,9 +675,42 @@ ok:
POPL BP
RET
-// Not used on 386.
+// syscallPtr is like syscall except the libc function reports an
+// error by returning NULL and setting errno.
TEXT runtime·syscallPtr(SB),NOSPLIT,$0
- MOVL $0xf1, 0xf1 // crash
+ PUSHL BP
+ MOVL SP, BP
+ SUBL $24, SP
+ MOVL 32(SP), CX
+ MOVL (0*4)(CX), AX // fn
+ MOVL (1*4)(CX), DX // a1
+ MOVL DX, 0(SP)
+ MOVL (2*4)(CX), DX // a2
+ MOVL DX, 4(SP)
+ MOVL (3*4)(CX), DX // a3
+ MOVL DX, 8(SP)
+
+ CALL AX
+
+ MOVL 32(SP), CX
+ MOVL AX, (4*4)(CX) // r1
+ MOVL DX, (5*4)(CX) // r2
+
+ // syscallPtr libc functions return NULL on error
+ // and set errno.
+ TESTL AX, AX
+ JNE ok
+
+ // Get error code from libc.
+ CALL libc_error(SB)
+ MOVL (AX), AX
+ MOVL 32(SP), CX
+ MOVL AX, (6*4)(CX) // err
+
+ok:
+ XORL AX, AX // no error (it's ignored anyway)
+ MOVL BP, SP
+ POPL BP
RET
// syscall6 calls a function in libc on behalf of the syscall package.
diff --git a/src/runtime/sys_darwin_64.go b/src/runtime/sys_darwin_64.go
index 8c128811b9..07b0bb54af 100644
--- a/src/runtime/sys_darwin_64.go
+++ b/src/runtime/sys_darwin_64.go
@@ -19,14 +19,3 @@ func syscall_syscallX(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
return
}
func syscallX()
-
-//go:linkname syscall_syscallXPtr syscall.syscallXPtr
-//go:nosplit
-//go:cgo_unsafe_args
-func syscall_syscallXPtr(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
- entersyscallblock()
- libcCall(unsafe.Pointer(funcPC(syscallXPtr)), unsafe.Pointer(&fn))
- exitsyscall()
- return
-}
-func syscallXPtr()
diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s
index f99cb00ab8..934c510b88 100644
--- a/src/runtime/sys_darwin_amd64.s
+++ b/src/runtime/sys_darwin_amd64.s
@@ -637,9 +637,40 @@ ok:
POPQ BP
RET
-// Not used on amd64.
-TEXT runtime·syscallXPtr(SB),NOSPLIT,$0
- MOVL $0xf1, 0xf1 // crash
+// syscallPtr is like syscallX except that the libc function reports an
+// error by returning NULL and setting errno.
+TEXT runtime·syscallPtr(SB),NOSPLIT,$0
+ PUSHQ BP
+ MOVQ SP, BP
+ SUBQ $16, SP
+ MOVQ (0*8)(DI), CX // fn
+ MOVQ (2*8)(DI), SI // a2
+ MOVQ (3*8)(DI), DX // a3
+ MOVQ DI, (SP)
+ MOVQ (1*8)(DI), DI // a1
+ XORL AX, AX // vararg: say "no float args"
+
+ CALL CX
+
+ MOVQ (SP), DI
+ MOVQ AX, (4*8)(DI) // r1
+ MOVQ DX, (5*8)(DI) // r2
+
+ // syscallPtr libc functions return NULL on error
+ // and set errno.
+ TESTQ AX, AX
+ JNE ok
+
+ // Get error code from libc.
+ CALL libc_error(SB)
+ MOVLQSX (AX), AX
+ MOVQ (SP), DI
+ MOVQ AX, (6*8)(DI) // err
+
+ok:
+ XORL AX, AX // no error (it's ignored anyway)
+ MOVQ BP, SP
+ POPQ BP
RET
// syscall6 calls a function in libc on behalf of the syscall package.
diff --git a/src/runtime/sys_darwin_arm.s b/src/runtime/sys_darwin_arm.s
index 54c7afbf34..6c3fa0739d 100644
--- a/src/runtime/sys_darwin_arm.s
+++ b/src/runtime/sys_darwin_arm.s
@@ -418,7 +418,7 @@ ok:
RET
// syscallPtr is like syscall except the libc function reports an
-// error by returning NULL.
+// error by returning NULL and setting errno.
TEXT runtime·syscallPtr(SB),NOSPLIT,$0
MOVW.W R0, -4(R13) // push structure pointer
MOVW 0(R0), R12 // fn
diff --git a/src/runtime/sys_darwin_arm64.s b/src/runtime/sys_darwin_arm64.s
index 29951d8ad7..89a2b8a054 100644
--- a/src/runtime/sys_darwin_arm64.s
+++ b/src/runtime/sys_darwin_arm64.s
@@ -465,9 +465,9 @@ TEXT runtime·syscallX(SB),NOSPLIT,$0
ok:
RET
-// syscallXPtr is like syscallX except that the libc function reports an
-// error by returning NULL.
-TEXT runtime·syscallXPtr(SB),NOSPLIT,$0
+// syscallPtr is like syscallX except that the libc function reports an
+// error by returning NULL and setting errno.
+TEXT runtime·syscallPtr(SB),NOSPLIT,$0
SUB $16, RSP // push structure pointer
MOVD R0, (RSP)