/**************************************************************************//**
 * @item     CosyOS-III Port
 * @file     port_rv32_FSL.S
 * @brief    RISC-V32 Core Port File for Interrupt FIFO Service Loading
 * @author   迟凯峰
 * @version  v3.0.7
 * @date     2026.08.14
 ******************************************************************************/

#include "syscfg.h"
#include "mcucfg_rv32.h"

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

#if (SYSCFG_PENDSVFIFO_DEPTH > 0)

/* 互斥访问机制 */
#if (MCUCFG_PENDSVFIFO_MUTEX == 0xFF)
.data
mPendSV_FIFO_X: .word 0
#endif

/* 中断FIFO服务装载器 */
.global mPendSV_FIFOLoader
.align  2
mPendSV_FIFOLoader:

/* FIFO选择 */
	la       a2,  m_fifo_lock
	lb       a3, (a2)
	beqz     a3,  1f
	la       a1,  mPendSV_FIFO_0
	j        2f
1:	la       a1,  mPendSV_FIFO_1
/* 计数溢出 */
2:
	#if (0) // 正常情况下计数器难以溢出，默认关闭防护以提高装载效率。
	lw       a2, (a1)
	li       a3,  0x80000000
	bltu     a3,  a2,  5f
	#endif
/* FIFO计数 */
	/* 关闭总中断（嵌套方式）*/
	#if   (MCUCFG_PENDSVFIFO_MUTEX == 0)
	csrr     a3,  mstatus
	csrc     mstatus, 0x8
	fence.i
	lw       a2, (a1)
	addi     a2,  a2,  1
	sw       a2, (a1)
	csrw     mstatus, a3
	/* [lr][sc]指令 */
	#elif (MCUCFG_PENDSVFIFO_MUTEX == 1)
3:	lr.w     a2, (a1)
	addi     a2,  a2,  1
	sc.w     a3,  a2, (a1)
	bnez     a3,  3b
	/* [amoadd]指令 */
	#elif (MCUCFG_PENDSVFIFO_MUTEX == 2)
	li       a3,  1
	amoadd.w a2,  a3, (a1)
	addi     a2,  a2,  1
	/* 互斥访问机制 */
	#elif (MCUCFG_PENDSVFIFO_MUTEX == 0xFF)
	csrrwi   a3,  mscratch, 1
3:	add      tp,  a1,  zero
	lw       a2, (tp)
	addi     a2,  a2,  1
	sw       a2, (tp)
	bne      tp,  a1,  3b
	csrw     mscratch, a3
	beqz     a3,  4f
	la       tp,  mPendSV_FIFO_X
	#endif
/* FIFO溢出 */
4:	li       a3,  SYSCFG_PENDSVFIFO_DEPTH
	bltu     a3,  a2,  5f
/* FIFO装载 */
	slli     a2,  a2,  2
	add      a1,  a1,  a2
	sw       a0, (a1)

5:	ret

#endif
