PCI 16x50 UART Controller, O2 Enablement (#39)
[lunaix-os.git] / lunaix-os / arch / x86 / syscall32.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_sys_sigaction
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_sys_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          /* 35 */
46         .long __lxsys_realpathat
47         .long __lxsys_symlink
48         .long __lxsys_chdir
49         .long __lxsys_fchdir
50         .long __lxsys_getcwd        /* 40 */
51         .long __lxsys_rename
52         .long __lxsys_mount
53         .long __lxsys_unmount
54         .long __lxsys_getxattr
55         .long __lxsys_setxattr      /* 45 */
56         .long __lxsys_fgetxattr
57         .long __lxsys_fsetxattr
58         .long __lxsys_ioctl
59         .long __lxsys_getpgid
60         .long __lxsys_setpgid       /* 50 */
61         .long __lxsys_syslog
62         .long __lxsys_sys_mmap
63         .long __lxsys_munmap
64         .long __lxsys_execve
65         .long __lxsys_fstat         /* 55 */
66         .long __lxsys_pollctl
67         .long __lxsys_th_create
68         .long __lxsys_th_self
69         .long __lxsys_th_exit
70         .long __lxsys_th_join       /* 60 */
71         .long __lxsys_th_kill
72         .long __lxsys_th_detach
73         .long __lxsys_th_sigmask
74         2:
75         .rept __SYSCALL_MAX - (2b - 1b)/4
76             .long 0
77         .endr
78
79
80 .section .text
81     .type syscall_hndlr, @function
82     .global syscall_hndlr
83     syscall_hndlr:
84         pushl   %ebp
85         movl    %esp, %ebp
86         movl    8(%esp), %ebx          // struct hart_state*
87
88         addl    $4, %ebx
89         movl    (%ebx), %eax          /* eax: call code as well as the return value from syscall */
90         cmpl    $__SYSCALL_MAX, %eax
91         jae     2f
92
93         shll    $2, %eax
94         addl    $syscall_table, %eax
95         cmpl    $0, (%eax)
96         jne     1f
97     2:    
98         neg     %eax
99         movl    %ebp, %esp
100         popl    %ebp
101         ret
102
103     1:
104         pushl   %ebx
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 */
110         
111         call    *(%eax)
112
113         addl    $20, %esp      /* remove the parameters from stack */
114         
115         popl    %ebx
116         movl    %eax, (%ebx)    /* save the return value */
117         
118         movl    %ebp, %esp
119         popl    %ebp
120         
121         ret