kernel - Refactor sysclock_t from 32 to 64 bits
authorMatthew Dillon <dillon@apollo.backplane.com>
Tue, 9 Jun 2020 16:08:16 +0000 (09:08 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Tue, 9 Jun 2020 16:38:37 +0000 (09:38 -0700)
commit8fbc264d2bc2add66aefe4f4a7966c4364da1211
tree5aeac16e51c10d3b49013273df92fc3b6f518b0e
parente470c808bd73e20d860aa76495ff6c16b6ef4b97
kernel - Refactor sysclock_t from 32 to 64 bits

* Refactor the core cpu timer API, changing sysclock_t from 32
  to 64 bits.  Provide a full 64-bit count from all sources.

* Implement muldivu64() using gcc's 128-bit integer type.  This
  functions takes three 64-bit valus, performs (a * b) / d
  using a 128-bit intermediate calculation, and returns a 64-bit
  result.

  Change all timer scaling functions to use this function which
  effectively gives systimers the capability of handling any
  timeout that fits 64 bits for the timer's resolution.

* Remove TSC frequency scaling, it is no longer needed.  The
  TSC timer is now used at its full resolution.

* Use atomic_fcmpset_long() instead of a clock spinlock when
  updating the msb bits for hardware timer sources less than
  64 bits wide.

* Properly recalculate existing systimers when the clock source
  is changed.  Existing systimers were not being recalculated,
  leading to the system failing to boot when time sources had
  radically different clock frequencies.
17 files changed:
sys/conf/kern.pre.mk
sys/cpu/x86_64/misc/cputimer_tsc.c
sys/dev/acpica/acpi_hpet.c
sys/dev/acpica/acpi_timer.c
sys/dev/virtual/hyperv/vmbus/vmbus.c
sys/kern/kern_clock.c
sys/kern/kern_cputimer.c
sys/kern/kern_nrandom.c
sys/kern/kern_systimer.c
sys/kern/kern_time.c
sys/kern/usched_bsd4.c
sys/platform/pc64/apic/lapic.c
sys/platform/pc64/isa/clock.c
sys/platform/vkernel64/platform/systimer.c
sys/sys/proc.h
sys/sys/systimer.h
sys/sys/systm.h