liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Copyright 2009 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.
 
package runtime
 
import "internal/cpu"
 
const (
   _HWCAP_VFP   = 1 << 6  // introduced in at least 2.6.11
   _HWCAP_VFPv3 = 1 << 13 // introduced in 2.6.30
)
 
var randomNumber uint32
 
func checkgoarm() {
   // On Android, /proc/self/auxv might be unreadable and hwcap won't
   // reflect the CPU capabilities. Assume that every Android arm device
   // has the necessary floating point hardware available.
   if GOOS == "android" {
       return
   }
   if goarm > 5 && cpu.HWCap&_HWCAP_VFP == 0 {
       print("runtime: this CPU has no floating point hardware, so it cannot run\n")
       print("this GOARM=", goarm, " binary. Recompile using GOARM=5.\n")
       exit(1)
   }
   if goarm > 6 && cpu.HWCap&_HWCAP_VFPv3 == 0 {
       print("runtime: this CPU has no VFPv3 floating point hardware, so it cannot run\n")
       print("this GOARM=", goarm, " binary. Recompile using GOARM=5 or GOARM=6.\n")
       exit(1)
   }
}
 
func archauxv(tag, val uintptr) {
   switch tag {
   case _AT_RANDOM:
       // sysargs filled in startupRandomData, but that
       // pointer may not be word aligned, so we must treat
       // it as a byte array.
       randomNumber = uint32(startupRandomData[4]) | uint32(startupRandomData[5])<<8 |
           uint32(startupRandomData[6])<<16 | uint32(startupRandomData[7])<<24
 
   case _AT_HWCAP:
       cpu.HWCap = uint(val)
   case _AT_HWCAP2:
       cpu.HWCap2 = uint(val)
   }
}
 
//go:nosplit
func cputicks() int64 {
   // Currently cputicks() is used in blocking profiler and to seed fastrand().
   // nanotime() is a poor approximation of CPU ticks that is enough for the profiler.
   // randomNumber provides better seeding of fastrand.
   return nanotime() + int64(randomNumber)
}