Added basic SBI support
This commit is contained in:
parent
31941c0813
commit
d7e684ad91
@ -97,6 +97,8 @@
|
|||||||
#define IMM_ECALL 0x0
|
#define IMM_ECALL 0x0
|
||||||
#define IMM_EBREAK 0x1
|
#define IMM_EBREAK 0x1
|
||||||
/* RISC-V Privileged Instructions */
|
/* RISC-V Privileged Instructions */
|
||||||
|
#define IMM_SRET 0x102
|
||||||
|
#define IMM_MRET 0x302
|
||||||
#define FUNC7_SFENCEVMA 0x9
|
#define FUNC7_SFENCEVMA 0x9
|
||||||
#define FUNC7_WFI 0x8
|
#define FUNC7_WFI 0x8
|
||||||
#define FUNC7_SINVALVMA 0x11
|
#define FUNC7_SINVALVMA 0x11
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "rv32cpu.h"
|
#include "rv32cpu.h"
|
||||||
#include "instruction.h"
|
#include "instruction.h"
|
||||||
#include "csr.h"
|
#include "csr.h"
|
||||||
|
#include "devices/sbi/sbi.h"
|
||||||
|
|
||||||
#include "memory/memory.h"
|
#include "memory/memory.h"
|
||||||
#include "memory/mmu/mmu.h"
|
#include "memory/mmu/mmu.h"
|
||||||
@ -510,7 +511,7 @@ static void cpu_execute(rv32_cpu_t* cpu, instruction_t* instruction)
|
|||||||
switch(instruction->immediate)
|
switch(instruction->immediate)
|
||||||
{
|
{
|
||||||
case IMM_ECALL:
|
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;
|
break;
|
||||||
case IMM_EBREAK:
|
case IMM_EBREAK:
|
||||||
// EBREAK : on debug, give back hand to debugger ; without debug, end simulation
|
// EBREAK : on debug, give back hand to debugger ; without debug, end simulation
|
||||||
|
27
src/devices/sbi/sbi.c
Normal file
27
src/devices/sbi/sbi.c
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#include "sbi.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
src/devices/sbi/sbi.h
Normal file
11
src/devices/sbi/sbi.h
Normal file
@ -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
|
@ -52,7 +52,7 @@ int main(int argc, char** argv)
|
|||||||
pthread_mutex_unlock(&cpu0_mutex);
|
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;
|
return cpu0->regs.a0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user