Commit b1a48299dc for qemu.org
commit b1a48299dc0a449f0c7e414cc3d11bd78f053c00
Author: Bibo Mao <maobibo@loongson.cn>
Date: Fri Jun 5 16:39:04 2026 +0800
target/loongarch: Add wrapper function get_csr_offset()
Add wrapper function get_csr_offset(), it is to get offset from structure
CPULoongArchState. There is no function change, and it is used for future
LVZ feature.
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Philippe Mathieu-Daudé <philmd@mailo.com>
Tested-by: Song Gao <gaosong@loongson.cn>
Message-ID: <20260605083904.175636-1-maobibo@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
index 8424f185f2..a8e51d977c 100644
--- a/target/loongarch/cpu.c
+++ b/target/loongarch/cpu.c
@@ -761,7 +761,7 @@ static void loongarch_cpu_dump_csr(CPUState *cs, FILE *f)
{
#ifndef CONFIG_USER_ONLY
CPULoongArchState *env = cpu_env(cs);
- CSRInfo *csr_info;
+ const CSRInfo *csr_info;
int64_t *addr;
int i, j, len, col = 0;
@@ -783,7 +783,7 @@ static void loongarch_cpu_dump_csr(CPUState *cs, FILE *f)
qemu_fprintf(f, " CSR%03d:", col);
}
- addr = (void *)env + csr_info->offset;
+ addr = (void *)env + get_csr_offset(csr_info, 0);
qemu_fprintf(f, " %s ", csr_info->name);
len = strlen(csr_info->name);
for (; len < 6; len++) {
diff --git a/target/loongarch/csr.h b/target/loongarch/csr.h
index 508a3214fc..ca988c21db 100644
--- a/target/loongarch/csr.h
+++ b/target/loongarch/csr.h
@@ -27,4 +27,8 @@ typedef struct {
CSRInfo *get_csr(unsigned int csr_num);
bool set_csr_flag(unsigned int csr_num, int flag);
+static inline unsigned int get_csr_offset(const CSRInfo *csr, int vm_level)
+{
+ return csr->offset;
+}
#endif /* TARGET_LOONGARCH_CSR_H */
diff --git a/target/loongarch/tcg/insn_trans/trans_privileged.c.inc b/target/loongarch/tcg/insn_trans/trans_privileged.c.inc
index 2094d182ac..6728ce5ec9 100644
--- a/target/loongarch/tcg/insn_trans/trans_privileged.c.inc
+++ b/target/loongarch/tcg/insn_trans/trans_privileged.c.inc
@@ -106,6 +106,7 @@ static bool trans_csrrd(DisasContext *ctx, arg_csrrd *a)
TCGv dest;
const CSRInfo *csr;
GenCSRRead readfn;
+ tcg_target_long offset;
if (check_plv(ctx)) {
return false;
@@ -121,7 +122,8 @@ static bool trans_csrrd(DisasContext *ctx, arg_csrrd *a)
if (readfn) {
readfn(dest, tcg_env);
} else {
- tcg_gen_ld_tl(dest, tcg_env, csr->offset);
+ offset = get_csr_offset(csr, 0);
+ tcg_gen_ld_tl(dest, tcg_env, offset);
}
}
gen_set_gpr(a->rd, dest, EXT_NONE);
@@ -133,6 +135,7 @@ static bool trans_csrwr(DisasContext *ctx, arg_csrwr *a)
TCGv dest, src1;
const CSRInfo *csr;
GenCSRWrite writefn;
+ tcg_target_long offset;
if (check_plv(ctx)) {
return false;
@@ -154,8 +157,9 @@ static bool trans_csrwr(DisasContext *ctx, arg_csrwr *a)
writefn(dest, tcg_env, src1);
} else {
dest = tcg_temp_new();
- tcg_gen_ld_tl(dest, tcg_env, csr->offset);
- tcg_gen_st_tl(src1, tcg_env, csr->offset);
+ offset = get_csr_offset(csr, 0);
+ tcg_gen_ld_tl(dest, tcg_env, offset);
+ tcg_gen_st_tl(src1, tcg_env, offset);
}
gen_set_gpr(a->rd, dest, EXT_NONE);
return true;
@@ -166,6 +170,7 @@ static bool trans_csrxchg(DisasContext *ctx, arg_csrxchg *a)
TCGv src1, mask, oldv, newv, temp;
const CSRInfo *csr;
GenCSRWrite writefn;
+ tcg_target_long offset;
if (check_plv(ctx)) {
return false;
@@ -191,7 +196,8 @@ static bool trans_csrxchg(DisasContext *ctx, arg_csrxchg *a)
newv = tcg_temp_new();
temp = tcg_temp_new();
- tcg_gen_ld_tl(oldv, tcg_env, csr->offset);
+ offset = get_csr_offset(csr, 0);
+ tcg_gen_ld_tl(oldv, tcg_env, offset);
tcg_gen_and_tl(newv, src1, mask);
tcg_gen_andc_tl(temp, oldv, mask);
tcg_gen_or_tl(newv, newv, temp);
@@ -200,7 +206,7 @@ static bool trans_csrxchg(DisasContext *ctx, arg_csrxchg *a)
if (writefn) {
writefn(oldv, tcg_env, newv);
} else {
- tcg_gen_st_tl(newv, tcg_env, csr->offset);
+ tcg_gen_st_tl(newv, tcg_env, offset);
}
gen_set_gpr(a->rd, oldv, EXT_NONE);
return true;