olofk / serv

SERV - The SErial RISC-V CPU
ISC License
1.45k stars 192 forks source link

`wfi` instruction unsupported / broken #131

Open m42uko opened 4 months ago

m42uko commented 4 months ago

Zephyr 3.6.0 introduces the use of wfi when waiting for interrupts (5fb6e267f629dedb8382da6bcad8018b1bb8930a). Executing this instructions breaks things for us.

How to reproduce?

Run the following example program (based on hello_world) on Zephyr >= 3.6.0:

#include <stdio.h>
#include <zephyr/kernel.h>

int main(void)
{
    int i=0;
    while (1) {
        printf("Hello World! %s %d\n", CONFIG_BOARD_TARGET, i++);
        k_msleep(1000);
    }
    return 0;
}

Observed behavior

Hello World is printed once, then the application locks up. Not even the interrupt handler in the timer driver is ever called again.

Expected behavior

Hello Word is printed every 1 second.

olofk commented 4 months ago

Ok, that's not good. It's a bit surprising that they didn't make WFI support optional in Zephyr. Either way, I think that we should short-term fix SERV to treat WFI as a nop and long term add proper support since it's a highly useful instruction for the kind of deeply embedded use cases that SERV intends to serve.