Skip to content

Commit b2967d1

Browse files
committed
fix(Smstateen): add [m|h|s]stateen[1|2|3] CSRs for Smstateen extension
1 parent 3b2a4b4 commit b2967d1

File tree

2 files changed

+93
-23
lines changed

2 files changed

+93
-23
lines changed

src/isa/riscv64/local-include/csr.h

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,15 @@
151151

152152
/** Supervisor State Enable Registers **/
153153
#ifdef CONFIG_RV_SMSTATEEN
154+
#define CSRS_S_STATE0_ENABLE(f) \
155+
f(sstateen0 , 0x10C)
156+
157+
#define CSRS_S_STATEX_ENABLE(f) \
158+
f(sstateen1 , 0x10D) f(sstateen2 , 0x10E) f(sstateen3 , 0x10F)
159+
154160
#define CSRS_S_STATE_ENABLE(f) \
155-
f(sstateen0 , 0x10C)
161+
CSRS_S_STATE0_ENABLE(f) \
162+
CSRS_S_STATEX_ENABLE(f)
156163
#else
157164
#define CSRS_S_STATE_ENABLE(f)
158165
#endif // CONFIG_RV_SMSTATEEN
@@ -268,8 +275,15 @@
268275

269276
/** Hypervisor State Enable Registers **/
270277
#ifdef CONFIG_RV_SMSTATEEN
271-
#define CSRS_H_STATE_ENABLE(f) \
272-
f(hstateen0 , 0x60C)
278+
#define CSRS_H_STATE0_ENABLE(f) \
279+
f(hstateen0 , 0x60C)
280+
281+
#define CSRS_H_STATEX_ENABLE(f) \
282+
f(hstateen1 , 0x60D) f(hstateen2 , 0x60E) f(hstateen3 , 0x60F)
283+
284+
#define CSRS_H_STATE_ENABLE(f) \
285+
CSRS_H_STATE0_ENABLE(f) \
286+
CSRS_H_STATEX_ENABLE(f)
273287
#else
274288
#define CSRS_H_STATE_ENABLE(f)
275289
#endif // CONFIG_RV_SMSTATEEN
@@ -411,8 +425,15 @@
411425

412426
/** Machine State Enable Registers **/
413427
#ifdef CONFIG_RV_SMSTATEEN
428+
#define CSRS_M_STATE0_ENABLE(f) \
429+
f(mstateen0 , 0x30C)
430+
431+
#define CSRS_M_STATEX_ENABLE(f) \
432+
f(mstateen1 , 0x30D) f(mstateen2 , 0x30E) f(mstateen3 , 0x30F)
433+
414434
#define CSRS_M_STATE_ENABLE(f) \
415-
f(mstateen0, 0x30C)
435+
CSRS_M_STATE0_ENABLE(f) \
436+
CSRS_M_STATEX_ENABLE(f)
416437
#else
417438
#define CSRS_M_STATE_ENABLE(f)
418439
#endif // CONFIG_RV_SMSTATEEN
@@ -812,12 +833,26 @@ CSR_STRUCT_END(mseccfg)
812833
uint64_t se0 : 1; // [63]
813834
CSR_STRUCT_END(mstateen0)
814835

836+
#define CSRS_M_STATEENX_STRUCT(name, addr) \
837+
CSR_STRUCT_START(name)\
838+
uint64_t pad : 63;\
839+
uint64_t se : 1; \
840+
CSR_STRUCT_END(name)
841+
842+
MAP(CSRS_M_STATEX_ENABLE, CSRS_M_STATEENX_STRUCT)
843+
815844
CSR_STRUCT_START(sstateen0)
816845
uint64_t c : 1; // [0]
817846
uint64_t fcsr : 1; // [1]
818847
uint64_t jvt : 1; // [2]
819848
uint64_t pad0 :29; // [31:3]
820849
CSR_STRUCT_END(sstateen0)
850+
851+
#define CSRS_S_STATEENX_STRUCT(name, addr) \
852+
CSR_STRUCT_START(name)\
853+
CSR_STRUCT_END(name)
854+
855+
MAP(CSRS_S_STATEX_ENABLE, CSRS_S_STATEENX_STRUCT)
821856

