Skip to content

Commit

Permalink
target/riscv: Allow setting CPU feature from machine/device emulation
Browse files Browse the repository at this point in the history
The machine or device emulation should be able to force set certain
CPU features because:
1) We can have certain CPU features which are in-general optional
   but implemented by RISC-V CPUs on the machine.
2) We can have devices which require a certain CPU feature. For example,
   AIA IMSIC devices expect AIA CSRs implemented by RISC-V CPUs.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Signed-off-by: Anup Patel <anup@brainfault.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Frank Chang <frank.chang@sifive.com>
Message-id: 20220204174700.534953-6-anup@brainfault.org
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
  • Loading branch information
avpatel authored and alistair23 committed Feb 16, 2022
1 parent 02d9565 commit f87adf2
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 8 deletions.
11 changes: 3 additions & 8 deletions target/riscv/cpu.c
Expand Up @@ -135,11 +135,6 @@ static void set_vext_version(CPURISCVState *env, int vext_ver)
env->vext_ver = vext_ver;
}

static void set_feature(CPURISCVState *env, int feature)
{
env->features |= (1ULL << feature);
}

static void set_resetvec(CPURISCVState *env, target_ulong resetvec)
{
#ifndef CONFIG_USER_ONLY
Expand Down Expand Up @@ -508,18 +503,18 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
}

if (cpu->cfg.mmu) {
set_feature(env, RISCV_FEATURE_MMU);
riscv_set_feature(env, RISCV_FEATURE_MMU);
}

if (cpu->cfg.pmp) {
set_feature(env, RISCV_FEATURE_PMP);
riscv_set_feature(env, RISCV_FEATURE_PMP);

/*
* Enhanced PMP should only be available
* on harts with PMP support
*/
if (cpu->cfg.epmp) {
set_feature(env, RISCV_FEATURE_EPMP);
riscv_set_feature(env, RISCV_FEATURE_EPMP);
}
}

Expand Down
5 changes: 5 additions & 0 deletions target/riscv/cpu.h
Expand Up @@ -379,6 +379,11 @@ static inline bool riscv_feature(CPURISCVState *env, int feature)
return env->features & (1ULL << feature);
}

static inline void riscv_set_feature(CPURISCVState *env, int feature)
{
env->features |= (1ULL << feature);
}

#include "cpu_user.h"

extern const char * const riscv_int_regnames[];
Expand Down

0 comments on commit f87adf2

Please sign in to comment.