Improve debuggability by eliminating system call stub in separate
authorBen Pfaff <blp@cs.stanford.edu>
Thu, 20 Jan 2005 07:31:25 +0000 (07:31 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Thu, 20 Jan 2005 07:31:25 +0000 (07:31 +0000)
assembly file.  Instead, implement system call stubs in inline
assembly.

src/Makefile.userprog
src/lib/user/syscall-stub.S [deleted file]
src/lib/user/syscall-stub.h [deleted file]
src/lib/user/syscall.c

index 2e95f9b0f99ffee177b63b42bf05e8caa7669e78..c5e6f3db33c6e992682c7b61818846b10b6a5034 100644 (file)
@@ -20,7 +20,6 @@ LIB_SRC += lib/stdio.c                        # I/O library.
 LIB_SRC += lib/stdlib.c                        # atoi()
 LIB_SRC += lib/string.c                        # String functions.
 LIB_SRC += lib/user/syscall.c          # System calls.
-LIB_SRC += lib/user/syscall-stub.S     # System call stub.
 LIB_SRC += lib/user/console.c          # Console code.
 
 LIB_OBJ = $(patsubst %.c,%.o,$(patsubst %.S,%.o,$(LIB_SRC)))
diff --git a/src/lib/user/syscall-stub.S b/src/lib/user/syscall-stub.S
deleted file mode 100644 (file)
index 73afc8d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-       .intel_syntax noprefix
-       .globl syscall
-syscall:
-       pop ecx
-       int 0x30
-       jmp ecx
diff --git a/src/lib/user/syscall-stub.h b/src/lib/user/syscall-stub.h
deleted file mode 100644 (file)
index 4f6036f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __LIB_USER_SYSCALL_STUB_H
-#define __LIB_USER_SYSCALL_STUB_H
-
-int syscall (int nr, ...);
-
-#endif /* lib/user/syscall-stub.h */
index 89e0185f901700cceab59d7709d0f0b389be98d8..c92c812ed18857c599a54cffb4e42a02d0ab7198 100644 (file)
 #include "syscall-stub.h"
 #include "../syscall-nr.h"
 
+/* Invokes syscall NUMBER, passing no arguments, and returns the
+   return value as an `int'. */
+#define syscall0(NUMBER)                                \
+        ({                                              \
+          int retval;                                   \
+          asm volatile                                  \
+            ("push %[number]; int 0x30; add %%esp, 4"   \
+               : "=a" (retval)                          \
+               : [number] "i" (NUMBER)                  \
+               : "memory");                             \
+          retval;                                       \
+        })
+
+/* Invokes syscall NUMBER, passing argument ARG0, and returns the
+   return value as an `int'. */
+#define syscall1(NUMBER, ARG0)                                          \
+        ({                                                              \
+          int retval;                                                   \
+          asm volatile                                                  \
+            ("push %[arg0]; push %[number]; int 0x30; add %%esp, 8"     \
+               : "=a" (retval)                                          \
+               : [number] "i" (NUMBER),                                 \
+                 [arg0] "g" (ARG0)                                      \
+               : "memory");                                             \
+          retval;                                                       \
+        })
+
+/* Invokes syscall NUMBER, passing arguments ARG0 and ARG1, and
+   returns the return value as an `int'. */
+#define syscall2(NUMBER, ARG0, ARG1)                    \
+        ({                                              \
+          int retval;                                   \
+          asm volatile                                  \
+            ("push %[arg1]; push %[arg0]; "             \
+             "push %[number]; int 0x30; add %%esp, 12"  \
+               : "=a" (retval)                          \
+               : [number] "i" (NUMBER),                 \
+                 [arg0] "g" (ARG0),                     \
+                 [arg1] "g" (ARG1)                      \
+               : "memory");                             \
+          retval;                                       \
+        })
+
+/* Invokes syscall NUMBER, passing arguments ARG0, ARG1, and
+   ARG2, and returns the return value as an `int'. */
+#define syscall3(NUMBER, ARG0, ARG1, ARG2)                      \
+        ({                                                      \
+          int retval;                                           \
+          asm volatile                                          \
+            ("push %[arg2]; push %[arg1]; push %[arg0]; "       \
+             "push %[number]; int 0x30; add %%esp, 16"          \
+               : "=a" (retval)                                  \
+               : [number] "i" (NUMBER),                         \
+                 [arg0] "g" (ARG0),                             \
+                 [arg1] "g" (ARG1),                             \
+                 [arg2] "g" (ARG2)                              \
+               : "memory");                                     \
+          retval;                                               \
+        })
+
 void
-halt (void)
+halt (void) 
 {
-  syscall (SYS_halt);
+  syscall0 (SYS_halt);
   NOT_REACHED ();
 }
 
 void
 exit (int status)
 {
-  syscall (SYS_exit, status);
+  syscall1 (SYS_exit, status);
   NOT_REACHED ();
 }
 
 pid_t
 exec (const char *file)
 {
-  return syscall (SYS_exec, file);
+  return (pid_t) syscall1 (SYS_exec, file);
 }
 
 int
 join (pid_t pid)
 {
-  return syscall (SYS_join, pid);
+  return syscall1 (SYS_join, pid);
 }
 
 bool
 create (const char *file, unsigned initial_size)
 {
-  return syscall (SYS_create, file, initial_size);
+  return syscall2 (SYS_create, file, initial_size);
 }
 
 bool
 remove (const char *file)
 {
-  return syscall (SYS_remove, file);
+  return syscall1 (SYS_remove, file);
 }
 
 int
 open (const char *file)
 {
-  return syscall (SYS_open, file);
+  return syscall1 (SYS_open, file);
 }
 
 int
 filesize (int fd) 
 {
-  return syscall (SYS_filesize, fd);
+  return syscall1 (SYS_filesize, fd);
 }
 
 int
 read (int fd, void *buffer, unsigned size)
 {
-  return syscall (SYS_read, fd, buffer, size);
+  return syscall3 (SYS_read, fd, buffer, size);
 }
 
 int
 write (int fd, const void *buffer, unsigned size)
 {
-  return syscall (SYS_write, fd, buffer, size);
+  return syscall3 (SYS_write, fd, buffer, size);
 }
 
 void
 seek (int fd, unsigned position) 
 {
-  syscall (SYS_seek, fd, position);
+  syscall2 (SYS_seek, fd, position);
 }
 
 unsigned
 tell (int fd) 
 {
-  return syscall (SYS_tell, fd);
+  return syscall1 (SYS_tell, fd);
 }
 
 void
 close (int fd)
 {
-  syscall (SYS_close, fd);
+  syscall1 (SYS_close, fd);
 }
 
 bool
 mmap (int fd, void *addr, unsigned length)
 {
-  return syscall (SYS_mmap, fd, addr, length);
+  return syscall3 (SYS_mmap, fd, addr, length);
 }
 
 bool
 munmap (void *addr, unsigned length)
 {
-  return syscall (SYS_munmap, addr, length);
+  return syscall2 (SYS_munmap, addr, length);
 }
 
 bool
 chdir (const char *dir)
 {
-  return syscall (SYS_chdir, dir);
+  return syscall1 (SYS_chdir, dir);
 }
 
 bool
 mkdir (const char *dir)
 {
-  return syscall (SYS_mkdir, dir);
+  return syscall1 (SYS_mkdir, dir);
 }
 
 void
 lsdir (void)
 {
-  syscall (SYS_lsdir);
+  syscall0 (SYS_lsdir);
 }