Eliminate user_page_limit global symbol.
[pintos-anon] / src / threads / init.c
index 9815a2030749dcece5d2c4e378a5b79120d1d9b7..8a037058a7358bea829c75153cfdca313570febd 100644 (file)
@@ -40,7 +40,7 @@
 size_t ram_pages;
 
 /* Page directory with kernel mappings only. */
-uint32_t *base_page_dir;
+uint32_t *init_page_dir;
 
 #ifdef FILESYS
 /* -f: Format the file system? */
@@ -53,6 +53,9 @@ 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;
+
 static void ram_init (void);
 static void paging_init (void);
 
@@ -88,7 +91,7 @@ main (void)
   printf ("Pintos booting with %'zu kB RAM...\n", ram_pages * PGSIZE / 1024);
 
   /* Initialize memory system. */
-  palloc_init ();
+  palloc_init (user_page_limit);
   malloc_init ();
   paging_init ();
 
@@ -152,7 +155,7 @@ ram_init (void)
 
 /* Populates the base page directory and page table with the
    kernel virtual mapping, and then sets up the CPU to use the
-   new page directory.  Points base_page_dir to the page
+   new page directory.  Points init_page_dir to the page
    directory it creates.
 
    At the time this function is called, the active page table
@@ -166,7 +169,7 @@ paging_init (void)
   size_t page;
   extern char _start, _end_kernel_text;
 
-  pd = base_page_dir = palloc_get_page (PAL_ASSERT | PAL_ZERO);
+  pd = init_page_dir = palloc_get_page (PAL_ASSERT | PAL_ZERO);
   pt = NULL;
   for (page = 0; page < ram_pages; page++) 
     {
@@ -190,7 +193,7 @@ paging_init (void)
      new page tables immediately.  See [IA32-v2a] "MOV--Move
      to/from Control Registers" and [IA32-v3a] 3.7.5 "Base Address
      of the Page Directory". */
-  asm volatile ("movl %0, %%cr3" : : "r" (vtop (base_page_dir)));
+  asm volatile ("movl %0, %%cr3" : : "r" (vtop (init_page_dir)));
 }
 
 /* Breaks the kernel command line into words and returns them as
@@ -376,35 +379,38 @@ usage (void)
   power_off ();
 }
 
+/* Keyboard control register port. */
+#define CONTROL_REG 0x64
 
-/* Reboots the machine we're running on. */
+/* Reboots the machine via the keyboard controller. */
 void
 reboot (void)
 {
-    int i;
-
-    printf ("Rebooting...\n");
-
-    /* based on reboot.c code by Osamu Tomita <tomita@cinet.co.jp>
-     * See http://www.win.tue.nl/~aeb/linux/kbd/scancodes-11.html */
-    for (i = 0; i < 100; i++) {
-        int j;
-
-        /* Poll keyboard controller's status byte until 
-         * 'input buffer empty' is reported, so it's ok to write */
-        for (j = 0; j < 0x10000; j++) 
-          {
-            if ((inb (0x64) & 0x02) == 0)   
-              break;
-            timer_usleep (2);
-          }
-
-        timer_usleep (50);
-
-        /* Pulse bit 0 of the output port P2 of the keyboard controller. 
-         * This will reset the CPU. */
-        outb (0x64, 0xfe);
-        timer_usleep (50);
+  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);
     }
 }