Move user exception support into userprog.
[pintos-anon] / src / threads / thread.c
index 4b848038a0b9ac03c6a23a72a98a62178b88edb2..d89edd6c8dcad5dcbe9cae5f21c2273c19be1f4d 100644 (file)
@@ -8,6 +8,9 @@
 #include "palloc.h"
 #include "random.h"
 #include "switch.h"
+#ifdef USERPROG
+#include "gdt.h"
+#endif
 
 #define THREAD_MAGIC 0x1234abcdu
 
@@ -23,11 +26,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);
@@ -75,7 +78,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;
@@ -135,7 +138,7 @@ thread_execute (const char *filename)
   if_->ds = SEL_UDSEG;
   if_->eip = start;
   if_->cs = SEL_UCSEG;
-  if_->eflags = FLAG_IF | 2;
+  if_->eflags = FLAG_IF | FLAG_MBS;
   if_->esp = PHYS_BASE;
   if_->ss = SEL_UDSEG;
 
@@ -262,7 +265,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);
 
@@ -336,7 +339,9 @@ destroy_thread (struct thread *t)
   ASSERT (t->status == THREAD_DYING);
   ASSERT (t != thread_current ());
 
+#ifdef USERPROG
   addrspace_destroy (t);
+#endif
   palloc_free (t);
 }