У меня такая переключалка выходит, в части блокировки прерываний
приоритетом до RTOS API включительно: csrrci x0, mstatus, 0b01000 /* Clear MIE bit of mstatus to disable machine interrupts */
addi sp, sp, -portCONTEXT_SIZE /* Reserve stack place for context storage */
store_x x5, 3 * portWORD_SIZE( sp ) /* Store general purpose register ASAP to handle PFIC register address */
store_x x6, 4 * portWORD_SIZE( sp ) /* Store general purpose register ASAP to handle PFIC register value */
lui t0,0xe000e /* Block RTOS_API interrupts. Set PFIC_ITRHESDR region address. */
li t1,128 /* Set interrupt level to RTOS_API_ISRprio=(4<
sw t1,64(t0) /* Write RTOS_API ISR priority threshold value to block RTOS-related interrupts */
csrrsi x0, mstatus, 0b01000 /* Set MIE bit of mstatus back to enable higher priority machine interrupts */
И далее сохранение остального контекста.
А чтобы выйти из прерывания переключателя контекста, в конце на время снимаю MIE, чтобы вложенное прерывание не перехватило взведённый GIHWSTKNEN:
csrrci x0, mstatus, 0b01000 /* Clear MIE bit of mstatus to disable machine interrupts */
li t1, 0x2e /* Disable HPE context restoration but keeping nested interrupts and hardware stack enabled */
csrw 0x804, t1 /* Write INTSYSCR register with GIHWSTKNEN set */
load_x x1, 2 * portWORD_SIZE( sp ) /* Restore t1 register */
addi sp, sp, portCONTEXT_SIZE /* Release stack region */
mret /* Exit the ISR */