target/loongarch: Add common source file for CSR register
Common source file csr.c is added here, it can be used by both TCG mode and kvm mode. The common code is removed from file tcg/insn_trans/trans_privileged.c.inc to csrc.c Signed-off-by: Bibo Mao <maobibo@loongson.cn>
This commit is contained in:
parent
d03114ea20
commit
cb6fa4142f
114
target/loongarch/csr.c
Normal file
114
target/loongarch/csr.c
Normal file
@ -0,0 +1,114 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Copyright (c) 2025 Loongson Technology Corporation Limited
|
||||
*/
|
||||
#include <stddef.h>
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "csr.h"
|
||||
|
||||
#define CSR_OFF_FUNCS(NAME, FL, RD, WR) \
|
||||
[LOONGARCH_CSR_##NAME] = { \
|
||||
.offset = offsetof(CPULoongArchState, CSR_##NAME), \
|
||||
.flags = FL, .readfn = RD, .writefn = WR \
|
||||
}
|
||||
|
||||
#define CSR_OFF_ARRAY(NAME, N) \
|
||||
[LOONGARCH_CSR_##NAME(N)] = { \
|
||||
.offset = offsetof(CPULoongArchState, CSR_##NAME[N]), \
|
||||
.flags = 0, .readfn = NULL, .writefn = NULL \
|
||||
}
|
||||
|
||||
#define CSR_OFF_FLAGS(NAME, FL) CSR_OFF_FUNCS(NAME, FL, NULL, NULL)
|
||||
#define CSR_OFF(NAME) CSR_OFF_FLAGS(NAME, 0)
|
||||
|
||||
static CSRInfo csr_info[] = {
|
||||
CSR_OFF_FLAGS(CRMD, CSRFL_EXITTB),
|
||||
CSR_OFF(PRMD),
|
||||
CSR_OFF_FLAGS(EUEN, CSRFL_EXITTB),
|
||||
CSR_OFF_FLAGS(MISC, CSRFL_READONLY),
|
||||
CSR_OFF(ECFG),
|
||||
CSR_OFF_FLAGS(ESTAT, CSRFL_EXITTB),
|
||||
CSR_OFF(ERA),
|
||||
CSR_OFF(BADV),
|
||||
CSR_OFF_FLAGS(BADI, CSRFL_READONLY),
|
||||
CSR_OFF(EENTRY),
|
||||
CSR_OFF(TLBIDX),
|
||||
CSR_OFF(TLBEHI),
|
||||
CSR_OFF(TLBELO0),
|
||||
CSR_OFF(TLBELO1),
|
||||
CSR_OFF_FLAGS(ASID, CSRFL_EXITTB),
|
||||
CSR_OFF(PGDL),
|
||||
CSR_OFF(PGDH),
|
||||
CSR_OFF_FLAGS(PGD, CSRFL_READONLY),
|
||||
CSR_OFF(PWCL),
|
||||
CSR_OFF(PWCH),
|
||||
CSR_OFF(STLBPS),
|
||||
CSR_OFF(RVACFG),
|
||||
CSR_OFF_FLAGS(CPUID, CSRFL_READONLY),
|
||||
CSR_OFF_FLAGS(PRCFG1, CSRFL_READONLY),
|
||||
CSR_OFF_FLAGS(PRCFG2, CSRFL_READONLY),
|
||||
CSR_OFF_FLAGS(PRCFG3, CSRFL_READONLY),
|
||||
CSR_OFF_ARRAY(SAVE, 0),
|
||||
CSR_OFF_ARRAY(SAVE, 1),
|
||||
CSR_OFF_ARRAY(SAVE, 2),
|
||||
CSR_OFF_ARRAY(SAVE, 3),
|
||||
CSR_OFF_ARRAY(SAVE, 4),
|
||||
CSR_OFF_ARRAY(SAVE, 5),
|
||||
CSR_OFF_ARRAY(SAVE, 6),
|
||||
CSR_OFF_ARRAY(SAVE, 7),
|
||||
CSR_OFF_ARRAY(SAVE, 8),
|
||||
CSR_OFF_ARRAY(SAVE, 9),
|
||||
CSR_OFF_ARRAY(SAVE, 10),
|
||||
CSR_OFF_ARRAY(SAVE, 11),
|
||||
CSR_OFF_ARRAY(SAVE, 12),
|
||||
CSR_OFF_ARRAY(SAVE, 13),
|
||||
CSR_OFF_ARRAY(SAVE, 14),
|
||||
CSR_OFF_ARRAY(SAVE, 15),
|
||||
CSR_OFF(TID),
|
||||
CSR_OFF_FLAGS(TCFG, CSRFL_IO),
|
||||
CSR_OFF_FLAGS(TVAL, CSRFL_READONLY | CSRFL_IO),
|
||||
CSR_OFF(CNTC),
|
||||
CSR_OFF_FLAGS(TICLR, CSRFL_IO),
|
||||
CSR_OFF(LLBCTL),
|
||||
CSR_OFF(IMPCTL1),
|
||||
CSR_OFF(IMPCTL2),
|
||||
CSR_OFF(TLBRENTRY),
|
||||
CSR_OFF(TLBRBADV),
|
||||
CSR_OFF(TLBRERA),
|
||||
CSR_OFF(TLBRSAVE),
|
||||
CSR_OFF(TLBRELO0),
|
||||
CSR_OFF(TLBRELO1),
|
||||
CSR_OFF(TLBREHI),
|
||||
CSR_OFF(TLBRPRMD),
|
||||
CSR_OFF(MERRCTL),
|
||||
CSR_OFF(MERRINFO1),
|
||||
CSR_OFF(MERRINFO2),
|
||||
CSR_OFF(MERRENTRY),
|
||||
CSR_OFF(MERRERA),
|
||||
CSR_OFF(MERRSAVE),
|
||||
CSR_OFF(CTAG),
|
||||
CSR_OFF_ARRAY(DMW, 0),
|
||||
CSR_OFF_ARRAY(DMW, 1),
|
||||
CSR_OFF_ARRAY(DMW, 2),
|
||||
CSR_OFF_ARRAY(DMW, 3),
|
||||
CSR_OFF(DBG),
|
||||
CSR_OFF(DERA),
|
||||
CSR_OFF(DSAVE),
|
||||
};
|
||||
|
||||
CSRInfo *get_csr(unsigned int csr_num)
|
||||
{
|
||||
CSRInfo *csr;
|
||||
|
||||
if (csr_num >= ARRAY_SIZE(csr_info)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
csr = &csr_info[csr_num];
|
||||
if (csr->offset == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return csr;
|
||||
}
|
@ -22,4 +22,5 @@ typedef struct {
|
||||
GenCSRFunc writefn;
|
||||
} CSRInfo;
|
||||
|
||||
CSRInfo *get_csr(unsigned int csr_num);
|
||||
#endif /* TARGET_LOONGARCH_CSR_H */
|
||||
|
@ -10,6 +10,7 @@ loongarch_system_ss = ss.source_set()
|
||||
loongarch_system_ss.add(files(
|
||||
'arch_dump.c',
|
||||
'cpu_helper.c',
|
||||
'csr.c',
|
||||
'loongarch-qmp-cmds.c',
|
||||
'machine.c',
|
||||
))
|
||||
|
@ -45,99 +45,6 @@ GEN_FALSE_TRANS(idle)
|
||||
typedef void (*GenCSRRead)(TCGv dest, TCGv_ptr env);
|
||||
typedef void (*GenCSRWrite)(TCGv dest, TCGv_ptr env, TCGv src);
|
||||
|
||||
#define CSR_OFF_FUNCS(NAME, FL, RD, WR) \
|
||||
[LOONGARCH_CSR_##NAME] = { \
|
||||
.offset = offsetof(CPULoongArchState, CSR_##NAME), \
|
||||
.flags = FL, .readfn = RD, .writefn = WR \
|
||||
}
|
||||
|
||||
#define CSR_OFF_ARRAY(NAME, N) \
|
||||
[LOONGARCH_CSR_##NAME(N)] = { \
|
||||
.offset = offsetof(CPULoongArchState, CSR_##NAME[N]), \
|
||||
.flags = 0, .readfn = NULL, .writefn = NULL \
|
||||
}
|
||||
|
||||
#define CSR_OFF_FLAGS(NAME, FL) \
|
||||
CSR_OFF_FUNCS(NAME, FL, NULL, NULL)
|
||||
|
||||
#define CSR_OFF(NAME) \
|
||||
CSR_OFF_FLAGS(NAME, 0)
|
||||
|
||||
static CSRInfo csr_info[] = {
|
||||
CSR_OFF_FLAGS(CRMD, CSRFL_EXITTB),
|
||||
CSR_OFF(PRMD),
|
||||
CSR_OFF_FLAGS(EUEN, CSRFL_EXITTB),
|
||||
CSR_OFF_FLAGS(MISC, CSRFL_READONLY),
|
||||
CSR_OFF(ECFG),
|
||||
CSR_OFF_FLAGS(ESTAT, CSRFL_EXITTB),
|
||||
CSR_OFF(ERA),
|
||||
CSR_OFF(BADV),
|
||||
CSR_OFF_FLAGS(BADI, CSRFL_READONLY),
|
||||
CSR_OFF(EENTRY),
|
||||
CSR_OFF(TLBIDX),
|
||||
CSR_OFF(TLBEHI),
|
||||
CSR_OFF(TLBELO0),
|
||||
CSR_OFF(TLBELO1),
|
||||
CSR_OFF_FLAGS(ASID, CSRFL_EXITTB),
|
||||
CSR_OFF(PGDL),
|
||||
CSR_OFF(PGDH),
|
||||
CSR_OFF_FLAGS(PGD, CSRFL_READONLY),
|
||||
CSR_OFF(PWCL),
|
||||
CSR_OFF(PWCH),
|
||||
CSR_OFF(STLBPS),
|
||||
CSR_OFF(RVACFG),
|
||||
CSR_OFF_FLAGS(CPUID, CSRFL_READONLY),
|
||||
CSR_OFF_FLAGS(PRCFG1, CSRFL_READONLY),
|
||||
CSR_OFF_FLAGS(PRCFG2, CSRFL_READONLY),
|
||||
CSR_OFF_FLAGS(PRCFG3, CSRFL_READONLY),
|
||||
CSR_OFF_ARRAY(SAVE, 0),
|
||||
CSR_OFF_ARRAY(SAVE, 1),
|
||||
CSR_OFF_ARRAY(SAVE, 2),
|
||||
CSR_OFF_ARRAY(SAVE, 3),
|
||||
CSR_OFF_ARRAY(SAVE, 4),
|
||||
CSR_OFF_ARRAY(SAVE, 5),
|
||||
CSR_OFF_ARRAY(SAVE, 6),
|
||||
CSR_OFF_ARRAY(SAVE, 7),
|
||||
CSR_OFF_ARRAY(SAVE, 8),
|
||||
CSR_OFF_ARRAY(SAVE, 9),
|
||||
CSR_OFF_ARRAY(SAVE, 10),
|
||||
CSR_OFF_ARRAY(SAVE, 11),
|
||||
CSR_OFF_ARRAY(SAVE, 12),
|
||||
CSR_OFF_ARRAY(SAVE, 13),
|
||||
CSR_OFF_ARRAY(SAVE, 14),
|
||||
CSR_OFF_ARRAY(SAVE, 15),
|
||||
CSR_OFF(TID),
|
||||
CSR_OFF_FLAGS(TCFG, CSRFL_IO),
|
||||
CSR_OFF_FLAGS(TVAL, CSRFL_READONLY | CSRFL_IO),
|
||||
CSR_OFF(CNTC),
|
||||
CSR_OFF_FLAGS(TICLR, CSRFL_IO),
|
||||
CSR_OFF(LLBCTL),
|
||||
CSR_OFF(IMPCTL1),
|
||||
CSR_OFF(IMPCTL2),
|
||||
CSR_OFF(TLBRENTRY),
|
||||
CSR_OFF(TLBRBADV),
|
||||
CSR_OFF(TLBRERA),
|
||||
CSR_OFF(TLBRSAVE),
|
||||
CSR_OFF(TLBRELO0),
|
||||
CSR_OFF(TLBRELO1),
|
||||
CSR_OFF(TLBREHI),
|
||||
CSR_OFF(TLBRPRMD),
|
||||
CSR_OFF(MERRCTL),
|
||||
CSR_OFF(MERRINFO1),
|
||||
CSR_OFF(MERRINFO2),
|
||||
CSR_OFF(MERRENTRY),
|
||||
CSR_OFF(MERRERA),
|
||||
CSR_OFF(MERRSAVE),
|
||||
CSR_OFF(CTAG),
|
||||
CSR_OFF_ARRAY(DMW, 0),
|
||||
CSR_OFF_ARRAY(DMW, 1),
|
||||
CSR_OFF_ARRAY(DMW, 2),
|
||||
CSR_OFF_ARRAY(DMW, 3),
|
||||
CSR_OFF(DBG),
|
||||
CSR_OFF(DERA),
|
||||
CSR_OFF(DSAVE),
|
||||
};
|
||||
|
||||
static bool check_plv(DisasContext *ctx)
|
||||
{
|
||||
if (ctx->plv == MMU_PLV_USER) {
|
||||
@ -147,20 +54,6 @@ static bool check_plv(DisasContext *ctx)
|
||||
return false;
|
||||
}
|
||||
|
||||
static CSRInfo *get_csr(unsigned csr_num)
|
||||
{
|
||||
CSRInfo *csr;
|
||||
|
||||
if (csr_num >= ARRAY_SIZE(csr_info)) {
|
||||
return NULL;
|
||||
}
|
||||
csr = &csr_info[csr_num];
|
||||
if (csr->offset == 0) {
|
||||
return NULL;
|
||||
}
|
||||
return csr;
|
||||
}
|
||||
|
||||
static bool set_csr_trans_func(unsigned int csr_num, GenCSRRead readfn,
|
||||
GenCSRWrite writefn)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user