@@ -78,8 +78,10 @@ u64 sbi_timer_get_delta(void);
/** Set timer delta value for current HART */
void sbi_timer_set_delta(ulong delta);
+#if __riscv_xlen == 32
/** Set upper 32-bits of timer delta value for current HART */
void sbi_timer_set_delta_upper(ulong delta_upper);
+#endif
/** Start timer event for current HART */
void sbi_timer_event_start(u64 next_event);
@@ -114,20 +114,21 @@ u64 sbi_timer_get_delta(void)
void sbi_timer_set_delta(ulong delta)
{
- u64 *time_delta = sbi_scratch_offset_ptr(sbi_scratch_thishart_ptr(),
- time_delta_off);
+ ulong *time_delta = sbi_scratch_offset_ptr(sbi_scratch_thishart_ptr(),
+ time_delta_off);
- *time_delta = (u64)delta;
+ *time_delta = delta;
}
+#if __riscv_xlen == 32
void sbi_timer_set_delta_upper(ulong delta_upper)
{
- u64 *time_delta = sbi_scratch_offset_ptr(sbi_scratch_thishart_ptr(),
- time_delta_off);
+ ulong *time_delta = sbi_scratch_offset_ptr(sbi_scratch_thishart_ptr(),
+ time_delta_off);
- *time_delta &= 0xffffffffULL;
- *time_delta |= ((u64)delta_upper << 32);
+ *(time_delta + 1) = delta_upper;
}
+#endif
void sbi_timer_event_start(u64 next_event)
{
Writes to the low half CSR should not affect the high half of the value. Make this separation explicit by writing to the delta in memory as two adjacent XLEN-sized values. Fixes: 1e9f88889f8b ("lib: Emulate HTIMEDELTA CSR for platforms not having TIME CSR") Signed-off-by: Samuel Holland <samuel.holland@sifive.com> --- include/sbi/sbi_timer.h | 2 ++ lib/sbi/sbi_timer.c | 15 ++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-)