On 2022/4/16 上午9:04, Richard Henderson wrote:
On 4/15/22 02:40, Xiaojuan Yang wrote:
...
+void  helper_csr_update(CPULoongArchState *env, target_ulong new_val,
+                        target_ulong csr_offset)
+{
+    uint64_t *csr = (void *)env + csr_offset;
+
+    *csr = new_val;
+}
This function should not exist
...
+    switch (a->csr) {
+    case LOONGARCH_CSR_ESTAT:
+        gen_helper_csrwr_estat(dest, cpu_env, new_val);
+        break;
+    case LOONGARCH_CSR_ASID:
+        gen_helper_csrwr_asid(dest, cpu_env, new_val);
+        break;
+    case LOONGARCH_CSR_TCFG:
+        gen_helper_csrwr_tcfg(dest, cpu_env, new_val);
+        break;
+    case LOONGARCH_CSR_TICLR:
+        gen_helper_csrwr_ticlr(dest, cpu_env, new_val);
+        break;
+    default:
+        tcg_gen_mov_tl(dest, old_val);
+    }
+
+    gen_helper_csr_update(cpu_env, new_val, tcg_constant_tl(csr_offset));

Note that helper_csr_update is nothing more than the store to csr_offset.
On trans_csrxchg() , I am don't know how to use a TCGv value 'new_val 'to update an uint64_t value "CSR_XXX",  So I use helper_csr_update(),

Thanks.
Xiaojuan
r~


Reply via email to