Misc cleanups in init, thread.
authorBen Pfaff <blp@cs.stanford.edu>
Wed, 1 Sep 2004 22:36:36 +0000 (22:36 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 1 Sep 2004 22:36:36 +0000 (22:36 +0000)
src/lib/random.c
src/threads/init.c
src/threads/thread.c
src/threads/thread.h

index c9973d07b3102bca4f4f0f1a1e8a8c7d2086e717..3fcf62ddca797a1d9514a624d6aed59304d20d0a 100644 (file)
@@ -1,6 +1,7 @@
 #include "random.h"
 #include <stdbool.h>
 #include <stdint.h>
+#include "debug.h"
 
 /* RC4-based pseudo-random state. */
 static uint8_t s[256];
index a3ab43d577c5d6a98bd629883c7f1e84c840034e..ae864981341d110464c59985d3ccd94e8acf193a 100644 (file)
@@ -38,30 +38,14 @@ static bool format_filesys;
 static char *initial_program;
 #endif
 
+static thread_func main_thread;
 static void ram_init (void);
 static void argv_init (void);
 
-static void
-main_thread (void *aux UNUSED) 
-{
-#ifdef FILESYS
-  disk_init ();
-  filesys_init (format_filesys);
-  fsutil_run ();
-#endif
-
-#ifdef USERPROG
-  if (initial_program != NULL)
-    thread_execute (initial_program);
-  else
-    PANIC ("no initial program specified");
-#endif
-}
-
 int
 main (void)
 {
-  /* Initialize prerequisites for calling printk(). */
+  /* Needed by printk(), so initialize them very early. */
   ram_init ();
   vga_init ();
   serial_init ();
@@ -72,13 +56,14 @@ main (void)
   /* Parse command line. */
   argv_init ();
 
-  /* Initialize memory system. */
+  /* Initialize memory system, segments, paging. */
   palloc_init ();
   paging_init ();
   tss_init ();
   gdt_init ();
   malloc_init ();
 
+  /* Set random seed if not already done. */
   random_init (0);
 
   /* Initialize interrupt handlers. */
@@ -92,7 +77,25 @@ main (void)
   thread_start ();
 }
 
+/* Initial thread. */
+static void
+main_thread (void *aux UNUSED) 
+{
+#ifdef FILESYS
+  disk_init ();
+  filesys_init (format_filesys);
+  fsutil_run ();
+#endif
 
+#ifdef USERPROG
+  if (initial_program != NULL)
+    thread_execute (initial_program);
+  else
+    PANIC ("no initial program specified");
+#endif
+}
+\f
+/* Clear BSS and obtain RAM size from loader. */
 static void
 ram_init (void) 
 {
@@ -105,10 +108,11 @@ ram_init (void)
   extern char _start_bss, _end_bss;
   memset (&_start_bss, 0, &_end_bss - &_start_bss);
 
-  /* Get RAM size from loader. */
+  /* Get RAM size from loader.  See loader.S. */
   ram_pages = *(uint32_t *) ptov (LOADER_RAM_PAGES);
 }
-\f
+
+/* Parses the command line. */
 static void
 argv_init (void) 
 {
index fed6b841aded48864edee8307fec6fb6090c87ae..e31d838da14a3c5012c6f8b5affd582c6885952c 100644 (file)
@@ -24,11 +24,11 @@ static void idle (void *aux UNUSED);    /* Thread function. */
 struct kernel_thread_frame 
   {
     void *eip;                  /* Return address. */
-    void (*function) (void *);  /* Function to call. */
+    thread_func *function;      /* Function to call. */
     void *aux;                  /* Auxiliary data for function. */
   };
 
-static void kernel_thread (void (*function) (void *aux), void *aux);
+static void kernel_thread (thread_func *, void *aux);
 
 static struct thread *next_thread_to_run (void);
 static struct thread *new_thread (const char *name);
@@ -76,7 +76,7 @@ thread_start (void)
    semaphore or some other form of synchronization if you need to
    ensure ordering. */
 struct thread *
-thread_create (const char *name, void (*function) (void *aux), void *aux) 
+thread_create (const char *name, thread_func *function, void *aux) 
 {
   struct thread *t;
   struct kernel_thread_frame *kf;
@@ -263,7 +263,7 @@ idle (void *aux UNUSED)
 
 /* Function used as the basis for a kernel thread. */
 static void
-kernel_thread (void (*function) (void *aux), void *aux) 
+kernel_thread (thread_func *function, void *aux) 
 {
   ASSERT (function != NULL);
 
index c4520580fcbca7b20bc1596eeb7bcc538db06d10..1dfde5ac9b03867f94a545f08cc2a7bb2ac83435 100644 (file)
@@ -37,7 +37,8 @@ struct thread
 void thread_init (void);
 void thread_start (void) NO_RETURN;
 
-struct thread *thread_create (const char *name, void (*) (void *aux), void *);
+typedef void thread_func (void *aux);
+struct thread *thread_create (const char *name, thread_func *, void *);
 #ifdef USERPROG
 bool thread_execute (const char *filename);
 #endif