diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-02-04 14:17:52 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2021-02-05 13:02:07 +0100 |
| commit | e2514b22b2bd4be907094fb3a6223fa61c558620 (patch) | |
| tree | 9ac2d38f5dff3360ce92fe841b8832b15f31a87c | |
| parent | f9d352a64d125ac69c2d1a74fdbc75665c6d0b42 (diff) | |
| download | pintos-e2514b22b2bd4be907094fb3a6223fa61c558620.tar.gz | |
syscall_handler(): macro to read user process arguments
| -rw-r--r-- | src/userprog/syscall.c | 7 |
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); |
