GIC2.0 通过操作 GICD_SGIR(0xf00)寄存器发送软中断
TargetListFilter 位设置 0 表示转发中断到 CPUTargetList 位所指定的核上:
SGIINTID 位设置需要发送的中断号 0-15。
因此发送软中断接口实现如下:
static VOID armGicV1RaiseSoftIrq (UINT64 ullCpuId, ULONG ulVector)
{
ULONG ulBase;
UINT32 uiVal;
ulBase = GIC_DIST_BASE_GET(); /* 获取 GICD 基址 */
KN_SMP_WMB();
uiVal = (0 << 24) | (UINT32)((1 << ullCpuId) << 16) | (UINT32)ulVector;
write32(uiVal, ulBase + GICD_SGIR);
}
在 SylixOS 上接收核注册对应中断的服务函数即可:
static irqreturn_t __IsrFunc(PVOID pvArg, ULONG ulVector)
{
/*
* do something
*/
return (LW_IRQ_HANDLED);
}
PVOID arg = NULL;
ULONG softirq_id = 4;
API_InterVectorConnect(softirq_id,
(PINT_SVR_ROUTINE)__IsrFunc,
(PVOID)arg,
"soft_irq_4");
API_InterVectorEnable(softirq_id);