diff --git a/Makefile.build b/Makefile.build index 30d709bed0682faf702cab87e8fe75b2e85cffd3..c079897805d7fb75ae1510b92d5e9af7dc59a224 100644 --- a/Makefile.build +++ b/Makefile.build @@ -63,7 +63,7 @@ userprog_SRC += userprog/syscall.c # System call handler. userprog_SRC += userprog/gdt.c # GDT initialization. userprog_SRC += userprog/tss.c # TSS management. userprog_SRC += userprog/syscall_exec.c -userprog_SRC += userprog/syscall_exit.c +userprog_SRC += userprog/syscall_open.c userprog_SRC += userprog/syscall_halt.c userprog_SRC += userprog/syscall_wait.c userprog_SRC += userprog/syscall_create.c diff --git a/userprog/syscall.c b/userprog/syscall.c index c78175f256fa5a9e0b31bda1d2ae6fe2fb2bdd07..a494704341d8785dfd0ec0c772c4d9e3dbb38167 100644 --- a/userprog/syscall.c +++ b/userprog/syscall.c @@ -58,9 +58,6 @@ syscall_handler (struct intr_frame *f UNUSED) case SYSCALL_HALT: syscall_halt(f); break; - case SYSCALL_EXIT: - syscall_exit(f); - break; case SYSCALL_EXEC: syscall_exec(f); break; @@ -70,6 +67,9 @@ syscall_handler (struct intr_frame *f UNUSED) case SYSCALL_CREATE: syscall_create(f); break; + case SYSCALL_OPEN: + syscall_open(f); + break; default: printf ("WARNING: Invalid Syscall (%d)\n", syscall_number); thread_exit (); diff --git a/userprog/syscall_open.c b/userprog/syscall_open.c new file mode 100644 index 0000000000000000000000000000000000000000..386fa269c9cdc95f7b4a27ac02c1d916c79c9afa --- /dev/null +++ b/userprog/syscall_open.c @@ -0,0 +1,22 @@ +/* + * Opens the file called file. Returns a nonnegative integer handle called a + * "file descriptor" (fd), or -1 if the file could not be opened. + * + * Authored by Alex Stratford + */ + + +#include "system_calls.h" +#include "threads/interrupt.h" // Dependency for intr_frame struct +#include "filesys/file.h" // Dependency for file_open and file struct + +void syscall_open(struct intr_frame *f) { + struct file_map *f_map; // Create f_map struct instance + // pop off first int argument from interrupt frame + f_map->file_descriptor = *((int*)f->esp + 1); + // Described in system_calls.h, opens the file + f_map->file = file_open(f_map->file_descriptor); + if (f_map->file == NULL) // Checking if file is empty or non-existent + f->eax = -1; // Returning a failure state + f->eax = f_map->file_descriptor; // Returning the file descriptor +} \ No newline at end of file diff --git a/userprog/system_calls.h b/userprog/system_calls.h index daed0eda12434a3bebc1b41db4999e293cb1ebed..b69bb44a4016b5408e4ce49197656085d47b6e28 100644 --- a/userprog/system_calls.h +++ b/userprog/system_calls.h @@ -1,4 +1,16 @@ #include "threads/interrupt.h" +#include "lib/kernel/list.h" // Added due to dependency for list_elem +#include "filesys/file.h" // Added due to dependency for file + + +// Maps file descriptions to the associated file structure +struct file_map +{ + struct list_elem list_element; // Defined in list.h + int file_descriptor; + struct file *file; // Defined in file.c +}; + /* * Terminates Pintos by calling shutdown_power_off() @@ -6,14 +18,6 @@ */ void syscall_halt(struct intr_frame *f); -/* - * Terminates the current user program, returning status to the kernel. If the - * process's parent waits for it (see below), this is the status that will be - * returned. Conventionally, a status of 0 indicates success and nonzero - * values indicate errors. - */ -void syscall_exit(struct intr_frame *status); - /* * Runs the executable whose name is given in cmd_line, passing any given * arguments, and returns the new process's program id (pid). Must return pid @@ -30,6 +34,7 @@ void syscall_exec(struct intr_frame *f); void syscall_wait(struct intr_frame *f); /* +<<<<<<< HEAD * Creates a new file called file initially initial_size bytes in size. * Returns true if successful, false otherwise. */ @@ -39,3 +44,9 @@ void syscall_create(struct intr_frame *f); * NOTE: There are more system calls implemented by Pintos but we are not * implementing them because the assignment brief does not ask of it. */ +======= + * Opens the file called file. Returns a nonnegative integer handle called a + * "file descriptor" (fd), or -1 if the file could not be opened. + */ +void syscall_open(struct intr_frame *f); +>>>>>>> Alex/27-implement-open-system-call