Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/feature.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,5 +118,16 @@
#define RV32_FEATURE_ARCH_TEST 0
#endif

/* MMIO support for system emulation
* It is enabled when running in SYSTEM mode without ELF_LOADER, corresponding
* to booting a full Linux kernel that requires memory-mapped I/O to interact
* with virtual devices (UART, PLIC, virtio-blk).
*/
#if RV32_FEATURE_SYSTEM && !RV32_FEATURE_ELF_LOADER
#define RV32_FEATURE_SYSTEM_MMIO 1
#else
#define RV32_FEATURE_SYSTEM_MMIO 0
#endif

/* Feature test macro */
#define RV32_HAS(x) RV32_FEATURE_##x
2 changes: 1 addition & 1 deletion src/jit.c
Original file line number Diff line number Diff line change
Expand Up @@ -1395,7 +1395,7 @@ static void muldivmod(struct jit_state *state,
}
#endif /* RV32_HAS(EXT_M) */

#if RV32_HAS(SYSTEM)
#if RV32_HAS(SYSTEM_MMIO)
uint32_t jit_mmio_read_wrapper(riscv_t *rv, uint32_t addr)
{
MMIO_READ();
Expand Down
16 changes: 8 additions & 8 deletions src/rv32_jit.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ GEN(bgeu, {
GEN(lb, {
memory_t *m = PRIV(rv)->mem;
vm_reg[0] = ra_load(state, ir->rs1);
IIF(RV32_HAS(SYSTEM))
IIF(RV32_HAS(SYSTEM_MMIO))
(
{
emit_load_imm_sext(state, temp_reg, ir->imm);
Expand Down Expand Up @@ -207,7 +207,7 @@ GEN(lb, {
GEN(lh, {
memory_t *m = PRIV(rv)->mem;
vm_reg[0] = ra_load(state, ir->rs1);
IIF(RV32_HAS(SYSTEM))
IIF(RV32_HAS(SYSTEM_MMIO))
(
{
emit_load_imm_sext(state, temp_reg, ir->imm);
Expand Down Expand Up @@ -259,7 +259,7 @@ GEN(lh, {
GEN(lw, {
memory_t *m = PRIV(rv)->mem;
vm_reg[0] = ra_load(state, ir->rs1);
IIF(RV32_HAS(SYSTEM))
IIF(RV32_HAS(SYSTEM_MMIO))
(
{
emit_load_imm_sext(state, temp_reg, ir->imm);
Expand Down Expand Up @@ -311,7 +311,7 @@ GEN(lw, {
GEN(lbu, {
memory_t *m = PRIV(rv)->mem;
vm_reg[0] = ra_load(state, ir->rs1);
IIF(RV32_HAS(SYSTEM))
IIF(RV32_HAS(SYSTEM_MMIO))
(
{
emit_load_imm_sext(state, temp_reg, ir->imm);
Expand Down Expand Up @@ -363,7 +363,7 @@ GEN(lbu, {
GEN(lhu, {
memory_t *m = PRIV(rv)->mem;
vm_reg[0] = ra_load(state, ir->rs1);
IIF(RV32_HAS(SYSTEM))
IIF(RV32_HAS(SYSTEM_MMIO))
(
{
emit_load_imm_sext(state, temp_reg, ir->imm);
Expand Down Expand Up @@ -415,7 +415,7 @@ GEN(lhu, {
GEN(sb, {
memory_t *m = PRIV(rv)->mem;
vm_reg[0] = ra_load(state, ir->rs1);
IIF(RV32_HAS(SYSTEM))
IIF(RV32_HAS(SYSTEM_MMIO))
(
{
emit_load_imm_sext(state, temp_reg, ir->imm);
Expand Down Expand Up @@ -465,7 +465,7 @@ GEN(sb, {
GEN(sh, {
memory_t *m = PRIV(rv)->mem;
vm_reg[0] = ra_load(state, ir->rs1);
IIF(RV32_HAS(SYSTEM))
IIF(RV32_HAS(SYSTEM_MMIO))
(
{
emit_load_imm_sext(state, temp_reg, ir->imm);
Expand Down Expand Up @@ -515,7 +515,7 @@ GEN(sh, {
GEN(sw, {
memory_t *m = PRIV(rv)->mem;
vm_reg[0] = ra_load(state, ir->rs1);
IIF(RV32_HAS(SYSTEM))
IIF(RV32_HAS(SYSTEM_MMIO))
(
{
emit_load_imm_sext(state, temp_reg, ir->imm);
Expand Down
4 changes: 4 additions & 0 deletions src/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
#define R 1
#define W 0

/* MMIO definitions for Linux kernel emulation.
* Only defined when ELF_LOADER is disabled, as kernel mode needs MMIO but ELF
* test mode does not.
*/
#if !RV32_HAS(ELF_LOADER)

#define MMIO_R 1
Expand Down
Loading