Skip to content
Snippets Groups Projects
Commit 49d3f220 authored by Sylvain Gauthier's avatar Sylvain Gauthier
Browse files

[SMP/Debug] New syscall to send arbitrary SGIs

Created a new syscall, seL4_DebugSendIPI for ARM to send arbitrary SGIs
(software generated interrupts) to arbitrary cores. As SGIs are
specifically PPIs (private interrupts), this syscall effectively allows
to trigger PPIs on arbitrary cores, for debug/testing purposes.
parent 9b1877de
No related branches found
No related tags found
No related merge requests found
......@@ -41,6 +41,7 @@ Upcoming release: BREAKING
* Non-hyp support added for Arm GICv3 interrupt controller.
* Add initial i.MX8M Quad evk 64-bit Support. Currently only AArch64 EL1 non-secure is supported.
* Add FVP platform with fixed configuration. This currently assumes A57 configuration described in tools/dts/fvp.dts.
* Add new seL4_DebugSendIPI syscall to send arbitrary SGIs on ARM when SMP and DEBUG_BUILD are activated.
## Upgrade Notes
---
......
......@@ -360,6 +360,13 @@ LIBSEL4_INLINE_FUNC void seL4_DebugNameThread(seL4_CPtr tcb, const char *name)
arm_sys_send_recv(seL4_SysDebugNameThread, tcb, &unused0, 0, &unused1, &unused2, &unused3, &unused4, &unused5);
}
#if CONFIG_MAX_NUM_NODES > 1
LIBSEL4_INLINE_FUNC void seL4_DebugSendIPI(seL4_Uint8 target, unsigned irq)
{
arm_sys_send(seL4_SysDebugSendIPI, target, irq, 0, 0, 0, 0);
}
#endif
#endif
#ifdef CONFIG_DANGEROUS_CODE_INJECTION
......
......@@ -37,6 +37,9 @@
<syscall name="DebugSnapshot" />
<syscall name="DebugNameThread"/>
</config>
<config condition="defined CONFIG_DEBUG_BUILD &amp;&amp; CONFIG_MAX_NUM_NODES > 1">
<syscall name="DebugSendIPI"/>
</config>
<config condition="defined CONFIG_DANGEROUS_CODE_INJECTION">
<syscall name="DebugRun"/>
</config>
......
......@@ -336,6 +336,20 @@ seL4_DebugCapIdentify(seL4_CPtr cap);
*/
LIBSEL4_INLINE_FUNC void
seL4_DebugNameThread(seL4_CPtr tcb, const char *name);
#if CONFIG_MAX_NUM_NODES > 1 && defined CONFIG_ARCH_ARM
/**
* @xmlonly <manual name="Send SGI 0-15" label="sel4_debugsendipi"/> @endxmlonly
* @brief Sends arbitrary SGI.
*
* Send an arbitrary SGI (core-specific interrupt 0-15) to the specified target core.
*
* @param target The target core ID.
* @param irq The SGI number (0-15).
*
*/
LIBSEL4_INLINE_FUNC void
seL4_DebugSendIPI(seL4_Uint8 target, unsigned irq);
#endif
#endif
#ifdef CONFIG_DANGEROUS_CODE_INJECTION
......
......@@ -119,6 +119,24 @@ exception_t handleUnknownSyscall(word_t w)
setThreadName(TCB_PTR(cap_thread_cap_get_capTCBPtr(lu_ret.cap)), name);
return EXCEPTION_NONE;
}
#if defined ENABLE_SMP_SUPPORT && defined CONFIG_ARCH_ARM
if (w == SysDebugSendIPI) {
seL4_Word target = getRegister(NODE_STATE(ksCurThread), capRegister);
irq_t irq = getRegister(NODE_STATE(ksCurThread), msgInfoRegister);
if (target > CONFIG_MAX_NUM_NODES) {
userError("SysDebugSendIPI: Invalid target, halting");
halt();
}
if (irq > 15) {
userError("SysDebugSendIPI: Invalid IRQ, not a SGI, halting");
halt();
}
ipi_send_target(irq, BIT(target));
return EXCEPTION_NONE;
}
#endif /* ENABLE_SMP_SUPPORT && CONFIG_ARCH_ARM */
#endif /* CONFIG_DEBUG_BUILD */
#ifdef CONFIG_DANGEROUS_CODE_INJECTION
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment