refactor: organize all arch related files together.
[lunaix-os.git] / lunaix-os / arch / i386 / syscall.S
diff --git a/lunaix-os/arch/i386/syscall.S b/lunaix-os/arch/i386/syscall.S
new file mode 100644 (file)
index 0000000..ac3fe80
--- /dev/null
@@ -0,0 +1,105 @@
+#define __ASM__
+#include <lunaix/syscall.h>
+
+.section .data
+    /*
+        注意,这里的顺序非常重要。每个系统调用在这个地址表里的索引等于其调用号。
+    */
+    syscall_table:
+        1:
+        .long 0
+        .long __lxsys_fork          /* 1 */
+        .long __lxsys_yield
+        .long __lxsys_sbrk
+        .long __lxsys_brk
+        .long __lxsys_getpid        /* 5 */
+        .long __lxsys_getppid
+        .long __lxsys_sleep
+        .long __lxsys_exit
+        .long __lxsys_wait          
+        .long __lxsys_waitpid       /* 10 */
+        .long __lxsys_sigreturn
+        .long __lxsys_sigprocmask
+        .long __lxsys_sys_sigaction
+        .long __lxsys_pause
+        .long __lxsys_kill          /* 15 */
+        .long __lxsys_alarm
+        .long __lxsys_sigpending
+        .long __lxsys_sigsuspend
+        .long __lxsys_open
+        .long __lxsys_close         /* 20 */
+        .long __lxsys_read
+        .long __lxsys_write
+        .long __lxsys_sys_readdir
+        .long __lxsys_mkdir
+        .long __lxsys_lseek         /* 25 */
+        .long __lxsys_geterrno
+        .long __lxsys_readlink
+        .long __lxsys_readlinkat
+        .long __lxsys_rmdir
+        .long __lxsys_unlink        /* 30 */
+        .long __lxsys_unlinkat
+        .long __lxsys_link
+        .long __lxsys_fsync
+        .long __lxsys_dup
+        .long __lxsys_dup2          /* 35 */
+        .long __lxsys_realpathat
+        .long __lxsys_symlink
+        .long __lxsys_chdir
+        .long __lxsys_fchdir
+        .long __lxsys_getcwd        /* 40 */
+        .long __lxsys_rename
+        .long __lxsys_mount
+        .long __lxsys_unmount
+        .long __lxsys_getxattr
+        .long __lxsys_setxattr      /* 45 */
+        .long __lxsys_fgetxattr
+        .long __lxsys_fsetxattr
+        .long __lxsys_ioctl
+        .long __lxsys_getpgid
+        .long __lxsys_setpgid       /* 50 */
+        .long __lxsys_syslog
+        .long __lxsys_sys_mmap
+        .long __lxsys_munmap
+        .long __lxsys_execve
+        2:
+        .rept __SYSCALL_MAX - (2b - 1b)/4
+            .long 0
+        .endr
+
+.global syscall_hndlr
+
+.section .text
+    syscall_hndlr:
+        pushl %ebp
+        movl 8(%esp), %ebp          // isr_param*
+
+        addl $4, %ebp
+        movl (%ebp), %eax          /* eax: call code as well as the return value from syscall */
+        cmpl $__SYSCALL_MAX, %eax
+        jae 2f
+
+        shll $2, %eax
+        addl $syscall_table, %eax
+        cmpl $0, (%eax)
+        jne 1f
+    2:    
+        neg   %eax
+        popl  %ebp
+        ret
+    1:
+        pushl 24(%ebp)      /* esi - #5 arg */
+        pushl 16(%ebp)      /* edi - #4 arg */
+        pushl 12(%ebp)      /* edx - #3 arg */
+        pushl 8(%ebp)       /* ecx - #2 arg */
+        pushl 4(%ebp)       /* ebx - #1 arg */
+        
+        call *(%eax)
+
+        movl %eax, (%ebp)    /* save the return value */
+
+        addl $20, %esp      /* remove the parameters from stack */
+
+        popl %ebp
+        
+        ret
\ No newline at end of file