From 7b1c7048e2371c3c3544b7b62c57ee8180d4fdc5 Mon Sep 17 00:00:00 2001 From: Joshua Saxby <joshua.a.saxby@gmail.com> Date: Tue, 3 Dec 2019 10:19:39 +0000 Subject: [PATCH] Not-quite-working implementation of write() --- lib/kernel/stdio.h | 1 + userprog/syscall_write.c | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/kernel/stdio.h b/lib/kernel/stdio.h index 3e5bae9..c7f9b39 100644 --- a/lib/kernel/stdio.h +++ b/lib/kernel/stdio.h @@ -1,5 +1,6 @@ #ifndef __LIB_KERNEL_STDIO_H #define __LIB_KERNEL_STDIO_H +#include <stddef.h> void putbuf (const char *, size_t); diff --git a/userprog/syscall_write.c b/userprog/syscall_write.c index cf476a7..24e7039 100644 --- a/userprog/syscall_write.c +++ b/userprog/syscall_write.c @@ -3,10 +3,29 @@ * * Authored by Joshua Saxby */ +#include <stdio.h> +#include "lib/kernel/stdio.h" #include "system_calls.h" #include "threads/interrupt.h" void syscall_write(struct intr_frame *f) { - // TODO: implement me! - (void*)0; + // first argument is syscall code (already handled) + int fd = *((int*)f->esp + 1); // file descriptor is second argument + void* buffer = (void*)(*((int*)f->esp + 2)); // buffer is third argument + unsigned size = *((unsigned*)((int*)f->esp + 3)); // size to write is fourth + printf("syscall_write: fd = %d\n", fd); + printf("syscall_write: buffer = '%s'\n", buffer); + printf("syscall_write: size = %u\n", size); + // writing to stdout or stderr (fd in {1, 2}) is a special case + switch (fd) { + case 1: + // case 2: + // TODO: split up output into reasonable-sized chunks + putbuf((const char*)buffer, size); + f->eax = size; + break; + default: + // XXX: unimplemented for now + break; + } } -- GitLab