/// The global emulator instance.
Emulator *emul;
-#if CONFIG_KERNEL
- #include <struct/list.h>
-
- /// List of process stacks
- List StackFreeList;
-
- // HACK: Reserve 64KB of stack space for kernel processes
- const int NPROC = 8;
- int stacks[NPROC][(64 * 1024) / sizeof(int)];
-#endif
-
Emulator::Emulator(int &argc, char **argv) :
emulApp(new QApplication(argc, argv)),
emulWin(new EmulWin(this))
// setup global emulator pointer
emul = new Emulator(*argc, argv);
-#if CONFIG_KERNEL
- LIST_INIT(&StackFreeList);
- for (int i = 0; i < NPROC; i++)
- ADDTAIL(&StackFreeList, (Node *)stacks[i]);
-#endif
-
MOD_INIT(emul);
}
#include "cfg/cfg_arch.h" /* ARCH_EMUL */
#include "cfg/cfg_kern.h"
#include <cfg/module.h>
+#include <cfg/depend.h> // CONFIG_DEPEND()
#include <cpu/irq.h>
#include <cpu/types.h>
#include <string.h> /* memset() */
-// FIXME: move somewhere
-#define CONFIG_DEPEND(FEATURE, DEPS) STATIC_ASSERT(!(FEATURE) || !!(DEPS))
-
-CONFIG_DEPEND(CONFIG_KERN_PRI, CONFIG_KERN_PREEMPT);
+// Check config dependencies
+CONFIG_DEPEND(CONFIG_KERN_SIGNALS, CONFIG_KERN_SCHED);
+CONFIG_DEPEND(CONFIG_KERN_SEMAPHORES, CONFIG_KERN_SIGNALS);
+CONFIG_DEPEND(CONFIG_KERN_MONITOR, CONFIG_KERN_SCHED);
/*
#if (ARCH & ARCH_EMUL)
/*
- * In hosted environments, we must emulate the stack on the real process stack.
+ * In some hosted environments, we must emulate the stack on the real
+ * process stack to satisfy consistency checks in system libraries and
+ * because some ABIs place trampolines on the stack.
*
* Access to this list must be protected by PROC_ATOMIC().
*/
-extern List StackFreeList;
+List StackFreeList;
+
+#define NPROC 8
+cpustack_t proc_stacks[NPROC][(64 * 1024) / sizeof(cpustack_t)];
#endif
/** The main process (the one that executes main()). */
{
LIST_INIT(&ProcReadyList);
+#if ARCH & ARCH_EMUL
+ LIST_INIT(&StackFreeList);
+ for (int i = 0; i < NPROC; i++)
+ ADDTAIL(&StackFreeList, (Node *)proc_stacks[i]);
+#endif
+
/*
* We "promote" the current context into a real process. The only thing we have
* to do is create a PCB and make it current. We don't need to setup the stack
MOD_INIT(proc);
}
-
/**
* Create a new process, starting at the provided entry point.
*
#endif
}
+
+#if CONFIG_KERN_PRI
/**
* Change the scheduling priority of a process.
*
//pric_permit();
}
}
+#endif // CONFIG_KERN_PRI
/**
* Terminate the current process