const (
_HPET_DEV_MAP_MAX = 10
_HPET_MAIN_COUNTER = 0xf0 /* Main counter register */
-)
-var (
- hpetDevMap [_HPET_DEV_MAP_MAX]uintptr
- hpetDevPath = [_HPET_DEV_MAP_MAX][11]byte{
- {'/', 'd', 'e', 'v', '/', 'h', 'p', 'e', 't', '0', 0},
- {'/', 'd', 'e', 'v', '/', 'h', 'p', 'e', 't', '1', 0},
- {'/', 'd', 'e', 'v', '/', 'h', 'p', 'e', 't', '2', 0},
- {'/', 'd', 'e', 'v', '/', 'h', 'p', 'e', 't', '3', 0},
- {'/', 'd', 'e', 'v', '/', 'h', 'p', 'e', 't', '4', 0},
- {'/', 'd', 'e', 'v', '/', 'h', 'p', 'e', 't', '5', 0},
- {'/', 'd', 'e', 'v', '/', 'h', 'p', 'e', 't', '6', 0},
- {'/', 'd', 'e', 'v', '/', 'h', 'p', 'e', 't', '7', 0},
- {'/', 'd', 'e', 'v', '/', 'h', 'p', 'e', 't', '8', 0},
- {'/', 'd', 'e', 'v', '/', 'h', 'p', 'e', 't', '9', 0},
- }
+ hpetDevPath = "/dev/hpetX\x00"
)
+var hpetDevMap [_HPET_DEV_MAP_MAX]uintptr
+
//go:nosplit
func (th *vdsoTimehands) getTSCTimecounter() uint32 {
tsc := cputicks()
return uint32(tsc)
}
-//go:nosplit
+//go:systemstack
func (th *vdsoTimehands) getHPETTimecounter() (uint32, bool) {
+ const digits = "0123456789"
+
idx := int(th.x86_hpet_idx)
if idx >= len(hpetDevMap) {
return 0, false
p := atomic.Loaduintptr(&hpetDevMap[idx])
if p == 0 {
- fd := open(&hpetDevPath[idx][0], 0 /* O_RDONLY */, 0)
+ var devPath [len(hpetDevPath)]byte
+ copy(devPath[:], hpetDevPath)
+ devPath[9] = digits[idx]
+
+ fd := open(&devPath[0], 0 /* O_RDONLY */, 0)
if fd < 0 {
atomic.Casuintptr(&hpetDevMap[idx], 0, ^uintptr(0))
return 0, false
case _VDSO_TH_ALGO_X86_TSC:
return th.getTSCTimecounter(), true
case _VDSO_TH_ALGO_X86_HPET:
- return th.getHPETTimecounter()
+ var (
+ tc uint32
+ ok bool
+ )
+ systemstack(func() {
+ tc, ok = th.getHPETTimecounter()
+ })
+ return tc, ok
default:
return 0, false
}