summaryrefslogtreecommitdiffstats
path: root/src/userprog
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-02-04 14:17:52 +0100
committerGustav Sörnäs <gustav@sornas.net>2021-02-05 13:02:07 +0100
commite2514b22b2bd4be907094fb3a6223fa61c558620 (patch)
tree9ac2d38f5dff3360ce92fe841b8832b15f31a87c /src/userprog
parentf9d352a64d125ac69c2d1a74fdbc75665c6d0b42 (diff)
downloadpintos-e2514b22b2bd4be907094fb3a6223fa61c558620.tar.gz
syscall_handler(): macro to read user process arguments
Diffstat (limited to 'src/userprog')
-rw-r--r--src/userprog/syscall.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/userprog/syscall.c b/src/userprog/syscall.c
index 49e61e8..1287d98 100644
--- a/src/userprog/syscall.c
+++ b/src/userprog/syscall.c
@@ -13,10 +13,13 @@ syscall_init (void)
intr_register_int (0x30, 3, INTR_ON, syscall_handler, "syscall");
}
+// cast to TYPE and deref argument N from f->esp
+#define INTR_ESP(N, TYPE) *(TYPE *)(f->esp+(4*(N)))
+
static void
syscall_handler (struct intr_frame *f UNUSED)
{
- int syscall_number = *((int *)f->esp);
+ int syscall_number = INTR_ESP(0, int);
switch (syscall_number) {
case 0:
// halt
@@ -24,7 +27,7 @@ syscall_handler (struct intr_frame *f UNUSED)
break;
case 9:
// printf
- printf ("printf: %s", *((char **)(f->esp+8)));
+ printf ("printf: %s", INTR_ESP(2, char *));
break;
default:
printf ("kernel: unknown syscall '%d'\n", syscall_number);