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