From d7e684ad915ccd971b2b1354264d94522bb85029 Mon Sep 17 00:00:00 2001 From: vhaudiquet Date: Wed, 11 Oct 2023 19:48:01 +0200 Subject: [PATCH] Added basic SBI support --- src/cpu/instruction.h | 2 ++ src/cpu/rv32cpu.c | 3 ++- src/devices/sbi/sbi.c | 27 +++++++++++++++++++++++++++ src/devices/sbi/sbi.h | 11 +++++++++++ src/main.c | 2 +- 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/devices/sbi/sbi.c create mode 100644 src/devices/sbi/sbi.h diff --git a/src/cpu/instruction.h b/src/cpu/instruction.h index accadf9..234555c 100644 --- a/src/cpu/instruction.h +++ b/src/cpu/instruction.h @@ -97,6 +97,8 @@ #define IMM_ECALL 0x0 #define IMM_EBREAK 0x1 /* RISC-V Privileged Instructions */ +#define IMM_SRET 0x102 +#define IMM_MRET 0x302 #define FUNC7_SFENCEVMA 0x9 #define FUNC7_WFI 0x8 #define FUNC7_SINVALVMA 0x11 diff --git a/src/cpu/rv32cpu.c b/src/cpu/rv32cpu.c index ae8bdd3..3c2e8ba 100644 --- a/src/cpu/rv32cpu.c +++ b/src/cpu/rv32cpu.c @@ -1,6 +1,7 @@ #include "rv32cpu.h" #include "instruction.h" #include "csr.h" +#include "devices/sbi/sbi.h" #include "memory/memory.h" #include "memory/mmu/mmu.h" @@ -510,7 +511,7 @@ static void cpu_execute(rv32_cpu_t* cpu, instruction_t* instruction) switch(instruction->immediate) { case IMM_ECALL: - fprintf(stderr, "ECALL: a7(sbi ext id) = %d, a6(sbi funct id) = %d\n", cpu->regs.a7, cpu->regs.a6); + sbi_call(cpu, cpu->regs.a7, cpu->regs.a6); break; case IMM_EBREAK: // EBREAK : on debug, give back hand to debugger ; without debug, end simulation diff --git a/src/devices/sbi/sbi.c b/src/devices/sbi/sbi.c new file mode 100644 index 0000000..9382022 --- /dev/null +++ b/src/devices/sbi/sbi.c @@ -0,0 +1,27 @@ +#include "sbi.h" + +#include + +void sbi_call(rv32_cpu_t* cpu, uint32_t extension_id, uint32_t func_id) +{ + switch(extension_id) + { + case SBI_EXTENSION_LEGACY_CONSOLE_PUTCHAR: + { + printf("%c", cpu->regs.a0); + cpu->regs.a0 = 0; + break; + } + case SBI_EXTENSION_LEGACY_SHUTDOWN: + { + printf("sbi_call: shutdown, goodbye !\n"); + cpu->sim_ticks_left = 1; + break; + } + default: + { + fprintf(stderr, "sbi_call: unknown extension id 0x%x\n", extension_id); + break; + } + } +} diff --git a/src/devices/sbi/sbi.h b/src/devices/sbi/sbi.h new file mode 100644 index 0000000..ce4f182 --- /dev/null +++ b/src/devices/sbi/sbi.h @@ -0,0 +1,11 @@ +#ifndef SBI_H +#define SBI_H + +#include "cpu/rv32cpu.h" + +#define SBI_EXTENSION_LEGACY_CONSOLE_PUTCHAR 0x1 +#define SBI_EXTENSION_LEGACY_SHUTDOWN 0x8 + +void sbi_call(rv32_cpu_t* cpu, uint32_t extension_id, uint32_t func_id); + +#endif diff --git a/src/main.c b/src/main.c index 784f40b..1aa8008 100644 --- a/src/main.c +++ b/src/main.c @@ -52,7 +52,7 @@ int main(int argc, char** argv) pthread_mutex_unlock(&cpu0_mutex); } - fprintf(stderr, "Simulation ended in a non-debug environment\n"); + fprintf(stderr, "Simulation ended (in a non-debug environment)\n"); return cpu0->regs.a0; }