From 070025b403bfcb09d6971686b51a9fe8ba45e0f2 Mon Sep 17 00:00:00 2001 From: Joshua Saxby <joshua.a.saxby@gmail.com> Date: Tue, 3 Dec 2019 17:42:24 +0000 Subject: [PATCH] Implemented the create() system call Also wrote a basic implementation of the *nix `touch` command so it can be tested --- Makefile.build | 1 + examples/Makefile | 5 ++++- examples/touch | Bin 0 -> 37028 bytes examples/touch.c | 12 ++++++++++++ userprog/syscall.c | 2 ++ userprog/syscall_create.c | 15 +++++++++++++++ userprog/system_calls.h | 6 ++++++ 7 files changed, 40 insertions(+), 1 deletion(-) create mode 100755 examples/touch create mode 100644 examples/touch.c create mode 100644 userprog/syscall_create.c diff --git a/Makefile.build b/Makefile.build index 0810c23..30d709b 100644 --- a/Makefile.build +++ b/Makefile.build @@ -66,6 +66,7 @@ userprog_SRC += userprog/syscall_exec.c userprog_SRC += userprog/syscall_exit.c userprog_SRC += userprog/syscall_halt.c userprog_SRC += userprog/syscall_wait.c +userprog_SRC += userprog/syscall_create.c # No virtual memory code yet. #vm_SRC = vm/file.c # Some file. diff --git a/examples/Makefile b/examples/Makefile index 41a663d..f224327 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -4,7 +4,7 @@ SRCDIR = .. # To add a new test, put its name on the PROGS list # and then add a name_SRC line that lists its source files. PROGS = cat cmp cp echo halt hex-dump ls mcat mcp mkdir pwd rm shell \ - bubsort insult lineup matmult recursor my + bubsort insult lineup matmult recursor my touch # Should work from project 2 onward. cat_SRC = cat.c @@ -31,5 +31,8 @@ mkdir_SRC = mkdir.c pwd_SRC = pwd.c shell_SRC = shell.c +# Joshua Saxby special additions! +touch_SRC = touch.c + include $(SRCDIR)/Make.config include $(SRCDIR)/Makefile.userprog diff --git a/examples/touch b/examples/touch new file mode 100755 index 0000000000000000000000000000000000000000..0d81b3ea3dccb90bf0a39ad1b64cfed65f0da0ca GIT binary patch literal 37028 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 H2V@2S=C@@d literal 0 HcmV?d00001 diff --git a/examples/touch.c b/examples/touch.c new file mode 100644 index 0000000..9c4ec39 --- /dev/null +++ b/examples/touch.c @@ -0,0 +1,12 @@ +/* touch.c + + Creates an empty file with the name given on the command-line. */ + +#include <stdio.h> +#include <syscall.h> + +int main (int argc, char *argv[]) { + if (argc != 2) exit(1); // very basic error-handling + char* filename = argv[1]; + return create(filename, 0) ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/userprog/syscall.c b/userprog/syscall.c index 0c4d8cf..dfc83ed 100644 --- a/userprog/syscall.c +++ b/userprog/syscall.c @@ -66,6 +66,8 @@ syscall_handler (struct intr_frame *f UNUSED) break; case SYSCALL_WAIT: syscall_wait(f); + case SYSCALL_CREATE: + syscall_create(f); break; default: printf ("WARNING: Invalid Syscall (%d)\n", syscall_number); diff --git a/userprog/syscall_create.c b/userprog/syscall_create.c new file mode 100644 index 0000000..12b4962 --- /dev/null +++ b/userprog/syscall_create.c @@ -0,0 +1,15 @@ +/* + * The Write System Call + * + * Authored by Joshua Saxby + */ +#include "filesys/filesys.h" +#include "system_calls.h" +#include "threads/interrupt.h" + +void syscall_create(struct intr_frame *f) { + // first argument is syscall code (already handled) + char* filename = (void*)(*((int*)f->esp + 1)); // filename is second argument + unsigned initial_size = *((unsigned*)((int*)f->esp + 2)); // third + f->eax = filesys_create(filename, initial_size); +} diff --git a/userprog/system_calls.h b/userprog/system_calls.h index c8b5518..6fadcd1 100644 --- a/userprog/system_calls.h +++ b/userprog/system_calls.h @@ -29,6 +29,12 @@ void syscall_exec(struct intr_frame *f); */ void syscall_wait(struct intr_frame *f); +/* + * Creates a new file called file initially initial_size bytes in size. + * Returns true if successful, false otherwise. + */ +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. -- GitLab