ia32entry.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:10k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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