File indexing completed on 2025-05-11 08:24:25
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 #include <rtems/score/cpuimpl.h>
0033 #include <rtems/score/isr.h>
0034 #include <rtems/score/riscv-utility.h>
0035
0036 #define RISCV_ASSERT_CONTEXT_OFFSET( field, off ) \
0037 RTEMS_STATIC_ASSERT( \
0038 offsetof( Context_Control, field) == RISCV_CONTEXT_ ## off, \
0039 riscv_context_offset_ ## field \
0040 )
0041
0042 RISCV_ASSERT_CONTEXT_OFFSET( isr_dispatch_disable, ISR_DISPATCH_DISABLE );
0043 #ifdef RTEMS_SMP
0044 RISCV_ASSERT_CONTEXT_OFFSET( is_executing, IS_EXECUTING );
0045 #endif
0046 RISCV_ASSERT_CONTEXT_OFFSET( ra, RA );
0047 RISCV_ASSERT_CONTEXT_OFFSET( sp, SP );
0048 RISCV_ASSERT_CONTEXT_OFFSET( tp, TP );
0049 RISCV_ASSERT_CONTEXT_OFFSET( s0, S0 );
0050 RISCV_ASSERT_CONTEXT_OFFSET( s1, S1 );
0051 RISCV_ASSERT_CONTEXT_OFFSET( s2, S2 );
0052 RISCV_ASSERT_CONTEXT_OFFSET( s3, S3 );
0053 RISCV_ASSERT_CONTEXT_OFFSET( s4, S4 );
0054 RISCV_ASSERT_CONTEXT_OFFSET( s5, S5 );
0055 RISCV_ASSERT_CONTEXT_OFFSET( s6, S6 );
0056 RISCV_ASSERT_CONTEXT_OFFSET( s7, S7 );
0057 RISCV_ASSERT_CONTEXT_OFFSET( s8, S8 );
0058 RISCV_ASSERT_CONTEXT_OFFSET( s9, S9 );
0059 RISCV_ASSERT_CONTEXT_OFFSET( s10, S10 );
0060 RISCV_ASSERT_CONTEXT_OFFSET( s11, S11 );
0061
0062 #if __riscv_flen > 0
0063
0064 RISCV_ASSERT_CONTEXT_OFFSET( fcsr, FCSR );
0065 RISCV_ASSERT_CONTEXT_OFFSET( fs0, FS0 );
0066 RISCV_ASSERT_CONTEXT_OFFSET( fs1, FS1 );
0067 RISCV_ASSERT_CONTEXT_OFFSET( fs2, FS2 );
0068 RISCV_ASSERT_CONTEXT_OFFSET( fs3, FS3 );
0069 RISCV_ASSERT_CONTEXT_OFFSET( fs4, FS4 );
0070 RISCV_ASSERT_CONTEXT_OFFSET( fs5, FS5 );
0071 RISCV_ASSERT_CONTEXT_OFFSET( fs6, FS6 );
0072 RISCV_ASSERT_CONTEXT_OFFSET( fs7, FS7 );
0073 RISCV_ASSERT_CONTEXT_OFFSET( fs8, FS8 );
0074 RISCV_ASSERT_CONTEXT_OFFSET( fs9, FS9 );
0075 RISCV_ASSERT_CONTEXT_OFFSET( fs10, FS10 );
0076 RISCV_ASSERT_CONTEXT_OFFSET( fs11, FS11 );
0077
0078 #endif
0079
0080 #define RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( field, off ) \
0081 RTEMS_STATIC_ASSERT( \
0082 offsetof( CPU_Interrupt_frame, field) == RISCV_INTERRUPT_FRAME_ ## off, \
0083 riscv_interrupt_frame_offset_ ## field \
0084 )
0085
0086 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( mstatus, MSTATUS );
0087 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( mepc, MEPC );
0088 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a2, A2 );
0089 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( s0, S0 );
0090 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( s1, S1 );
0091 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ra, RA );
0092 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a3, A3 );
0093 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a4, A4 );
0094 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a5, A5 );
0095 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a6, A6 );
0096 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a7, A7 );
0097 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t0, T0 );
0098 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t1, T1 );
0099 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t2, T2 );
0100 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t3, T3 );
0101 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t4, T4 );
0102 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t5, T5 );
0103 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t6, T6 );
0104 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a0, A0 );
0105 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a1, A1 );
0106
0107 #if __riscv_flen > 0
0108
0109 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fcsr, FCSR );
0110 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft0, FT0 );
0111 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft1, FT1 );
0112 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft2, FT2 );
0113 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft3, FT3 );
0114 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft4, FT4 );
0115 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft5, FT5 );
0116 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft6, FT6 );
0117 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft7, FT7 );
0118 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft8, FT8 );
0119 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft9, FT9 );
0120 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft10, FT10 );
0121 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ft11, FT11 );
0122 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa0, FA0 );
0123 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa1, FA1 );
0124 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa2, FA2 );
0125 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa3, FA3 );
0126 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa4, FA4 );
0127 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa5, FA5 );
0128 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa6, FA6 );
0129 RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( fa7, FA7 );
0130
0131 #endif
0132
0133 #define RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( field, off ) \
0134 RTEMS_STATIC_ASSERT( \
0135 offsetof( CPU_Exception_frame, field) == RISCV_EXCEPTION_FRAME_ ## off, \
0136 riscv_context_offset_ ## field \
0137 )
0138
0139 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( mcause, MCAUSE );
0140 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( sp, SP );
0141 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( gp, GP );
0142 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( tp, TP );
0143 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( s2, S2 );
0144 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( s3, S3 );
0145 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( s4, S4 );
0146 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( s5, S5 );
0147 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( s6, S6 );
0148 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( s7, S7 );
0149 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( s8, S8 );
0150 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( s9, S9 );
0151 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( s10, S10 );
0152 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( s11, S11 );
0153
0154 #if __riscv_flen > 0
0155
0156 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs0, FS0 );
0157 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs1, FS1 );
0158 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs2, FS2 );
0159 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs3, FS3 );
0160 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs4, FS4 );
0161 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs5, FS5 );
0162 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs6, FS6 );
0163 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs7, FS7 );
0164 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs8, FS8 );
0165 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs9, FS9 );
0166 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs10, FS10 );
0167 RISCV_ASSERT_EXCEPTION_FRAME_OFFSET( fs11, FS11 );
0168
0169 #endif
0170
0171 RTEMS_STATIC_ASSERT(
0172 sizeof( CPU_Interrupt_frame ) % CPU_STACK_ALIGNMENT == 0,
0173 riscv_interrupt_frame_size
0174 );
0175
0176
0177
0178
0179 void _CPU_Initialize(void)
0180 {
0181
0182 }
0183
0184 uint32_t _CPU_ISR_Get_level( void )
0185 {
0186 if ( _CPU_ISR_Is_enabled( read_csr( mstatus ) ) ) {
0187 return 0;
0188 }
0189
0190 return 1;
0191 }
0192
0193 void *_CPU_Thread_Idle_body( uintptr_t ignored )
0194 {
0195 while ( true ) {
0196 __asm__ volatile ( "wfi" );
0197 }
0198 }