PageRenderTime 46ms CodeModel.GetById 10ms app.highlight 29ms RepoModel.GetById 2ms app.codeStats 0ms

/arch/ia64/ia32/ia32_entry.S

https://bitbucket.org/evzijst/gittest
Assembly | 500 lines | 477 code | 10 blank | 13 comment | 14 complexity | 731fdeb1c52e8ea8125f880f05d785b5 MD5 | raw file
  1#include <asm/asmmacro.h>
  2#include <asm/ia32.h>
  3#include <asm/offsets.h>
  4#include <asm/signal.h>
  5#include <asm/thread_info.h>
  6
  7#include "../kernel/minstate.h"
  8
  9	/*
 10	 * execve() is special because in case of success, we need to
 11	 * setup a null register window frame (in case an IA-32 process
 12	 * is exec'ing an IA-64 program).
 13	 */
 14ENTRY(ia32_execve)
 15	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(3)
 16	alloc loc1=ar.pfs,3,2,4,0
 17	mov loc0=rp
 18	.body
 19	zxt4 out0=in0			// filename
 20	;;				// stop bit between alloc and call
 21	zxt4 out1=in1			// argv
 22	zxt4 out2=in2			// envp
 23	add out3=16,sp			// regs
 24	br.call.sptk.few rp=sys32_execve
 251:	cmp.ge p6,p0=r8,r0
 26	mov ar.pfs=loc1			// restore ar.pfs
 27	;;
 28(p6)	mov ar.pfs=r0			// clear ar.pfs in case of success
 29	sxt4 r8=r8			// return 64-bit result
 30	mov rp=loc0
 31	br.ret.sptk.few rp
 32END(ia32_execve)
 33
 34ENTRY(ia32_clone)
 35	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(5)
 36	alloc r16=ar.pfs,5,2,6,0
 37	DO_SAVE_SWITCH_STACK
 38	mov loc0=rp
 39	mov loc1=r16				// save ar.pfs across do_fork
 40	.body
 41	zxt4 out1=in1				// newsp
 42	mov out3=16				// stacksize (compensates for 16-byte scratch area)
 43	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = &regs
 44	mov out0=in0				// out0 = clone_flags
 45	zxt4 out4=in2				// out4 = parent_tidptr
 46	zxt4 out5=in4				// out5 = child_tidptr
 47	br.call.sptk.many rp=do_fork
 48.ret0:	.restore sp
 49	adds sp=IA64_SWITCH_STACK_SIZE,sp	// pop the switch stack
 50	mov ar.pfs=loc1
 51	mov rp=loc0
 52	br.ret.sptk.many rp
 53END(ia32_clone)
 54
 55ENTRY(sys32_rt_sigsuspend)
 56	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
 57	alloc loc1=ar.pfs,8,2,3,0		// preserve all eight input regs
 58	mov loc0=rp
 59	mov out0=in0				// mask
 60	mov out1=in1				// sigsetsize
 61	mov out2=sp				// out2 = &sigscratch
 62	.fframe 16
 63	adds sp=-16,sp				// allocate dummy "sigscratch"
 64	;;
 65	.body
 66	br.call.sptk.many rp=ia32_rt_sigsuspend
 671:	.restore sp
 68	adds sp=16,sp
 69	mov rp=loc0
 70	mov ar.pfs=loc1
 71	br.ret.sptk.many rp
 72END(sys32_rt_sigsuspend)
 73
 74ENTRY(sys32_sigsuspend)
 75	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
 76	alloc loc1=ar.pfs,8,2,3,0		// preserve all eight input regs
 77	mov loc0=rp
 78	mov out0=in2				// mask (first two args are ignored)
 79	;;
 80	mov out1=sp				// out1 = &sigscratch
 81	.fframe 16
 82	adds sp=-16,sp				// allocate dummy "sigscratch"
 83	.body
 84	br.call.sptk.many rp=ia32_sigsuspend
 851:	.restore sp
 86	adds sp=16,sp
 87	mov rp=loc0
 88	mov ar.pfs=loc1
 89	br.ret.sptk.many rp
 90END(sys32_sigsuspend)
 91
 92GLOBAL_ENTRY(ia32_ret_from_clone)
 93	PT_REGS_UNWIND_INFO(0)
 94{	/*
 95	 * Some versions of gas generate bad unwind info if the first instruction of a
 96	 * procedure doesn't go into the first slot of a bundle.  This is a workaround.
 97	 */
 98	nop.m 0
 99	nop.i 0
100	/*
101	 * We need to call schedule_tail() to complete the scheduling process.
102	 * Called by ia64_switch_to after do_fork()->copy_thread().  r8 contains the
103	 * address of the previously executing task.
104	 */
105	br.call.sptk.many rp=ia64_invoke_schedule_tail
106}
107.ret1:
108	adds r2=TI_FLAGS+IA64_TASK_SIZE,r13
109	;;
110	ld4 r2=[r2]
111	;;
112	mov r8=0
113	and r2=_TIF_SYSCALL_TRACEAUDIT,r2
114	;;
115	cmp.ne p6,p0=r2,r0
116(p6)	br.cond.spnt .ia32_strace_check_retval
117	;;					// prevent RAW on r8
118END(ia32_ret_from_clone)
119	// fall thrugh
120GLOBAL_ENTRY(ia32_ret_from_syscall)
121	PT_REGS_UNWIND_INFO(0)
122
123	cmp.ge p6,p7=r8,r0                      // syscall executed successfully?
124	adds r2=IA64_PT_REGS_R8_OFFSET+16,sp    // r2 = &pt_regs.r8
125	;;
126	alloc r3=ar.pfs,0,0,0,0			// drop the syscall argument frame
127	st8 [r2]=r8                             // store return value in slot for r8
128	br.cond.sptk.many ia64_leave_kernel
129END(ia32_ret_from_syscall)
130
131	//
132	// Invoke a system call, but do some tracing before and after the call.
133	// We MUST preserve the current register frame throughout this routine
134	// because some system calls (such as ia64_execve) directly
135	// manipulate ar.pfs.
136	//
137	// Input:
138	//	r8 = syscall number
139	//	b6 = syscall entry point
140	//
141GLOBAL_ENTRY(ia32_trace_syscall)
142	PT_REGS_UNWIND_INFO(0)
143	mov r3=-38
144	adds r2=IA64_PT_REGS_R8_OFFSET+16,sp
145	;;
146	st8 [r2]=r3				// initialize return code to -ENOSYS
147	br.call.sptk.few rp=syscall_trace_enter	// give parent a chance to catch syscall args
148.ret2:	// Need to reload arguments (they may be changed by the tracing process)
149	adds r2=IA64_PT_REGS_R1_OFFSET+16,sp	// r2 = &pt_regs.r1
150	adds r3=IA64_PT_REGS_R13_OFFSET+16,sp	// r3 = &pt_regs.r13
151	mov r15=IA32_NR_syscalls
152	;;
153	ld4 r8=[r2],IA64_PT_REGS_R9_OFFSET-IA64_PT_REGS_R1_OFFSET
154	movl r16=ia32_syscall_table
155	;;
156	ld4 r33=[r2],8				// r9 == ecx
157	ld4 r37=[r3],16				// r13 == ebp
158	cmp.ltu.unc p6,p7=r8,r15
159	;;
160	ld4 r34=[r2],8				// r10 == edx
161	ld4 r36=[r3],8				// r15 == edi
162(p6)	shladd r16=r8,3,r16	// force ni_syscall if not valid syscall number
163	;;
164	ld8 r16=[r16]
165	;;
166	ld4 r32=[r2],8				// r11 == ebx
167	mov b6=r16
168	ld4 r35=[r3],8				// r14 == esi
169	br.call.sptk.few rp=b6			// do the syscall
170.ia32_strace_check_retval:
171	cmp.lt p6,p0=r8,r0			// syscall failed?
172	adds r2=IA64_PT_REGS_R8_OFFSET+16,sp	// r2 = &pt_regs.r8
173	;;
174	st8.spill [r2]=r8			// store return value in slot for r8
175	br.call.sptk.few rp=syscall_trace_leave	// give parent a chance to catch return value
176.ret4:	alloc r2=ar.pfs,0,0,0,0			// drop the syscall argument frame
177	br.cond.sptk.many ia64_leave_kernel
178END(ia32_trace_syscall)
179
180GLOBAL_ENTRY(sys32_vfork)
181	alloc r16=ar.pfs,2,2,4,0;;
182	mov out0=IA64_CLONE_VFORK|IA64_CLONE_VM|SIGCHLD	// out0 = clone_flags
183	br.cond.sptk.few .fork1			// do the work
184END(sys32_vfork)
185
186GLOBAL_ENTRY(sys32_fork)
187	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
188	alloc r16=ar.pfs,2,2,4,0
189	mov out0=SIGCHLD			// out0 = clone_flags
190	;;
191.fork1:
192	mov loc0=rp
193	mov loc1=r16				// save ar.pfs across do_fork
194	DO_SAVE_SWITCH_STACK
195
196	.body
197
198	mov out1=0
199	mov out3=0
200	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = &regs
201	br.call.sptk.few rp=do_fork
202.ret5:	.restore sp
203	adds sp=IA64_SWITCH_STACK_SIZE,sp	// pop the switch stack
204	mov ar.pfs=loc1
205	mov rp=loc0
206	br.ret.sptk.many rp
207END(sys32_fork)
208
209	.rodata
210	.align 8
211	.globl ia32_syscall_table
212ia32_syscall_table:
213	data8 sys_ni_syscall	  /* 0	-  old "setup(" system call*/
214	data8 sys_exit
215	data8 sys32_fork
216	data8 sys_read
217	data8 sys_write
218	data8 sys32_open	  /* 5 */
219	data8 sys_close
220	data8 sys32_waitpid
221	data8 sys_creat
222	data8 sys_link
223	data8 sys_unlink	  /* 10 */
224	data8 ia32_execve
225	data8 sys_chdir
226	data8 compat_sys_time
227	data8 sys_mknod
228	data8 sys_chmod		  /* 15 */
229	data8 sys_lchown	/* 16-bit version */
230	data8 sys_ni_syscall	  /* old break syscall holder */
231	data8 sys_ni_syscall
232	data8 sys32_lseek
233	data8 sys_getpid	  /* 20 */
234	data8 compat_sys_mount
235	data8 sys_oldumount
236	data8 sys_setuid	/* 16-bit version */
237	data8 sys_getuid	/* 16-bit version */
238	data8 compat_sys_stime    /* 25 */
239	data8 sys32_ptrace
240	data8 sys32_alarm
241	data8 sys_ni_syscall
242	data8 sys32_pause
243	data8 compat_sys_utime	  /* 30 */
244	data8 sys_ni_syscall	  /* old stty syscall holder */
245	data8 sys_ni_syscall	  /* old gtty syscall holder */
246	data8 sys_access
247	data8 sys_nice
248	data8 sys_ni_syscall	  /* 35 */	  /* old ftime syscall holder */
249	data8 sys_sync
250	data8 sys_kill
251	data8 sys_rename
252	data8 sys_mkdir
253	data8 sys_rmdir		  /* 40 */
254	data8 sys_dup
255	data8 sys32_pipe
256	data8 compat_sys_times
257	data8 sys_ni_syscall	  /* old prof syscall holder */
258	data8 sys32_brk		  /* 45 */
259	data8 sys_setgid	/* 16-bit version */
260	data8 sys_getgid	/* 16-bit version */
261	data8 sys32_signal
262	data8 sys_geteuid	/* 16-bit version */
263	data8 sys_getegid	/* 16-bit version */	  /* 50 */
264	data8 sys_acct
265	data8 sys_umount	  /* recycled never used phys( */
266	data8 sys_ni_syscall	  /* old lock syscall holder */
267	data8 compat_sys_ioctl
268	data8 compat_sys_fcntl	  /* 55 */
269	data8 sys_ni_syscall	  /* old mpx syscall holder */
270	data8 sys_setpgid
271	data8 sys_ni_syscall	  /* old ulimit syscall holder */
272	data8 sys_ni_syscall
273	data8 sys_umask		  /* 60 */
274	data8 sys_chroot
275	data8 sys_ustat
276	data8 sys_dup2
277	data8 sys_getppid
278	data8 sys_getpgrp	  /* 65 */
279	data8 sys_setsid
280	data8 sys32_sigaction
281	data8 sys_ni_syscall
282	data8 sys_ni_syscall
283	data8 sys_setreuid	/* 16-bit version */	  /* 70 */
284	data8 sys_setregid	/* 16-bit version */
285	data8 sys32_sigsuspend
286	data8 compat_sys_sigpending
287	data8 sys_sethostname
288	data8 compat_sys_setrlimit	  /* 75 */
289	data8 compat_sys_old_getrlimit
290	data8 compat_sys_getrusage
291	data8 sys32_gettimeofday
292	data8 sys32_settimeofday
293	data8 sys32_getgroups16	  /* 80 */
294	data8 sys32_setgroups16
295	data8 sys32_old_select
296	data8 sys_symlink
297	data8 sys_ni_syscall
298	data8 sys_readlink	  /* 85 */
299	data8 sys_uselib
300	data8 sys_swapon
301	data8 sys_reboot
302	data8 sys32_readdir
303	data8 sys32_mmap	  /* 90 */
304	data8 sys32_munmap
305	data8 sys_truncate
306	data8 sys_ftruncate
307	data8 sys_fchmod
308	data8 sys_fchown	/* 16-bit version */	  /* 95 */
309	data8 sys_getpriority
310	data8 sys_setpriority
311	data8 sys_ni_syscall	  /* old profil syscall holder */
312	data8 compat_sys_statfs
313	data8 compat_sys_fstatfs	  /* 100 */
314	data8 sys_ni_syscall	/* ioperm */
315	data8 compat_sys_socketcall
316	data8 sys_syslog
317	data8 compat_sys_setitimer
318	data8 compat_sys_getitimer	  /* 105 */
319	data8 compat_sys_newstat
320	data8 compat_sys_newlstat
321	data8 compat_sys_newfstat
322	data8 sys_ni_syscall
323	data8 sys_ni_syscall	/* iopl */	/* 110 */
324	data8 sys_vhangup
325	data8 sys_ni_syscall		/* used to be sys_idle */
326	data8 sys_ni_syscall
327	data8 compat_sys_wait4
328	data8 sys_swapoff	  /* 115 */
329	data8 sys32_sysinfo
330	data8 sys32_ipc
331	data8 sys_fsync
332	data8 sys32_sigreturn
333	data8 ia32_clone	  /* 120 */
334	data8 sys_setdomainname
335	data8 sys32_newuname
336	data8 sys32_modify_ldt
337	data8 sys_ni_syscall	/* adjtimex */
338	data8 sys32_mprotect	  /* 125 */
339	data8 compat_sys_sigprocmask
340	data8 sys_ni_syscall	/* create_module */
341	data8 sys_ni_syscall	/* init_module */
342	data8 sys_ni_syscall	/* delete_module */
343	data8 sys_ni_syscall	/* get_kernel_syms */  /* 130 */
344	data8 sys_quotactl
345	data8 sys_getpgid
346	data8 sys_fchdir
347	data8 sys_ni_syscall	/* sys_bdflush */
348	data8 sys_sysfs		/* 135 */
349	data8 sys32_personality
350	data8 sys_ni_syscall	  /* for afs_syscall */
351	data8 sys_setfsuid	/* 16-bit version */
352	data8 sys_setfsgid	/* 16-bit version */
353	data8 sys_llseek	  /* 140 */
354	data8 compat_sys_getdents
355	data8 compat_sys_select
356	data8 sys_flock
357	data8 sys32_msync
358	data8 compat_sys_readv	  /* 145 */
359	data8 compat_sys_writev
360	data8 sys_getsid
361	data8 sys_fdatasync
362	data8 sys32_sysctl
363	data8 sys_mlock		  /* 150 */
364	data8 sys_munlock
365	data8 sys_mlockall
366	data8 sys_munlockall
367	data8 sys_sched_setparam
368	data8 sys_sched_getparam  /* 155 */
369	data8 sys_sched_setscheduler
370	data8 sys_sched_getscheduler
371	data8 sys_sched_yield
372	data8 sys_sched_get_priority_max
373	data8 sys_sched_get_priority_min	 /* 160 */
374	data8 sys32_sched_rr_get_interval
375	data8 compat_sys_nanosleep
376	data8 sys32_mremap
377	data8 sys_setresuid	/* 16-bit version */
378	data8 sys32_getresuid16	/* 16-bit version */	  /* 165 */
379	data8 sys_ni_syscall	/* vm86 */
380	data8 sys_ni_syscall	/* sys_query_module */
381	data8 sys_poll
382	data8 sys_ni_syscall	/* nfsservctl */
383	data8 sys_setresgid	  /* 170 */
384	data8 sys32_getresgid16
385	data8 sys_prctl
386	data8 sys32_rt_sigreturn
387	data8 sys32_rt_sigaction
388	data8 sys32_rt_sigprocmask /* 175 */
389	data8 sys_rt_sigpending
390	data8 compat_sys_rt_sigtimedwait
391	data8 sys32_rt_sigqueueinfo
392	data8 sys32_rt_sigsuspend
393	data8 sys32_pread	  /* 180 */
394	data8 sys32_pwrite
395	data8 sys_chown	/* 16-bit version */
396	data8 sys_getcwd
397	data8 sys_capget
398	data8 sys_capset	  /* 185 */
399	data8 sys32_sigaltstack
400	data8 sys32_sendfile
401	data8 sys_ni_syscall		  /* streams1 */
402	data8 sys_ni_syscall		  /* streams2 */
403	data8 sys32_vfork	  /* 190 */
404	data8 compat_sys_getrlimit
405	data8 sys32_mmap2
406	data8 sys32_truncate64
407	data8 sys32_ftruncate64
408	data8 sys32_stat64	  /* 195 */
409	data8 sys32_lstat64
410	data8 sys32_fstat64
411	data8 sys_lchown
412	data8 sys_getuid
413	data8 sys_getgid	  /* 200 */
414	data8 sys_geteuid
415	data8 sys_getegid
416	data8 sys_setreuid
417	data8 sys_setregid
418	data8 sys_getgroups	  /* 205 */
419	data8 sys_setgroups
420	data8 sys_fchown
421	data8 sys_setresuid
422	data8 sys_getresuid
423	data8 sys_setresgid	  /* 210 */
424	data8 sys_getresgid
425	data8 sys_chown
426	data8 sys_setuid
427	data8 sys_setgid
428	data8 sys_setfsuid	  /* 215 */
429	data8 sys_setfsgid
430	data8 sys_pivot_root
431	data8 sys_mincore
432	data8 sys_madvise
433	data8 compat_sys_getdents64	  /* 220 */
434	data8 compat_sys_fcntl64
435	data8 sys_ni_syscall		/* reserved for TUX */
436	data8 sys_ni_syscall		/* reserved for Security */
437	data8 sys_gettid
438	data8 sys_readahead	  /* 225 */
439 	data8 sys_setxattr
440 	data8 sys_lsetxattr
441 	data8 sys_fsetxattr
442 	data8 sys_getxattr
443 	data8 sys_lgetxattr	/* 230 */
444 	data8 sys_fgetxattr
445 	data8 sys_listxattr
446 	data8 sys_llistxattr
447 	data8 sys_flistxattr
448 	data8 sys_removexattr	/* 235 */
449 	data8 sys_lremovexattr
450 	data8 sys_fremovexattr
451	data8 sys_tkill
452 	data8 sys_sendfile64
453	data8 compat_sys_futex	/* 240 */
454	data8 compat_sys_sched_setaffinity
455	data8 compat_sys_sched_getaffinity
456	data8 sys32_set_thread_area
457	data8 sys32_get_thread_area
458 	data8 compat_sys_io_setup	/* 245 */
459 	data8 sys_io_destroy
460 	data8 compat_sys_io_getevents
461 	data8 compat_sys_io_submit
462 	data8 sys_io_cancel
463 	data8 sys_fadvise64	/* 250 */
464	data8 sys_ni_syscall
465	data8 sys_exit_group
466 	data8 sys_lookup_dcookie
467	data8 sys_epoll_create
468	data8 sys32_epoll_ctl	/* 255 */
469	data8 sys32_epoll_wait
470	data8 sys_remap_file_pages
471	data8 sys_set_tid_address
472 	data8 sys32_timer_create
473 	data8 compat_sys_timer_settime	/* 260 */
474 	data8 compat_sys_timer_gettime
475 	data8 sys_timer_getoverrun
476 	data8 sys_timer_delete
477 	data8 compat_sys_clock_settime
478 	data8 compat_sys_clock_gettime /* 265 */
479 	data8 compat_sys_clock_getres
480 	data8 compat_sys_clock_nanosleep
481	data8 compat_sys_statfs64
482	data8 compat_sys_fstatfs64
483 	data8 sys_tgkill	/* 270 */
484 	data8 compat_sys_utimes
485 	data8 sys32_fadvise64_64
486 	data8 sys_ni_syscall
487  	data8 sys_ni_syscall
488 	data8 sys_ni_syscall	/* 275 */
489  	data8 sys_ni_syscall
490  	data8 compat_sys_mq_open
491  	data8 sys_mq_unlink
492  	data8 compat_sys_mq_timedsend
493  	data8 compat_sys_mq_timedreceive	/* 280 */
494  	data8 compat_sys_mq_notify
495  	data8 compat_sys_mq_getsetattr
496	data8 sys_ni_syscall		/* reserved for kexec */
497	data8 compat_sys_waitid
498
499	// guard against failures to increase IA32_NR_syscalls
500	.org ia32_syscall_table + 8*IA32_NR_syscalls