Architectural Support: x86_64 (#37)
[lunaix-os.git] / lunaix-os / arch / x86 / syscall32.S
diff --git a/lunaix-os/arch/x86/syscall32.S b/lunaix-os/arch/x86/syscall32.S
new file mode 100644 (file)
index 0000000..4f0ad5b
--- /dev/null
@@ -0,0 +1,121 @@
+#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
+        .long __lxsys_fstat         /* 55 */
+        .long __lxsys_pollctl
+        .long __lxsys_th_create
+        .long __lxsys_th_self
+        .long __lxsys_th_exit
+        .long __lxsys_th_join       /* 60 */
+        .long __lxsys_th_kill
+        .long __lxsys_th_detach
+        .long __lxsys_th_sigmask
+        2:
+        .rept __SYSCALL_MAX - (2b - 1b)/4
+            .long 0
+        .endr
+
+
+.section .text
+    .type syscall_hndlr, @function
+    .global syscall_hndlr
+    syscall_hndlr:
+        pushl   %ebp
+        movl    %esp, %ebp
+        movl    8(%esp), %ebx          // struct hart_state*
+
+        addl    $4, %ebx
+        movl    (%ebx), %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
+        movl    %ebp, %esp
+        popl    %ebp
+        ret
+
+    1:
+        pushl   %ebx
+        pushl   24(%ebx)      /* esi - #5 arg */
+        pushl   16(%ebx)      /* edi - #4 arg */
+        pushl   12(%ebx)      /* edx - #3 arg */
+        pushl   8(%ebx)       /* ecx - #2 arg */
+        pushl   4(%ebx)       /* ebx - #1 arg */
+        
+        call    *(%eax)
+
+        addl    $20, %esp      /* remove the parameters from stack */
+        
+        popl    %ebx
+        movl    %eax, (%ebx)    /* save the return value */
+        
+        movl    %ebp, %esp
+        popl    %ebp
+        
+        ret
\ No newline at end of file