From e2514b22b2bd4be907094fb3a6223fa61c558620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Thu, 4 Feb 2021 14:17:52 +0100 Subject: syscall_handler(): macro to read user process arguments --- src/userprog/syscall.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/userprog') 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); -- cgit v1.2.1