// Call fn(arg) on the scheduler stack,
// aligned appropriately for the gcc ABI.
// See cgocall.c for more details.
-TEXT ·asmcgocall(SB),NOSPLIT,$0-8
- MOVL fn+0(FP), AX
- MOVL arg+4(FP), BX
- CALL asmcgocall<>(SB)
- RET
-
TEXT ·asmcgocall_errno(SB),NOSPLIT,$0-12
MOVL fn+0(FP), AX
MOVL arg+4(FP), BX
// Call fn(arg) on the scheduler stack,
// aligned appropriately for the gcc ABI.
// See cgocall.c for more details.
-TEXT ·asmcgocall(SB),NOSPLIT,$0-16
- MOVQ fn+0(FP), AX
- MOVQ arg+8(FP), BX
- CALL asmcgocall<>(SB)
- RET
-
TEXT ·asmcgocall_errno(SB),NOSPLIT,$0-20
MOVQ fn+0(FP), AX
MOVQ arg+8(FP), BX
MOVL 0(DX), BX
JMP BX // but first run the deferred function
-// asmcgocall(void(*fn)(void*), void *arg)
-// Not implemented.
-TEXT runtime·asmcgocall(SB),NOSPLIT,$0-8
- MOVL 0, AX
- RET
-
// asmcgocall(void(*fn)(void*), void *arg)
// Not implemented.
TEXT runtime·asmcgocall_errno(SB),NOSPLIT,$0-12
// Call fn(arg) on the scheduler stack,
// aligned appropriately for the gcc ABI.
// See cgocall.c for more details.
-TEXT ·asmcgocall(SB),NOSPLIT,$0-8
- MOVW fn+0(FP), R1
- MOVW arg+4(FP), R0
- BL asmcgocall<>(SB)
- RET
-
TEXT ·asmcgocall_errno(SB),NOSPLIT,$0-12
MOVW fn+0(FP), R1
MOVW arg+4(FP), R0
// Call fn(arg) on the scheduler stack,
// aligned appropriately for the gcc ABI.
// See cgocall.go for more details.
-TEXT ·asmcgocall(SB),NOSPLIT,$0-16
- MOVD fn+0(FP), R1
- MOVD arg+8(FP), R0
- BL asmcgocall<>(SB)
- RET
-
TEXT ·asmcgocall_errno(SB),NOSPLIT,$0-20
MOVD fn+0(FP), R1
MOVD arg+8(FP), R0
// Call fn(arg) on the scheduler stack,
// aligned appropriately for the gcc ABI.
// See cgocall.c for more details.
-TEXT ·asmcgocall(SB),NOSPLIT,$0-16
- MOVD fn+0(FP), R3
- MOVD arg+8(FP), R4
- BL asmcgocall<>(SB)
- RET
-
TEXT ·asmcgocall_errno(SB),NOSPLIT,$0-20
MOVD fn+0(FP), R3
MOVD arg+8(FP), R4
import "unsafe"
// Call from Go to C.
-//go:nosplit
-func cgocall(fn, arg unsafe.Pointer) {
- cgocall_errno(fn, arg)
-}
-
//go:nosplit
func cgocall_errno(fn, arg unsafe.Pointer) int32 {
if !iscgo && GOOS != "solaris" && GOOS != "windows" {
ret unsafe.Pointer
}
args.n = uint64(n)
- cgocall(_cgo_malloc, unsafe.Pointer(&args))
+ cgocall_errno(_cgo_malloc, unsafe.Pointer(&args))
if args.ret == nil {
throw("C malloc failed")
}
}
func cfree(p unsafe.Pointer) {
- cgocall(_cgo_free, p)
+ cgocall_errno(_cgo_free, p)
}
// Call from C back to Go.
return
}
arg := [2]unsafe.Pointer{cstring(k), cstring(v)}
- asmcgocall(unsafe.Pointer(_cgo_setenv), unsafe.Pointer(&arg))
+ asmcgocall_errno(unsafe.Pointer(_cgo_setenv), unsafe.Pointer(&arg))
}
// Update the C environment if cgo is loaded.
return
}
arg := [1]unsafe.Pointer{cstring(k)}
- asmcgocall(unsafe.Pointer(_cgo_unsetenv), unsafe.Pointer(&arg))
+ asmcgocall_errno(unsafe.Pointer(_cgo_unsetenv), unsafe.Pointer(&arg))
}
func cstring(s string) unsafe.Pointer {
// all three values to be non-zero, it will use them
mp.libcallsp = getcallersp(unsafe.Pointer(&fn))
}
- asmcgocall(asmstdcallAddr, unsafe.Pointer(&mp.libcall))
+ asmcgocall_errno(asmstdcallAddr, unsafe.Pointer(&mp.libcall))
mp.libcallsp = 0
return mp.libcall.r1
}
// Called on the new thread, can not allocate memory.
func minit() {
_g_ := getg()
- asmcgocall(unsafe.Pointer(funcPC(miniterrno)), unsafe.Pointer(&libc____errno))
+ asmcgocall_errno(unsafe.Pointer(funcPC(miniterrno)), unsafe.Pointer(&libc____errno))
// Initialize signal handling
signalstack(&_g_.m.gsignal.stack)
memclr(unsafe.Pointer(&_g_.m.scratch), uintptr(len(_g_.m.scratch.v)))
_g_.m.scratch.v[0] = unsafe.Sizeof(*sem)
_g_.m.libcall.args = uintptr(unsafe.Pointer(&_g_.m.scratch))
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&_g_.m.libcall))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&_g_.m.libcall))
sem = (*semt)(unsafe.Pointer(_g_.m.libcall.r1))
if sem_init(sem, 0, 0) != 0 {
throw("sem_init")
_m_.scratch.v[0] = _m_.waitsema
_m_.scratch.v[1] = uintptr(unsafe.Pointer(&_m_.ts))
_m_.libcall.args = uintptr(unsafe.Pointer(&_m_.scratch))
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&_m_.libcall))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&_m_.libcall))
if *_m_.perrno != 0 {
if *_m_.perrno == _ETIMEDOUT || *_m_.perrno == _EAGAIN || *_m_.perrno == _EINTR {
return -1
memclr(unsafe.Pointer(&_m_.scratch), uintptr(len(_m_.scratch.v)))
_m_.scratch.v[0] = _m_.waitsema
_m_.libcall.args = uintptr(unsafe.Pointer(&_m_.scratch))
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&_m_.libcall))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&_m_.libcall))
if _m_.libcall.r1 == 0 {
break
}
libcall.fn = uintptr(unsafe.Pointer(fn))
libcall.n = 0
libcall.args = uintptr(unsafe.Pointer(fn)) // it's unused but must be non-nil, otherwise crashes
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
return libcall.r1
}
libcall.n = 1
// TODO(rsc): Why is noescape necessary here and below?
libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
return libcall.r1
}
libcall.fn = uintptr(unsafe.Pointer(fn))
libcall.n = 2
libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
return libcall.r1
}
libcall.fn = uintptr(unsafe.Pointer(fn))
libcall.n = 3
libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
return libcall.r1
}
libcall.fn = uintptr(unsafe.Pointer(fn))
libcall.n = 4
libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
return libcall.r1
}
libcall.fn = uintptr(unsafe.Pointer(fn))
libcall.n = 5
libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
return libcall.r1
}
libcall.fn = uintptr(unsafe.Pointer(fn))
libcall.n = 6
libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
return libcall.r1
}
if _cgo_notify_runtime_init_done == nil {
throw("_cgo_notify_runtime_init_done missing")
}
- cgocall(_cgo_notify_runtime_init_done, nil)
+ cgocall_errno(_cgo_notify_runtime_init_done, nil)
}
main_init()
ts.g.set(mp.g0)
ts.tls = (*uint64)(unsafe.Pointer(&mp.tls[0]))
ts.fn = unsafe.Pointer(funcPC(mstart))
- asmcgocall(_cgo_thread_start, unsafe.Pointer(&ts))
+ asmcgocall_errno(_cgo_thread_start, unsafe.Pointer(&ts))
return
}
newosproc(mp, unsafe.Pointer(mp.g0.stack.hi))
//go:noescape
func getcallersp(argp unsafe.Pointer) uintptr
-//go:noescape
-func asmcgocall(fn, arg unsafe.Pointer)
-
//go:noescape
func asmcgocall_errno(fn, arg unsafe.Pointer) int32
args: uintptr(unsafe.Pointer(&a1)),
}
entersyscallblock(0)
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
exitsyscall(0)
return call.r1, call.r2, call.err
}
n: nargs,
args: uintptr(unsafe.Pointer(&a1)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.r1, call.r2, call.err
}
n: 1,
args: uintptr(unsafe.Pointer(&path)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.err
}
n: 1,
args: uintptr(unsafe.Pointer(&path)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.err
}
n: 3,
args: uintptr(unsafe.Pointer(&path)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.err
}
n: 3,
args: uintptr(unsafe.Pointer(&fd)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.r1, call.err
}
n: 1,
args: uintptr(unsafe.Pointer(&flags)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.r1, call.err
}
args: uintptr(unsafe.Pointer(&args[0])),
}
entersyscallblock(0)
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
exitsyscall(0)
if call.r1 != 0 {
return "", call.err
n: 0,
args: uintptr(unsafe.Pointer(&libc_getpid)), // it's unused but must be non-nil, otherwise crashes
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.r1, call.err
}
n: 3,
args: uintptr(unsafe.Pointer(&fd)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.err
}
args: uintptr(unsafe.Pointer(&pipe1)), // it's unused but must be non-nil, otherwise crashes
}
entersyscallblock(0)
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
exitsyscall(0)
return call.r1, call.r2, call.err
}
n: 4,
args: uintptr(unsafe.Pointer(&trap)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.r1, call.r2, call.err
}
n: 1,
args: uintptr(unsafe.Pointer(&gid)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.err
}
n: 2,
args: uintptr(unsafe.Pointer(&ngid)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.err
}
n: 0,
args: uintptr(unsafe.Pointer(&libc_setsid)), // it's unused but must be non-nil, otherwise crashes
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.r1, call.err
}
n: 1,
args: uintptr(unsafe.Pointer(&uid)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.err
}
n: 2,
args: uintptr(unsafe.Pointer(&pid)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.err
}
args: uintptr(unsafe.Pointer(&trap)),
}
entersyscallblock(0)
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
exitsyscall(0)
return call.r1, call.r2, call.err
}
args: uintptr(unsafe.Pointer(&pid)),
}
entersyscallblock(0)
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
exitsyscall(0)
return int(call.r1), call.err
}
n: 3,
args: uintptr(unsafe.Pointer(&fd)),
}
- asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
+ asmcgocall_errno(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&call))
return call.r1, call.err
}