diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-06-27 10:05:50 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-06-29 10:04:37 +0200 |
commit | e43994dfbb2c0ce9012c33c64f14533acc230366 (patch) | |
tree | 7e662060fab6f8f7487cb041a7ba04abccb9c3e3 /cpukit/score/cpu/riscv/cpu.c | |
parent | riscv: Fix _CPU_Context_Initialize() prototype (diff) | |
download | rtems-e43994dfbb2c0ce9012c33c64f14533acc230366.tar.bz2 |
riscv: Optimize context switch and interrupts
Save/restore non-volatile registers in _CPU_Context_switch().
Save/restore volatile registers in _ISR_Handler().
Update #3433.
Diffstat (limited to 'cpukit/score/cpu/riscv/cpu.c')
-rw-r--r-- | cpukit/score/cpu/riscv/cpu.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/cpukit/score/cpu/riscv/cpu.c b/cpukit/score/cpu/riscv/cpu.c index c5d309a5d6..87e61f1ec9 100644 --- a/cpukit/score/cpu/riscv/cpu.c +++ b/cpukit/score/cpu/riscv/cpu.c @@ -40,6 +40,56 @@ ) RISCV_ASSERT_CONTEXT_OFFSET( isr_dispatch_disable, ISR_DISPATCH_DISABLE ); +#ifdef RTEMS_SMP +RISCV_ASSERT_CONTEXT_OFFSET( is_executing, IS_EXECUTING ); +#endif +RISCV_ASSERT_CONTEXT_OFFSET( ra, RA ); +RISCV_ASSERT_CONTEXT_OFFSET( sp, SP ); +RISCV_ASSERT_CONTEXT_OFFSET( tp, TP ); +RISCV_ASSERT_CONTEXT_OFFSET( s0, S0 ); +RISCV_ASSERT_CONTEXT_OFFSET( s1, S1 ); +RISCV_ASSERT_CONTEXT_OFFSET( s2, S2 ); +RISCV_ASSERT_CONTEXT_OFFSET( s3, S3 ); +RISCV_ASSERT_CONTEXT_OFFSET( s4, S4 ); +RISCV_ASSERT_CONTEXT_OFFSET( s5, S5 ); +RISCV_ASSERT_CONTEXT_OFFSET( s6, S6 ); +RISCV_ASSERT_CONTEXT_OFFSET( s7, S7 ); +RISCV_ASSERT_CONTEXT_OFFSET( s8, S8 ); +RISCV_ASSERT_CONTEXT_OFFSET( s9, S9 ); +RISCV_ASSERT_CONTEXT_OFFSET( s10, S10 ); +RISCV_ASSERT_CONTEXT_OFFSET( s11, S11 ); + +#define RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( field, off ) \ + RTEMS_STATIC_ASSERT( \ + offsetof( CPU_Interrupt_frame, field) == RISCV_INTERRUPT_FRAME_ ## off, \ + riscv_interrupt_frame_offset_ ## field \ + ) + +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( mstatus, MSTATUS ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( mepc, MEPC ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a2, A2 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( s0, S0 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( s1, S1 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( ra, RA ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a3, A3 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a4, A4 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a5, A5 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a6, A6 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a7, A7 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t0, T0 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t1, T1 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t2, T2 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t3, T3 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t4, T4 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t5, T5 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( t6, T6 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a0, A0 ); +RISCV_ASSERT_INTERRUPT_FRAME_OFFSET( a1, A1 ); + +RTEMS_STATIC_ASSERT( + sizeof( CPU_Interrupt_frame ) % CPU_STACK_ALIGNMENT == 0, + riscv_interrupt_frame_size +); /* bsp_start_vector_table_begin is the start address of the vector table * containing addresses to ISR Handlers. It's defined at the BSP linkcmds |