X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Finit.c;h=8a037058a7358bea829c75153cfdca313570febd;hb=bcf9f9ab10a3df0fd12e6e69944307a63967a521;hp=9815a2030749dcece5d2c4e378a5b79120d1d9b7;hpb=d88e8f5938d6aae4b58149b259fd485278a83ef9;p=pintos-anon diff --git a/src/threads/init.c b/src/threads/init.c index 9815a20..8a03705 100644 --- a/src/threads/init.c +++ b/src/threads/init.c @@ -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 - * 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); } }