X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/32b9a6d76790c73d3d2d36d9081a2581cc65d184..28c176b668c841a3b7fb093faccf0efa39257603:/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 index 0000000..4f0ad5b --- /dev/null +++ b/lunaix-os/arch/x86/syscall32.S @@ -0,0 +1,121 @@ +#define __ASM__ +#include + +.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