blob: 822e25e346daf2c8366371bcdc8bd58ff689fbea [file] [log] [blame]
/*
* MIPS-specific CSRs.
*
* Copyright (c) 2025 MIPS
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
*/
#include "qemu/osdep.h"
#include "cpu.h"
#include "cpu_vendorid.h"
/* Static MIPS CSR state storage */
static struct {
uint64_t tvec;
uint64_t config[12];
uint64_t pmacfg[16];
} mips_csr_state;
/* MIPS CSR */
#define CSR_MIPSTVEC 0x7c0
#define CSR_MIPSCONFIG0 0x7d0
#define CSR_MIPSCONFIG1 0x7d1
#define CSR_MIPSCONFIG2 0x7d2
#define CSR_MIPSCONFIG3 0x7d3
#define CSR_MIPSCONFIG4 0x7d4
#define CSR_MIPSCONFIG5 0x7d5
#define CSR_MIPSCONFIG6 0x7d6
#define CSR_MIPSCONFIG7 0x7d7
#define CSR_MIPSCONFIG8 0x7d8
#define CSR_MIPSCONFIG9 0x7d9
#define CSR_MIPSCONFIG10 0x7da
#define CSR_MIPSCONFIG11 0x7db
#define CSR_MIPSPMACFG0 0x7e0
#define CSR_MIPSPMACFG1 0x7e1
#define CSR_MIPSPMACFG2 0x7e2
#define CSR_MIPSPMACFG3 0x7e3
#define CSR_MIPSPMACFG4 0x7e4
#define CSR_MIPSPMACFG5 0x7e5
#define CSR_MIPSPMACFG6 0x7e6
#define CSR_MIPSPMACFG7 0x7e7
#define CSR_MIPSPMACFG8 0x7e8
#define CSR_MIPSPMACFG9 0x7e9
#define CSR_MIPSPMACFG10 0x7ea
#define CSR_MIPSPMACFG11 0x7eb
#define CSR_MIPSPMACFG12 0x7ec
#define CSR_MIPSPMACFG13 0x7ed
#define CSR_MIPSPMACFG14 0x7ee
#define CSR_MIPSPMACFG15 0x7ef
static RISCVException any(CPURISCVState *env, int csrno)
{
return RISCV_EXCP_NONE;
}
static RISCVException read_mipstvec(CPURISCVState *env, int csrno,
target_ulong *val)
{
*val = mips_csr_state.tvec;
return RISCV_EXCP_NONE;
}
static RISCVException write_mipstvec(CPURISCVState *env, int csrno,
target_ulong val, uintptr_t ra)
{
mips_csr_state.tvec = val;
return RISCV_EXCP_NONE;
}
static RISCVException read_mipsconfig(CPURISCVState *env, int csrno,
target_ulong *val)
{
*val = mips_csr_state.config[csrno - CSR_MIPSCONFIG0];
return RISCV_EXCP_NONE;
}
static RISCVException write_mipsconfig(CPURISCVState *env, int csrno,
target_ulong val, uintptr_t ra)
{
mips_csr_state.config[csrno - CSR_MIPSCONFIG0] = val;
return RISCV_EXCP_NONE;
}
static RISCVException read_mipspmacfg(CPURISCVState *env, int csrno,
target_ulong *val)
{
*val = mips_csr_state.pmacfg[csrno - CSR_MIPSPMACFG0];
return RISCV_EXCP_NONE;
}
static RISCVException write_mipspmacfg(CPURISCVState *env, int csrno,
target_ulong val, uintptr_t ra)
{
mips_csr_state.pmacfg[csrno - CSR_MIPSPMACFG0] = val;
return RISCV_EXCP_NONE;
}
const RISCVCSR mips_csr_list[] = {
{
.csrno = CSR_MIPSTVEC,
.csr_ops = { "mipstvec", any, read_mipstvec, write_mipstvec }
},
{
.csrno = CSR_MIPSCONFIG0,
.csr_ops = { "mipsconfig0", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSCONFIG1,
.csr_ops = { "mipsconfig1", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSCONFIG2,
.csr_ops = { "mipsconfig2", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSCONFIG3,
.csr_ops = { "mipsconfig3", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSCONFIG4,
.csr_ops = { "mipsconfig4", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSCONFIG5,
.csr_ops = { "mipsconfig5", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSCONFIG6,
.csr_ops = { "mipsconfig6", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSCONFIG7,
.csr_ops = { "mipsconfig7", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSCONFIG8,
.csr_ops = { "mipsconfig8", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSCONFIG9,
.csr_ops = { "mipsconfig9", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSCONFIG10,
.csr_ops = { "mipsconfig10", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSCONFIG11,
.csr_ops = { "mipsconfig11", any, read_mipsconfig, write_mipsconfig }
},
{
.csrno = CSR_MIPSPMACFG0,
.csr_ops = { "mipspmacfg0", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG1,
.csr_ops = { "mipspmacfg1", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG2,
.csr_ops = { "mipspmacfg2", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG3,
.csr_ops = { "mipspmacfg3", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG4,
.csr_ops = { "mipspmacfg4", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG5,
.csr_ops = { "mipspmacfg5", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG6,
.csr_ops = { "mipspmacfg6", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG7,
.csr_ops = { "mipspmacfg7", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG8,
.csr_ops = { "mipspmacfg8", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG9,
.csr_ops = { "mipspmacfg9", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG10,
.csr_ops = { "mipspmacfg10", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG11,
.csr_ops = { "mipspmacfg11", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG12,
.csr_ops = { "mipspmacfg12", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG13,
.csr_ops = { "mipspmacfg13", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG14,
.csr_ops = { "mipspmacfg14", any, read_mipspmacfg, write_mipspmacfg }
},
{
.csrno = CSR_MIPSPMACFG15,
.csr_ops = { "mipspmacfg15", any, read_mipspmacfg, write_mipspmacfg }
},
{ },
};