Get rid of THREAD_JOIN_IMPLEMENTED by adding thread_join() stub.
[pintos-anon] / src / threads / init.c
index ef67071aec53daceb476b02faf3af4fe48fd7824..b4b1057eb750fd290d7a02adbc752c073db7a210 100644 (file)
@@ -49,8 +49,8 @@ static bool format_filesys;
 static char *initial_program;
 #endif
 
-/* -q: Power off after running requested actions? */
-static bool do_power_off;
+/* -q: Power off after kernel tasks complete? */
+bool power_off_when_done;
 
 static void ram_init (void);
 static void paging_init (void);
@@ -105,6 +105,7 @@ main (void)
   /* Start thread scheduler and enable interrupts. */
   thread_start ();
   serial_init_queue ();
+  timer_calibrate ();
 
 #ifdef FILESYS
   /* Initialize filesystem. */
@@ -122,10 +123,8 @@ main (void)
       tid_t tid;
       printf ("\nExecuting '%s':\n", initial_program);
       tid = process_execute (initial_program);
-#ifdef THREAD_JOIN_IMPLEMENTED
       if (tid != TID_ERROR)
         thread_join (tid);
-#endif
     }
 #else
   /* Run the compiled-in test function. */
@@ -133,7 +132,7 @@ main (void)
 #endif
 
   /* Finish up. */
-  if (do_power_off
+  if (power_off_when_done
     power_off ();
   else 
     thread_exit ();
@@ -189,7 +188,11 @@ paging_init (void)
       pt[pte_idx] = pte_create_kernel (vaddr, true);
     }
 
-  asm volatile ("movl %0,%%cr3" :: "r" (vtop (base_page_dir)));
+  /* Store the physical address of the page directory into CR3
+     aka PDBR (page directory base register).  This activates our
+     new page tables immediately.  See [IA32-v2a] "MOV--Move
+     to/from Control Registers" and [IA32-v3] 3.7.5. */
+  asm volatile ("mov %%cr3, %0" :: "r" (vtop (base_page_dir)));
 }
 
 /* Parses the command line. */
@@ -225,7 +228,7 @@ argv_init (void)
     else if (!strcmp (argv[i], "-d")) 
       debug_enable (argv[++i]);
     else if (!strcmp (argv[i], "-q"))
-      do_power_off = true;
+      power_off_when_done = true;
 #ifdef USERPROG
     else if (!strcmp (argv[i], "-ex")) 
       initial_program = argv[++i];