/**************************************************************************//**
 * @item     CosyOS-III Port
 * @file     port_rv32e_HWS.S
 * @brief    RV32E Core Port File for Hardware Stack
 * @note     对处理器特权模式无要求。
 * @note     x4(tp)寄存器默认未保护，如需保护可自行开启。
 * @author   迟凯峰
 * @version  v3.0.7
 * @date     2026.08.14
 ******************************************************************************/

#if defined ( __riscv_32e )

#include "syscfg.h"
#include "mcucfg_rv32.h"
#define   store    sw
#define   load     lw

////////////////////////////////////////////////////////////////////////////////

/* PendSV 软中断 */

.global OS_PendSV_Handler
.align  2
OS_PendSV_Handler: // hardware push Caller

/* push Callee */
	addi sp, sp, -4 * MCUCFG_REGBYTES
	store    x8,  1 * MCUCFG_REGBYTES(sp)
	store    x9,  2 * MCUCFG_REGBYTES(sp)
////store    x4,  3 * MCUCFG_REGBYTES(sp) // default not store/load x4

	call    sPendSV_Handler
	beqz    a0,  2f // 直接返回
	la      s1,  s_task_current
	addi    s0,  a0, -1
	beqz    s0,  1f // 恢复现场

/* push mepc */
	csrr    a0,  mepc
	store   a0,   0 * MCUCFG_REGBYTES(sp)

/* 任务-PC 监控 */
#if (SYSCFG_TASKPC_MONITOR == 1)
	la      a1,  s_pc
	sw      a0, (a1)
#endif

	lw      t0, (s1)
	sw      sp, (t0)
	fence   rw,  rw

/* 恢复现场 */
1:	la      t1,  s_task_news
	lw      t0, (t1)
	lw      sp, (t0)
	sw      t0, (s1)

/* pop mepc */
	load    a0,   0 * MCUCFG_REGBYTES(sp)
	csrw    mepc, a0

/* pop Callee */
2:	load    x8,   1 * MCUCFG_REGBYTES(sp)
	load    x9,   2 * MCUCFG_REGBYTES(sp)
////load    x4,   3 * MCUCFG_REGBYTES(sp) // default not store/load x4
	addi sp, sp,  4 * MCUCFG_REGBYTES

	mret // hardware pop Caller

////////////////////////////////////////////////////////////////////////////////

#endif
