@@ -86,6 +86,15 @@ extern void entry(void);
86
86
// Execute Hart ID
87
87
#define EXECUTE_HARTID 0
88
88
89
+ #if defined(__SSTC_PRESENT ) && __SSTC_PRESENT == 1
90
+ #define SMODE_TIMER_IRQ SysTimer_S_IRQn
91
+ #define SMODE_SWI_IRQ SysTimerSW_S_IRQn
92
+ #else
93
+ #define SMODE_TIMER_IRQ SysTimer_IRQn
94
+ #define SMODE_SWI_IRQ SysTimerSW_IRQn
95
+ #endif
96
+
97
+
89
98
/* Create a stack for supervisor mode execution */
90
99
uint8_t smode_stack [SMODE_STACK_SIZE ] __attribute__((aligned (16 )));
91
100
@@ -112,10 +121,19 @@ int main_entry(void)
112
121
};
113
122
114
123
__set_PMPENTRYx (0 , & pmp_cfg );
115
- printf ("Set ECLIC Timer Interrupt and Software Timer Interrupt to be executed in S-Mode\r\n" );
116
124
// before drop to S Mode, specifies in which privilege mode the interrupt should be taken
117
- ECLIC_SetModeIRQ (SysTimerSW_IRQn , PRV_S );
118
- ECLIC_SetModeIRQ (SysTimer_IRQn , PRV_S );
125
+ ECLIC_SetModeIRQ (SMODE_TIMER_IRQ , PRV_S );
126
+ ECLIC_SetModeIRQ (SMODE_SWI_IRQ , PRV_S );
127
+ #if defined(__SSTC_PRESENT ) && __SSTC_PRESENT == 1
128
+ /* Disable S-mode access some system timer registers */
129
+ SysTimer_DisableSAccess ();
130
+ /* Enable CY,TM,IR in CSR_MCOUNTEREN to allow S-mode access cycle,time,instret csr */
131
+ SysTimer_EnableSSTC ();
132
+ printf ("Set ECLIC Timer S-Mode Interrupt and Software Timer S-Mode Interrupt to be executed in S-Mode\r\n" );
133
+ #else
134
+ printf ("Set ECLIC Timer M-Mode Interrupt and Software Timer M-Mode Interrupt to be executed in S-Mode\r\n" );
135
+ SysTimer_EnableSAccess ();
136
+ #endif
119
137
120
138
printf ("Drop to S-Mode to prepare RT-Thread Environment\r\n" );
121
139
/* Drop to S mode */
0 commit comments