X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Finit.c;h=01eec1120c923804083b747367b4e1a621ea5e19;hb=a4e60364ebf69203297ce071914671d2b49d9b6d;hp=b89b282435ffa4fd284c776049dcc4c45a60c66c;hpb=0fd3a243b790dd1cfc9e0a40c57dddde56cf344d;p=pintos-anon diff --git a/src/threads/init.c b/src/threads/init.c index b89b282..01eec11 100644 --- a/src/threads/init.c +++ b/src/threads/init.c @@ -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" @@ -40,7 +41,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? */ @@ -50,6 +51,12 @@ static bool format_filesys; /* -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; + static void ram_init (void); static void paging_init (void); @@ -58,9 +65,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. */ @@ -85,7 +89,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 (); @@ -122,8 +126,11 @@ main (void) run_actions (argv); /* Finish up. */ + if (reboot_when_done) + shutdown_reboot (); + if (power_off_when_done) - power_off (); + shutdown_power_off (); thread_exit (); } @@ -146,7 +153,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 @@ -160,7 +167,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++) { @@ -184,7 +191,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 @@ -237,6 +244,8 @@ parse_options (char **argv) usage (); else if (!strcmp (name, "-q")) power_off_when_done = true; + else if (!strcmp (name, "-r")) + reboot_when_done = true; #ifdef FILESYS else if (!strcmp (name, "-f")) format_filesys = true; @@ -302,8 +311,8 @@ run_actions (char **argv) {"ls", 1, fsutil_ls}, {"cat", 2, fsutil_cat}, {"rm", 2, fsutil_rm}, - {"put", 2, fsutil_put}, - {"get", 2, fsutil_get}, + {"extract", 1, fsutil_extract}, + {"append", 2, fsutil_append}, #endif {NULL, 0, NULL}, }; @@ -351,12 +360,13 @@ usage (void) " cat FILE Print FILE to the console.\n" " rm FILE Delete FILE.\n" "Use these actions indirectly via `pintos' -g and -p options:\n" - " put FILE Put FILE into file system from scratch disk.\n" - " get FILE Get FILE from file system into scratch disk.\n" + " extract Untar from scratch disk into file system.\n" + " append FILE Append FILE to tar file on scratch disk.\n" #endif "\nOptions:\n" " -h Print this help message and power off.\n" " -q Power off VM after actions or on panic.\n" + " -r Reboot after actions.\n" " -f Format file system disk during startup.\n" " -rs=SEED Set random number seed to SEED.\n" " -mlfqs Use multi-level feedback queue scheduler.\n" @@ -364,46 +374,5 @@ usage (void) " -ul=COUNT Limit user memory to COUNT pages.\n" #endif ); - power_off (); -} - - -/* 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 (); }