mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2026-10-09 23:53:04 -04:00
Merge ef308b3f7c into 92bfb86ce3
This commit is contained in:
commit
2e267cc2b3
2 changed files with 200 additions and 63 deletions
|
|
@ -338,13 +338,16 @@ freertos_risc_v_interrupt_handler:
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
.section .text.freertos_risc_v_mtimer_interrupt_handler
|
.section .text.freertos_risc_v_mtimer_interrupt_handler
|
||||||
|
.align 2
|
||||||
freertos_risc_v_mtimer_interrupt_handler:
|
freertos_risc_v_mtimer_interrupt_handler:
|
||||||
portcontextSAVE_INTERRUPT_CONTEXT
|
portcontextSAVE_TIMER_CALLER_CONTEXT
|
||||||
portUPDATE_MTIMER_COMPARE_REGISTER
|
portUPDATE_MTIMER_COMPARE_REGISTER
|
||||||
call xTaskIncrementTick
|
call xTaskIncrementTick
|
||||||
beqz a0, exit_without_context_switch /* Don't switch context if incrementing tick didn't unblock a task. */
|
bnez a0, mtimer_context_switch
|
||||||
|
portcontextRESTORE_TIMER_CALLER_CONTEXT
|
||||||
|
mtimer_context_switch:
|
||||||
|
portcontextSAVE_DEFERRED_TASK_STATE
|
||||||
call vTaskSwitchContext
|
call vTaskSwitchContext
|
||||||
exit_without_context_switch:
|
|
||||||
portcontextRESTORE_CONTEXT
|
portcontextRESTORE_CONTEXT
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,10 @@
|
||||||
#define portCRITICAL_NESTING_OFFSET 30
|
#define portCRITICAL_NESTING_OFFSET 30
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Keep the ISR stack aligned to the RISC-V ABI while reserving metadata used
|
||||||
|
* by the machine-timer fast path. */
|
||||||
|
#define portISR_STACK_METADATA_SIZE 16
|
||||||
|
|
||||||
#if ( configENABLE_FPU == 1 )
|
#if ( configENABLE_FPU == 1 )
|
||||||
/* Bit [14:13] in the mstatus encode the status of FPU state which is one of
|
/* Bit [14:13] in the mstatus encode the status of FPU state which is one of
|
||||||
* the following values:
|
* the following values:
|
||||||
|
|
@ -270,38 +274,48 @@ add sp, sp, -( 2 * portWORD_SIZE )
|
||||||
.endm
|
.endm
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
.macro portcontextSAVE_CALLER_REGISTERS frame
|
||||||
|
store_x x1, 2 * portWORD_SIZE( \frame )
|
||||||
|
store_x x5, 3 * portWORD_SIZE( \frame )
|
||||||
|
store_x x6, 4 * portWORD_SIZE( \frame )
|
||||||
|
store_x x7, 5 * portWORD_SIZE( \frame )
|
||||||
|
store_x x10, 8 * portWORD_SIZE( \frame )
|
||||||
|
store_x x11, 9 * portWORD_SIZE( \frame )
|
||||||
|
store_x x12, 10 * portWORD_SIZE( \frame )
|
||||||
|
store_x x13, 11 * portWORD_SIZE( \frame )
|
||||||
|
store_x x14, 12 * portWORD_SIZE( \frame )
|
||||||
|
store_x x15, 13 * portWORD_SIZE( \frame )
|
||||||
|
#ifndef __riscv_32e
|
||||||
|
store_x x16, 14 * portWORD_SIZE( \frame )
|
||||||
|
store_x x17, 15 * portWORD_SIZE( \frame )
|
||||||
|
store_x x28, 26 * portWORD_SIZE( \frame )
|
||||||
|
store_x x29, 27 * portWORD_SIZE( \frame )
|
||||||
|
store_x x30, 28 * portWORD_SIZE( \frame )
|
||||||
|
store_x x31, 29 * portWORD_SIZE( \frame )
|
||||||
|
#endif /* ifndef __riscv_32e */
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro portcontextSAVE_CALLEE_REGISTERS frame
|
||||||
|
store_x x8, 6 * portWORD_SIZE( \frame )
|
||||||
|
store_x x9, 7 * portWORD_SIZE( \frame )
|
||||||
|
#ifndef __riscv_32e
|
||||||
|
store_x x18, 16 * portWORD_SIZE( \frame )
|
||||||
|
store_x x19, 17 * portWORD_SIZE( \frame )
|
||||||
|
store_x x20, 18 * portWORD_SIZE( \frame )
|
||||||
|
store_x x21, 19 * portWORD_SIZE( \frame )
|
||||||
|
store_x x22, 20 * portWORD_SIZE( \frame )
|
||||||
|
store_x x23, 21 * portWORD_SIZE( \frame )
|
||||||
|
store_x x24, 22 * portWORD_SIZE( \frame )
|
||||||
|
store_x x25, 23 * portWORD_SIZE( \frame )
|
||||||
|
store_x x26, 24 * portWORD_SIZE( \frame )
|
||||||
|
store_x x27, 25 * portWORD_SIZE( \frame )
|
||||||
|
#endif /* ifndef __riscv_32e */
|
||||||
|
.endm
|
||||||
|
|
||||||
.macro portcontextSAVE_CONTEXT_INTERNAL
|
.macro portcontextSAVE_CONTEXT_INTERNAL
|
||||||
addi sp, sp, -portCONTEXT_SIZE
|
addi sp, sp, -portCONTEXT_SIZE
|
||||||
store_x x1, 2 * portWORD_SIZE( sp )
|
portcontextSAVE_CALLER_REGISTERS sp
|
||||||
store_x x5, 3 * portWORD_SIZE( sp )
|
portcontextSAVE_CALLEE_REGISTERS sp
|
||||||
store_x x6, 4 * portWORD_SIZE( sp )
|
|
||||||
store_x x7, 5 * portWORD_SIZE( sp )
|
|
||||||
store_x x8, 6 * portWORD_SIZE( sp )
|
|
||||||
store_x x9, 7 * portWORD_SIZE( sp )
|
|
||||||
store_x x10, 8 * portWORD_SIZE( sp )
|
|
||||||
store_x x11, 9 * portWORD_SIZE( sp )
|
|
||||||
store_x x12, 10 * portWORD_SIZE( sp )
|
|
||||||
store_x x13, 11 * portWORD_SIZE( sp )
|
|
||||||
store_x x14, 12 * portWORD_SIZE( sp )
|
|
||||||
store_x x15, 13 * portWORD_SIZE( sp )
|
|
||||||
#ifndef __riscv_32e
|
|
||||||
store_x x16, 14 * portWORD_SIZE( sp )
|
|
||||||
store_x x17, 15 * portWORD_SIZE( sp )
|
|
||||||
store_x x18, 16 * portWORD_SIZE( sp )
|
|
||||||
store_x x19, 17 * portWORD_SIZE( sp )
|
|
||||||
store_x x20, 18 * portWORD_SIZE( sp )
|
|
||||||
store_x x21, 19 * portWORD_SIZE( sp )
|
|
||||||
store_x x22, 20 * portWORD_SIZE( sp )
|
|
||||||
store_x x23, 21 * portWORD_SIZE( sp )
|
|
||||||
store_x x24, 22 * portWORD_SIZE( sp )
|
|
||||||
store_x x25, 23 * portWORD_SIZE( sp )
|
|
||||||
store_x x26, 24 * portWORD_SIZE( sp )
|
|
||||||
store_x x27, 25 * portWORD_SIZE( sp )
|
|
||||||
store_x x28, 26 * portWORD_SIZE( sp )
|
|
||||||
store_x x29, 27 * portWORD_SIZE( sp )
|
|
||||||
store_x x30, 28 * portWORD_SIZE( sp )
|
|
||||||
store_x x31, 29 * portWORD_SIZE( sp )
|
|
||||||
#endif /* ifndef __riscv_32e */
|
|
||||||
|
|
||||||
load_x t0, xCriticalNesting /* Load the value of xCriticalNesting into t0. */
|
load_x t0, xCriticalNesting /* Load the value of xCriticalNesting into t0. */
|
||||||
store_x t0, portCRITICAL_NESTING_OFFSET * portWORD_SIZE( sp ) /* Store the critical nesting value to the stack. */
|
store_x t0, portCRITICAL_NESTING_OFFSET * portWORD_SIZE( sp ) /* Store the critical nesting value to the stack. */
|
||||||
|
|
@ -369,6 +383,116 @@ store_x sp, 0 ( t0 ) /* Write sp to first TCB member. */
|
||||||
.endm
|
.endm
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
.macro portcontextSAVE_TIMER_CALLER_CONTEXT
|
||||||
|
addi sp, sp, -portCONTEXT_SIZE
|
||||||
|
portcontextSAVE_CALLER_REGISTERS sp
|
||||||
|
|
||||||
|
/* Keep the fixed integer frame base available after variable-length optional
|
||||||
|
* contexts have been saved by recording it in per-hart ISR stack metadata. */
|
||||||
|
load_x t0, xISRStackTop
|
||||||
|
addi t0, t0, -portISR_STACK_METADATA_SIZE
|
||||||
|
store_x sp, 0( t0 )
|
||||||
|
|
||||||
|
#if( configENABLE_FPU == 1 )
|
||||||
|
csrr t0, mstatus
|
||||||
|
srl t1, t0, MSTATUS_FS_OFFSET
|
||||||
|
andi t1, t1, 3
|
||||||
|
addi t2, x0, 3
|
||||||
|
bne t1, t2, 7f
|
||||||
|
portcontexSAVE_FPU_CONTEXT
|
||||||
|
7:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if( configENABLE_VPU == 1 )
|
||||||
|
csrr t0, mstatus
|
||||||
|
srl t1, t0, MSTATUS_VS_OFFSET
|
||||||
|
andi t1, t1, 3
|
||||||
|
addi t2, x0, 3
|
||||||
|
bne t1, t2, 8f
|
||||||
|
portcontexSAVE_VPU_CONTEXT
|
||||||
|
8:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
csrr t0, mstatus
|
||||||
|
store_x t0, 1 * portWORD_SIZE( sp )
|
||||||
|
portasmSAVE_ADDITIONAL_REGISTERS
|
||||||
|
|
||||||
|
#if( configENABLE_FPU == 1 )
|
||||||
|
srl t1, t0, MSTATUS_FS_OFFSET
|
||||||
|
andi t1, t1, 3
|
||||||
|
addi t2, x0, 3
|
||||||
|
bne t1, t2, 9f
|
||||||
|
li t1, ~MSTATUS_FS_MASK
|
||||||
|
and t0, t0, t1
|
||||||
|
li t1, MSTATUS_FS_CLEAN
|
||||||
|
or t0, t0, t1
|
||||||
|
csrw mstatus, t0
|
||||||
|
9:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if( configENABLE_VPU == 1 )
|
||||||
|
srl t1, t0, MSTATUS_VS_OFFSET
|
||||||
|
andi t1, t1, 3
|
||||||
|
addi t2, x0, 3
|
||||||
|
bne t1, t2, 10f
|
||||||
|
li t1, ~MSTATUS_VS_MASK
|
||||||
|
and t0, t0, t1
|
||||||
|
li t1, MSTATUS_VS_CLEAN
|
||||||
|
or t0, t0, t1
|
||||||
|
csrw mstatus, t0
|
||||||
|
10:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
csrr t0, mepc
|
||||||
|
store_x t0, 0 * portWORD_SIZE( sp )
|
||||||
|
load_x t0, pxCurrentTCB
|
||||||
|
store_x sp, 0( t0 )
|
||||||
|
load_x sp, xISRStackTop
|
||||||
|
addi sp, sp, -portISR_STACK_METADATA_SIZE
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro portcontextSAVE_DEFERRED_TASK_STATE
|
||||||
|
load_x t1, 0( sp )
|
||||||
|
portcontextSAVE_CALLEE_REGISTERS t1
|
||||||
|
load_x t0, xCriticalNesting
|
||||||
|
store_x t0, portCRITICAL_NESTING_OFFSET * portWORD_SIZE( t1 )
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro portcontextRESTORE_TIMER_CALLER_CONTEXT
|
||||||
|
load_x t1, pxCurrentTCB
|
||||||
|
load_x sp, 0( t1 )
|
||||||
|
load_x t0, 0 * portWORD_SIZE( sp )
|
||||||
|
csrw mepc, t0
|
||||||
|
|
||||||
|
portasmRESTORE_ADDITIONAL_REGISTERS
|
||||||
|
|
||||||
|
load_x t3, 1 * portWORD_SIZE( sp )
|
||||||
|
csrw mstatus, t3
|
||||||
|
|
||||||
|
#if( configENABLE_VPU == 1 )
|
||||||
|
srl t1, t3, MSTATUS_VS_OFFSET
|
||||||
|
andi t1, t1, 3
|
||||||
|
addi t2, x0, 3
|
||||||
|
bne t1, t2, 11f
|
||||||
|
portcontextRESTORE_VPU_CONTEXT
|
||||||
|
11:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if( configENABLE_FPU == 1 )
|
||||||
|
srl t1, t3, MSTATUS_FS_OFFSET
|
||||||
|
andi t1, t1, 3
|
||||||
|
addi t2, x0, 3
|
||||||
|
bne t1, t2, 12f
|
||||||
|
portcontextRESTORE_FPU_CONTEXT
|
||||||
|
12:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
portcontextRESTORE_CALLER_REGISTERS sp
|
||||||
|
addi sp, sp, portCONTEXT_SIZE
|
||||||
|
mret
|
||||||
|
.endm
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
.macro portcontextSAVE_EXCEPTION_CONTEXT
|
.macro portcontextSAVE_EXCEPTION_CONTEXT
|
||||||
portcontextSAVE_CONTEXT_INTERNAL
|
portcontextSAVE_CONTEXT_INTERNAL
|
||||||
csrr a0, mcause
|
csrr a0, mcause
|
||||||
|
|
@ -388,6 +512,44 @@ load_x sp, xISRStackTop /* Switch to ISR stack. */
|
||||||
.endm
|
.endm
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
.macro portcontextRESTORE_CALLER_REGISTERS frame
|
||||||
|
load_x x1, 2 * portWORD_SIZE( \frame )
|
||||||
|
load_x x5, 3 * portWORD_SIZE( \frame )
|
||||||
|
load_x x6, 4 * portWORD_SIZE( \frame )
|
||||||
|
load_x x7, 5 * portWORD_SIZE( \frame )
|
||||||
|
load_x x10, 8 * portWORD_SIZE( \frame )
|
||||||
|
load_x x11, 9 * portWORD_SIZE( \frame )
|
||||||
|
load_x x12, 10 * portWORD_SIZE( \frame )
|
||||||
|
load_x x13, 11 * portWORD_SIZE( \frame )
|
||||||
|
load_x x14, 12 * portWORD_SIZE( \frame )
|
||||||
|
load_x x15, 13 * portWORD_SIZE( \frame )
|
||||||
|
#ifndef __riscv_32e
|
||||||
|
load_x x16, 14 * portWORD_SIZE( \frame )
|
||||||
|
load_x x17, 15 * portWORD_SIZE( \frame )
|
||||||
|
load_x x28, 26 * portWORD_SIZE( \frame )
|
||||||
|
load_x x29, 27 * portWORD_SIZE( \frame )
|
||||||
|
load_x x30, 28 * portWORD_SIZE( \frame )
|
||||||
|
load_x x31, 29 * portWORD_SIZE( \frame )
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro portcontextRESTORE_CALLEE_REGISTERS frame
|
||||||
|
load_x x8, 6 * portWORD_SIZE( \frame )
|
||||||
|
load_x x9, 7 * portWORD_SIZE( \frame )
|
||||||
|
#ifndef __riscv_32e
|
||||||
|
load_x x18, 16 * portWORD_SIZE( \frame )
|
||||||
|
load_x x19, 17 * portWORD_SIZE( \frame )
|
||||||
|
load_x x20, 18 * portWORD_SIZE( \frame )
|
||||||
|
load_x x21, 19 * portWORD_SIZE( \frame )
|
||||||
|
load_x x22, 20 * portWORD_SIZE( \frame )
|
||||||
|
load_x x23, 21 * portWORD_SIZE( \frame )
|
||||||
|
load_x x24, 22 * portWORD_SIZE( \frame )
|
||||||
|
load_x x25, 23 * portWORD_SIZE( \frame )
|
||||||
|
load_x x26, 24 * portWORD_SIZE( \frame )
|
||||||
|
load_x x27, 25 * portWORD_SIZE( \frame )
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
.macro portcontextRESTORE_CONTEXT
|
.macro portcontextRESTORE_CONTEXT
|
||||||
load_x t1, pxCurrentTCB /* Load pxCurrentTCB. */
|
load_x t1, pxCurrentTCB /* Load pxCurrentTCB. */
|
||||||
load_x sp, 0 ( t1 ) /* Read sp from first TCB member. */
|
load_x sp, 0 ( t1 ) /* Read sp from first TCB member. */
|
||||||
|
|
@ -429,36 +591,8 @@ load_x t0, portCRITICAL_NESTING_OFFSET * portWORD_SIZE( sp ) /* Obtain xCritical
|
||||||
load_x t1, pxCriticalNesting /* Load the address of xCriticalNesting into t1. */
|
load_x t1, pxCriticalNesting /* Load the address of xCriticalNesting into t1. */
|
||||||
store_x t0, 0 ( t1 ) /* Restore the critical nesting value for this task. */
|
store_x t0, 0 ( t1 ) /* Restore the critical nesting value for this task. */
|
||||||
|
|
||||||
load_x x1, 2 * portWORD_SIZE( sp )
|
portcontextRESTORE_CALLEE_REGISTERS sp
|
||||||
load_x x5, 3 * portWORD_SIZE( sp )
|
portcontextRESTORE_CALLER_REGISTERS sp
|
||||||
load_x x6, 4 * portWORD_SIZE( sp )
|
|
||||||
load_x x7, 5 * portWORD_SIZE( sp )
|
|
||||||
load_x x8, 6 * portWORD_SIZE( sp )
|
|
||||||
load_x x9, 7 * portWORD_SIZE( sp )
|
|
||||||
load_x x10, 8 * portWORD_SIZE( sp )
|
|
||||||
load_x x11, 9 * portWORD_SIZE( sp )
|
|
||||||
load_x x12, 10 * portWORD_SIZE( sp )
|
|
||||||
load_x x13, 11 * portWORD_SIZE( sp )
|
|
||||||
load_x x14, 12 * portWORD_SIZE( sp )
|
|
||||||
load_x x15, 13 * portWORD_SIZE( sp )
|
|
||||||
#ifndef __riscv_32e
|
|
||||||
load_x x16, 14 * portWORD_SIZE( sp )
|
|
||||||
load_x x17, 15 * portWORD_SIZE( sp )
|
|
||||||
load_x x18, 16 * portWORD_SIZE( sp )
|
|
||||||
load_x x19, 17 * portWORD_SIZE( sp )
|
|
||||||
load_x x20, 18 * portWORD_SIZE( sp )
|
|
||||||
load_x x21, 19 * portWORD_SIZE( sp )
|
|
||||||
load_x x22, 20 * portWORD_SIZE( sp )
|
|
||||||
load_x x23, 21 * portWORD_SIZE( sp )
|
|
||||||
load_x x24, 22 * portWORD_SIZE( sp )
|
|
||||||
load_x x25, 23 * portWORD_SIZE( sp )
|
|
||||||
load_x x26, 24 * portWORD_SIZE( sp )
|
|
||||||
load_x x27, 25 * portWORD_SIZE( sp )
|
|
||||||
load_x x28, 26 * portWORD_SIZE( sp )
|
|
||||||
load_x x29, 27 * portWORD_SIZE( sp )
|
|
||||||
load_x x30, 28 * portWORD_SIZE( sp )
|
|
||||||
load_x x31, 29 * portWORD_SIZE( sp )
|
|
||||||
#endif /* ifndef __riscv_32e */
|
|
||||||
addi sp, sp, portCONTEXT_SIZE
|
addi sp, sp, portCONTEXT_SIZE
|
||||||
|
|
||||||
mret
|
mret
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue