|
@@ -95,7 +95,7 @@ static RISCVException ctr(CPURISCVState *env, int csrno)
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- if (riscv_cpu_is_32bit(env)) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) == MXL_RV32) {
|
|
switch (csrno) {
|
|
switch (csrno) {
|
|
case CSR_CYCLEH:
|
|
case CSR_CYCLEH:
|
|
if (!get_field(env->hcounteren, COUNTEREN_CY) &&
|
|
if (!get_field(env->hcounteren, COUNTEREN_CY) &&
|
|
@@ -130,7 +130,7 @@ static RISCVException ctr(CPURISCVState *env, int csrno)
|
|
|
|
|
|
static RISCVException ctr32(CPURISCVState *env, int csrno)
|
|
static RISCVException ctr32(CPURISCVState *env, int csrno)
|
|
{
|
|
{
|
|
- if (!riscv_cpu_is_32bit(env)) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) != MXL_RV32) {
|
|
return RISCV_EXCP_ILLEGAL_INST;
|
|
return RISCV_EXCP_ILLEGAL_INST;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -145,7 +145,7 @@ static RISCVException any(CPURISCVState *env, int csrno)
|
|
|
|
|
|
static RISCVException any32(CPURISCVState *env, int csrno)
|
|
static RISCVException any32(CPURISCVState *env, int csrno)
|
|
{
|
|
{
|
|
- if (!riscv_cpu_is_32bit(env)) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) != MXL_RV32) {
|
|
return RISCV_EXCP_ILLEGAL_INST;
|
|
return RISCV_EXCP_ILLEGAL_INST;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -180,7 +180,7 @@ static RISCVException hmode(CPURISCVState *env, int csrno)
|
|
|
|
|
|
static RISCVException hmode32(CPURISCVState *env, int csrno)
|
|
static RISCVException hmode32(CPURISCVState *env, int csrno)
|
|
{
|
|
{
|
|
- if (!riscv_cpu_is_32bit(env)) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) != MXL_RV32) {
|
|
if (riscv_cpu_virt_enabled(env)) {
|
|
if (riscv_cpu_virt_enabled(env)) {
|
|
return RISCV_EXCP_ILLEGAL_INST;
|
|
return RISCV_EXCP_ILLEGAL_INST;
|
|
} else {
|
|
} else {
|
|
@@ -486,7 +486,7 @@ static RISCVException read_mstatus(CPURISCVState *env, int csrno,
|
|
|
|
|
|
static int validate_vm(CPURISCVState *env, target_ulong vm)
|
|
static int validate_vm(CPURISCVState *env, target_ulong vm)
|
|
{
|
|
{
|
|
- if (riscv_cpu_is_32bit(env)) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) == MXL_RV32) {
|
|
return valid_vm_1_10_32[vm & 0xf];
|
|
return valid_vm_1_10_32[vm & 0xf];
|
|
} else {
|
|
} else {
|
|
return valid_vm_1_10_64[vm & 0xf];
|
|
return valid_vm_1_10_64[vm & 0xf];
|
|
@@ -510,7 +510,7 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
|
|
MSTATUS_MPP | MSTATUS_MXR | MSTATUS_TVM | MSTATUS_TSR |
|
|
MSTATUS_MPP | MSTATUS_MXR | MSTATUS_TVM | MSTATUS_TSR |
|
|
MSTATUS_TW;
|
|
MSTATUS_TW;
|
|
|
|
|
|
- if (!riscv_cpu_is_32bit(env)) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) != MXL_RV32) {
|
|
/*
|
|
/*
|
|
* RV32: MPV and GVA are not in mstatus. The current plan is to
|
|
* RV32: MPV and GVA are not in mstatus. The current plan is to
|
|
* add them to mstatush. For now, we just don't support it.
|
|
* add them to mstatush. For now, we just don't support it.
|
|
@@ -522,7 +522,7 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
|
|
|
|
|
|
dirty = ((mstatus & MSTATUS_FS) == MSTATUS_FS) |
|
|
dirty = ((mstatus & MSTATUS_FS) == MSTATUS_FS) |
|
|
((mstatus & MSTATUS_XS) == MSTATUS_XS);
|
|
((mstatus & MSTATUS_XS) == MSTATUS_XS);
|
|
- if (riscv_cpu_is_32bit(env)) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) == MXL_RV32) {
|
|
mstatus = set_field(mstatus, MSTATUS32_SD, dirty);
|
|
mstatus = set_field(mstatus, MSTATUS32_SD, dirty);
|
|
} else {
|
|
} else {
|
|
mstatus = set_field(mstatus, MSTATUS64_SD, dirty);
|
|
mstatus = set_field(mstatus, MSTATUS64_SD, dirty);
|
|
@@ -795,7 +795,7 @@ static RISCVException read_sstatus(CPURISCVState *env, int csrno,
|
|
{
|
|
{
|
|
target_ulong mask = (sstatus_v1_10_mask);
|
|
target_ulong mask = (sstatus_v1_10_mask);
|
|
|
|
|
|
- if (riscv_cpu_is_32bit(env)) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) == MXL_RV32) {
|
|
mask |= SSTATUS32_SD;
|
|
mask |= SSTATUS32_SD;
|
|
} else {
|
|
} else {
|
|
mask |= SSTATUS64_SD;
|
|
mask |= SSTATUS64_SD;
|
|
@@ -1006,7 +1006,7 @@ static RISCVException write_satp(CPURISCVState *env, int csrno,
|
|
return RISCV_EXCP_NONE;
|
|
return RISCV_EXCP_NONE;
|
|
}
|
|
}
|
|
|
|
|
|
- if (riscv_cpu_is_32bit(env)) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) == MXL_RV32) {
|
|
vm = validate_vm(env, get_field(val, SATP32_MODE));
|
|
vm = validate_vm(env, get_field(val, SATP32_MODE));
|
|
mask = (val ^ env->satp) & (SATP32_MODE | SATP32_ASID | SATP32_PPN);
|
|
mask = (val ^ env->satp) & (SATP32_MODE | SATP32_ASID | SATP32_PPN);
|
|
asid = (val ^ env->satp) & SATP32_ASID;
|
|
asid = (val ^ env->satp) & SATP32_ASID;
|
|
@@ -1034,7 +1034,7 @@ static RISCVException read_hstatus(CPURISCVState *env, int csrno,
|
|
target_ulong *val)
|
|
target_ulong *val)
|
|
{
|
|
{
|
|
*val = env->hstatus;
|
|
*val = env->hstatus;
|
|
- if (!riscv_cpu_is_32bit(env)) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) != MXL_RV32) {
|
|
/* We only support 64-bit VSXL */
|
|
/* We only support 64-bit VSXL */
|
|
*val = set_field(*val, HSTATUS_VSXL, 2);
|
|
*val = set_field(*val, HSTATUS_VSXL, 2);
|
|
}
|
|
}
|
|
@@ -1047,7 +1047,7 @@ static RISCVException write_hstatus(CPURISCVState *env, int csrno,
|
|
target_ulong val)
|
|
target_ulong val)
|
|
{
|
|
{
|
|
env->hstatus = val;
|
|
env->hstatus = val;
|
|
- if (!riscv_cpu_is_32bit(env) && get_field(val, HSTATUS_VSXL) != 2) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) != MXL_RV32 && get_field(val, HSTATUS_VSXL) != 2) {
|
|
qemu_log_mask(LOG_UNIMP, "QEMU does not support mixed HSXLEN options.");
|
|
qemu_log_mask(LOG_UNIMP, "QEMU does not support mixed HSXLEN options.");
|
|
}
|
|
}
|
|
if (get_field(val, HSTATUS_VSBE) != 0) {
|
|
if (get_field(val, HSTATUS_VSBE) != 0) {
|
|
@@ -1215,7 +1215,7 @@ static RISCVException write_htimedelta(CPURISCVState *env, int csrno,
|
|
return RISCV_EXCP_ILLEGAL_INST;
|
|
return RISCV_EXCP_ILLEGAL_INST;
|
|
}
|
|
}
|
|
|
|
|
|
- if (riscv_cpu_is_32bit(env)) {
|
|
|
|
|
|
+ if (riscv_cpu_mxl(env) == MXL_RV32) {
|
|
env->htimedelta = deposit64(env->htimedelta, 0, 32, (uint64_t)val);
|
|
env->htimedelta = deposit64(env->htimedelta, 0, 32, (uint64_t)val);
|
|
} else {
|
|
} else {
|
|
env->htimedelta = val;
|
|
env->htimedelta = val;
|