pub(crate) fn csr_name(csr: u16) -> Option<&'static str> {
Some(match csr {
0x001 => "fflags",
0x002 => "frm",
0x003 => "fcsr",
0x007 => "utvt",
0x008 => "vstart",
0x009 => "vxsat",
0x00a => "vxrm",
0x00f => "vcsr",
0x011 => "ssp",
0x015 => "seed",
0x017 => "jvt",
0x045 => "unxti",
0x046 => "uintstatus",
0x048 => "uscratchcsw",
0x049 => "uscratchcswl",
0x100 => "sstatus",
0x104 => "sie",
0x105 => "stvec",
0x106 => "scounteren",
0x107 => "stvt",
0x10a => "senvcfg",
0x10c => "sstateen0",
0x10d => "sstateen1",
0x10e => "sstateen2",
0x10f => "sstateen3",
0x114 => "sieh",
0x120 => "scountinhibit",
0x140 => "sscratch",
0x141 => "sepc",
0x142 => "scause",
0x143 => "stval",
0x144 => "sip",
0x145 => "snxti",
0x146 => "sintstatus",
0x148 => "sscratchcsw",
0x149 => "sscratchcswl",
0x14d => "stimecmp",
0x14e => "sctrctl",
0x14f => "sctrstatus",
0x150 => "siselect",
0x151 => "sireg",
0x152 => "sireg2",
0x153 => "sireg3",
0x154 => "siph",
0x155 => "sireg4",
0x156 => "sireg5",
0x157 => "sireg6",
0x15c => "stopei",
0x15d => "stimecmph",
0x15f => "sctrdepth",
0x180 => "satp",
0x181 => "srmcfg",
0x183 => "spmpen",
0x193 => "spmpenh",
0x200 => "vsstatus",
0x204 => "vsie",
0x205 => "vstvec",
0x214 => "vsieh",
0x240 => "vsscratch",
0x241 => "vsepc",
0x242 => "vscause",
0x243 => "vstval",
0x244 => "vsip",
0x24d => "vstimecmp",
0x24e => "vsctrctl",
0x250 => "vsiselect",
0x251 => "vsireg",
0x252 => "vsireg2",
0x253 => "vsireg3",
0x254 => "vsiph",
0x255 => "vsireg4",
0x256 => "vsireg5",
0x257 => "vsireg6",
0x25c => "vstopei",
0x25d => "vstimecmph",
0x280 => "vsatp",
0x300 => "mstatus",
0x301 => "misa",
0x302 => "medeleg",
0x303 => "mideleg",
0x304 => "mie",
0x305 => "mtvec",
0x306 => "mcounteren",
0x307 => "mtvt",
0x308 => "mvien",
0x309 => "mvip",
0x30a => "menvcfg",
0x30c => "mstateen0",
0x30d => "mstateen1",
0x30e => "mstateen2",
0x30f => "mstateen3",
0x310 => "mstatush",
0x312 => "medelegh",
0x313 => "midelegh",
0x314 => "mieh",
0x316 => "mpmpdeleg",
0x318 => "mvienh",
0x319 => "mviph",
0x31a => "menvcfgh",
0x31c => "mstateen0h",
0x31d => "mstateen1h",
0x31e => "mstateen2h",
0x31f => "mstateen3h",
0x320 => "mcountinhibit",
0x321 => "mcyclecfg",
0x322 => "minstretcfg",
0x323 => "mhpmevent3",
0x324 => "mhpmevent4",
0x325 => "mhpmevent5",
0x326 => "mhpmevent6",
0x327 => "mhpmevent7",
0x328 => "mhpmevent8",
0x329 => "mhpmevent9",
0x32a => "mhpmevent10",
0x32b => "mhpmevent11",
0x32c => "mhpmevent12",
0x32d => "mhpmevent13",
0x32e => "mhpmevent14",
0x32f => "mhpmevent15",
0x330 => "mhpmevent16",
0x331 => "mhpmevent17",
0x332 => "mhpmevent18",
0x333 => "mhpmevent19",
0x334 => "mhpmevent20",
0x335 => "mhpmevent21",
0x336 => "mhpmevent22",
0x337 => "mhpmevent23",
0x338 => "mhpmevent24",
0x339 => "mhpmevent25",
0x33a => "mhpmevent26",
0x33b => "mhpmevent27",
0x33c => "mhpmevent28",
0x33d => "mhpmevent29",
0x33e => "mhpmevent30",
0x33f => "mhpmevent31",
0x340 => "mscratch",
0x341 => "mepc",
0x342 => "mcause",
0x343 => "mtval",
0x344 => "mip",
0x345 => "mnxti",
0x346 => "mintstatus",
0x348 => "mscratchcsw",
0x349 => "mscratchcswl",
0x34a => "mtinst",
0x34b => "mtval2",
0x34e => "mctrctl",
0x350 => "miselect",
0x351 => "mireg",
0x352 => "mireg2",
0x353 => "mireg3",
0x354 => "miph",
0x355 => "mireg4",
0x356 => "mireg5",
0x357 => "mireg6",
0x35c => "mtopei",
0x3a0 => "pmpcfg0",
0x3a1 => "pmpcfg1",
0x3a2 => "pmpcfg2",
0x3a3 => "pmpcfg3",
0x3a4 => "pmpcfg4",
0x3a5 => "pmpcfg5",
0x3a6 => "pmpcfg6",
0x3a7 => "pmpcfg7",
0x3a8 => "pmpcfg8",
0x3a9 => "pmpcfg9",
0x3aa => "pmpcfg10",
0x3ab => "pmpcfg11",
0x3ac => "pmpcfg12",
0x3ad => "pmpcfg13",
0x3ae => "pmpcfg14",
0x3af => "pmpcfg15",
0x3b0 => "pmpaddr0",
0x3b1 => "pmpaddr1",
0x3b2 => "pmpaddr2",
0x3b3 => "pmpaddr3",
0x3b4 => "pmpaddr4",
0x3b5 => "pmpaddr5",
0x3b6 => "pmpaddr6",
0x3b7 => "pmpaddr7",
0x3b8 => "pmpaddr8",
0x3b9 => "pmpaddr9",
0x3ba => "pmpaddr10",
0x3bb => "pmpaddr11",
0x3bc => "pmpaddr12",
0x3bd => "pmpaddr13",
0x3be => "pmpaddr14",
0x3bf => "pmpaddr15",
0x3c0 => "pmpaddr16",
0x3c1 => "pmpaddr17",
0x3c2 => "pmpaddr18",
0x3c3 => "pmpaddr19",
0x3c4 => "pmpaddr20",
0x3c5 => "pmpaddr21",
0x3c6 => "pmpaddr22",
0x3c7 => "pmpaddr23",
0x3c8 => "pmpaddr24",
0x3c9 => "pmpaddr25",
0x3ca => "pmpaddr26",
0x3cb => "pmpaddr27",
0x3cc => "pmpaddr28",
0x3cd => "pmpaddr29",
0x3ce => "pmpaddr30",
0x3cf => "pmpaddr31",
0x3d0 => "pmpaddr32",
0x3d1 => "pmpaddr33",
0x3d2 => "pmpaddr34",
0x3d3 => "pmpaddr35",
0x3d4 => "pmpaddr36",
0x3d5 => "pmpaddr37",
0x3d6 => "pmpaddr38",
0x3d7 => "pmpaddr39",
0x3d8 => "pmpaddr40",
0x3d9 => "pmpaddr41",
0x3da => "pmpaddr42",
0x3db => "pmpaddr43",
0x3dc => "pmpaddr44",
0x3dd => "pmpaddr45",
0x3de => "pmpaddr46",
0x3df => "pmpaddr47",
0x3e0 => "pmpaddr48",
0x3e1 => "pmpaddr49",
0x3e2 => "pmpaddr50",
0x3e3 => "pmpaddr51",
0x3e4 => "pmpaddr52",
0x3e5 => "pmpaddr53",
0x3e6 => "pmpaddr54",
0x3e7 => "pmpaddr55",
0x3e8 => "pmpaddr56",
0x3e9 => "pmpaddr57",
0x3ea => "pmpaddr58",
0x3eb => "pmpaddr59",
0x3ec => "pmpaddr60",
0x3ed => "pmpaddr61",
0x3ee => "pmpaddr62",
0x3ef => "pmpaddr63",
0x5a8 => "scontext",
0x600 => "hstatus",
0x602 => "hedeleg",
0x603 => "hideleg",
0x604 => "hie",
0x605 => "htimedelta",
0x606 => "hcounteren",
0x607 => "hgeie",
0x608 => "hvien",
0x609 => "hvictl",
0x60a => "henvcfg",
0x60c => "hstateen0",
0x60d => "hstateen1",
0x60e => "hstateen2",
0x60f => "hstateen3",
0x612 => "hedelegh",
0x613 => "hidelegh",
0x615 => "htimedeltah",
0x618 => "hvienh",
0x61a => "henvcfgh",
0x61c => "hstateen0h",
0x61d => "hstateen1h",
0x61e => "hstateen2h",
0x61f => "hstateen3h",
0x643 => "htval",
0x644 => "hip",
0x645 => "hvip",
0x646 => "hviprio1",
0x647 => "hviprio2",
0x64a => "htinst",
0x655 => "hviph",
0x656 => "hviprio1h",
0x657 => "hviprio2h",
0x680 => "hgatp",
0x6a8 => "hcontext",
0x721 => "mcyclecfgh",
0x722 => "minstretcfgh",
0x723 => "mhpmevent3h",
0x724 => "mhpmevent4h",
0x725 => "mhpmevent5h",
0x726 => "mhpmevent6h",
0x727 => "mhpmevent7h",
0x728 => "mhpmevent8h",
0x729 => "mhpmevent9h",
0x72a => "mhpmevent10h",
0x72b => "mhpmevent11h",
0x72c => "mhpmevent12h",
0x72d => "mhpmevent13h",
0x72e => "mhpmevent14h",
0x72f => "mhpmevent15h",
0x730 => "mhpmevent16h",
0x731 => "mhpmevent17h",
0x732 => "mhpmevent18h",
0x733 => "mhpmevent19h",
0x734 => "mhpmevent20h",
0x735 => "mhpmevent21h",
0x736 => "mhpmevent22h",
0x737 => "mhpmevent23h",
0x738 => "mhpmevent24h",
0x739 => "mhpmevent25h",
0x73a => "mhpmevent26h",
0x73b => "mhpmevent27h",
0x73c => "mhpmevent28h",
0x73d => "mhpmevent29h",
0x73e => "mhpmevent30h",
0x73f => "mhpmevent31h",
0x740 => "mnscratch",
0x741 => "mnepc",
0x742 => "mncause",
0x744 => "mnstatus",
0x747 => "mseccfg",
0x757 => "mseccfgh",
0x7a0 => "tselect",
0x7a1 => "tdata1",
0x7a2 => "tdata2",
0x7a3 => "tdata3",
0x7a4 => "tinfo",
0x7a5 => "tcontrol",
0x7a8 => "mcontext",
0x7aa => "mscontext",
0x7b0 => "dcsr",
0x7b1 => "dpc",
0x7b2 => "dscratch0",
0x7b3 => "dscratch1",
0xb00 => "mcycle",
0xb02 => "minstret",
0xb03 => "mhpmcounter3",
0xb04 => "mhpmcounter4",
0xb05 => "mhpmcounter5",
0xb06 => "mhpmcounter6",
0xb07 => "mhpmcounter7",
0xb08 => "mhpmcounter8",
0xb09 => "mhpmcounter9",
0xb0a => "mhpmcounter10",
0xb0b => "mhpmcounter11",
0xb0c => "mhpmcounter12",
0xb0d => "mhpmcounter13",
0xb0e => "mhpmcounter14",
0xb0f => "mhpmcounter15",
0xb10 => "mhpmcounter16",
0xb11 => "mhpmcounter17",
0xb12 => "mhpmcounter18",
0xb13 => "mhpmcounter19",
0xb14 => "mhpmcounter20",
0xb15 => "mhpmcounter21",
0xb16 => "mhpmcounter22",
0xb17 => "mhpmcounter23",
0xb18 => "mhpmcounter24",
0xb19 => "mhpmcounter25",
0xb1a => "mhpmcounter26",
0xb1b => "mhpmcounter27",
0xb1c => "mhpmcounter28",
0xb1d => "mhpmcounter29",
0xb1e => "mhpmcounter30",
0xb1f => "mhpmcounter31",
0xb80 => "mcycleh",
0xb82 => "minstreth",
0xb83 => "mhpmcounter3h",
0xb84 => "mhpmcounter4h",
0xb85 => "mhpmcounter5h",
0xb86 => "mhpmcounter6h",
0xb87 => "mhpmcounter7h",
0xb88 => "mhpmcounter8h",
0xb89 => "mhpmcounter9h",
0xb8a => "mhpmcounter10h",
0xb8b => "mhpmcounter11h",
0xb8c => "mhpmcounter12h",
0xb8d => "mhpmcounter13h",
0xb8e => "mhpmcounter14h",
0xb8f => "mhpmcounter15h",
0xb90 => "mhpmcounter16h",
0xb91 => "mhpmcounter17h",
0xb92 => "mhpmcounter18h",
0xb93 => "mhpmcounter19h",
0xb94 => "mhpmcounter20h",
0xb95 => "mhpmcounter21h",
0xb96 => "mhpmcounter22h",
0xb97 => "mhpmcounter23h",
0xb98 => "mhpmcounter24h",
0xb99 => "mhpmcounter25h",
0xb9a => "mhpmcounter26h",
0xb9b => "mhpmcounter27h",
0xb9c => "mhpmcounter28h",
0xb9d => "mhpmcounter29h",
0xb9e => "mhpmcounter30h",
0xb9f => "mhpmcounter31h",
0xc00 => "cycle",
0xc01 => "time",
0xc02 => "instret",
0xc03 => "hpmcounter3",
0xc04 => "hpmcounter4",
0xc05 => "hpmcounter5",
0xc06 => "hpmcounter6",
0xc07 => "hpmcounter7",
0xc08 => "hpmcounter8",
0xc09 => "hpmcounter9",
0xc0a => "hpmcounter10",
0xc0b => "hpmcounter11",
0xc0c => "hpmcounter12",
0xc0d => "hpmcounter13",
0xc0e => "hpmcounter14",
0xc0f => "hpmcounter15",
0xc10 => "hpmcounter16",
0xc11 => "hpmcounter17",
0xc12 => "hpmcounter18",
0xc13 => "hpmcounter19",
0xc14 => "hpmcounter20",
0xc15 => "hpmcounter21",
0xc16 => "hpmcounter22",
0xc17 => "hpmcounter23",
0xc18 => "hpmcounter24",
0xc19 => "hpmcounter25",
0xc1a => "hpmcounter26",
0xc1b => "hpmcounter27",
0xc1c => "hpmcounter28",
0xc1d => "hpmcounter29",
0xc1e => "hpmcounter30",
0xc1f => "hpmcounter31",
0xc20 => "vl",
0xc21 => "vtype",
0xc22 => "vlenb",
0xc23 => "mtype",
0xc80 => "cycleh",
0xc81 => "timeh",
0xc82 => "instreth",
0xc83 => "hpmcounter3h",
0xc84 => "hpmcounter4h",
0xc85 => "hpmcounter5h",
0xc86 => "hpmcounter6h",
0xc87 => "hpmcounter7h",
0xc88 => "hpmcounter8h",
0xc89 => "hpmcounter9h",
0xc8a => "hpmcounter10h",
0xc8b => "hpmcounter11h",
0xc8c => "hpmcounter12h",
0xc8d => "hpmcounter13h",
0xc8e => "hpmcounter14h",
0xc8f => "hpmcounter15h",
0xc90 => "hpmcounter16h",
0xc91 => "hpmcounter17h",
0xc92 => "hpmcounter18h",
0xc93 => "hpmcounter19h",
0xc94 => "hpmcounter20h",
0xc95 => "hpmcounter21h",
0xc96 => "hpmcounter22h",
0xc97 => "hpmcounter23h",
0xc98 => "hpmcounter24h",
0xc99 => "hpmcounter25h",
0xc9a => "hpmcounter26h",
0xc9b => "hpmcounter27h",
0xc9c => "hpmcounter28h",
0xc9d => "hpmcounter29h",
0xc9e => "hpmcounter30h",
0xc9f => "hpmcounter31h",
0xda0 => "scountovf",
0xdb0 => "stopi",
0xe12 => "hgeip",
0xeb0 => "vstopi",
0xf11 => "mvendorid",
0xf12 => "marchid",
0xf13 => "mimpid",
0xf14 => "mhartid",
0xf15 => "mconfigptr",
0xfb0 => "mtopi",
_ => return None,
})
}
#[cfg(test)]
mod tests {
use super::csr_name;
#[test]
fn names_are_unique() {
let mut names: [Option<&str>; 0x1000] = [None; 0x1000];
for (csr, slot) in names.iter_mut().enumerate() {
*slot = csr_name(csr as u16);
}
names.sort_unstable();
for pair in names.windows(2) {
assert!(
pair[0].is_none() || pair[0] != pair[1],
"duplicate CSR name {:?}",
pair[0]
);
}
}
}