Skip to content

Commit

Permalink
RISC-V: Add support for the Zifencei extension
Browse files Browse the repository at this point in the history
fence.i has been split out of the base ISA as part of the ratification
process.  This patch adds a Zifencei argument, which disables the
fence.i instruction.

Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
  • Loading branch information
palmer-dabbelt committed Jun 26, 2019
1 parent 0a13a5b commit 50fba81
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 0 deletions.
1 change: 1 addition & 0 deletions target/riscv/cpu.c
Expand Up @@ -441,6 +441,7 @@ static Property riscv_cpu_properties[] = {
DEFINE_PROP_BOOL("s", RISCVCPU, cfg.ext_s, true),
DEFINE_PROP_BOOL("u", RISCVCPU, cfg.ext_u, true),
DEFINE_PROP_BOOL("Counters", RISCVCPU, cfg.ext_counters, true),
DEFINE_PROP_BOOL("Zifencei", RISCVCPU, cfg.ext_ifencei, true),
DEFINE_PROP_STRING("priv_spec", RISCVCPU, cfg.priv_spec),
DEFINE_PROP_BOOL("mmu", RISCVCPU, cfg.mmu, true),
DEFINE_PROP_BOOL("pmp", RISCVCPU, cfg.pmp, true),
Expand Down
1 change: 1 addition & 0 deletions target/riscv/cpu.h
Expand Up @@ -223,6 +223,7 @@ typedef struct RISCVCPU {
bool ext_s;
bool ext_u;
bool ext_counters;
bool ext_ifencei;

char *priv_spec;
char *user_spec;
Expand Down
4 changes: 4 additions & 0 deletions target/riscv/insn_trans/trans_rvi.inc.c
Expand Up @@ -484,6 +484,10 @@ static bool trans_fence(DisasContext *ctx, arg_fence *a)

static bool trans_fence_i(DisasContext *ctx, arg_fence_i *a)
{
if (!ctx->ext_ifencei) {
return false;
}

/*
* FENCE_I is a no-op in QEMU,
* however we need to end the translation block
Expand Down
3 changes: 3 additions & 0 deletions target/riscv/translate.c
Expand Up @@ -54,6 +54,7 @@ typedef struct DisasContext {
to any system register, which includes CSR_FRM, so we do not have
to reset this known value. */
int frm;
bool ext_ifencei;
} DisasContext;

#ifdef TARGET_RISCV64
Expand Down Expand Up @@ -752,13 +753,15 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
{
DisasContext *ctx = container_of(dcbase, DisasContext, base);
CPURISCVState *env = cs->env_ptr;
RISCVCPU *cpu = RISCV_CPU(cs);

ctx->pc_succ_insn = ctx->base.pc_first;
ctx->mem_idx = ctx->base.tb->flags & TB_FLAGS_MMU_MASK;
ctx->mstatus_fs = ctx->base.tb->flags & TB_FLAGS_MSTATUS_FS;
ctx->priv_ver = env->priv_ver;
ctx->misa = env->misa;
ctx->frm = -1; /* unknown rounding mode */
ctx->ext_ifencei = cpu->cfg.ext_ifencei;
}

static void riscv_tr_tb_start(DisasContextBase *db, CPUState *cpu)
Expand Down

0 comments on commit 50fba81

Please sign in to comment.