riscv64: trigger deferred timer interrupts from splx(9)
authorcheloha <cheloha@openbsd.org>
Tue, 9 Aug 2022 04:49:08 +0000 (04:49 +0000)
committercheloha <cheloha@openbsd.org>
Tue, 9 Aug 2022 04:49:08 +0000 (04:49 +0000)
commit8272ea32c72a9b6974df8a91bd1bc3c0e2aa883f
tree7a944cd922cfda633241a03102947e22ed69de7a
parentf27ca60c2fcbf90cdebcf57245e97d9e6d6421bf
riscv64: trigger deferred timer interrupts from splx(9)

In order to move riscv64 to a machine-independent clock interrupt
subsystem, the riscv64 clock interrupt code needs to function without
any specific knowledge of the clock interrupt schedule.

The easiest way to achieve this (as we just did with powerpc and
powerpc64) is, if the timer interrupt fires while the CPU is at or
above IPL_CLOCK, defer clock interrupt work until the the timer
interrupt is logically unmasked in splx(9).

In particular, trigger the timer interrupt from plic_setipl() so the
interrupt, if any, is pending before we handle soft interrupts.

Because we're no longer deferring work until the next tick, we don't
need to count pending statclock ticks in struct cpu_info.

kettenis@ notes that the timer triggering code should be refactored
into more generic code when we add support for a non-plic(4) riscv64
machine.

Graciously fixed, compiled, and tested by jca@.

Link: https://marc.info/?l=openbsd-tech&m=165931635410276&w=2
ok kettenis@
sys/arch/riscv64/dev/plic.c
sys/arch/riscv64/include/cpu.h
sys/arch/riscv64/riscv64/clock.c