Rename ram_pages to init_ram_pages.
[pintos-anon] / src / threads / init.c
index 8a037058a7358bea829c75153cfdca313570febd..d2d3e087de286cb8f5b48fd960d1568ae2d1cab4 100644 (file)
@@ -11,6 +11,7 @@
 #include "devices/kbd.h"
 #include "devices/input.h"
 #include "devices/serial.h"
+#include "devices/shutdown.h"
 #include "devices/timer.h"
 #include "devices/vga.h"
 #include "devices/rtc.h"
@@ -37,7 +38,7 @@
 #endif
 
 /* Amount of physical memory, in 4 kB pages. */
-size_t ram_pages;
+size_t init_ram_pages;
 
 /* Page directory with kernel mappings only. */
 uint32_t *init_page_dir;
@@ -47,12 +48,6 @@ uint32_t *init_page_dir;
 static bool format_filesys;
 #endif
 
-/* -q: Power off after kernel tasks complete? */
-bool power_off_when_done;
-
-/* -r: Reboot after kernel tasks complete? */
-static bool reboot_when_done;
-
 /* -ul: Maximum number of pages to put into palloc's user pool. */
 static size_t user_page_limit = SIZE_MAX;
 
@@ -64,9 +59,6 @@ static char **parse_options (char **argv);
 static void run_actions (char **argv);
 static void usage (void);
 
-static void print_stats (void);
-
-
 int main (void) NO_RETURN;
 
 /* Pintos main program. */
@@ -88,7 +80,8 @@ main (void)
   console_init ();  
 
   /* Greet user. */
-  printf ("Pintos booting with %'zu kB RAM...\n", ram_pages * PGSIZE / 1024);
+  printf ("Pintos booting with %'zu kB RAM...\n",
+          init_ram_pages * PGSIZE / 1024);
 
   /* Initialize memory system. */
   palloc_init (user_page_limit);
@@ -128,11 +121,7 @@ main (void)
   run_actions (argv);
 
   /* Finish up. */
-  if (reboot_when_done)
-    reboot ();
-
-  if (power_off_when_done)
-    power_off ();
+  shutdown ();
   thread_exit ();
 }
 \f
@@ -150,7 +139,7 @@ ram_init (void)
   memset (&_start_bss, 0, &_end_bss - &_start_bss);
 
   /* Get RAM size from loader.  See loader.S. */
-  ram_pages = *(uint32_t *) ptov (LOADER_RAM_PGS);
+  init_ram_pages = *(uint32_t *) ptov (LOADER_RAM_PGS);
 }
 
 /* Populates the base page directory and page table with the
@@ -171,7 +160,7 @@ paging_init (void)
 
   pd = init_page_dir = palloc_get_page (PAL_ASSERT | PAL_ZERO);
   pt = NULL;
-  for (page = 0; page < ram_pages; page++) 
+  for (page = 0; page < init_ram_pages; page++)
     {
       uintptr_t paddr = page * PGSIZE;
       char *vaddr = ptov (paddr);
@@ -245,9 +234,9 @@ parse_options (char **argv)
       if (!strcmp (name, "-h"))
         usage ();
       else if (!strcmp (name, "-q"))
-        power_off_when_done = true;
+        shutdown_configure (SHUTDOWN_POWER_OFF);
       else if (!strcmp (name, "-r"))
-        reboot_when_done = true;
+        shutdown_configure (SHUTDOWN_REBOOT);
 #ifdef FILESYS
       else if (!strcmp (name, "-f"))
         format_filesys = true;
@@ -376,80 +365,5 @@ usage (void)
           "  -ul=COUNT          Limit user memory to COUNT pages.\n"
 #endif
           );
-  power_off ();
-}
-
-/* Keyboard control register port. */
-#define CONTROL_REG 0x64
-
-/* Reboots the machine via the keyboard controller. */
-void
-reboot (void)
-{
-  int i;
-
-  printf ("Rebooting...\n");
-
-    /* See [kbd] for details on how to program the keyboard
-     * controller. */
-  for (i = 0; i < 100; i++) 
-    {
-      int j;
-
-      /* Poll keyboard controller's status byte until 
-       * 'input buffer empty' is reported. */
-      for (j = 0; j < 0x10000; j++) 
-        {
-          if ((inb (CONTROL_REG) & 0x02) == 0)   
-            break;
-          timer_udelay (2);
-        }
-
-      timer_udelay (50);
-
-      /* Pulse bit 0 of the output port P2 of the keyboard controller. 
-       * This will reset the CPU. */
-      outb (CONTROL_REG, 0xfe);
-      timer_udelay (50);
-    }
-}
-
-/* Powers down the machine we're running on,
-   as long as we're running on Bochs or QEMU. */
-void
-power_off (void) 
-{
-  const char s[] = "Shutdown";
-  const char *p;
-
-#ifdef FILESYS
-  filesys_done ();
-#endif
-
-  print_stats ();
-
-  printf ("Powering off...\n");
-  serial_flush ();
-
-  for (p = s; *p != '\0'; p++)
-    outb (0x8900, *p);
-  asm volatile ("cli; hlt" : : : "memory");
-  printf ("still running...\n");
-  for (;;);
-}
-
-/* Print statistics about Pintos execution. */
-static void
-print_stats (void) 
-{
-  timer_print_stats ();
-  thread_print_stats ();
-#ifdef FILESYS
-  disk_print_stats ();
-#endif
-  console_print_stats ();
-  kbd_print_stats ();
-#ifdef USERPROG
-  exception_print_stats ();
-#endif
+  shutdown_power_off ();
 }