include upstream ip1000a driver version 2.09f
[linux-2.4.git] / arch / x86_64 / ia32 / ia32entry.S
1 /*
2  * Compatibility mode system call entry point for x86-64. 
3  *              
4  * Copyright 2000,2001 Andi Kleen, SuSE Labs.
5  * 
6  * $Id: ia32entry.S,v 1.42 2003/11/27 00:55:43 ak Exp $                 
7  */              
8
9 #include <asm/calling.h>
10 #include <asm/offset.h>
11 #include <asm/current.h>
12 #include <linux/linkage.h>
13 #include <asm/errno.h>
14 #include <asm/ia32_unistd.h>    
15
16         .macro IA32_ARG_FIXUP
17         movl    %edi,%r8d
18         movl    %ebp,%r9d
19         xchg    %ecx,%esi
20         movl    %ebx,%edi
21         movl    %edx,%edx       /* zero extension */
22         .endm 
23
24 /*
25  * 32bit SYSCALL instruction entry.     
26  */     
27 ENTRY(ia32_cstar_target)
28         movq $-ENOSYS,%rax
29         sysretl 
30         
31 /* 
32  * Emulated IA32 system calls via int 0x80. 
33  *
34  * Arguments:    
35  * %eax System call number.
36  * %ebx Arg1
37  * %ecx Arg2
38  * %edx Arg3
39  * %esi Arg4
40  * %edi Arg5
41  * %ebp Arg6    [note: not saved in the stack frame, should not be touched]
42  *
43  * Notes:
44  * Uses the same stack frame as the x86-64 version.     
45  * All registers except %eax must be saved (but ptrace may violate that)
46  * Arguments are zero extended. For system calls that want sign extension and
47  * take long arguments a wrapper is needed. Most calls can just be called
48  * directly.
49  * Assumes it is only called from user space and entered with interrups off.            
50  */                             
51
52 ENTRY(ia32_syscall)
53         swapgs  
54         sti
55         movl %eax,%eax  
56         pushq %rax
57         cld
58         SAVE_ARGS
59         GET_CURRENT(%r10)
60         testl $PT_TRACESYS,tsk_ptrace(%r10) 
61         jne  ia32_tracesys
62         cmpl $(IA32_NR_syscalls),%eax
63         jae  ia32_badsys
64         IA32_ARG_FIXUP
65         call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
66         movq %rax,RAX-ARGOFFSET(%rsp)
67         jmp int_ret_from_sys_call 
68
69 ia32_tracesys:                   
70         SAVE_REST
71         movq $-ENOSYS,RAX(%rsp)
72         movq %rsp,%rdi        /* &pt_regs -> arg1 */
73         call syscall_trace
74         LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
75         RESTORE_REST
76         cmpl $(IA32_NR_syscalls),%eax
77         jae  1f
78         IA32_ARG_FIXUP
79         call *ia32_sys_call_table(,%rax,8)
80 ia32_tracesys_end:      
81         movq %rax,RAX-ARGOFFSET(%rsp)
82 1:      SAVE_REST
83         movq %rsp,%rdi          /* &pt_regs -> arg1 */ 
84         call syscall_trace
85         RESTORE_REST
86         jmp int_ret_from_sys_call
87                 
88 ia32_badsys:
89         movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
90         movq $0,ORIG_RAX-ARGOFFSET(%rsp)
91         jmp int_ret_from_sys_call
92
93 ni_syscall:
94         movq %rax,%rdi
95         jmp  sys32_ni_syscall                   
96
97 quiet_ni_syscall:
98         movl $-ENOSYS,%eax
99         ret     
100         
101         .macro PTREGSCALL label, func
102         .globl \label
103 \label:
104         leaq \func(%rip),%rax
105         jmp  ia32_ptregs_common 
106         .endm
107
108         PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn
109         PTREGSCALL stub32_sigreturn, sys32_sigreturn
110         PTREGSCALL stub32_sigaltstack, sys32_sigaltstack
111         PTREGSCALL stub32_sigsuspend, sys32_sigsuspend
112         PTREGSCALL stub32_execve, sys32_execve
113         PTREGSCALL stub32_fork, sys32_fork
114         PTREGSCALL stub32_clone, sys32_clone
115         PTREGSCALL stub32_vfork, sys32_vfork
116         PTREGSCALL stub32_rt_sigsuspend, sys_rt_sigsuspend
117
118         .macro PTREGSCALL3 label, func, arg
119         .globl \label
120 \label:
121         leaq \func(%rip),%rax
122         leaq -ARGOFFSET+8(%rsp),\arg    /* 8 for return address */
123         jmp  ia32_ptregs_common 
124         .endm
125
126         PTREGSCALL3 stub32_iopl, sys_iopl, %rsi
127
128 ENTRY(ia32_ptregs_common)
129         popq %r11
130         SAVE_REST
131         movq %r11, %r15
132         call *%rax
133         movq %r15, %r11
134         RESTORE_REST
135         pushq %r11
136         ret
137
138         .data
139         .align 8
140         .globl ia32_sys_call_table
141 ia32_sys_call_table:
142         .quad ni_syscall        /* 0  -  old "setup" system call*/
143         .quad sys_exit
144         .quad stub32_fork
145         .quad sys_read
146         .quad sys_write
147         .quad sys32_open                /* 5 */
148         .quad sys_close
149         .quad sys32_waitpid
150         .quad sys_creat
151         .quad sys_link
152         .quad sys_unlink                /* 10 */
153         .quad stub32_execve
154         .quad sys_chdir
155         .quad sys32_time
156         .quad sys_mknod
157         .quad sys_chmod         /* 15 */
158         .quad sys_lchown16
159         .quad ni_syscall                        /* old break syscall holder */
160         .quad ni_syscall        /* (old)stat */ 
161         .quad sys32_lseek
162         .quad sys_getpid                /* 20 */
163         .quad sys_mount /* mount  */
164         .quad sys_oldumount     /* old_umount  */
165         .quad sys_setuid16
166         .quad sys_getuid16
167         .quad sys_stime         /* stime */             /* 25 */
168         .quad sys32_ptrace      /* ptrace */
169         .quad sys_alarm         /* XXX sign extension??? */ 
170         .quad ni_syscall        /* (old)fstat */
171         .quad sys_pause
172         .quad sys32_utime       /* 30 */
173         .quad ni_syscall        /* old stty syscall holder */
174         .quad ni_syscall        /* old gtty syscall holder */
175         .quad sys_access
176         .quad sys_nice  
177         .quad ni_syscall        /* 35 */        /* old ftime syscall holder */
178         .quad sys_sync
179         .quad sys32_kill
180         .quad sys_rename
181         .quad sys_mkdir
182         .quad sys_rmdir         /* 40 */
183         .quad sys_dup
184         .quad sys32_pipe
185         .quad sys32_times
186         .quad ni_syscall                        /* old prof syscall holder */
187         .quad sys_brk           /* 45 */
188         .quad sys_setgid16
189         .quad sys_getgid16
190         .quad sys_signal
191         .quad sys_geteuid16
192         .quad sys_getegid16     /* 50 */
193         .quad sys_acct
194         .quad sys_umount                        /* new_umount */
195         .quad ni_syscall                        /* old lock syscall holder */
196         .quad sys32_ioctl
197         .quad sys32_fcntl               /* 55 */
198         .quad ni_syscall                        /* old mpx syscall holder */
199         .quad sys_setpgid
200         .quad ni_syscall                        /* old ulimit syscall holder */
201         .quad sys32_olduname
202         .quad sys_umask         /* 60 */
203         .quad sys_chroot
204         .quad sys32_ustat
205         .quad sys_dup2
206         .quad sys_getppid
207         .quad sys_getpgrp               /* 65 */
208         .quad sys_setsid
209         .quad sys32_sigaction
210         .quad sys_sgetmask
211         .quad sys_ssetmask
212         .quad sys_setreuid16    /* 70 */
213         .quad sys_setregid16
214         .quad stub32_sigsuspend
215         .quad sys32_sigpending
216         .quad sys_sethostname
217         .quad sys32_setrlimit   /* 75 */
218         .quad sys32_old_getrlimit       /* old_getrlimit */
219         .quad sys32_getrusage
220         .quad sys32_gettimeofday
221         .quad sys32_settimeofday
222         .quad sys_getgroups16   /* 80 */
223         .quad sys_setgroups16
224         .quad sys32_old_select
225         .quad sys_symlink
226         .quad ni_syscall        /* (old)lstat */
227         .quad sys_readlink              /* 85 */
228         .quad sys_uselib
229         .quad sys_swapon
230         .quad sys_reboot
231         .quad sys32_oldreaddir
232         .quad sys32_mmap                /* 90 */
233         .quad sys_munmap
234         .quad sys_truncate
235         .quad sys_ftruncate
236         .quad sys_fchmod
237         .quad sys_fchown16              /* 95 */
238         .quad sys_getpriority
239         .quad sys_setpriority
240         .quad ni_syscall                        /* old profil syscall holder */
241         .quad sys32_statfs
242         .quad sys32_fstatfs             /* 100 */
243         .quad sys_ioperm
244         .quad sys32_socketcall
245         .quad sys_syslog
246         .quad sys32_setitimer
247         .quad sys32_getitimer   /* 105 */
248         .quad sys32_newstat
249         .quad sys32_newlstat
250         .quad sys32_newfstat
251         .quad sys32_uname
252         .quad stub32_iopl               /* 110 */
253         .quad sys_vhangup
254         .quad ni_syscall        /* old "idle" system call */
255         .quad sys32_vm86_warning        /* vm86old */ 
256         .quad sys32_wait4
257         .quad sys_swapoff               /* 115 */
258         .quad sys32_sysinfo
259         .quad sys32_ipc
260         .quad sys_fsync
261         .quad stub32_sigreturn
262         .quad stub32_clone              /* 120 */
263         .quad sys_setdomainname
264         .quad sys_uname
265         .quad sys32_modify_ldt
266         .quad sys32_adjtimex
267         .quad sys32_mprotect            /* 125 */
268         .quad sys32_sigprocmask
269         .quad sys32_create_module
270         .quad sys32_init_module
271         .quad sys32_delete_module
272         .quad sys32_get_kernel_syms     /* 130 */
273         .quad ni_syscall        /* quotactl */ 
274         .quad sys_getpgid
275         .quad sys_fchdir
276         .quad ni_syscall        /* bdflush */
277         .quad sys_sysfs         /* 135 */
278         .quad sys_personality
279         .quad ni_syscall        /* for afs_syscall */
280         .quad sys_setfsuid16
281         .quad sys_setfsgid16
282         .quad sys_llseek                /* 140 */
283         .quad sys32_getdents
284         .quad sys32_select
285         .quad sys_flock
286         .quad sys_msync
287         .quad sys32_readv               /* 145 */
288         .quad sys32_writev
289         .quad sys_getsid
290         .quad sys_fdatasync
291         .quad sys32_sysctl      /* sysctl */
292         .quad sys_mlock         /* 150 */
293         .quad sys_munlock
294         .quad sys_mlockall
295         .quad sys_munlockall
296         .quad sys_sched_setparam
297         .quad sys_sched_getparam   /* 155 */
298         .quad sys_sched_setscheduler
299         .quad sys_sched_getscheduler
300         .quad sys_sched_yield
301         .quad sys_sched_get_priority_max
302         .quad sys_sched_get_priority_min  /* 160 */
303         .quad sys_sched_rr_get_interval
304         .quad sys32_nanosleep
305         .quad sys_mremap
306         .quad sys_setresuid16
307         .quad sys_getresuid16   /* 165 */
308         .quad sys32_vm86_warning        /* vm86 */ 
309         .quad sys32_query_module
310         .quad sys_poll
311         .quad sys32_nfsservctl
312         .quad sys_setresgid16   /* 170 */
313         .quad sys_getresgid16
314         .quad sys_prctl
315         .quad stub32_rt_sigreturn
316         .quad sys32_rt_sigaction
317         .quad sys32_rt_sigprocmask      /* 175 */
318         .quad sys32_rt_sigpending
319         .quad sys32_rt_sigtimedwait
320         .quad sys32_rt_sigqueueinfo
321         .quad stub32_rt_sigsuspend
322         .quad sys32_pread               /* 180 */
323         .quad sys32_pwrite
324         .quad sys_chown16
325         .quad sys_getcwd
326         .quad sys_capget
327         .quad sys_capset
328         .quad stub32_sigaltstack
329         .quad sys32_sendfile
330         .quad ni_syscall                /* streams1 */
331         .quad ni_syscall                /* streams2 */
332         .quad stub32_vfork            /* 190 */
333         .quad sys32_getrlimit
334         .quad sys32_mmap2
335         .quad sys32_truncate64
336         .quad sys32_ftruncate64
337         .quad sys32_stat64              /* 195 */
338         .quad sys32_lstat64
339         .quad sys32_fstat64
340         .quad sys_lchown
341         .quad sys_getuid
342         .quad sys_getgid                /* 200 */
343         .quad sys_geteuid
344         .quad sys_getegid
345         .quad sys_setreuid
346         .quad sys_setregid
347         .quad sys_getgroups     /* 205 */
348         .quad sys_setgroups
349         .quad sys_fchown
350         .quad sys_setresuid
351         .quad sys_getresuid
352         .quad sys_setresgid     /* 210 */
353         .quad sys_getresgid
354         .quad sys_chown
355         .quad sys_setuid
356         .quad sys_setgid
357         .quad sys_setfsuid              /* 215 */
358         .quad sys_setfsgid
359         .quad sys_pivot_root
360         .quad sys_mincore
361         .quad sys_madvise
362         .quad sys_getdents64    /* 220 getdents64 */ 
363         .quad sys32_fcntl64     
364         .quad sys_ni_syscall    /* tux */
365         .quad sys_ni_syscall    /* security */
366         .quad sys_gettid        
367         .quad sys_readahead     /* 225 */ 
368         .quad quiet_ni_syscall  /* xattr syscalls 226-237 */
369         .quad quiet_ni_syscall
370         .quad quiet_ni_syscall
371         .quad quiet_ni_syscall
372         .quad quiet_ni_syscall  /* 230 */
373         .quad quiet_ni_syscall  
374         .quad quiet_ni_syscall  
375         .quad quiet_ni_syscall  
376         .quad quiet_ni_syscall  
377         .quad quiet_ni_syscall  /* 235 */
378         .quad quiet_ni_syscall  
379         .quad quiet_ni_syscall  /* fremovexattr - 237 */
380         .quad sys_tkill
381         .quad sys_sendfile64
382         .quad quiet_ni_syscall  /* futex */
383         .quad quiet_ni_syscall  /* sched_setaffinity */
384         .quad quiet_ni_syscall  /* sched_getaffinity */ 
385 ia32_syscall_end:               
386         .rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8
387                 .quad ni_syscall
388         .endr
389
390