X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Finit.c;h=203b79dff7fca5b4a51bbe6b43c9f8e2a6028fe8;hb=c00124df280431bb3f1fd26ef0f5c863365c6474;hp=729c25ffcd528957ea96e5f22cf2cf1a439d2cfb;hpb=d0d14ca50fbac167253e1e1d8d806bfd749a5e8a;p=pintos-anon diff --git a/src/threads/init.c b/src/threads/init.c index 729c25f..203b79d 100644 --- a/src/threads/init.c +++ b/src/threads/init.c @@ -1,4 +1,5 @@ #include "threads/init.h" +#include #include #include #include @@ -18,6 +19,7 @@ #include "threads/mmu.h" #include "threads/paging.h" #include "threads/palloc.h" +#include "threads/test.h" #include "threads/thread.h" #ifdef USERPROG #include "userprog/exception.h" @@ -44,27 +46,32 @@ static bool format_filesys; static char *initial_program; #endif +/* Power off after running requested actions? */ +static bool power_off; + static void ram_init (void); static void argv_init (void); +static void do_power_off (void); int main (void) NO_RETURN; int main (void) { - /* Needed by printf(), so initialize them very early. */ + /* Initialize everything needed for printf() first. */ ram_init (); + thread_init (); vga_init (); serial_init_poll (); + console_init (); /* Greet user. */ - printf ("Pintos booting with %'d kB RAM...\n", ram_pages * 4); + printf ("Pintos booting with %'zd kB RAM...\n", ram_pages * (PGSIZE / 1024)); /* Parse command line. */ argv_init (); /* Initialize memory system, segments, paging. */ - thread_init (); palloc_init (); paging_init (); #ifdef USERPROG @@ -73,7 +80,7 @@ main (void) #endif malloc_init (); - /* Set random seed if not already done. */ + /* Set random seed if argv_init() didn't. */ random_init (0); /* Initialize interrupt handlers. */ @@ -105,8 +112,13 @@ main (void) printf ("\nExecuting '%s':\n", initial_program); thread_execute (initial_program); } +#else + test (); #endif + if (power_off) + do_power_off (); + /* Terminate this thread. */ thread_exit (); } @@ -133,7 +145,7 @@ static void argv_init (void) { char *cmd_line, *pos; - char *argv[LOADER_CMD_LINE_LEN / 2 + 1]; + char *argv[LOADER_CMD_LINE_LEN / 2 + 2]; int argc = 0; int i; @@ -149,6 +161,7 @@ argv_init (void) pos = strchr (pos, '\0') + 1; } argv[argc] = ""; + argv[argc + 1] = ""; /* Parse the words. */ for (i = 0; i < argc; i++) @@ -156,6 +169,8 @@ argv_init (void) random_init (atoi (argv[++i])); else if (!strcmp (argv[i], "-d")) debug_enable (argv[++i]); + else if (!strcmp (argv[i], "-q")) + power_off = true; #ifdef USERPROG else if (!strcmp (argv[i], "-ex")) initial_program = argv[++i]; @@ -163,8 +178,13 @@ argv_init (void) #ifdef FILESYS else if (!strcmp (argv[i], "-f")) format_filesys = true; - else if (!strcmp (argv[i], "-cp")) - fsutil_copy_arg = argv[++i]; + else if (!strcmp (argv[i], "-ci")) + { + fsutil_copyin_file = argv[++i]; + fsutil_copyin_size = atoi (argv[++i]); + } + else if (!strcmp (argv[i], "-co")) + fsutil_copyout_file = argv[++i]; else if (!strcmp (argv[i], "-p")) fsutil_print_file = argv[++i]; else if (!strcmp (argv[i], "-r")) @@ -185,15 +205,34 @@ argv_init (void) #endif #ifdef FILESYS " -f Format the filesystem disk (hdb or hd0:1).\n" - " -cp FILENAME:SIZE Copy SIZE bytes from the scratch disk (hdc\n" + " -ci FILENAME SIZE Copy SIZE bytes from the scratch disk (hdc\n" " or hd1:0) into the filesystem as FILENAME\n" + " -co FILENAME Copy FILENAME to the scratch disk, with\n" + " size at start of sector 0 and data afterward\n" " -p FILENAME Print the contents of FILENAME\n" " -r FILENAME Delete FILENAME\n" " -ls List the files in the filesystem\n" " -D Dump complete filesystem contents\n" #endif + " -q Power off after doing requested actions.\n" ); } else PANIC ("unknown option `%s'", argv[i]); } + +void +do_power_off (void) +{ + const char s[] = "Shutdown"; + const char *p; + +#ifdef FILESYS + filesys_done (); +#endif + + printf ("Powering off...\n"); + for (p = s; *p != '\0'; p++) + outb (0x8900, *p); + for (;;); +}