Spelling/grammar fixes.
[bertos.git] / kern / proc.c
index 6ce3071aaf104379519f69e74ec7f799ac1c5424..c0a45a7295649a956c9ce2729583cea2a61bf7bd 100755 (executable)
  * \author Stefano Fedrigo <aleph@develer.com>
  */
 
-/*
- * $Log$
- * 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.
- *
- */
+/*#*
+ *#* $Log$
+ *#* Revision 1.12  2004/08/25 14:12:09  rasky
+ *#* Aggiornato il comment block dei log RCS
+ *#*
+ *#* 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"
@@ -47,6 +62,7 @@
 #include "event.h"
 #include "hw.h"
 #include <drv/kdebug.h>
+#include <arch_config.h>  /* ARCH_EMUL */
 
 #include <string.h> /* memset() */
 
@@ -93,8 +109,9 @@ static void monitor_init(void)
        INITLIST(&MonitorProcs);
 }
 
-static void monitor_add(Process* proc, cpustack_t* stack_base, size_t stack_size)
+static void monitor_add(Process* proc, const char* name, cpustack_t* stack_base, size_t stack_size)
 {
+       proc->monitor.name = name;
        proc->monitor.stack_base = stack_base;
        proc->monitor.stack_size = stack_size;
 
@@ -142,19 +159,35 @@ size_t monitor_check_stack(cpustack_t* stack_base, size_t stack_size)
        return sp_free;
 }
 
+#if CONFIG_KERN_MONITOR
+
 void monitor_debug_stacks(void)
 {
        struct Process* p;
+       int i;
+
+       if (ISLISTEMPTY(&MonitorProcs))
+       {
+               kputs("No stacks registered in the monitor\n");
+               return;
+       }
+
+       kprintf("%-24s    %-6s%-8s%-8s%-8s\n", "Process name", "TCB", "SPbase", "SPsize", "SPfree");
+       for (i=0;i<56;i++)
+               kputchar('-');
+       kputchar('\n');
 
        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);
+               kprintf("%-24s    %04x    %04x    %4x    %4x\n", p->monitor.name, (uint16_t)p, (uint16_t)p->monitor.stack_base, (uint16_t)p->monitor.stack_size, (uint16_t)free);
        }
 }
 
+#endif /* CONFIG_KERN_MONITOR */
+
 #endif
 
 
@@ -199,7 +232,7 @@ void proc_init(void)
  * \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;
@@ -258,6 +291,7 @@ Process *proc_new(void (*entry)(void), size_t stacksize, cpustack_t *stack_base)
        }
 
        proc_init_struct(proc);
+       proc->user_data = data;
 
 #if CONFIG_KERN_HEAP
        proc->stack_base = stack_base;
@@ -280,7 +314,7 @@ Process *proc_new(void (*entry)(void), size_t stacksize, cpustack_t *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;
@@ -416,6 +450,13 @@ struct Process *proc_current(void)
        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 */
 
@@ -453,8 +494,8 @@ static cpustack_t proc_test_stack2[CONFIG_KERN_DEFSTACKSIZE/sizeof(cpustack_t)];
  */
 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");