From: Ben Pfaff Date: Tue, 31 Aug 2004 22:04:29 +0000 (+0000) Subject: Implement command line arguments. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e4b11e55cce16307ffae87d90c08bacb1a2f3c66;p=pintos-anon Implement command line arguments. --- diff --git a/src/threads/init.c b/src/threads/init.c index 03e0bb8..60114ba 100644 --- a/src/threads/init.c +++ b/src/threads/init.c @@ -20,11 +20,22 @@ #ifdef FILESYS #include "filesys.h" #include "disk.h" +#include "fsutil.h" #endif /* Amount of physical memory, in 4 kB pages. */ size_t ram_pages; +#ifdef FILESYS +/* Format the filesystem? */ +static bool format_filesys; +#endif + +#ifdef USERPROG +/* Initial program to run. */ +static char *initial_program; +#endif + static void ram_init (void); static void gdt_init (void); static void argv_init (void); @@ -34,8 +45,15 @@ main_thread (void *aux UNUSED) { #ifdef FILESYS disk_init (); - filesys_init (true); - filesys_self_test (); + filesys_init (format_filesys); + fsutil_run (); +#endif + +#ifdef USERPROG + if (initial_program != NULL) + thread_execute (initial_program); + else + PANIC ("no initial program specified"); #endif } @@ -50,14 +68,16 @@ main (void) /* Greet user. */ printk ("Booting cnachos86 with %'d kB RAM...\n", ram_pages * 4); + /* Parse command line. */ + argv_init (); + /* Initialize memory system. */ palloc_init (); paging_init (); gdt_init (); malloc_init (); - random_init (); - argv_init (); + random_init (0); /* Initialize interrupt handlers. */ intr_init (); @@ -65,7 +85,9 @@ main (void) kbd_init (); /* Do everything else in a system thread. */ - thread_init ("main", main_thread, NULL); + thread_init (); + thread_create ("main", main_thread, NULL); + thread_start (); } static uint64_t @@ -160,24 +182,70 @@ ram_init (void) ram_pages = *(uint32_t *) ptov (LOADER_RAM_PAGES); } -/* This should be sufficient because the command line buffer is - only 128 bytes and arguments are space-delimited. */ -#define ARGC_MAX 64 - -int argc; -char *argv[ARGC_MAX + 1]; - static void argv_init (void) { - char *cmd_line = ptov (LOADER_CMD_LINE); - char *arg, *pos; - - for (arg = strtok_r (cmd_line, " \t\r\n\v", &pos); arg != NULL; - arg = strtok_r (NULL, " \t\r\n\v", &pos)) + char *cmd_line, *pos; + char *argv[LOADER_CMD_LINE_LEN / 2 + 1]; + int argc = 0; + int i; + + /* The command line is made up of null terminated strings + followed by an empty string. Break it up into words. */ + cmd_line = pos = ptov (LOADER_CMD_LINE); + while (pos < cmd_line + LOADER_CMD_LINE_LEN) { - ASSERT (argc < ARGC_MAX); - argv[argc++] = arg; + ASSERT (argc < LOADER_CMD_LINE_LEN / 2); + if (*pos == '\0') + break; + argv[argc++] = pos; + pos = strchr (pos, '\0') + 1; } - argv[argc] = NULL; + argv[argc] = ""; + + /* Parse the words. */ + for (i = 0; i < argc; i++) + if (!strcmp (argv[i], "-rs")) + random_init (atoi (argv[++i])); + else if (!strcmp (argv[i], "-d")) + debug_enable (argv[++i]); +#ifdef USERPROG + else if (!strcmp (argv[i], "-ex")) + initial_program = argv[++i]; +#endif +#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], "-p")) + fsutil_print_file = argv[++i]; + else if (!strcmp (argv[i], "-r")) + fsutil_remove_file = argv[++i]; + else if (!strcmp (argv[i], "-ls")) + fsutil_list_files = true; + else if (!strcmp (argv[i], "-D")) + fsutil_dump_filesys = true; +#endif + else if (!strcmp (argv[i], "-u")) + { + printk ( + "Kernel options:\n" + " -rs SEED Seed random seed to SEED.\n" + " -d CLASS[,...] Enable the given classes of debug messages.\n" +#ifdef USERPROG + " -ex 'PROG [ARG...]' Run PROG, passing the optional arguments.\n" +#endif +#ifdef FILESYS + " -f Format the filesystem disk (hdb or ide0:1).\n" + " -cp FILENAME:SIZE Copy SIZE bytes from the scratch disk (hdc\n" + " ide1:0) into the filesystem as FILENAME\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 + } + else + PANIC ("unknown option `%s'", argv[i]); } diff --git a/src/threads/init.h b/src/threads/init.h index 8dfb651..1d6c5c6 100644 --- a/src/threads/init.h +++ b/src/threads/init.h @@ -6,11 +6,6 @@ /* Physical memory size, in 4 kB pages. */ size_t ram_pages; -/* Kernel command line. */ -extern int argc; -extern char *argv[]; - struct tss *tss; - #endif /* init.h */