|
|
|
@ -18,84 +18,104 @@ func setg_trampoline(setg uintptr, G uintptr) |
|
|
|
|
// call5 takes fn the C function and 5 arguments and calls the function with those arguments
|
|
|
|
|
func call5(fn, a1, a2, a3, a4, a5 uintptr) uintptr |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func malloc(size uintptr) unsafe.Pointer { |
|
|
|
|
ret := call5(mallocABI0, uintptr(size), 0, 0, 0, 0) |
|
|
|
|
// this indirection is to avoid go vet complaining about possible misuse of unsafe.Pointer
|
|
|
|
|
return *(*unsafe.Pointer)(unsafe.Pointer(&ret)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func free(ptr unsafe.Pointer) { |
|
|
|
|
call5(freeABI0, uintptr(ptr), 0, 0, 0, 0) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func setenv(name *byte, value *byte, overwrite int32) int32 { |
|
|
|
|
return int32(call5(setenvABI0, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value)), uintptr(overwrite), 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func unsetenv(name *byte) int32 { |
|
|
|
|
return int32(call5(unsetenvABI0, uintptr(unsafe.Pointer(name)), 0, 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func sigfillset(set *sigset_t) int32 { |
|
|
|
|
return int32(call5(sigfillsetABI0, uintptr(unsafe.Pointer(set)), 0, 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func nanosleep(ts *syscall.Timespec, rem *syscall.Timespec) int32 { |
|
|
|
|
return int32(call5(nanosleepABI0, uintptr(unsafe.Pointer(ts)), uintptr(unsafe.Pointer(rem)), 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func abort() { |
|
|
|
|
call5(abortABI0, 0, 0, 0, 0, 0) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_attr_init(attr *pthread_attr_t) int32 { |
|
|
|
|
return int32(call5(pthread_attr_initABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_create(thread *pthread_t, attr *pthread_attr_t, start unsafe.Pointer, arg unsafe.Pointer) int32 { |
|
|
|
|
return int32(call5(pthread_createABI0, uintptr(unsafe.Pointer(thread)), uintptr(unsafe.Pointer(attr)), uintptr(start), uintptr(arg), 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_detach(thread pthread_t) int32 { |
|
|
|
|
return int32(call5(pthread_detachABI0, uintptr(thread), 0, 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_sigmask(how sighow, ign *sigset_t, oset *sigset_t) int32 { |
|
|
|
|
return int32(call5(pthread_sigmaskABI0, uintptr(how), uintptr(unsafe.Pointer(ign)), uintptr(unsafe.Pointer(oset)), 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_self() pthread_t { |
|
|
|
|
return pthread_t(call5(pthread_selfABI0, 0, 0, 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_get_stacksize_np(thread pthread_t) size_t { |
|
|
|
|
return size_t(call5(pthread_get_stacksize_npABI0, uintptr(thread), 0, 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_attr_getstacksize(attr *pthread_attr_t, stacksize *size_t) int32 { |
|
|
|
|
return int32(call5(pthread_attr_getstacksizeABI0, uintptr(unsafe.Pointer(attr)), uintptr(unsafe.Pointer(stacksize)), 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_attr_setstacksize(attr *pthread_attr_t, size size_t) int32 { |
|
|
|
|
return int32(call5(pthread_attr_setstacksizeABI0, uintptr(unsafe.Pointer(attr)), uintptr(size), 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_attr_destroy(attr *pthread_attr_t) int32 { |
|
|
|
|
return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_mutex_lock(mutex *pthread_mutex_t) int32 { |
|
|
|
|
return int32(call5(pthread_mutex_lockABI0, uintptr(unsafe.Pointer(mutex)), 0, 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_mutex_unlock(mutex *pthread_mutex_t) int32 { |
|
|
|
|
return int32(call5(pthread_mutex_unlockABI0, uintptr(unsafe.Pointer(mutex)), 0, 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_cond_broadcast(cond *pthread_cond_t) int32 { |
|
|
|
|
return int32(call5(pthread_cond_broadcastABI0, uintptr(unsafe.Pointer(cond)), 0, 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//go:nosplit
|
|
|
|
|
func pthread_setspecific(key pthread_key_t, value unsafe.Pointer) int32 { |
|
|
|
|
return int32(call5(pthread_setspecificABI0, uintptr(key), uintptr(value), 0, 0, 0)) |
|
|
|
|
} |
|
|
|
|