The branch stable/13 has been updated by mhorne:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=850182848dada6f8524e9df2a75a01aa50b09b69

commit 850182848dada6f8524e9df2a75a01aa50b09b69
Author:     Ruslan Bukin <b...@freebsd.org>
AuthorDate: 2024-05-22 14:51:45 +0000
Commit:     Mitchell Horne <mho...@freebsd.org>
CommitDate: 2025-09-15 19:32:14 +0000

    riscv: Fix SSTC extension support
    
    From the SSTC spec:
    "If the stimecmp (supervisor-mode timer compare) register is implemented,
    then STIP is read-only in mip and reflects the supervisor-level timer
    interrupt signal resulting from stimecmp. This timer interrupt signal
    is cleared by writing stimecmp with a value greater than the current time
    value."
    
    This fixes operation in Spike with sstc extension enabled.
    Example:
      spike --isa RV64IMAFDCH_zicntr_zihpm_sstc
    
    Reviewed by:    mhorne
    Differential Revision:  https://reviews.freebsd.org/D45226
    
    (cherry picked from commit ddd0d4f4cd65341a07bb3bb833dee7982018fd60)
---
 sys/riscv/riscv/timer.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/sys/riscv/riscv/timer.c b/sys/riscv/riscv/timer.c
index 66131914607c..f7657130ff70 100644
--- a/sys/riscv/riscv/timer.c
+++ b/sys/riscv/riscv/timer.c
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2015-2017 Ruslan Bukin <b...@bsdpad.com>
+ * Copyright (c) 2015-2024 Ruslan Bukin <b...@bsdpad.com>
  * All rights reserved.
  *
  * Portions of this software were developed by SRI International and the
@@ -142,7 +142,10 @@ riscv_timer_intr(void *arg)
 
        sc = (struct riscv_timer_softc *)arg;
 
-       csr_clear(sip, SIP_STIP);
+       if (has_sstc)
+               csr_write(stimecmp, -1UL);
+       else
+               csr_clear(sip, SIP_STIP);
 
        if (sc->et.et_active)
                sc->et.et_event_cb(&sc->et, sc->et.et_arg);

Reply via email to