mirror of https://github.com/xemu-project/xemu.git
target/riscv: Group all predicate() routines together
Move sstc()/sstc32() to where all predicate() routines live, and smstateen_acc_ok() to near {read,write}_xenvcfg(). Signed-off-by: Bin Meng <bmeng@tinylab.org> Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn> Message-ID: <20230228104035.1879882-19-bmeng@tinylab.org> Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
parent
9e83a35661
commit
fb5bd4dcae
|
@ -40,42 +40,6 @@ void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops)
|
||||||
csr_ops[csrno & (CSR_TABLE_SIZE - 1)] = *ops;
|
csr_ops[csrno & (CSR_TABLE_SIZE - 1)] = *ops;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Predicates */
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
|
||||||
static RISCVException smstateen_acc_ok(CPURISCVState *env, int index,
|
|
||||||
uint64_t bit)
|
|
||||||
{
|
|
||||||
bool virt = riscv_cpu_virt_enabled(env);
|
|
||||||
RISCVCPU *cpu = env_archcpu(env);
|
|
||||||
|
|
||||||
if (env->priv == PRV_M || !cpu->cfg.ext_smstateen) {
|
|
||||||
return RISCV_EXCP_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(env->mstateen[index] & bit)) {
|
|
||||||
return RISCV_EXCP_ILLEGAL_INST;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virt) {
|
|
||||||
if (!(env->hstateen[index] & bit)) {
|
|
||||||
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (env->priv == PRV_U && !(env->sstateen[index] & bit)) {
|
|
||||||
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (env->priv == PRV_U && riscv_has_ext(env, RVS)) {
|
|
||||||
if (!(env->sstateen[index] & bit)) {
|
|
||||||
return RISCV_EXCP_ILLEGAL_INST;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return RISCV_EXCP_NONE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static RISCVException fs(CPURISCVState *env, int csrno)
|
static RISCVException fs(CPURISCVState *env, int csrno)
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
@ -399,6 +363,60 @@ static RISCVException sstateen(CPURISCVState *env, int csrno)
|
||||||
return RISCV_EXCP_NONE;
|
return RISCV_EXCP_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static RISCVException sstc(CPURISCVState *env, int csrno)
|
||||||
|
{
|
||||||
|
RISCVCPU *cpu = env_archcpu(env);
|
||||||
|
bool hmode_check = false;
|
||||||
|
|
||||||
|
if (!cpu->cfg.ext_sstc || !env->rdtime_fn) {
|
||||||
|
return RISCV_EXCP_ILLEGAL_INST;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((csrno == CSR_VSTIMECMP) || (csrno == CSR_VSTIMECMPH)) {
|
||||||
|
hmode_check = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
RISCVException ret = hmode_check ? hmode(env, csrno) : smode(env, csrno);
|
||||||
|
if (ret != RISCV_EXCP_NONE) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (env->debugger) {
|
||||||
|
return RISCV_EXCP_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (env->priv == PRV_M) {
|
||||||
|
return RISCV_EXCP_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* No need of separate function for rv32 as menvcfg stores both menvcfg
|
||||||
|
* menvcfgh for RV32.
|
||||||
|
*/
|
||||||
|
if (!(get_field(env->mcounteren, COUNTEREN_TM) &&
|
||||||
|
get_field(env->menvcfg, MENVCFG_STCE))) {
|
||||||
|
return RISCV_EXCP_ILLEGAL_INST;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (riscv_cpu_virt_enabled(env)) {
|
||||||
|
if (!(get_field(env->hcounteren, COUNTEREN_TM) &&
|
||||||
|
get_field(env->henvcfg, HENVCFG_STCE))) {
|
||||||
|
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return RISCV_EXCP_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static RISCVException sstc_32(CPURISCVState *env, int csrno)
|
||||||
|
{
|
||||||
|
if (riscv_cpu_mxl(env) != MXL_RV32) {
|
||||||
|
return RISCV_EXCP_ILLEGAL_INST;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sstc(env, csrno);
|
||||||
|
}
|
||||||
|
|
||||||
/* Checks if PointerMasking registers could be accessed */
|
/* Checks if PointerMasking registers could be accessed */
|
||||||
static RISCVException pointer_masking(CPURISCVState *env, int csrno)
|
static RISCVException pointer_masking(CPURISCVState *env, int csrno)
|
||||||
{
|
{
|
||||||
|
@ -943,60 +961,6 @@ static RISCVException read_timeh(CPURISCVState *env, int csrno,
|
||||||
return RISCV_EXCP_NONE;
|
return RISCV_EXCP_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static RISCVException sstc(CPURISCVState *env, int csrno)
|
|
||||||
{
|
|
||||||
RISCVCPU *cpu = env_archcpu(env);
|
|
||||||
bool hmode_check = false;
|
|
||||||
|
|
||||||
if (!cpu->cfg.ext_sstc || !env->rdtime_fn) {
|
|
||||||
return RISCV_EXCP_ILLEGAL_INST;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((csrno == CSR_VSTIMECMP) || (csrno == CSR_VSTIMECMPH)) {
|
|
||||||
hmode_check = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
RISCVException ret = hmode_check ? hmode(env, csrno) : smode(env, csrno);
|
|
||||||
if (ret != RISCV_EXCP_NONE) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (env->debugger) {
|
|
||||||
return RISCV_EXCP_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (env->priv == PRV_M) {
|
|
||||||
return RISCV_EXCP_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* No need of separate function for rv32 as menvcfg stores both menvcfg
|
|
||||||
* menvcfgh for RV32.
|
|
||||||
*/
|
|
||||||
if (!(get_field(env->mcounteren, COUNTEREN_TM) &&
|
|
||||||
get_field(env->menvcfg, MENVCFG_STCE))) {
|
|
||||||
return RISCV_EXCP_ILLEGAL_INST;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (riscv_cpu_virt_enabled(env)) {
|
|
||||||
if (!(get_field(env->hcounteren, COUNTEREN_TM) &&
|
|
||||||
get_field(env->henvcfg, HENVCFG_STCE))) {
|
|
||||||
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return RISCV_EXCP_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static RISCVException sstc_32(CPURISCVState *env, int csrno)
|
|
||||||
{
|
|
||||||
if (riscv_cpu_mxl(env) != MXL_RV32) {
|
|
||||||
return RISCV_EXCP_ILLEGAL_INST;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sstc(env, csrno);
|
|
||||||
}
|
|
||||||
|
|
||||||
static RISCVException read_vstimecmp(CPURISCVState *env, int csrno,
|
static RISCVException read_vstimecmp(CPURISCVState *env, int csrno,
|
||||||
target_ulong *val)
|
target_ulong *val)
|
||||||
{
|
{
|
||||||
|
@ -1944,6 +1908,39 @@ static RISCVException write_menvcfgh(CPURISCVState *env, int csrno,
|
||||||
return RISCV_EXCP_NONE;
|
return RISCV_EXCP_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static RISCVException smstateen_acc_ok(CPURISCVState *env, int index,
|
||||||
|
uint64_t bit)
|
||||||
|
{
|
||||||
|
bool virt = riscv_cpu_virt_enabled(env);
|
||||||
|
RISCVCPU *cpu = env_archcpu(env);
|
||||||
|
|
||||||
|
if (env->priv == PRV_M || !cpu->cfg.ext_smstateen) {
|
||||||
|
return RISCV_EXCP_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(env->mstateen[index] & bit)) {
|
||||||
|
return RISCV_EXCP_ILLEGAL_INST;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virt) {
|
||||||
|
if (!(env->hstateen[index] & bit)) {
|
||||||
|
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (env->priv == PRV_U && !(env->sstateen[index] & bit)) {
|
||||||
|
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (env->priv == PRV_U && riscv_has_ext(env, RVS)) {
|
||||||
|
if (!(env->sstateen[index] & bit)) {
|
||||||
|
return RISCV_EXCP_ILLEGAL_INST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return RISCV_EXCP_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
static RISCVException read_senvcfg(CPURISCVState *env, int csrno,
|
static RISCVException read_senvcfg(CPURISCVState *env, int csrno,
|
||||||
target_ulong *val)
|
target_ulong *val)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue