diff options
Diffstat (limited to '')
-rw-r--r-- | user/lib/syscall.S | 111 |
1 files changed, 22 insertions, 89 deletions
diff --git a/user/lib/syscall.S b/user/lib/syscall.S index 46fcb89..fc1ab93 100644 --- a/user/lib/syscall.S +++ b/user/lib/syscall.S @@ -1,93 +1,26 @@ -/** -** @file ulibs.S -** -** @author CSCI-452 class of 20245 -** -** @brief assembly-language user-level library functions -*/ - -#define ASM_SRC - -// get the system call codes - #include <syscalls.h> -/** -** System call stubs -** -** All have the same structure: -** -** move a code into EAX -** generate the interrupt -** return to the caller -** -** As these are simple "leaf" routines, we don't use -** the standard enter/leave method to set up a stack -** frame - that takes time, and we don't really need it. -** -** Could be modified to use the UNIX/Linux convention of -** having the syscall code set the 'C' flag to indicate that -** the value being returned in %EAX is an error code: -** -** ... -** int $VEC_SYSCALL -** jc set_errno -** ret -** ... -** -** .globl errno -** set_errno: -** movl %eax, errno -** movl $-1, %eax -** ret -*/ - -#define SYSCALL(name) \ - .globl name ; \ -name: ; \ - movl $SYS_##name, %eax ; \ - int $VEC_SYSCALL ; \ +.macro SYSCALL name num + .align 8 + .globl \name +\name: + movq $\num, %rax + int $VEC_SYSCALL ret +.endm -/* -** "real" system calls -*/ - -SYSCALL(exit) -SYSCALL(waitpid) -SYSCALL(fork) -SYSCALL(exec) -SYSCALL(read) -SYSCALL(write) -SYSCALL(getpid) -SYSCALL(getppid) -SYSCALL(gettime) -SYSCALL(getprio) -SYSCALL(setprio) -SYSCALL(kill) -SYSCALL(sleep) - -/* -** This is a bogus system call; it's here so that we can test -** our handling of out-of-range syscall codes in the syscall ISR. -*/ -SYSCALL(bogus) - -/* -** Other library functions -*/ - -/** -** fake_exit() -** -** Dummy "startup" function -** -** calls exit(%eax) - serves as the "return to" code for -** main() functions, in case they don't call exit() themselves -*/ - - .globl fake_exit -fake_exit: - // alternate: could push a "fake exit" status - pushl %eax // termination status returned by main() - call exit // terminate this process +SYSCALL exit SYS_exit +SYSCALL waitpid SYS_waitpid +SYSCALL fork SYS_fork +SYSCALL exec SYS_exec +SYSCALL read SYS_read +SYSCALL write SYS_write +SYSCALL getpid SYS_getpid +SYSCALL getppid SYS_getppid +SYSCALL gettime SYS_gettime +SYSCALL getprio SYS_getprio +SYSCALL setprio SYS_setprio +SYSCALL kill SYS_kill +SYSCALL sleep SYS_sleep +SYSCALL brk SYS_brk +SYSCALL sbrk SYS_sbrk |