blob: 2d4ac54fc2f5c4eb1050eacb0678c9aa70785467 [file] [log] [blame] [edit]
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build darwin && !ios
package cpu
import _ "unsafe" // for linkname
// Pushed from runtime.
//
//go:noescape
func sysctlbynameInt32(name []byte) (int32, int32)
// Pushed from runtime.
//
//go:noescape
func sysctlbynameBytes(name, out []byte) int32
// sysctlEnabled should be an internal detail,
// but widely used packages access it using linkname.
// Notable members of the hall of shame include:
// - github.com/bytedance/gopkg
// - github.com/songzhibin97/gkit
//
// Do not remove or change the type signature.
// See go.dev/issue/67401.
//
//go:linkname sysctlEnabled
func sysctlEnabled(name []byte) bool {
ret, value := sysctlbynameInt32(name)
if ret < 0 {
return false
}
return value > 0
}
// darwinKernelVersionCheck reports if Darwin kernel version is at
// least major.minor.patch.
//
// Code borrowed from x/sys/cpu.
func darwinKernelVersionCheck(major, minor, patch int) bool {
var release [256]byte
ret := sysctlbynameBytes([]byte("kern.osrelease\x00"), release[:])
if ret < 0 {
return false
}
var mmp [3]int
c := 0
Loop:
for _, b := range release[:] {
switch {
case b >= '0' && b <= '9':
mmp[c] = 10*mmp[c] + int(b-'0')
case b == '.':
c++
if c > 2 {
return false
}
case b == 0:
break Loop
default:
return false
}
}
if c != 2 {
return false
}
return mmp[0] > major || mmp[0] == major && (mmp[1] > minor || mmp[1] == minor && mmp[2] >= patch)
}