822857
#ifdef CONFIG_RVH
823858
CSR_STRUCT_START(hstateen0)
@@ -834,6 +869,15 @@ CSR_STRUCT_END(mseccfg)
834869
uint64_t envcfg : 1; // [62]
835870
uint64_t se0 : 1; // [63]
836871
CSR_STRUCT_END(hstateen0)
872+
873+
#define CSRS_H_STATEENX_STRUCT(name, addr) \
874+
CSR_STRUCT_START(name)\
875+
uint64_t pad : 63;\
876+
uint64_t se : 1; \
877+
CSR_STRUCT_END(name)
878+
879+
MAP(CSRS_H_STATEX_ENABLE, CSRS_H_STATEENX_STRUCT)
880+
837881
#endif
838882
#endif
839883

src/isa/riscv64/system/priv.c

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ void init_pma() {
202202
{0},
203203
{0},
204204
};
205-
205+
206206
PMAConfigModule* pmaconfigs = (PMAConfigModule *)malloc(sizeof (PMAConfigModule));
207207
for (int i = 0; i < CONFIG_RV_PMA_ACTIVE_NUM; i++) {
208208
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) {
674674
#define HSTATEEN0_WMASK MSTATEEN0_WMASK
675675
#define SSTATEEN0_WMASK SSTATEEN0_CS
676676

677+
#define MSTATEENX_WMASK MSTATEEN_HSTATEEN
678+
#define HSTATEENX_WMASK MSTATEENX_WMASK
679+
#define SSTATEENX_WMASK 0x0
680+
677681
#ifdef CONFIG_RV_SMSTATEEN
678682
void init_smstateen() {
679683
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;
682687
#if defined(CONFIG_RV_AIA) && !defined(CONFIG_RV_SMCSRIND)
683688
mstateen0->val |= MSTATEEN0_CSRIND;
684689
IFDEF(CONFIG_RVH, hstateen0->val |= MSTATEEN0_CSRIND);
@@ -1504,7 +1509,7 @@ inline void update_vstopi() {
15041509
iidC1C4 = iidOnlyC4;
15051510
iprioC1C4 = iprioC4;
15061511
}
1507-
1512+
15081513
uint16_t iidC1C5 = 0;
15091514
uint8_t iprioC1C5 = 0;
15101515
iidC1C5 = hvictl->dpr ? iidOnlyC1 : iidOnlyC5;
@@ -1637,9 +1642,16 @@ static word_t csr_read(uint32_t csrid) {
16371642
case CSR_SSTATUS: return sstatus_read(false, false);
16381643

16391644
#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+
}
16431655
#endif // CONFIG_RV_SMSTATEEN
16441656

16451657
case CSR_SIE:
@@ -1671,7 +1683,7 @@ static word_t csr_read(uint32_t csrid) {
16711683
#endif // CONFIG_RV_SSTC
16721684
#ifdef CONFIG_RV_SSCOFPMF
16731685
case CSR_SCOUNTOVF:
1674-
if (cpu.mode == MODE_M) return scountovf->val;
1686+
if (cpu.mode == MODE_M) return scountovf->val;
16751687
IFDEF(CONFIG_RVH, else if (cpu.v && cpu.mode == MODE_S) return (mcounteren->val & hcounteren->val & scountovf->val));
16761688
else if (cpu.mode == MODE_S) return (mcounteren->val & scountovf->val);
16771689
#endif // CONFIG_RV_SSCOFPMF
@@ -1720,7 +1732,12 @@ static word_t csr_read(uint32_t csrid) {
17201732
}
17211733

17221734
#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+
}
17241741
#endif // CONFIG_RV_SMSTATEEN
17251742

17261743
case CSR_HIP: return get_hip();
@@ -1969,6 +1986,8 @@ static void csr_write(uint32_t csrid, word_t src) {
19691986

19701987
#ifdef CONFIG_RV_SMSTATEEN
19711988
case CSR_SSTATEEN0: *dest = src & SSTATEEN0_WMASK; break;
1989+
case CSR_SSTATEEN1 ... CSR_SSTATEEN3: *dest = src & SSTATEENX_WMASK; break;
1990+
19721991
#endif // CONFIG_RV_SMSTATEEN
19731992

19741993
case CSR_SIE:
@@ -2145,6 +2164,7 @@ static void csr_write(uint32_t csrid, word_t src) {
21452164

21462165
#ifdef CONFIG_RV_SMSTATEEN
21472166
case CSR_HSTATEEN0: *dest = src & HSTATEEN0_WMASK; break;
2167+
case CSR_HSTATEEN1 ... CSR_HSTATEEN3: *dest = src & HSTATEENX_WMASK; break;
21482168
#endif // CONFIG_RV_SMSTATEEN
21492169

21502170
case CSR_HGATP:
@@ -2260,6 +2280,7 @@ static void csr_write(uint32_t csrid, word_t src) {
22602280

22612281
#ifdef CONFIG_RV_SMSTATEEN
22622282
case CSR_MSTATEEN0: *dest = src & MSTATEEN0_WMASK; break;
2283+
case CSR_MSTATEEN1 ... CSR_MSTATEEN3: *dest = src & MSTATEENX_WMASK; break;
22632284
#endif // CONFIG_RV_SMSTATEEN
22642285

22652286
#ifdef CONFIG_RV_CSR_MCOUNTINHIBIT
@@ -2289,7 +2310,7 @@ static void csr_write(uint32_t csrid, word_t src) {
22892310
}
22902311
#ifdef CONFIG_RV_SSCOFPMF
22912312
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
22932314
break;
22942315
}
22952316

@@ -2390,7 +2411,7 @@ static void csr_write(uint32_t csrid, word_t src) {
23902411
if (idx_base + i >= CONFIG_RV_PMA_ACTIVE_NUM) {
23912412
break;
23922413
}
2393-
word_t oldCfg = pmacfg_from_index(idx_base + i);
2414+
word_t oldCfg = pmacfg_from_index(idx_base + i);
23942415
word_t cfg = ((src >> (i*8)) & 0xff);
23952416
if ((oldCfg & PMA_L) == 0) {
23962417
cfg &= ~PMA_W | ((cfg & PMA_R) ? PMA_W : 0);
@@ -2634,13 +2655,18 @@ static inline bool smstateen_extension_permit_check(const uint32_t addr) {
26342655
bool has_vi = false;
26352656

26362657
// 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; })
26402665
}
26412666
#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); }
26442670
}
26452671
#endif // CONFIG_RVH
26462672

@@ -2659,8 +2685,8 @@ static inline bool smstateen_extension_permit_check(const uint32_t addr) {
26592685
// CSRIND bit 60
26602686
else if (addr >= CSR_SISELECT && addr <= CSR_SIREG6) {
26612687
// 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.
26642690
if ((cpu.mode < MODE_M) && (!mstateen0->csrind)) { longjmp_exception(EX_II); }
26652691
IFDEF(CONFIG_RVH, else if (cpu.v && !hstateen0->csrind) { has_vi = true; })
26662692
}
@@ -2823,7 +2849,7 @@ static inline bool csrind_permit_check(const uint32_t addr) {
28232849
else if (siselect->val <= ISELECT_MAX_MASK) {
28242850
#ifdef CONFIG_RV_IMSIC
28252851
if (
2826-
((cpu.mode == MODE_S) && mvien->seie) ||
2852+
((cpu.mode == MODE_S) && mvien->seie) ||
28272853
(siselect->val > ISELECT_7F_MASK && (siselect->val & 0x1))
28282854
) longjmp_exception(EX_II);
28292855
#ifdef CONFIG_RV_SMSTATEEN

0 commit comments

Comments
 (0)