package runtime
import (
)
func ( *byte, uintptr, uint32, uintptr, uintptr) int
var vgetrandomAlloc struct {
states []uintptr
statesLock mutex
stateSize uintptr
mmapProt int32
mmapFlags int32
}
func () {
if vdsoGetrandomSym == 0 {
return
}
var struct {
uint32
uint32
uint32
[13]uint32
}
if vgetrandom1(nil, 0, 0, uintptr(unsafe.Pointer(&)), ^uintptr(0)) != 0 {
return
}
vgetrandomAlloc.stateSize = uintptr(.)
vgetrandomAlloc.mmapProt = int32(.)
vgetrandomAlloc.mmapFlags = int32(.)
lockInit(&vgetrandomAlloc.statesLock, lockRankLeafRank)
}
func () uintptr {
lock(&vgetrandomAlloc.statesLock)
if len(vgetrandomAlloc.states) == 0 {
:= uintptr(ncpu)
:= (vgetrandomAlloc.stateSize + cpu.CacheLineSize - 1) &^ (cpu.CacheLineSize - 1)
:= (* + physPageSize - 1) &^ (physPageSize - 1)
= (physPageSize / ) * ( / physPageSize)
, := mmap(nil, , vgetrandomAlloc.mmapProt, vgetrandomAlloc.mmapFlags, -1, 0)
if != 0 {
unlock(&vgetrandomAlloc.statesLock)
return 0
}
:= uintptr()
if vgetrandomAlloc.states == nil {
vgetrandomAlloc.states = make([]uintptr, 0, )
}
for := uintptr(0); < ; ++ {
if (&(physPageSize-1))+vgetrandomAlloc.stateSize > physPageSize {
= ( + physPageSize - 1) &^ (physPageSize - 1)
}
vgetrandomAlloc.states = append(vgetrandomAlloc.states, )
+=
}
}
:= vgetrandomAlloc.states[len(vgetrandomAlloc.states)-1]
vgetrandomAlloc.states = vgetrandomAlloc.states[:len(vgetrandomAlloc.states)-1]
unlock(&vgetrandomAlloc.statesLock)
return
}
func ( *m) {
if .vgetrandomState == 0 {
return
}
lock(&vgetrandomAlloc.statesLock)
vgetrandomAlloc.states = append(vgetrandomAlloc.states, .vgetrandomState)
unlock(&vgetrandomAlloc.statesLock)
}
func ( []byte, uint32) ( int, bool) {
if vgetrandomAlloc.stateSize == 0 {
return -1, false
}
:= getg().m
if .vgetrandomState == 0 {
.locks++
:= vgetrandomGetState()
.locks--
if == 0 {
return -1, false
}
.vgetrandomState =
}
return vgetrandom1(unsafe.SliceData(), uintptr(len()), , .vgetrandomState, vgetrandomAlloc.stateSize), true
}