* \author Stefano Fedrigo <aleph@develer.com>
*/
-/*
- * $Log$
- * Revision 1.6 2004/07/30 14:24:16 rasky
- * Task switching con salvataggio perfetto stato di interrupt (SR)
- * Kernel monitor per dump informazioni su stack dei processi
- *
- * Revision 1.5 2004/07/14 14:18:09 rasky
- * Merge da SC: Rimosso timer dentro il task, che è uno spreco di memoria per troppi task
- *
- * Revision 1.4 2004/07/13 19:21:28 aleph
- * Avoid warning for unused arg when compiled without some CONFIG_KERN_xx options
- *
- * Revision 1.3 2004/06/06 18:37:57 bernie
- * Rename event macros to look like regular functions.
- *
- * Revision 1.2 2004/06/03 11:27:09 bernie
- * Add dual-license information.
- *
- * Revision 1.1 2004/05/23 17:27:00 bernie
- * Import kern/ subdirectory.
- *
- */
+/*#*
+ *#* $Log$
+ *#* Revision 1.16 2004/10/03 20:39:28 bernie
+ *#* Import changes from sc/firmware.
+ *#*
+ *#* Revision 1.15 2004/09/20 03:29:39 bernie
+ *#* C++ fixes.
+ *#*
+ *#* Revision 1.14 2004/09/14 21:06:44 bernie
+ *#* Use debug.h instead of kdebug.h.
+ *#*
+ *#* Revision 1.13 2004/08/29 21:58:53 bernie
+ *#* Include macros.h explicityl.
+ *#*
+ *#* Revision 1.11 2004/08/24 16:09:08 bernie
+ *#* Add missing header.
+ *#*
+ *#* Revision 1.10 2004/08/24 16:07:01 bernie
+ *#* Use kputs()/kputchar() when possible.
+ *#*
+ *#* Revision 1.9 2004/08/24 14:26:57 bernie
+ *#* monitor_debug_stacks(): Conditionally compile on CONFIG_KERN_MONITOR.
+ *#*
+ *#* Revision 1.8 2004/08/14 19:37:57 rasky
+ *#* Merge da SC: macros.h, pool.h, BIT_CHANGE, nome dei processi, etc.
+ *#*
+ *#* Revision 1.7 2004/08/02 20:20:29 aleph
+ *#* Merge from project_ks
+ *#*
+ *#* Revision 1.6 2004/07/30 14:24:16 rasky
+ *#* Task switching con salvataggio perfetto stato di interrupt (SR)
+ *#* Kernel monitor per dump informazioni su stack dei processi
+ *#*
+ *#* Revision 1.5 2004/07/14 14:18:09 rasky
+ *#* Merge da SC: Rimosso timer dentro il task, che è uno spreco di memoria per troppi task
+ *#*
+ *#* Revision 1.4 2004/07/13 19:21:28 aleph
+ *#* Avoid warning for unused arg when compiled without some CONFIG_KERN_xx options
+ *#*
+ *#* Revision 1.3 2004/06/06 18:37:57 bernie
+ *#* Rename event macros to look like regular functions.
+ *#*
+ *#* Revision 1.2 2004/06/03 11:27:09 bernie
+ *#* Add dual-license information.
+ *#*
+ *#* Revision 1.1 2004/05/23 17:27:00 bernie
+ *#* Import kern/ subdirectory.
+ *#*
+ *#*/
-#include "cpu.h"
#include "proc_p.h"
#include "proc.h"
+#include "cpu.h"
#include "event.h"
#include "hw.h"
-#include <drv/kdebug.h>
+#include <debug.h>
+#include <arch_config.h> /* ARCH_EMUL */
+#include <macros.h> /* ABS() */
#include <string.h> /* memset() */
-/*! CPU dependent context switching routines
- * \note This function *MUST* preserve also the status of the interrupts.
+/*!
+ * CPU dependent context switching routines.
+ *
+ * \note This function *MUST* preserve also the status of the interrupts.
*/
-extern void asm_switch_context(cpustack_t **new_sp, cpustack_t **save_sp);
-extern int asm_switch_version(void);
+EXTERN_C void asm_switch_context(cpustack_t **new_sp, cpustack_t **save_sp);
+EXTERN_C int asm_switch_version(void);
/*
* The scheduer tracks ready and waiting processes
struct Process MainProcess;
-#if CONFIG_KERN_MONITOR
-List MonitorProcs;
-
-static void monitor_init(void)
-{
- INITLIST(&MonitorProcs);
-}
-
-static void monitor_add(Process* proc, cpustack_t* stack_base, size_t stack_size)
-{
- proc->monitor.stack_base = stack_base;
- proc->monitor.stack_size = stack_size;
-
- ADDTAIL(&MonitorProcs, &proc->monitor.link);
-}
-
-static void monitor_remove(Process* proc)
-{
- REMOVE(&proc->monitor.link);
-}
-
-#define MONITOR_NODE_TO_PROCESS(node) \
- (struct Process*)((char*)(node) - offsetof(struct Process, monitor.link))
-
-size_t monitor_check_stack(cpustack_t* stack_base, size_t stack_size)
-{
- cpustack_t* beg;
- cpustack_t* cur;
- cpustack_t* end;
- size_t sp_free;
-
- beg = stack_base;
- end = stack_base + stack_size / sizeof(cpustack_t) - 1;
-
- if (CPU_STACK_GROWS_UPWARD)
- {
- cur = beg;
- beg = end;
- end = cur;
- }
-
- cur = beg;
- while (cur != end)
- {
- if (*cur != CONFIG_KERN_STACKFILLCODE)
- break;
-
- if (CPU_STACK_GROWS_UPWARD)
- cur--;
- else
- cur++;
- }
-
- sp_free = ABS(cur - beg) * sizeof(cpustack_t);
- return sp_free;
-}
-
-void monitor_debug_stacks(void)
-{
- struct Process* p;
-
- for (p = MONITOR_NODE_TO_PROCESS(MonitorProcs.head);
- p->monitor.link.succ;
- p = MONITOR_NODE_TO_PROCESS(p->monitor.link.succ))
- {
- size_t free = monitor_check_stack(p->monitor.stack_base, p->monitor.stack_size);
- kprintf("TCB: %x sp_base: %x sp_size: %x sp_free: %x\n", (uint16_t)p, (uint16_t)p->monitor.stack_base, (uint16_t)p->monitor.stack_size, (uint16_t)free);
- }
-}
-
-#endif
-
-
static void proc_init_struct(Process* proc)
{
+ /* Avoid warning for unused argument */
+ (void)proc;
+
#if CONFIG_KERN_SIGNALS
proc->sig_recv = 0;
#endif
#endif
}
+
void proc_init(void)
{
INITLIST(&ProcReadyList);
* \return Process structure of new created process
* if successful, NULL otherwise.
*/
-Process *proc_new(void (*entry)(void), size_t stacksize, cpustack_t *stack_base)
+struct Process *proc_new_with_name(UNUSED(const char*, name), void (*entry)(void), IPTR data, size_t stacksize, cpustack_t *stack_base)
{
Process *proc;
cpuflags_t flags;
}
proc_init_struct(proc);
+ proc->user_data = data;
#if CONFIG_KERN_HEAP
proc->stack_base = stack_base;
ENABLE_IRQRESTORE(flags);
#if CONFIG_KERN_MONITOR
- monitor_add(proc, stack_base, stacksize);
+ monitor_add(proc, name, stack_base, stacksize);
#endif
return proc;
return CurrentProcess;
}
+/*!
+ * Get the pointer to the user data of the current process
+ */
+IPTR proc_current_user_data(void)
+{
+ return CurrentProcess->user_data;
+}
#if 0 /* Simple testcase for the scheduler */
+#include <drv/timer.h>
+
/*!
* Proc scheduling test subthread 1
*/
*/
void NORETURN proc_test(void)
{
- proc_new(proc_test_thread1, sizeof(proc_test_stack1), proc_test_stack1);
- proc_new(proc_test_thread2, sizeof(proc_test_stack2), proc_test_stack2);
+ proc_new(proc_test_thread1, NULL, sizeof(proc_test_stack1), proc_test_stack1);
+ proc_new(proc_test_thread2, NULL, sizeof(proc_test_stack2), proc_test_stack2);
kputs("Created tasks\n");
kputs("stack1:\n");