Hi Radim,

Does your patchset want to resolve the same issue as my sstc patch [1]?
My sstc patchset has been merged to "riscv-to-apply.next".
Maybe you can review it or check if there is still any issue in the
"riscv-to-apply.next" branch, thanks!

[1]  "[PATCH v3 4/4] target/riscv: Enable/Disable S/VS-mode Timer when
STCE bit is changed"
https://patchew.org/QEMU/20250519143518.11086-1-jim....@sifive.com/20250519143518.11086-5-jim....@sifive.com/

Thanks,
Jim


On Tue, Jun 24, 2025 at 9:49 PM Radim Krčmář <rkrc...@ventanamicro.com> wrote:
>
> 2025-06-23T18:39:02-03:00, Daniel Henrique Barboza 
> <dbarb...@ventanamicro.com>:
> > Hi Radim,
> >
> > It seems like this patch is breaking 'make check-functional':
>
> That is a nice command to know of, thanks!
>
> > 12/12 qemu:func-quick+func-riscv64 / func-riscv64-riscv_opensbi   TIMEOUT   
> >       90.06s   killed by signal 15 SIGTERM
> >
> > Checking the logs I verified that the problem can be reproduced by running 
> > the
> > 'spike' machine as follows:
> >
> > $ ./build/qemu-system-riscv64 -M spike   --nographic
> > Segmentation fault (core dumped)
> >
> > The expected result is to boot opensbi. The problem can't be reproduced with
> > the 'virt' board, so something that you did here impacted 'spike' in 
> > particular
> > for some reason.
>
> Uff, mtimer is NULL on spike:
>
>   0x0000555555c46618 in riscv_timer_write_timecmp 
> (env=env@entry=0x555556888270, timer=0x5555568a61e0, timecmp=0, 
> delta=delta@entry=0, timer_irq=timer_irq@entry=32) at 
> ../target/riscv/time_helper.c:49
>   49       uint32_t timebase_freq = mtimer->timebase_freq;
>   (gdb) bt
>   #0  0x0000555555c46618 in riscv_timer_write_timecmp 
> (env=env@entry=0x555556888270, timer=0x5555568a61e0, timecmp=0, 
> delta=delta@entry=0, timer_irq=timer_irq@entry=32) at 
> ../target/riscv/time_helper.c:49
>   #1  0x0000555555c6eb9e in write_menvcfg (env=0x555556888270, 
> csrno=<optimized out>, val=<optimized out>, ra=140736012591329) at 
> ../target/riscv/csr.c:3214
>   #2  0x0000555555c6a181 in riscv_csrrw_do64 (env=env@entry=0x555556888270, 
> csrno=<optimized out>, ret_value=ret_value@entry=0x0, new_value=<optimized 
> out>, write_mask=<optimized out>, ra=140736012591329) at 
> ../target/riscv/csr.c:5579
>   [...]
>   (gdb) p mtimer
>   $1 = (RISCVAclintMTimerState *) 0x0
>   (gdb) p timer
>   $2 = (QEMUTimer *) 0x5555568a61e0
>   (gdb) p *timer
>   $3 = {expire_time = -1, timer_list = 0x55555666b840, cb = 0x555555c465d0 
> <riscv_stimer_cb>, opaque = 0x5555568856b0, next = 0x0, attributes = 0, scale 
> = 1}
>
> I'll try to figure out is going on, but `make check-functional` passes
> with this hack:
>
> diff --git a/target/riscv/time_helper.c b/target/riscv/time_helper.c
> index 81a6a6394502..a2092206cb20 100644
> --- a/target/riscv/time_helper.c
> +++ b/target/riscv/time_helper.c
> @@ -44,10 +44,8 @@ void riscv_timer_write_timecmp(CPURISCVState *env, 
> QEMUTimer *timer,
>                                 uint64_t timecmp, uint64_t delta,
>                                 uint32_t timer_irq)
>  {
> -    uint64_t diff, ns_diff, next;
> +    uint64_t diff, ns_diff, next, timebase_freq, rtc_r;
>      RISCVAclintMTimerState *mtimer = env->rdtime_fn_arg;
> -    uint32_t timebase_freq = mtimer->timebase_freq;
> -    uint64_t rtc_r = env->rdtime_fn(env->rdtime_fn_arg) + delta;
>
>      /*
>       * *envcfg.STCE disables *stimecmp interrupts, but still allows higher
> @@ -59,6 +57,13 @@ void riscv_timer_write_timecmp(CPURISCVState *env, 
> QEMUTimer *timer,
>          return;
>      }
>
> +    if (!mtimer) {
> +        return;
> +    }
> +
> +    timebase_freq = mtimer->timebase_freq;
> +    rtc_r = env->rdtime_fn(env->rdtime_fn_arg) + delta;
> +
>      if (timecmp <= rtc_r) {
>          /*
>           * If we're setting an stimecmp value in the "past",
>

Reply via email to