0ebf221842159ad2aeda5abc8753f9340abf1014
[musl] / src / internal / i386 / syscall.s
1 .hidden __sysinfo
2
3 # The calling convention for __vsyscall has the syscall number
4 # and 5 args arriving as:  eax, edx, ecx, edi, esi, 4(%esp).
5 # This ensures that the inline asm in the C code never has to touch
6 # ebx or ebp (which are unavailable in PIC and frame-pointer-using
7 # code, respectively), and optimizes for size/simplicity in the caller.
8
9 .global __vsyscall
10 .hidden __vsyscall
11 .type __vsyscall,@function
12 __vsyscall:
13         push %edi
14         push %ebx
15         mov %edx,%ebx
16         mov %edi,%edx
17         mov 12(%esp),%edi
18         push %eax
19         call 1f
20 2:      mov %ebx,%edx
21         pop %ebx
22         pop %ebx
23         pop %edi
24         ret
25
26 1:      mov (%esp),%eax
27         add $[__sysinfo-2b],%eax
28         mov (%eax),%eax
29         test %eax,%eax
30         jz 1f
31         push %eax
32         mov 8(%esp),%eax
33         ret                     # tail call to kernel vsyscall entry
34 1:      mov 4(%esp),%eax
35         int $128
36         ret
37
38 # The __vsyscall6 entry point is used only for 6-argument syscalls.
39 # Instead of passing the 5th argument on the stack, a pointer to the
40 # 5th and 6th arguments is passed. This is ugly, but there are no
41 # register constraints the inline asm could use that would make it
42 # possible to pass two arguments on the stack.
43
44 .global __vsyscall6
45 .hidden __vsyscall6
46 .type __vsyscall6,@function
47 __vsyscall6:
48         push %ebp
49         push %eax
50         mov 12(%esp), %ebp
51         mov (%ebp), %eax
52         mov 4(%ebp), %ebp
53         push %eax
54         mov 4(%esp),%eax
55         call __vsyscall
56         pop %ebp
57         pop %ebp
58         pop %ebp
59         ret
60
61 .global __syscall
62 .hidden __syscall
63 .type __syscall,@function
64 __syscall:
65         lea 24(%esp),%eax
66         push %esi
67         push %edi
68         push %eax
69         mov 16(%esp),%eax
70         mov 20(%esp),%edx
71         mov 24(%esp),%ecx
72         mov 28(%esp),%edi
73         mov 32(%esp),%esi
74         call __vsyscall6
75         pop %edi
76         pop %edi
77         pop %esi
78         ret