*
* \version $Id: proc.h 1646 2008-08-17 13:49:48Z bernie $
* \author Bernie Innocenti <bernie@codewiz.org>
+ *
+ * Still in development, disable nightly test for now
+ * notest: avr
+ * notest: arm
*/
#include "irq.h"
#include <cfg/module.h>
#include <kern/proc_p.h>
+#include <kern/proc.h>
#include <cfg/cfg_kern.h>
/* signal handler */
void irq_entry(int signum)
{
+#if CONFIG_KERN_PREEMPT
Process * const old_process = CurrentProcess;
+#endif
irq_handlers[signum]();
#if CONFIG_KERN_PREEMPT
- if (!CurrentProcess)
+ ASSERT2(CurrentProcess, "no idle proc?");
+
+ if (old_process != CurrentProcess)
{
- TRACEMSG("no runnable processes!");
+ IRQ_DISABLE;
+
+ TRACEMSG("switching from %p:%s to %p:%s",
+ old_process, old_process ? old_process->monitor.name : "---",
+ CurrentProcess, proc_currentName());
+
+ if (old_process)
+ swapcontext(&old_process->context, &CurrentProcess->context);
+ else
+ setcontext(&CurrentProcess->context);
+
IRQ_ENABLE;
- pause();
- }
- else
- {
- if (old_process != CurrentProcess)
- {
- TRACEMSG("switching from %p:%s to %p:%s",
- old_process, old_process ? old_process->monitor.name : "-",
- CurrentProcess, CurrentProcess->monitor.name);
-
- if (old_process)
- swapcontext(&old_process->context, &CurrentProcess->context);
- else
- setcontext(&CurrentProcess->context);
-
- // not reached
- }
- TRACEMSG("keeping %p:%s", CurrentProcess, CurrentProcess->monitor.name);
}
+ TRACEMSG("resuming %p:%s", CurrentProcess, CurrentProcess->monitor.name);
#endif // CONFIG_KERN_PREEMPT
}
void irq_init(void)
{
struct sigaction act;
+
act.sa_handler = irq_entry;
sigemptyset(&act.sa_mask);
//sigaddset(&act.sa_mask, irq);
act.sa_flags = SA_RESTART; // | SA_SIGINFO;
sigaction(SIGUSR1, &act, NULL);
- #if !(ARCH & ARCH_QT)
- sigaction(SIGALRM, &act, NULL);
- #endif
+ sigaction(SIGALRM, &act, NULL);
MOD_INIT(irq);
}