feat: support per-process current working directory (cwd)
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / syscall.S
1 #define __ASM__
2 #include <lunaix/syscall.h>
3
4 .section .data
5     /*
6         注意,这里的顺序非常重要。每个系统调用在这个地址表里的索引等于其调用号。
7     */
8     syscall_table:
9         1:
10         .long 0
11         .long __lxsys_fork          /* 1 */
12         .long __lxsys_yield
13         .long __lxsys_sbrk
14         .long __lxsys_brk
15         .long __lxsys_getpid        /* 5 */
16         .long __lxsys_getppid
17         .long __lxsys_sleep
18         .long __lxsys_exit
19         .long __lxsys_wait          
20         .long __lxsys_waitpid       /* 10 */
21         .long __lxsys_sigreturn
22         .long __lxsys_sigprocmask
23         .long __lxsys_signal
24         .long __lxsys_pause
25         .long __lxsys_kill          /* 15 */
26         .long __lxsys_alarm
27         .long __lxsys_sigpending
28         .long __lxsys_sigsuspend
29         .long __lxsys_open
30         .long __lxsys_close         /* 20 */
31         .long __lxsys_read
32         .long __lxsys_write
33         .long __lxsys_readdir
34         .long __lxsys_mkdir
35         .long __lxsys_lseek         /* 25 */
36         .long __lxsys_geterrno
37         .long __lxsys_readlink
38         .long __lxsys_readlinkat
39         .long __lxsys_rmdir
40         .long __lxsys_unlink        /* 30 */
41         .long __lxsys_unlinkat
42         .long __lxsys_link
43         .long __lxsys_fsync
44         .long __lxsys_dup
45         .long __lxsys_dup2
46         .long __lxsys_realpathat
47         .long __lxsys_symlink
48         .long __lxsys_chdir
49         .long __lxsys_fchdir
50         .long __lxsys_getcwd
51         2:
52         .rept __SYSCALL_MAX - (2b - 1b)/4
53             .long 0
54         .endr
55
56 .global syscall_hndlr
57
58 .section .text
59     syscall_hndlr:
60         pushl %ebp
61         movl 8(%esp), %ebp
62
63         movl  (%ebp), %eax          /* eax: call code as well as the return value from syscall */
64         cmpl  $__SYSCALL_MAX, %eax
65         jae 2f
66
67         shll $2, %eax
68         addl $syscall_table, %eax
69         cmpl $0, (%eax)
70         jne 1f
71     2:    
72         neg   %eax
73         popl  %ebp
74         ret
75     1:
76         pushl 24(%ebp)      /* esi - #6 arg */
77         pushl 20(%ebp)      /* ebp - #5 arg */
78         pushl 16(%ebp)      /* edi - #4 arg */
79         pushl 12(%ebp)      /* edx - #3 arg */
80         pushl 8(%ebp)       /* ecx - #2 arg */
81         pushl 4(%ebp)       /* ebx - #1 arg */
82         
83         call (%eax)
84
85         movl %eax, (%ebp)    /* save the return value */
86
87         addl $24, %esp      /* remove the parameters from stack */
88
89         popl %ebp
90         
91         ret