timecounter “TSC”

NetBSD/amd64 on ECS LIVA Z の続き

sysctlkern.timecounter.hardware を TSC 以外にしてやれば、時計の狂いはなくなるのだけれど、全部が解決したわけでもないらしい。

例えば、1秒が4秒の世界。

$ date; sleep 1; date
Fri Aug 30 10:27:39 JST 2019
Fri Aug 30 10:27:43 JST 2019

TSC のままで考えると、異常なのはこの値。

$ sysctl machdep.tsc_freq
machdep.tsc_freq = 4348770010

ふと思い立って、CPUの情報を見てみるとこんな感じ。

$ cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 92
model name	: Intel(R) Pentium(R) CPU N4200 @ 1.10GHz
stepping	: 9
cpu MHz		: 4348.77
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 21
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm pni pclmulqdq dtes64 ds_cpl vmx est tm2 ssse3 sdbg cx16 xtpr pdcm sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand lahf_lm 3dnowprefetch fsgsbase tsc_adjust smep erms mpx rdt_a rdseed smap clflushopt intel_pt sha_ni xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts arch_capabilities 
clflush size	: 64

processor	: 1
…

1.1GHzのCPUを4GHz超で動かす極限オーバークロッキン……なわけはなく、cpuinfo の cpu MHz が machdep.tsc_freq と一致してるので(どっちがどっちに依存しているかは知らないけれども)この辺の値が正しく取れていないのが原因なのでしょう。

つづく