@@ -202,7 +202,7 @@ void init_pma() {
202
202
{0 },
203
203
{0 },
204
204
};
205
-
205
+
206
206
PMAConfigModule * pmaconfigs = (PMAConfigModule * )malloc (sizeof (PMAConfigModule ));
207
207
for (int i = 0 ; i < CONFIG_RV_PMA_ACTIVE_NUM ; i ++ ) {
208
208
pmaconfigs -> pmaconfigs [i ].base_addr = pmaConfigInit [CONFIG_RV_PMA_ACTIVE_NUM - 1 - i ][0 ];
@@ -674,11 +674,16 @@ static inline word_t* csr_decode(uint32_t addr) {
674
674
#define HSTATEEN0_WMASK MSTATEEN0_WMASK
675
675
#define SSTATEEN0_WMASK SSTATEEN0_CS
676
676
677
+ #define MSTATEENX_WMASK MSTATEEN_HSTATEEN
678
+ #define HSTATEENX_WMASK MSTATEENX_WMASK
679
+ #define SSTATEENX_WMASK 0x0
680
+
677
681
#ifdef CONFIG_RV_SMSTATEEN
678
682
void init_smstateen () {
679
683
mstateen0 -> val = 0 ;
680
- IFDEF (CONFIG_RVH , hstateen0 -> val = 0 );
681
- sstateen0 -> val = 0 ;
684
+ mstateen1 -> val = 0 ;
685
+ mstateen2 -> val = 0 ;
686
+ mstateen3 -> val = 0 ;
682
687
#if defined(CONFIG_RV_AIA ) && !defined(CONFIG_RV_SMCSRIND )
683
688
mstateen0 -> val |= MSTATEEN0_CSRIND ;
684
689
IFDEF (CONFIG_RVH , hstateen0 -> val |= MSTATEEN0_CSRIND );
@@ -1504,7 +1509,7 @@ inline void update_vstopi() {
1504
1509
iidC1C4 = iidOnlyC4 ;
1505
1510
iprioC1C4 = iprioC4 ;
1506
1511
}
1507
-
1512
+
1508
1513
uint16_t iidC1C5 = 0 ;
1509
1514
uint8_t iprioC1C5 = 0 ;
1510
1515
iidC1C5 = hvictl -> dpr ? iidOnlyC1 : iidOnlyC5 ;
@@ -1637,9 +1642,16 @@ static word_t csr_read(uint32_t csrid) {
1637
1642
case CSR_SSTATUS : return sstatus_read (false, false);
1638
1643
1639
1644
#ifdef CONFIG_RV_SMSTATEEN
1640
- case CSR_SSTATEEN0 :
1641
- IFDEF (CONFIG_RVH , if (cpu .v ) return sstateen0 -> val & hstateen0 -> val & mstateen0 -> val );
1642
- return sstateen0 -> val & mstateen0 -> val ;
1645
+ case CSR_SSTATEEN0 ... CSR_SSTATEEN3 :
1646
+ {
1647
+ mstateen1_t * mstateenx = (mstateen1_t * )& csr_array [CSR_MSTATEEN0 + (csrid - CSR_SSTATEEN0 )];
1648
+ sstateen1_t * sstateenx = (sstateen1_t * )& csr_array [CSR_SSTATEEN0 + (csrid - CSR_SSTATEEN0 )];
1649
+ #ifdef CONFIG_RVH
1650
+ hstateen1_t * hstateenx = (hstateen1_t * )& csr_array [CSR_HSTATEEN0 + (csrid - CSR_SSTATEEN0 )];
1651
+ if (cpu .v ) return sstateenx -> val & hstateenx -> val & mstateenx -> val ;
1652
+ #endif // CONFIG_RVH
1653
+ return sstateenx -> val & mstateenx -> val ;
1654
+ }
1643
1655
#endif // CONFIG_RV_SMSTATEEN
1644
1656
1645
1657
case CSR_SIE :
@@ -1671,7 +1683,7 @@ static word_t csr_read(uint32_t csrid) {
1671
1683
#endif // CONFIG_RV_SSTC
1672
1684
#ifdef CONFIG_RV_SSCOFPMF
1673
1685
case CSR_SCOUNTOVF :
1674
- if (cpu .mode == MODE_M ) return scountovf -> val ;
1686
+ if (cpu .mode == MODE_M ) return scountovf -> val ;
1675
1687
IFDEF (CONFIG_RVH , else if (cpu .v && cpu .mode == MODE_S ) return (mcounteren -> val & hcounteren -> val & scountovf -> val ));
1676
1688
else if (cpu .mode == MODE_S ) return (mcounteren - > val & scountovf - > val );
1677
1689
#endif // CONFIG_RV_SSCOFPMF
@@ -1720,7 +1732,12 @@ static word_t csr_read(uint32_t csrid) {
1720
1732
}
1721
1733
1722
1734
#ifdef CONFIG_RV_SMSTATEEN
1723
- case CSR_HSTATEEN0 : return hstateen0 -> val & mstateen0 -> val ;
1735
+ case CSR_HSTATEEN0 ... CSR_HSTATEEN3 :
1736
+ {
1737
+ mstateen1_t * mstateenx = (mstateen1_t * )& csr_array [CSR_MSTATEEN0 + (csrid - CSR_HSTATEEN0 )];
1738
+ hstateen1_t * hstateenx = (hstateen1_t * )& csr_array [CSR_HSTATEEN0 + (csrid - CSR_HSTATEEN0 )];
1739
+ return hstateenx -> val & mstateenx -> val ;
1740
+ }
1724
1741
#endif // CONFIG_RV_SMSTATEEN
1725
1742
1726
1743
case CSR_HIP : return get_hip ();
@@ -1969,6 +1986,8 @@ static void csr_write(uint32_t csrid, word_t src) {
1969
1986
1970
1987
#ifdef CONFIG_RV_SMSTATEEN
1971
1988
case CSR_SSTATEEN0 : * dest = src & SSTATEEN0_WMASK ; break ;
1989
+ case CSR_SSTATEEN1 ... CSR_SSTATEEN3 : * dest = src & SSTATEENX_WMASK ; break ;
1990
+
1972
1991
#endif // CONFIG_RV_SMSTATEEN
1973
1992
1974
1993
case CSR_SIE :
@@ -2145,6 +2164,7 @@ static void csr_write(uint32_t csrid, word_t src) {
2145
2164
2146
2165
#ifdef CONFIG_RV_SMSTATEEN
2147
2166
case CSR_HSTATEEN0 : * dest = src & HSTATEEN0_WMASK ; break ;
2167
+ case CSR_HSTATEEN1 ... CSR_HSTATEEN3 : * dest = src & HSTATEENX_WMASK ; break ;
2148
2168
#endif // CONFIG_RV_SMSTATEEN
2149
2169
2150
2170
case CSR_HGATP :
@@ -2260,6 +2280,7 @@ static void csr_write(uint32_t csrid, word_t src) {
2260
2280
2261
2281
#ifdef CONFIG_RV_SMSTATEEN
2262
2282
case CSR_MSTATEEN0 : * dest = src & MSTATEEN0_WMASK ; break ;
2283
+ case CSR_MSTATEEN1 ... CSR_MSTATEEN3 : * dest = src & MSTATEENX_WMASK ; break ;
2263
2284
#endif // CONFIG_RV_SMSTATEEN
2264
2285
2265
2286
#ifdef CONFIG_RV_CSR_MCOUNTINHIBIT
@@ -2289,7 +2310,7 @@ static void csr_write(uint32_t csrid, word_t src) {
2289
2310
}
2290
2311
#ifdef CONFIG_RV_SSCOFPMF
2291
2312
scountovf -> ofvec = (scountovf -> ofvec & ~(1 << (csrid - CSR_MHPMEVENT_BASE ))) | (new_val .of << (csrid - CSR_MHPMEVENT_BASE ));
2292
- #endif // CONFIG_RV_SSCOFPMF
2313
+ #endif // CONFIG_RV_SSCOFPMF
2293
2314
break ;
2294
2315
}
2295
2316
@@ -2390,7 +2411,7 @@ static void csr_write(uint32_t csrid, word_t src) {
2390
2411
if (idx_base + i >= CONFIG_RV_PMA_ACTIVE_NUM ) {
2391
2412
break ;
2392
2413
}
2393
- word_t oldCfg = pmacfg_from_index (idx_base + i );
2414
+ word_t oldCfg = pmacfg_from_index (idx_base + i );
2394
2415
word_t cfg = ((src >> (i * 8 )) & 0xff );
2395
2416
if ((oldCfg & PMA_L ) == 0 ) {
2396
2417
cfg &= ~PMA_W | ((cfg & PMA_R ) ? PMA_W : 0 );
@@ -2634,13 +2655,18 @@ static inline bool smstateen_extension_permit_check(const uint32_t addr) {
2634
2655
bool has_vi = false;
2635
2656
2636
2657
// SE0 bit 63
2637
- if (is_access (sstateen0 )) {
2638
- if ((cpu .mode < MODE_M ) && (!mstateen0 -> se0 )) { longjmp_exception (EX_II ); }
2639
- IFDEF (CONFIG_RVH , else if (cpu .v && !hstateen0 -> se0 ) { has_vi = true; })
2658
+ if (is_access (sstateen0 ) || is_access (sstateen1 ) || is_access (sstateen2 ) || is_access (sstateen3 )) {
2659
+ mstateen1_t * mstateenx = (mstateen1_t * )& csr_array [CSR_MSTATEEN0 + (addr - CSR_SSTATEEN0 )];
2660
+ #ifdef CONFIG_RVH
2661
+ hstateen1_t * hstateenx = (hstateen1_t * )& csr_array [CSR_HSTATEEN0 + (addr - CSR_SSTATEEN0 )];
2662
+ #endif // CONFIG_RVH
2663
+ if ((cpu .mode < MODE_M ) && (!mstateenx -> se )) { longjmp_exception (EX_II ); }
2664
+ IFDEF (CONFIG_RVH , else if (cpu .v && !hstateenx -> se ) { has_vi = true; })
2640
2665
}
2641
2666
#ifdef CONFIG_RVH
2642
- else if (is_access (hstateen0 )) {
2643
- if ((cpu .mode < MODE_M ) && (!mstateen0 -> se0 )) { longjmp_exception (EX_II ); }
2667
+ else if (is_access (hstateen0 ) || is_access (hstateen1 ) || is_access (hstateen2 ) || is_access (hstateen3 )) {
2668
+ mstateen1_t * mstateenx = (mstateen1_t * )& csr_array [CSR_MSTATEEN0 + (addr - CSR_HSTATEEN0 )];
2669
+ if ((cpu .mode < MODE_M ) && (!mstateenx -> se )) { longjmp_exception (EX_II ); }
2644
2670
}
2645
2671
#endif // CONFIG_RVH
2646
2672
@@ -2659,8 +2685,8 @@ static inline bool smstateen_extension_permit_check(const uint32_t addr) {
2659
2685
// CSRIND bit 60
2660
2686
else if (addr >= CSR_SISELECT && addr <= CSR_SIREG6 ) {
2661
2687
// siph is also within this range, but if the accessed CSR is miph,
2662
- // it will directly raise an illegal instruction exception
2663
- // during the earlier check for the existence of the CSR.
2688
+ // it will directly raise an illegal instruction exception
2689
+ // during the earlier check for the existence of the CSR.
2664
2690
if ((cpu .mode < MODE_M ) && (!mstateen0 -> csrind )) { longjmp_exception (EX_II ); }
2665
2691
IFDEF (CONFIG_RVH , else if (cpu .v && !hstateen0 -> csrind ) { has_vi = true; })
2666
2692
}
@@ -2823,7 +2849,7 @@ static inline bool csrind_permit_check(const uint32_t addr) {
2823
2849
else if (siselect -> val <= ISELECT_MAX_MASK ) {
2824
2850
#ifdef CONFIG_RV_IMSIC
2825
2851
if (
2826
- ((cpu .mode == MODE_S ) && mvien -> seie ) ||
2852
+ ((cpu .mode == MODE_S ) && mvien -> seie ) ||
2827
2853
(siselect -> val > ISELECT_7F_MASK && (siselect -> val & 0x1 ))
2828
2854
) longjmp_exception (EX_II );
2829
2855
#ifdef CONFIG_RV_SMSTATEEN
0 commit comments