package runtime
import (
)
type mOS struct{}
func ( unsafe.Pointer, int32, uint32, , unsafe.Pointer, uint32) int32
const (
_FUTEX_PRIVATE_FLAG = 128
_FUTEX_WAIT_PRIVATE = 0 | _FUTEX_PRIVATE_FLAG
_FUTEX_WAKE_PRIVATE = 1 | _FUTEX_PRIVATE_FLAG
)
func ( *uint32, uint32, int64) {
if < 0 {
futex(unsafe.Pointer(), _FUTEX_WAIT_PRIVATE, , nil, nil, 0)
return
}
var timespec
.setNsec()
futex(unsafe.Pointer(), _FUTEX_WAIT_PRIVATE, , unsafe.Pointer(&), nil, 0)
}
func ( *uint32, uint32) {
:= futex(unsafe.Pointer(), _FUTEX_WAKE_PRIVATE, , nil, nil, 0)
if >= 0 {
return
}
systemstack(func() {
print("futexwakeup addr=", , " returned ", , "\n")
})
*(*int32)(unsafe.Pointer(uintptr(0x1006))) = 0x1006
}
func () int32 {
const = 64 * 1024
var [ / 8]byte
:= sched_getaffinity(0, unsafe.Sizeof(), &[0])
if < 0 {
return 1
}
:= int32(0)
for , := range [:] {
for != 0 {
+= int32( & 1)
>>= 1
}
}
if == 0 {
= 1
}
return
}
const (
_CLONE_VM = 0x100
_CLONE_FS = 0x200
_CLONE_FILES = 0x400
_CLONE_SIGHAND = 0x800
_CLONE_PTRACE = 0x2000
_CLONE_VFORK = 0x4000
_CLONE_PARENT = 0x8000
_CLONE_THREAD = 0x10000
_CLONE_NEWNS = 0x20000
_CLONE_SYSVSEM = 0x40000
_CLONE_SETTLS = 0x80000
_CLONE_PARENT_SETTID = 0x100000
_CLONE_CHILD_CLEARTID = 0x200000
_CLONE_UNTRACED = 0x800000
_CLONE_CHILD_SETTID = 0x1000000
_CLONE_STOPPED = 0x2000000
_CLONE_NEWUTS = 0x4000000
_CLONE_NEWIPC = 0x8000000
cloneFlags = _CLONE_VM |
_CLONE_FS |
_CLONE_FILES |
_CLONE_SIGHAND |
_CLONE_SYSVSEM |
_CLONE_THREAD
)
func ( int32, , , , unsafe.Pointer) int32
func ( *m) {
:= unsafe.Pointer(.g0.stack.hi)
if false {
print("newosproc stk=", , " m=", , " g=", .g0, " clone=", funcPC(clone), " id=", .id, " ostk=", &, "\n")
}
var sigset
sigprocmask(_SIG_SETMASK, &sigset_all, &)
:= clone(cloneFlags, , unsafe.Pointer(), unsafe.Pointer(.g0), unsafe.Pointer(funcPC(mstart)))
sigprocmask(_SIG_SETMASK, &, nil)
if < 0 {
print("runtime: failed to create new OS thread (have ", mcount(), " already; errno=", -, ")\n")
if == -_EAGAIN {
println("runtime: may need to increase max user processes (ulimit -u)")
}
throw("newosproc")
}
}
func ( uintptr, unsafe.Pointer) {
:= sysAlloc(, &memstats.stacks_sys)
if == nil {
write(2, unsafe.Pointer(&failallocatestack[0]), int32(len(failallocatestack)))
exit(1)
}
:= clone(cloneFlags, unsafe.Pointer(uintptr()+), nil, nil, )
if < 0 {
write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
exit(1)
}
}
var failallocatestack = []byte("runtime: failed to allocate stack for the new OS thread\n")
var failthreadcreate = []byte("runtime: failed to create new OS thread\n")
const (
_AT_NULL = 0
_AT_PAGESZ = 6
_AT_HWCAP = 16
_AT_RANDOM = 25
_AT_HWCAP2 = 26
)
var procAuxv = []byte("/proc/self/auxv\x00")
var addrspace_vec [1]byte
func ( unsafe.Pointer, uintptr, *byte) int32
func ( int32, **byte) {
:= + 1
for argv_index(, ) != nil {
++
}
++
:= (*[1 << 28]uintptr)(add(unsafe.Pointer(), uintptr()*sys.PtrSize))
if sysauxv([:]) != 0 {
return
}
:= open(&procAuxv[0], 0 , 0)
if < 0 {
const = 256 << 10
, := mmap(nil, , _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)
if != 0 {
return
}
var uintptr
for = 4 << 10; < ; <<= 1 {
:= mincore(unsafe.Pointer(uintptr()+), 1, &addrspace_vec[0])
if == 0 {
physPageSize =
break
}
}
if physPageSize == 0 {
physPageSize =
}
munmap(, )
return
}
var [128]uintptr
= read(, noescape(unsafe.Pointer(&[0])), int32(unsafe.Sizeof()))
closefd()
if < 0 {
return
}
[len()-2] = _AT_NULL
sysauxv([:])
}
var startupRandomData []byte
func ( []uintptr) int {
var int
for ; [] != _AT_NULL; += 2 {
, := [], [+1]
switch {
case _AT_RANDOM:
startupRandomData = (*[16]byte)(unsafe.Pointer())[:]
case _AT_PAGESZ:
physPageSize =
}
archauxv(, )
vdsoauxv(, )
}
return / 2
}
var sysTHPSizePath = []byte("/sys/kernel/mm/transparent_hugepage/hpage_pmd_size\x00")
func () uintptr {
var [20]byte
:= open(&sysTHPSizePath[0], 0 , 0)
if < 0 {
return 0
}
:= noescape(unsafe.Pointer(&[0]))
:= read(, , int32(len()))
closefd()
if <= 0 {
return 0
}
--
, := atoi(slicebytetostringtmp((*byte)(), int()))
if ! || < 0 {
= 0
}
if &(-1) != 0 {
return 0
}
return uintptr()
}
func () {
ncpu = getproccount()
physHugePageSize = getHugePageSize()
if iscgo {
sigdelset(&sigsetAllExiting, 32)
sigdelset(&sigsetAllExiting, 33)
sigdelset(&sigsetAllExiting, 34)
}
osArchInit()
}
var urandom_dev = []byte("/dev/urandom\x00")
func ( []byte) {
if startupRandomData != nil {
:= copy(, startupRandomData)
extendRandom(, )
return
}
:= open(&urandom_dev[0], 0 , 0)
:= read(, unsafe.Pointer(&[0]), int32(len()))
closefd()
extendRandom(, int())
}
func () {
goenvs_unix()
}
func () {
initsig(true)
}
func ( *m) {
.gsignal = malg(32 * 1024)
.gsignal.m =
}
func () uint32
func () {
minitSignals()
getg().m.procid = uint64(gettid())
}
func () {
unminitSignals()
}
func ( *m) {
}
func ()
func ( uint32, *siginfo, unsafe.Pointer)
func ()
func (, *stackt)
func ( int32, , *itimerval)
func ( int32, , *sigset, int32)
func ( int32, , *sigset) {
rtsigprocmask(, , , int32(unsafe.Sizeof(*)))
}
func ( uint32)
func ( uint32)
func (, uintptr, *byte) int32
func ()
func () (, int32, int32)
func ( int32) (, int32, int32)
func ( int32)
func ( uint32, uintptr) {
var sigactiont
.sa_flags = _SA_SIGINFO | _SA_ONSTACK | _SA_RESTORER | _SA_RESTART
sigfillset(&.sa_mask)
if GOARCH == "386" || GOARCH == "amd64" {
.sa_restorer = funcPC(sigreturn)
}
if == funcPC(sighandler) {
if iscgo {
= funcPC(cgoSigtramp)
} else {
= funcPC(sigtramp)
}
}
.sa_handler =
sigaction(, &, nil)
}
func ( uint32) {
var sigactiont
sigaction(, nil, &)
if .sa_flags&_SA_ONSTACK != 0 {
return
}
.sa_flags |= _SA_ONSTACK
sigaction(, &, nil)
}
func ( uint32) uintptr {
var sigactiont
sigaction(, nil, &)
return .sa_handler
}
func ( *stackt, uintptr) {
*(*uintptr)(unsafe.Pointer(&.ss_sp)) =
}
func ( *sigctxt) ( uint32) {
}
func ( uint32, , *sigactiont) {
if rt_sigaction(uintptr(), , , unsafe.Sizeof(sigactiont{}.sa_mask)) != 0 {
if != 32 && != 33 && != 64 {
systemstack(func() {
throw("sigaction failed")
})
}
}
}
func ( uintptr, , *sigactiont, uintptr) int32
func () int
func (, , int)
func ( *m, int) {
tgkill(getpid(), int(.procid), )
}