2 #include <lunaix/syscall.h>
6 注意,这里的顺序非常重要。每个系统调用在这个地址表里的索引等于其调用号。
11 .long __lxsys_fork /* 1 */
15 .long __lxsys_getpid /* 5 */
20 .long __lxsys_waitpid /* 10 */
21 .long __lxsys_sigreturn
22 .long __lxsys_sigprocmask
23 .long __lxsys_sys_sigaction
25 .long __lxsys_kill /* 15 */
27 .long __lxsys_sigpending
28 .long __lxsys_sigsuspend
30 .long __lxsys_close /* 20 */
33 .long __lxsys_sys_readdir
35 .long __lxsys_lseek /* 25 */
36 .long __lxsys_geterrno
37 .long __lxsys_readlink
38 .long __lxsys_readlinkat
40 .long __lxsys_unlink /* 30 */
41 .long __lxsys_unlinkat
45 .long __lxsys_dup2 /* 35 */
46 .long __lxsys_realpathat
50 .long __lxsys_getcwd /* 40 */
54 .long __lxsys_getxattr
55 .long __lxsys_setxattr /* 45 */
56 .long __lxsys_fgetxattr
57 .long __lxsys_fsetxattr
60 .long __lxsys_setpgid /* 50 */
62 .long __lxsys_sys_mmap
65 .long __lxsys_fstat /* 55 */
67 .long __lxsys_th_create
70 .long __lxsys_th_join /* 60 */
72 .long __lxsys_th_detach
73 .long __lxsys_th_sigmask
75 .rept __SYSCALL_MAX - (2b - 1b)/4
81 .type syscall_hndlr, @function
86 movl 8(%esp), %ebx // isr_param*
89 movl (%ebx), %eax /* eax: call code as well as the return value from syscall */
90 cmpl $__SYSCALL_MAX, %eax
94 addl $syscall_table, %eax
105 pushl 24(%ebx) /* esi - #5 arg */
106 pushl 16(%ebx) /* edi - #4 arg */
107 pushl 12(%ebx) /* edx - #3 arg */
108 pushl 8(%ebx) /* ecx - #2 arg */
109 pushl 4(%ebx) /* ebx - #1 arg */
113 addl $20, %esp /* remove the parameters from stack */
116 movl %eax, (%ebx) /* save the return value */