proc: Move stack hack from emul.c to proc.c
authorbernie <bernie@38d2e660-2303-0410-9eaa-f027e97ec537>
Mon, 25 Aug 2008 11:23:00 +0000 (11:23 +0000)
committerbernie <bernie@38d2e660-2303-0410-9eaa-f027e97ec537>
Mon, 25 Aug 2008 11:23:00 +0000 (11:23 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1681 38d2e660-2303-0410-9eaa-f027e97ec537

bertos/emul/emul.cpp
bertos/kern/proc.c

index e26c680e7a0ecfb05f58c13094b86b09db40a2c7..9b06fb90269236d1a34a07164ce9b9af2b47291a 100644 (file)
 /// 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))
@@ -95,12 +84,6 @@ extern "C" void emul_init(int *argc, char *argv[])
        // 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);
 }
 
index b49c87f3e0eb666cbf94170b103d6b836ebfb7f5..6bd5fdf417ed1469a989aa8ac0539ec8c70373d2 100644 (file)
@@ -44,6 +44,7 @@
 #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);
 
 
 /*
@@ -75,11 +76,16 @@ REGISTER Process *CurrentProcess;
 
 #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()). */
@@ -110,6 +116,12 @@ void proc_init(void)
 {
        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
@@ -130,7 +142,6 @@ void proc_init(void)
        MOD_INIT(proc);
 }
 
-
 /**
  * Create a new process, starting at the provided entry point.
  *
@@ -270,6 +281,8 @@ void proc_rename(struct Process *proc, const char *name)
 #endif
 }
 
+
+#if CONFIG_KERN_PRI
 /**
  * Change the scheduling priority of a process.
  *
@@ -303,6 +316,7 @@ void proc_setPri(struct Process *proc, int pri)
                                //pric_permit();
                }
 }
+#endif // CONFIG_KERN_PRI
 
 /**
  * Terminate the current process