Skip to content

Commit 3215fe8

Browse files
committed
target/loongarch: Dump all generic CSR registers
CSR registers is import system control registers, it had better dump all CSR registers when VM is running in system mode. Here is dump output example of CSR registers: CSR000: CRMD b4 PRMD 4 EUEN 0 MISC 0 CSR004: ECFG 71c1c ESTAT 0 ERA 9000000002c31300 BADV 12022c0e0 CSR008: BADI 2b0000 CSR012: EENTRY 90000000046b0000 CSR016: TLBIDX ffffffff8e000228 TLBEHI 120228000 TLBELO0 400000016f19001f TLBELO1 400000016f1a401f CSR024: ASID a0004 PGDL 90000001016f0000 PGDH 9000000004680000 PGD 0 CSR028: PWCL 5e56e PWCH 2e4 STLBPS e RVACFG 0 CSR032: CPUID 0 PRCFG1 72f8 PRCFG2 3ffff000 PRCFG3 8073f2 CSR048: SAVE0 0 SAVE1 af9c SAVE2 12010d6a8 SAVE3 8300000 CSR052: SAVE4 0 SAVE5 0 SAVE6 0 SAVE7 0 CSR064: TID 0 TCFG 8f0ca15 TVAL 4cefd8b CNTC fffffffffe688aaa CSR068: TICLR 0 CSR096: LLBCTL 1 CSR136: TLBRENTRY 46ba000 TLBRBADV ffff8000130d81e2 TLBRERA 9000000003585cb8 TLBRSAVE ffff8000130d81e0 CSR140: TLBRELO0 1fe00043 TLBRELO1 40 TLBREHI ffff8000130d800e TLBRPRMD 0 CSR384: DMW0 8000000000000001 DMW1 9000000000000011 DMW2 0 DMW3 0 Signed-off-by: Bibo Mao <maobibo@loongson.cn>
1 parent b5b13eb commit 3215fe8

File tree

3 files changed

+53
-16
lines changed

3 files changed

+53
-16
lines changed

target/loongarch/cpu.c

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,54 @@ static ObjectClass *loongarch_cpu_class_by_name(const char *cpu_model)
793793
return oc;
794794
}
795795

796+
static void loongarch_cpu_dump_csr(CPUState *cs, FILE *f)
797+
{
798+
#ifndef CONFIG_USER_ONLY
799+
CPULoongArchState *env = cpu_env(cs);
800+
CSRInfo *csr_info;
801+
int64_t *addr;
802+
int i, j, len, col = 0;
803+
804+
qemu_fprintf(f, "\n");
805+
806+
/* Dump all generic CSR register */
807+
for (i = 0; i < LOONGARCH_CSR_DBG; i++) {
808+
csr_info = get_csr(i);
809+
if (!csr_info || (csr_info->flags & CSRFL_UNUSED)) {
810+
if (i == (col + 3)) {
811+
qemu_fprintf(f, "\n");
812+
}
813+
814+
continue;
815+
}
816+
817+
if ((i > (col + 3)) || (i == col)) {
818+
col = i & ~3;
819+
qemu_fprintf(f, " CSR%03d:", col);
820+
}
821+
822+
addr = (void *)env + csr_info->offset;
823+
qemu_fprintf(f, " %s ", csr_info->name);
824+
len = strlen(csr_info->name);
825+
for (; len < 6; len++) {
826+
qemu_fprintf(f, " ");
827+
}
828+
829+
qemu_fprintf(f, "%" PRIx64, *addr);
830+
j = find_last_bit((void *)addr, BITS_PER_LONG) & (BITS_PER_LONG - 1);
831+
len += j / 4 + 1;
832+
for (; len < 22; len++) {
833+
qemu_fprintf(f, " ");
834+
}
835+
836+
if (i == (col + 3)) {
837+
qemu_fprintf(f, "\n");
838+
}
839+
}
840+
qemu_fprintf(f, "\n");
841+
#endif
842+
}
843+
796844
static void loongarch_cpu_dump_state(CPUState *cs, FILE *f, int flags)
797845
{
798846
CPULoongArchState *env = cpu_env(cs);
@@ -812,22 +860,8 @@ static void loongarch_cpu_dump_state(CPUState *cs, FILE *f, int flags)
812860
}
813861
}
814862

815-
qemu_fprintf(f, "CRMD=%016" PRIx64 "\n", env->CSR_CRMD);
816-
qemu_fprintf(f, "PRMD=%016" PRIx64 "\n", env->CSR_PRMD);
817-
qemu_fprintf(f, "EUEN=%016" PRIx64 "\n", env->CSR_EUEN);
818-
qemu_fprintf(f, "ESTAT=%016" PRIx64 "\n", env->CSR_ESTAT);
819-
qemu_fprintf(f, "ERA=%016" PRIx64 "\n", env->CSR_ERA);
820-
qemu_fprintf(f, "BADV=%016" PRIx64 "\n", env->CSR_BADV);
821-
qemu_fprintf(f, "BADI=%016" PRIx64 "\n", env->CSR_BADI);
822-
qemu_fprintf(f, "EENTRY=%016" PRIx64 "\n", env->CSR_EENTRY);
823-
qemu_fprintf(f, "PRCFG1=%016" PRIx64 ", PRCFG2=%016" PRIx64 ","
824-
" PRCFG3=%016" PRIx64 "\n",
825-
env->CSR_PRCFG1, env->CSR_PRCFG2, env->CSR_PRCFG3);
826-
qemu_fprintf(f, "TLBRENTRY=%016" PRIx64 "\n", env->CSR_TLBRENTRY);
827-
qemu_fprintf(f, "TLBRBADV=%016" PRIx64 "\n", env->CSR_TLBRBADV);
828-
qemu_fprintf(f, "TLBRERA=%016" PRIx64 "\n", env->CSR_TLBRERA);
829-
qemu_fprintf(f, "TCFG=%016" PRIx64 "\n", env->CSR_TCFG);
830-
qemu_fprintf(f, "TVAL=%016" PRIx64 "\n", env->CSR_TVAL);
863+
/* csr */
864+
loongarch_cpu_dump_csr(cs, f);
831865

832866
/* fpr */
833867
if (flags & CPU_DUMP_FPU) {

target/loongarch/csr.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99

1010
#define CSR_OFF_FUNCS(NAME, FL, RD, WR) \
1111
[LOONGARCH_CSR_##NAME] = { \
12+
.name = (stringify(NAME)), \
1213
.offset = offsetof(CPULoongArchState, CSR_##NAME), \
1314
.flags = FL, .readfn = RD, .writefn = WR \
1415
}
1516

1617
#define CSR_OFF_ARRAY(NAME, N) \
1718
[LOONGARCH_CSR_##NAME(N)] = { \
19+
.name = (stringify(NAME##N)), \
1820
.offset = offsetof(CPULoongArchState, CSR_##NAME[N]), \
1921
.flags = 0, .readfn = NULL, .writefn = NULL \
2022
}

target/loongarch/csr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ enum {
1717
};
1818

1919
typedef struct {
20+
const char *name;
2021
int offset;
2122
int flags;
2223
GenCSRFunc readfn;

0 commit comments

Comments
 (0)