@@ -109,27 +109,13 @@ function readCSR csr : csreg -> xlenbits = {
109109 (0x343 , _ ) => mtval ,
110110 (0x344 , _ ) => mip . bits ,
111111
112- (0x3A0 , _ ) => pmpReadCfgReg (0 ), // pmpcfg0
113- (0x3A1 , 32 ) => pmpReadCfgReg (1 ), // pmpcfg1
114- (0x3A2 , _ ) => pmpReadCfgReg (2 ), // pmpcfg2
115- (0x3A3 , 32 ) => pmpReadCfgReg (3 ), // pmpcfg3
116-
117- (0x3B0 , _ ) => pmpaddr0 ,
118- (0x3B1 , _ ) => pmpaddr1 ,
119- (0x3B2 , _ ) => pmpaddr2 ,
120- (0x3B3 , _ ) => pmpaddr3 ,
121- (0x3B4 , _ ) => pmpaddr4 ,
122- (0x3B5 , _ ) => pmpaddr5 ,
123- (0x3B6 , _ ) => pmpaddr6 ,
124- (0x3B7 , _ ) => pmpaddr7 ,
125- (0x3B8 , _ ) => pmpaddr8 ,
126- (0x3B9 , _ ) => pmpaddr9 ,
127- (0x3BA , _ ) => pmpaddr10 ,
128- (0x3BB , _ ) => pmpaddr11 ,
129- (0x3BC , _ ) => pmpaddr12 ,
130- (0x3BD , _ ) => pmpaddr13 ,
131- (0x3BE , _ ) => pmpaddr14 ,
132- (0x3BF , _ ) => pmpaddr15 ,
112+ // pmpcfgN
113+ (0x3A @ idx : bits (4 ), _ ) if idx [0 ] == bitzero | sizeof (xlen ) == 32 => pmpReadCfgReg (unsigned (idx )),
114+ // pmpaddrN. Unfortunately the PMP index does not nicely align with the CSR index bits.
115+ (0x3B @ idx : bits (4 ), _ ) => pmpReadAddrReg (unsigned (0b00 @ idx )),
116+ (0x3C @ idx : bits (4 ), _ ) => pmpReadAddrReg (unsigned (0b01 @ idx )),
117+ (0x3D @ idx : bits (4 ), _ ) => pmpReadAddrReg (unsigned (0b10 @ idx )),
118+ (0x3E @ idx : bits (4 ), _ ) => pmpReadAddrReg (unsigned (0b11 @ idx )),
133119
134120 /* machine mode counters */
135121 (0xB00 , _ ) => mcycle [(sizeof (xlen ) - 1 ) .. 0 ],
@@ -209,28 +195,17 @@ function writeCSR (csr : csreg, value : xlenbits) -> unit = {
209195 (0x343 , _ ) => { mtval = value ; Some (mtval ) },
210196 (0x344 , _ ) => { mip = legalize_mip (mip , value ); Some (mip . bits ) },
211197
212- // Note: Some(value) returned below is not the legalized value due to locked entries
213- (0x3A0 , _ ) => { pmpWriteCfgReg ( 0 , value ); Some ( pmpReadCfgReg ( 0 )) } , // pmpcfg0
214- ( 0x3A1 , 32 ) => { pmpWriteCfgReg ( 1 , value ); Some ( pmpReadCfgReg ( 1 )) } , // pmpcfg1
215- ( 0x3A2 , _ ) => { pmpWriteCfgReg (2 , value ); Some (pmpReadCfgReg (2 )) } , // pmpcfg2
216- ( 0x3A3 , 32 ) => { pmpWriteCfgReg ( 3 , value ); Some ( pmpReadCfgReg ( 3 )) } , // pmpcfg3
198+ // pmpcfgN
199+ (0x3A @ idx : bits ( 4 ) , _ ) if idx [ 0 ] == bitzero | sizeof ( xlen ) == 32 => {
200+ let idx = unsigned ( idx );
201+ pmpWriteCfgReg (idx , value ); Some (pmpReadCfgReg (idx ))
202+ } ,
217203
218- (0x3B0 , _ ) => { pmpaddr0 = pmpWriteAddr (pmpLocked (pmp0cfg ), pmpTORLocked (pmp1cfg ), pmpaddr0 , value ); Some (pmpaddr0 ) },
219- (0x3B1 , _ ) => { pmpaddr1 = pmpWriteAddr (pmpLocked (pmp1cfg ), pmpTORLocked (pmp2cfg ), pmpaddr1 , value ); Some (pmpaddr1 ) },
220- (0x3B2 , _ ) => { pmpaddr2 = pmpWriteAddr (pmpLocked (pmp2cfg ), pmpTORLocked (pmp3cfg ), pmpaddr2 , value ); Some (pmpaddr2 ) },
221- (0x3B3 , _ ) => { pmpaddr3 = pmpWriteAddr (pmpLocked (pmp3cfg ), pmpTORLocked (pmp4cfg ), pmpaddr3 , value ); Some (pmpaddr3 ) },
222- (0x3B4 , _ ) => { pmpaddr4 = pmpWriteAddr (pmpLocked (pmp4cfg ), pmpTORLocked (pmp5cfg ), pmpaddr4 , value ); Some (pmpaddr4 ) },
223- (0x3B5 , _ ) => { pmpaddr5 = pmpWriteAddr (pmpLocked (pmp5cfg ), pmpTORLocked (pmp6cfg ), pmpaddr5 , value ); Some (pmpaddr5 ) },
224- (0x3B6 , _ ) => { pmpaddr6 = pmpWriteAddr (pmpLocked (pmp6cfg ), pmpTORLocked (pmp7cfg ), pmpaddr6 , value ); Some (pmpaddr6 ) },
225- (0x3B7 , _ ) => { pmpaddr7 = pmpWriteAddr (pmpLocked (pmp7cfg ), pmpTORLocked (pmp8cfg ), pmpaddr7 , value ); Some (pmpaddr7 ) },
226- (0x3B8 , _ ) => { pmpaddr8 = pmpWriteAddr (pmpLocked (pmp8cfg ), pmpTORLocked (pmp9cfg ), pmpaddr8 , value ); Some (pmpaddr8 ) },
227- (0x3B9 , _ ) => { pmpaddr9 = pmpWriteAddr (pmpLocked (pmp9cfg ), pmpTORLocked (pmp10cfg ), pmpaddr9 , value ); Some (pmpaddr9 ) },
228- (0x3BA , _ ) => { pmpaddr10 = pmpWriteAddr (pmpLocked (pmp10cfg ), pmpTORLocked (pmp11cfg ), pmpaddr10 , value ); Some (pmpaddr10 ) },
229- (0x3BB , _ ) => { pmpaddr11 = pmpWriteAddr (pmpLocked (pmp11cfg ), pmpTORLocked (pmp12cfg ), pmpaddr11 , value ); Some (pmpaddr11 ) },
230- (0x3BC , _ ) => { pmpaddr12 = pmpWriteAddr (pmpLocked (pmp12cfg ), pmpTORLocked (pmp13cfg ), pmpaddr12 , value ); Some (pmpaddr12 ) },
231- (0x3BD , _ ) => { pmpaddr13 = pmpWriteAddr (pmpLocked (pmp13cfg ), pmpTORLocked (pmp14cfg ), pmpaddr13 , value ); Some (pmpaddr13 ) },
232- (0x3BE , _ ) => { pmpaddr14 = pmpWriteAddr (pmpLocked (pmp14cfg ), pmpTORLocked (pmp15cfg ), pmpaddr14 , value ); Some (pmpaddr14 ) },
233- (0x3BF , _ ) => { pmpaddr15 = pmpWriteAddr (pmpLocked (pmp15cfg ), false , pmpaddr15 , value ); Some (pmpaddr15 ) },
204+ // pmpaddrN. Unfortunately the PMP index does not nicely align with the CSR index bits.
205+ (0x3B @ idx : bits (4 ), _ ) => { let idx = unsigned (0b00 @ idx ); pmpWriteAddrReg (idx , value ); Some (pmpReadAddrReg (idx )) },
206+ (0x3C @ idx : bits (4 ), _ ) => { let idx = unsigned (0b01 @ idx ); pmpWriteAddrReg (idx , value ); Some (pmpReadAddrReg (idx )) },
207+ (0x3D @ idx : bits (4 ), _ ) => { let idx = unsigned (0b10 @ idx ); pmpWriteAddrReg (idx , value ); Some (pmpReadAddrReg (idx )) },
208+ (0x3E @ idx : bits (4 ), _ ) => { let idx = unsigned (0b11 @ idx ); pmpWriteAddrReg (idx , value ); Some (pmpReadAddrReg (idx )) },
234209
235210 /* machine mode counters */
236211 (0xB00 , _ ) => { mcycle [(sizeof (xlen ) - 1 ) .. 0 ] = value ; Some (value ) },
0 commit comments