Files
lk/arch/arm
Aaron Odell 08111d4a37 [arch][arm-m][systick] Update for monotonicity
Update arm-m systick current_time() and current_time_hires() to advance
monotonically even when interrupts are disabled.

Previous implementation relied on the systick exception triggering
immediately when the counter wrapped and incrementing the current_ticks
count. But if called when interrutps are disabled, then the systick has
not had a chance to trigger and increment the count, but the counter has
already wrapped around. This would result in the current_time() value
moving backwards.

The implementation in this commit is as follows:
- Access to the systick val csr is always done in conjunction with a
  check of the COUNTFLAG bit, which indicates counter reaching zero.
- The global current_ticks count is incremented immediately when
  wrap around is detected via COUNTFLAG, rather than waiting for the
  systick exception to run.
- The check of the counter value, COUNTFLAG bit, and current_ticks
  global count are always done in a critical section to avoid race
  conditions between current_time and the systick handler.
- The critical section and workarounds are consolidated into a helper
  function shared by current_time() and current_time_hires() to
  atomically get the tick count and the cycles since the last tick.

The effect should be that current_time() always returns an accurate
monotonically increasing value, regardless of interrupt enablement
or not.
2023-06-01 12:40:55 -07:00
..
2023-04-23 17:37:18 -07:00