On 11/10/21 8:04 AM, LIU Zhiwei wrote:
The mask comes from the pointer masking extension, or the max value
corresponding to XLEN bits.
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
---
target/riscv/cpu.c | 1 +
target/riscv/cpu.h | 4 ++++
target/riscv/cpu_helper.c | 40 ++++++++++++++++++++++++++++++++++++
target/riscv/csr.c | 19 +++++++++++++++++
target/riscv/machine.c | 10 +++++++++
target/riscv/vector_helper.c | 23 +++++++++++++--------
6 files changed, 88 insertions(+), 9 deletions(-)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 0d2d175fa2..886388f066 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -378,6 +378,7 @@ static void riscv_cpu_reset(DeviceState *dev)
#ifndef CONFIG_USER_ONLY
env->misa_mxl = env->misa_mxl_max;
env->priv = PRV_M;
+ riscv_cpu_update_mask(env);
env->mstatus &= ~(MSTATUS_MIE | MSTATUS_MPRV);
if (env->misa_mxl > MXL_RV32) {
/*
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 11590a510e..73d7aa9ad7 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -252,6 +252,8 @@ struct CPURISCVState {
target_ulong upmmask;
target_ulong upmbase;
#endif
+ target_ulong mask;
+ target_ulong base;
I think the name here isn't great. Without the context of the
preceeding elements, the question becomes: mask of what?
Better might be cur_pmmask, cur_pmbase.
Broader than that, you're doing too many things in this patch. The
subject is "adjust vector address with mask", but you're also creating
new fields and updating them at priv changes, etc. Too much.
+void riscv_cpu_update_mask(CPURISCVState *env)
... update_pmmask?
+}
+
+
+
Watch the extra spaces.
@@ -1571,6 +1572,9 @@ static RISCVException
write_mpmmask(CPURISCVState *env, int csrno,
uint64_t mstatus;
env->mpmmask = val;
+ if ((env->priv == PRV_M) && (env->mmte & M_PM_ENABLE)) {
+ env->mask = val;
+ }
This needs to use the function; there are pieces missing here, notably
the zero-extend for RV32.