a030d21a6f
frequencies (and having different cache sizes) so use the STICK (System TICK) timer, which was introduced due to this and is driven by the same frequency across all CPUs, instead of the TICK timer, whose frequency varies with the CPU clock, to drive hardclock. We try to use the STICK counter with all CPUs that are USIII or beyond, even when not necessary due to identical CPUs, as we can can also avoid the workaround for the BlackBird erratum #1 there. Unfortunately, using the STICK counter currently causes a hang with USIIIi MP machines for reasons unknown, so we still use the TICK timer there (which is okay as they can only consist of identical CPUs). - Given that we only (try to) synchronize the (S)TICK timers of APs with the BSP during startup, we could end up spinning forever in DELAY(9) if that function is migrated to another CPU while we're spinning due to clock drift afterwards, so pin to the CPU in order to avoid migration. Unfortunately, pinning doesn't work at the point DELAY(9) is required by the low-level console drivers, yet, so switch to a function pointer, which is updated accordingly, for implementing DELAY(9). For USIII and beyond, this would also allow to easily use the STICK counter instead of the TICK one here, there's no benefit in doing so however. While at it, use cpu_spinwait(9) for spinning in the delay- functions. This currently is a NOP though. - Don't set the TICK timer of the BSP to 0 during at startup as there's no need to do so. - Implement cpu_est_clockrate(). - Unfortunately, USIIIi-based machines don't provide a timecounter device besides the STICK and TICK counters (well, in theory the Tomatillo bridges have a performance counter that can be (ab)used as timecounter by configuring it to count bus cycles, though unlike the performance counter of Schizo bridges, the Tomatillo one is broken and counts Sun knows what in this mode). This means that we've to use a (S)TICK counter for timecounting, which has the old problem of not being in sync across CPUs, so provide an additional timecounter function which binds itself to the BSP but has an adequate low priority. |
||
---|---|---|
.. | ||
_bus.h | ||
_inttypes.h | ||
_limits.h | ||
_stdint.h | ||
_types.h | ||
asi.h | ||
asm.h | ||
asmacros.h | ||
atomic.h | ||
bus_common.h | ||
bus_dma.h | ||
bus_private.h | ||
bus.h | ||
cache.h | ||
ccr.h | ||
clock.h | ||
cpu.h | ||
cpufunc.h | ||
db_machdep.h | ||
elf.h | ||
endian.h | ||
exec.h | ||
float.h | ||
floatingpoint.h | ||
fp.h | ||
frame.h | ||
fsr.h | ||
gdb_machdep.h | ||
idprom.h | ||
ieee.h | ||
ieeefp.h | ||
in_cksum.h | ||
instr.h | ||
intr_machdep.h | ||
iommureg.h | ||
iommuvar.h | ||
kdb.h | ||
kerneldump.h | ||
ktr.h | ||
limits.h | ||
lsu.h | ||
md_var.h | ||
memdev.h | ||
metadata.h | ||
mutex.h | ||
ofw_bus.h | ||
ofw_machdep.h | ||
ofw_mem.h | ||
ofw_nexus.h | ||
param.h | ||
pcb.h | ||
pcpu.h | ||
pmap.h | ||
pmc_mdep.h | ||
proc.h | ||
profile.h | ||
pstate.h | ||
ptrace.h | ||
reg.h | ||
reloc.h | ||
resource.h | ||
runq.h | ||
sc_machdep.h | ||
setjmp.h | ||
sf_buf.h | ||
sigframe.h | ||
signal.h | ||
smp.h | ||
stack.h | ||
stdarg.h | ||
sysarch.h | ||
tick.h | ||
tlb.h | ||
trap.h | ||
tsb.h | ||
tstate.h | ||
tte.h | ||
ucontext.h | ||
upa.h | ||
utrap.h | ||
varargs.h | ||
ver.h | ||
vmparam.h | ||
watch.h | ||
wstate.h |