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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * ia64/kernel/entry.S
  3.  *
  4.  * Kernel entry points.
  5.  *
  6.  * Copyright (C) 1998-2002 Hewlett-Packard Co
  7.  * David Mosberger-Tang <davidm@hpl.hp.com>
  8.  * Copyright (C) 1999 VA Linux Systems
  9.  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
  10.  * Copyright (C) 1999 Asit Mallick <Asit.K.Mallick@intel.com>
  11.  * Copyright (C) 1999 Don Dugger <Don.Dugger@intel.com>
  12.  */
  13. /*
  14.  * ia64_switch_to now places correct virtual mapping in in TR2 for
  15.  * kernel stack. This allows us to handle interrupts without changing
  16.  * to physical mode.
  17.  *
  18.  * Jonathan Nicklin <nicklin@missioncriticallinux.com>
  19.  * Patrick O'Rourke <orourke@missioncriticallinux.com>
  20.  * 11/07/2000
  21.  /
  22. /*
  23.  * Global (preserved) predicate usage on syscall entry/exit path:
  24.  *
  25.  * pKern: See entry.h.
  26.  * pUser: See entry.h.
  27.  * pSys: See entry.h.
  28.  * pNonSys: !pSys
  29.  */
  30. #include <linux/config.h>
  31. #include <asm/cache.h>
  32. #include <asm/errno.h>
  33. #include <asm/kregs.h>
  34. #include <asm/offsets.h>
  35. #include <asm/processor.h>
  36. #include <asm/unistd.h>
  37. #include <asm/asmmacro.h>
  38. #include <asm/pgtable.h>
  39. #include "minstate.h"
  40. /*
  41.  * execve() is special because in case of success, we need to
  42.  * setup a null register window frame.
  43.  */
  44. ENTRY(ia64_execve)
  45. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(3)
  46. alloc loc1=ar.pfs,3,2,4,0
  47. mov loc0=rp
  48. .body
  49. mov out0=in0 // filename
  50. ;; // stop bit between alloc and call
  51. mov out1=in1 // argv
  52. mov out2=in2 // envp
  53. add out3=16,sp // regs
  54. br.call.sptk.many rp=sys_execve
  55. .ret0: cmp4.ge p6,p7=r8,r0
  56. mov ar.pfs=loc1 // restore ar.pfs
  57. sxt4 r8=r8 // return 64-bit result
  58. ;;
  59. stf.spill [sp]=f0
  60. (p6) cmp.ne pKern,pUser=r0,r0 // a successful execve() lands us in user-mode...
  61. mov rp=loc0
  62. (p6) mov ar.pfs=r0 // clear ar.pfs on success
  63. (p7) br.ret.sptk.many rp
  64. /*
  65.  * In theory, we'd have to zap this state only to prevent leaking of
  66.  * security sensitive state (e.g., if current->mm->dumpable is zero).  However,
  67.  * this executes in less than 20 cycles even on Itanium, so it's not worth
  68.  * optimizing for...).
  69.  */
  70. mov r4=0; mov f2=f0; mov b1=r0
  71. mov r5=0; mov f3=f0; mov b2=r0
  72. mov r6=0; mov f4=f0; mov b3=r0
  73. mov r7=0; mov f5=f0; mov b4=r0
  74. mov ar.unat=0; mov f10=f0; mov b5=r0
  75. ldf.fill f11=[sp]; ldf.fill f12=[sp]; mov f13=f0
  76. ldf.fill f14=[sp]; ldf.fill f15=[sp]; mov f16=f0
  77. ldf.fill f17=[sp]; ldf.fill f18=[sp]; mov f19=f0
  78. ldf.fill f20=[sp]; ldf.fill f21=[sp]; mov f22=f0
  79. ldf.fill f23=[sp]; ldf.fill f24=[sp]; mov f25=f0
  80. ldf.fill f26=[sp]; ldf.fill f27=[sp]; mov f28=f0
  81. ldf.fill f29=[sp]; ldf.fill f30=[sp]; mov f31=f0
  82. mov ar.lc=0
  83. br.ret.sptk.many rp
  84. END(ia64_execve)
  85. GLOBAL_ENTRY(sys_clone2)
  86. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
  87. alloc r16=ar.pfs,3,2,4,0
  88. DO_SAVE_SWITCH_STACK
  89. mov loc0=rp
  90. mov loc1=r16 // save ar.pfs across do_fork
  91. .body
  92. mov out1=in1
  93. mov out3=in2
  94. adds out2=IA64_SWITCH_STACK_SIZE+16,sp // out2 = &regs
  95. mov out0=in0 // out0 = clone_flags
  96. br.call.sptk.many rp=do_fork
  97. .ret1: .restore sp
  98. adds sp=IA64_SWITCH_STACK_SIZE,sp // pop the switch stack
  99. mov ar.pfs=loc1
  100. mov rp=loc0
  101. br.ret.sptk.many rp
  102. END(sys_clone2)
  103. GLOBAL_ENTRY(sys_clone)
  104. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
  105. alloc r16=ar.pfs,2,2,4,0
  106. DO_SAVE_SWITCH_STACK
  107. mov loc0=rp
  108. mov loc1=r16 // save ar.pfs across do_fork
  109. .body
  110. mov out1=in1
  111. mov out3=16 // stacksize (compensates for 16-byte scratch area)
  112. adds out2=IA64_SWITCH_STACK_SIZE+16,sp // out2 = &regs
  113. mov out0=in0 // out0 = clone_flags
  114. br.call.sptk.many rp=do_fork
  115. .ret2: .restore sp
  116. adds sp=IA64_SWITCH_STACK_SIZE,sp // pop the switch stack
  117. mov ar.pfs=loc1
  118. mov rp=loc0
  119. br.ret.sptk.many rp
  120. END(sys_clone)
  121. /*
  122.  * prev_task <- ia64_switch_to(struct task_struct *next)
  123.  */
  124. GLOBAL_ENTRY(ia64_switch_to)
  125. .prologue
  126. alloc r16=ar.pfs,1,0,0,0
  127. DO_SAVE_SWITCH_STACK
  128. .body
  129. adds r22=IA64_TASK_THREAD_KSP_OFFSET,r13
  130. mov r27=IA64_KR(CURRENT_STACK)
  131. dep r20=0,in0,61,3 // physical address of "current"
  132. ;;
  133. st8 [r22]=sp // save kernel stack pointer of old task
  134. shr.u r26=r20,IA64_GRANULE_SHIFT
  135. shr.u r17=r20,KERNEL_TR_PAGE_SHIFT
  136. ;;
  137. cmp.ne p6,p7=KERNEL_TR_PAGE_NUM,r17
  138. adds r21=IA64_TASK_THREAD_KSP_OFFSET,in0
  139. ;;
  140. /*
  141.  * If we've already mapped this task's page, we can skip doing it again.
  142.  */
  143. (p6) cmp.eq p7,p6=r26,r27
  144. (p6) br.cond.dpnt .map
  145. ;;
  146. .done:
  147. (p6) ssm psr.ic // if we we had to map, renable the psr.ic bit FIRST!!!
  148. ;;
  149. (p6) srlz.d
  150. ld8 sp=[r21] // load kernel stack pointer of new task
  151. mov IA64_KR(CURRENT)=r20 // update "current" application register
  152. mov r8=r13 // return pointer to previously running task
  153. mov r13=in0 // set "current" pointer
  154. ;;
  155. (p6) ssm psr.i // renable psr.i AFTER the ic bit is serialized
  156. DO_LOAD_SWITCH_STACK
  157. #ifdef CONFIG_SMP
  158. sync.i // ensure "fc"s done by this CPU are visible on other CPUs
  159. #endif
  160. br.ret.sptk.many rp // boogie on out in new context
  161. .map:
  162. rsm psr.i | psr.ic
  163. movl r25=PAGE_KERNEL
  164. ;;
  165. srlz.d
  166. or r23=r25,r20 // construct PA | page properties
  167. mov r25=IA64_GRANULE_SHIFT<<2
  168. ;;
  169. mov cr.itir=r25
  170. mov cr.ifa=in0 // VA of next task...
  171. ;;
  172. mov r25=IA64_TR_CURRENT_STACK
  173. mov IA64_KR(CURRENT_STACK)=r26 // remember last page we mapped...
  174. ;;
  175. itr.d dtr[r25]=r23 // wire in new mapping...
  176. br.cond.sptk .done
  177. END(ia64_switch_to)
  178. /*
  179.  * Note that interrupts are enabled during save_switch_stack and
  180.  * load_switch_stack.  This means that we may get an interrupt with
  181.  * "sp" pointing to the new kernel stack while ar.bspstore is still
  182.  * pointing to the old kernel backing store area.  Since ar.rsc,
  183.  * ar.rnat, ar.bsp, and ar.bspstore are all preserved by interrupts,
  184.  * this is not a problem.  Also, we don't need to specify unwind
  185.  * information for preserved registers that are not modified in
  186.  * save_switch_stack as the right unwind information is already
  187.  * specified at the call-site of save_switch_stack.
  188.  */
  189. /*
  190.  * save_switch_stack:
  191.  * - r16 holds ar.pfs
  192.  * - b7 holds address to return to
  193.  * - rp (b0) holds return address to save
  194.  */
  195. GLOBAL_ENTRY(save_switch_stack)
  196. .prologue
  197. .altrp b7
  198. flushrs // flush dirty regs to backing store (must be first in insn group)
  199. .save @priunat,r17
  200. mov r17=ar.unat // preserve caller's
  201. .body
  202. adds r3=80,sp
  203. ;;
  204. lfetch.fault.excl.nt1 [r3],128
  205. mov ar.rsc=0 // put RSE in mode: enforced lazy, little endian, pl 0
  206. adds r2=16+128,sp
  207. ;;
  208. lfetch.fault.excl.nt1 [r2],128
  209. lfetch.fault.excl.nt1 [r3],128
  210. adds r14=SW(R4)+16,sp
  211. ;;
  212. lfetch.fault.excl [r2]
  213. lfetch.fault.excl [r3]
  214. adds r15=SW(R5)+16,sp
  215. ;;
  216. mov r18=ar.fpsr // preserve fpsr
  217. mov r19=ar.rnat
  218. add r2=SW(F2)+16,sp // r2 = &sw->f2
  219. .mem.offset 0,0; st8.spill [r14]=r4,16 // spill r4
  220. .mem.offset 8,0; st8.spill [r15]=r5,16 // spill r5
  221. add r3=SW(F3)+16,sp // r3 = &sw->f3
  222. ;;
  223. stf.spill [r2]=f2,32
  224. stf.spill [r3]=f3,32
  225. mov r21=b0
  226. .mem.offset 0,0; st8.spill [r14]=r6,16 // spill r6
  227. .mem.offset 8,0; st8.spill [r15]=r7,16 // spill r7
  228. mov r22=b1
  229. ;;
  230. // since we're done with the spills, read and save ar.unat:
  231. mov r29=ar.unat // M-unit
  232. mov r20=ar.bspstore // M-unit
  233. mov r23=b2
  234. stf.spill [r2]=f4,32
  235. stf.spill [r3]=f5,32
  236. mov r24=b3
  237. ;;
  238. st8 [r14]=r21,16 // save b0
  239. st8 [r15]=r22,16 // save b1
  240. mov r25=b4
  241. stf.spill [r2]=f10,32
  242. stf.spill [r3]=f11,32
  243. mov r26=b5
  244. ;;
  245. st8 [r14]=r23,16 // save b2
  246. st8 [r15]=r24,16 // save b3
  247. mov r21=ar.lc // I-unit
  248. stf.spill [r2]=f12,32
  249. stf.spill [r3]=f13,32
  250. ;;
  251. st8 [r14]=r25,16 // save b4
  252. st8 [r15]=r26,16 // save b5
  253. stf.spill [r2]=f14,32
  254. stf.spill [r3]=f15,32
  255. ;;
  256. st8 [r14]=r16 // save ar.pfs
  257. st8 [r15]=r21 // save ar.lc
  258. stf.spill [r2]=f16,32
  259. stf.spill [r3]=f17,32
  260. ;;
  261. stf.spill [r2]=f18,32
  262. stf.spill [r3]=f19,32
  263. ;;
  264. stf.spill [r2]=f20,32
  265. stf.spill [r3]=f21,32
  266. ;;
  267. stf.spill [r2]=f22,32
  268. stf.spill [r3]=f23,32
  269. ;;
  270. stf.spill [r2]=f24,32
  271. stf.spill [r3]=f25,32
  272. add r14=SW(CALLER_UNAT)+16,sp
  273. ;;
  274. stf.spill [r2]=f26,32
  275. stf.spill [r3]=f27,32
  276. add r15=SW(AR_FPSR)+16,sp
  277. ;;
  278. stf.spill [r2]=f28,32
  279. stf.spill [r3]=f29,32
  280. st8 [r14]=r17 // save caller_unat
  281. st8 [r15]=r18 // save fpsr
  282. mov r21=pr
  283. ;;
  284. stf.spill [r2]=f30,(SW(AR_UNAT)-SW(F30))
  285. stf.spill [r3]=f31,(SW(AR_RNAT)-SW(F31))
  286. ;;
  287. st8 [r2]=r29,16 // save ar.unat
  288. st8 [r3]=r19,16 // save ar.rnat
  289. ;;
  290. st8 [r2]=r20 // save ar.bspstore
  291. st8 [r3]=r21 // save predicate registers
  292. mov ar.rsc=3 // put RSE back into eager mode, pl 0
  293. br.cond.sptk.many b7
  294. END(save_switch_stack)
  295. /*
  296.  * load_switch_stack:
  297.  * - "invala" MUST be done at call site (normally in DO_LOAD_SWITCH_STACK)
  298.  * - b7 holds address to return to
  299.  * - must not touch r8-r11
  300.  */
  301. ENTRY(load_switch_stack)
  302. .prologue
  303. .altrp b7
  304. .body
  305. lfetch.fault.nt1 [sp]
  306. adds r2=SW(AR_BSPSTORE)+16,sp
  307. adds r3=SW(AR_UNAT)+16,sp
  308. mov ar.rsc=0 // put RSE into enforced lazy mode
  309. adds r14=SW(CALLER_UNAT)+16,sp
  310. adds r15=SW(AR_FPSR)+16,sp
  311. ;;
  312. ld8 r27=[r2],(SW(B0)-SW(AR_BSPSTORE)) // bspstore
  313. ld8 r29=[r3],(SW(B1)-SW(AR_UNAT)) // unat
  314. ;;
  315. ld8 r21=[r2],16 // restore b0
  316. ld8 r22=[r3],16 // restore b1
  317. ;;
  318. ld8 r23=[r2],16 // restore b2
  319. ld8 r24=[r3],16 // restore b3
  320. ;;
  321. ld8 r25=[r2],16 // restore b4
  322. ld8 r26=[r3],16 // restore b5
  323. ;;
  324. ld8 r16=[r2],(SW(PR)-SW(AR_PFS)) // ar.pfs
  325. ld8 r17=[r3],(SW(AR_RNAT)-SW(AR_LC)) // ar.lc
  326. ;;
  327. ld8 r28=[r2] // restore pr
  328. ld8 r30=[r3] // restore rnat
  329. ;;
  330. ld8 r18=[r14],16 // restore caller's unat
  331. ld8 r19=[r15],24 // restore fpsr
  332. ;;
  333. ldf.fill f2=[r14],32
  334. ldf.fill f3=[r15],32
  335. ;;
  336. ldf.fill f4=[r14],32
  337. ldf.fill f5=[r15],32
  338. ;;
  339. ldf.fill f10=[r14],32
  340. ldf.fill f11=[r15],32
  341. ;;
  342. ldf.fill f12=[r14],32
  343. ldf.fill f13=[r15],32
  344. ;;
  345. ldf.fill f14=[r14],32
  346. ldf.fill f15=[r15],32
  347. ;;
  348. ldf.fill f16=[r14],32
  349. ldf.fill f17=[r15],32
  350. ;;
  351. ldf.fill f18=[r14],32
  352. ldf.fill f19=[r15],32
  353. mov b0=r21
  354. ;;
  355. ldf.fill f20=[r14],32
  356. ldf.fill f21=[r15],32
  357. mov b1=r22
  358. ;;
  359. ldf.fill f22=[r14],32
  360. ldf.fill f23=[r15],32
  361. mov b2=r23
  362. ;;
  363. mov ar.bspstore=r27
  364. mov ar.unat=r29 // establish unat holding the NaT bits for r4-r7
  365. mov b3=r24
  366. ;;
  367. ldf.fill f24=[r14],32
  368. ldf.fill f25=[r15],32
  369. mov b4=r25
  370. ;;
  371. ldf.fill f26=[r14],32
  372. ldf.fill f27=[r15],32
  373. mov b5=r26
  374. ;;
  375. ldf.fill f28=[r14],32
  376. ldf.fill f29=[r15],32
  377. mov ar.pfs=r16
  378. ;;
  379. ldf.fill f30=[r14],32
  380. ldf.fill f31=[r15],24
  381. mov ar.lc=r17
  382. ;;
  383. ld8.fill r4=[r14],16
  384. ld8.fill r5=[r15],16
  385. mov pr=r28,-1
  386. ;;
  387. ld8.fill r6=[r14],16
  388. ld8.fill r7=[r15],16
  389. mov ar.unat=r18 // restore caller's unat
  390. mov ar.rnat=r30 // must restore after bspstore but before rsc!
  391. mov ar.fpsr=r19 // restore fpsr
  392. mov ar.rsc=3 // put RSE back into eager mode, pl 0
  393. br.cond.sptk.many b7
  394. END(load_switch_stack)
  395. GLOBAL_ENTRY(__ia64_syscall)
  396. .regstk 6,0,0,0
  397. mov r15=in5 // put syscall number in place
  398. break __BREAK_SYSCALL
  399. movl r2=errno
  400. cmp.eq p6,p7=-1,r10
  401. ;;
  402. (p6) st4 [r2]=r8
  403. (p6) mov r8=-1
  404. br.ret.sptk.many rp
  405. END(__ia64_syscall)
  406. /*
  407.  * We invoke syscall_trace through this intermediate function to
  408.  * ensure that the syscall input arguments are not clobbered.  We
  409.  * also use it to preserve b6, which contains the syscall entry point.
  410.  */
  411. GLOBAL_ENTRY(invoke_syscall_trace)
  412. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
  413. alloc loc1=ar.pfs,8,3,0,0
  414. mov loc0=rp
  415. .body
  416. mov loc2=b6
  417. ;;
  418. br.call.sptk.many rp=syscall_trace
  419. .ret3: mov rp=loc0
  420. mov ar.pfs=loc1
  421. mov b6=loc2
  422. br.ret.sptk.many rp
  423. END(invoke_syscall_trace)
  424. /*
  425.  * Invoke a system call, but do some tracing before and after the call.
  426.  * We MUST preserve the current register frame throughout this routine
  427.  * because some system calls (such as ia64_execve) directly
  428.  * manipulate ar.pfs.
  429.  *
  430.  * Input:
  431.  * r15 = syscall number
  432.  * b6  = syscall entry point
  433.  */
  434. .global ia64_strace_leave_kernel
  435. GLOBAL_ENTRY(ia64_trace_syscall)
  436. PT_REGS_UNWIND_INFO(0)
  437. br.call.sptk.many rp=invoke_syscall_trace // give parent a chance to catch syscall args
  438. .ret6: br.call.sptk.many rp=b6 // do the syscall
  439. strace_check_retval:
  440. cmp.lt p6,p0=r8,r0 // syscall failed?
  441. adds r2=PT(R8)+16,sp // r2 = &pt_regs.r8
  442. adds r3=PT(R10)+16,sp // r3 = &pt_regs.r10
  443. mov r10=0
  444. (p6) br.cond.sptk strace_error // syscall failed ->
  445. ;; // avoid RAW on r10
  446. strace_save_retval:
  447. .mem.offset 0,0; st8.spill [r2]=r8 // store return value in slot for r8
  448. .mem.offset 8,0; st8.spill [r3]=r10 // clear error indication in slot for r10
  449. ia64_strace_leave_kernel:
  450. br.call.sptk.many rp=invoke_syscall_trace // give parent a chance to catch return value
  451. .rety: br.cond.sptk ia64_leave_kernel
  452. strace_error:
  453. ld8 r3=[r2] // load pt_regs.r8
  454. sub r9=0,r8 // negate return value to get errno value
  455. ;;
  456. cmp.ne p6,p0=r3,r0 // is pt_regs.r8!=0?
  457. adds r3=16,r2 // r3=&pt_regs.r10
  458. ;;
  459. (p6) mov r10=-1
  460. (p6) mov r8=r9
  461. br.cond.sptk strace_save_retval
  462. END(ia64_trace_syscall)
  463. GLOBAL_ENTRY(ia64_ret_from_clone)
  464. PT_REGS_UNWIND_INFO(0)
  465. /*
  466.  * We need to call schedule_tail() to complete the scheduling process.
  467.  * Called by ia64_switch_to after do_fork()->copy_thread().  r8 contains the
  468.  * address of the previously executing task.
  469.  */
  470. br.call.sptk.many rp=ia64_invoke_schedule_tail
  471. .ret8:
  472. adds r2=IA64_TASK_PTRACE_OFFSET,r13
  473. ;;
  474. ld8 r2=[r2]
  475. ;;
  476. mov r8=0
  477. tbit.nz p6,p0=r2,PT_TRACESYS_BIT
  478. (p6) br.cond.spnt strace_check_retval
  479. ;; // added stop bits to prevent r8 dependency
  480. END(ia64_ret_from_clone)
  481. // fall through
  482. GLOBAL_ENTRY(ia64_ret_from_syscall)
  483. PT_REGS_UNWIND_INFO(0)
  484. cmp.ge p6,p7=r8,r0 // syscall executed successfully?
  485. adds r2=PT(R8)+16,sp // r2 = &pt_regs.r8
  486. adds r3=PT(R10)+16,sp // r3 = &pt_regs.r10
  487. ;;
  488. .mem.offset 0,0
  489. (p6) st8.spill [r2]=r8 // store return value in slot for r8 and set unat bit
  490. .mem.offset 8,0
  491. (p6) st8.spill [r3]=r0 // clear error indication in slot for r10 and set unat bit
  492. (p7) br.cond.spnt handle_syscall_error // handle potential syscall failure
  493. END(ia64_ret_from_syscall)
  494. // fall through
  495. GLOBAL_ENTRY(ia64_leave_kernel)
  496. PT_REGS_UNWIND_INFO(0)
  497. lfetch.fault [sp]
  498. movl r14=.restart
  499. ;;
  500. mov.ret.sptk rp=r14,.restart
  501. .restart:
  502. // need_resched and signals atomic test
  503. (pUser) rsm psr.i
  504. adds r17=IA64_TASK_NEED_RESCHED_OFFSET,r13
  505. adds r18=IA64_TASK_SIGPENDING_OFFSET,r13
  506. #ifdef CONFIG_PERFMON
  507. adds r19=IA64_TASK_PFM_OVFL_BLOCK_RESET_OFFSET,r13
  508. #endif
  509. ;;
  510. #ifdef CONFIG_PERFMON
  511. (pUser) ld8 r19=[r19] // load current->thread.pfm_ovfl_block_reset
  512. #endif
  513. (pUser) ld8 r17=[r17] // load current->need_resched
  514. (pUser) ld4 r18=[r18] // load current->sigpending
  515. ;;
  516. #ifdef CONFIG_PERFMON
  517. (pUser) cmp.ne.unc p9,p0=r19,r0 // current->thread.pfm_ovfl_block_reset != 0?
  518. #endif
  519. (pUser) cmp.ne.unc p7,p0=r17,r0 // current->need_resched != 0?
  520. (pUser) cmp.ne.unc p8,p0=r18,r0 // current->sigpending != 0?
  521. ;;
  522. #ifdef CONFIG_PERFMON
  523. (p9) br.call.spnt.many b7=pfm_ovfl_block_reset
  524. #endif
  525. #if __GNUC__ < 3
  526. (p7) br.call.spnt.many b7=invoke_schedule
  527. #else
  528. (p7) br.call.spnt.many b7=schedule
  529. #endif
  530. (p8) br.call.spnt.many rp=handle_signal_delivery // check & deliver pending signals (once)
  531. ;;
  532. .ret9: adds r2=PT(R8)+16,r12
  533. adds r3=PT(R9)+16,r12
  534. ;;
  535. // start restoring the state saved on the kernel stack (struct pt_regs):
  536. ld8.fill r8=[r2],16
  537. ld8.fill r9=[r3],16
  538. ;;
  539. ld8.fill r10=[r2],16
  540. ld8.fill r11=[r3],16
  541. ;;
  542. ld8.fill r16=[r2],16
  543. ld8.fill r17=[r3],16
  544. ;;
  545. ld8.fill r18=[r2],16
  546. ld8.fill r19=[r3],16
  547. ;;
  548. ld8.fill r20=[r2],16
  549. ld8.fill r21=[r3],16
  550. ;;
  551. ld8.fill r22=[r2],16
  552. ld8.fill r23=[r3],16
  553. ;;
  554. ld8.fill r24=[r2],16
  555. ld8.fill r25=[r3],16
  556. ;;
  557. ld8.fill r26=[r2],16
  558. ld8.fill r27=[r3],16
  559. ;;
  560. ld8.fill r28=[r2],16
  561. ld8.fill r29=[r3],16
  562. ;;
  563. ld8.fill r30=[r2],16
  564. ld8.fill r31=[r3],16
  565. ;;
  566. rsm psr.i | psr.ic // initiate turning off of interrupt and interruption collection
  567. invala // invalidate ALAT
  568. ;;
  569. ld8 r1=[r2],16 // ar.ccv
  570. ld8 r13=[r3],16 // ar.fpsr
  571. ;;
  572. ld8 r14=[r2],16 // b0
  573. ld8 r15=[r3],16+8 // b7
  574. ;;
  575. ldf.fill f6=[r2],32
  576. ldf.fill f7=[r3],32
  577. ;;
  578. ldf.fill f8=[r2],32
  579. ldf.fill f9=[r3],32
  580. ;;
  581. mov ar.ccv=r1
  582. mov ar.fpsr=r13
  583. mov b0=r14
  584. ;;
  585. srlz.i // ensure interruption collection is off
  586. mov b7=r15
  587. ;;
  588. bsw.0 // switch back to bank 0
  589. ;;
  590. adds r16=16,r12
  591. adds r17=24,r12
  592. ;;
  593. ld8 rCRIPSR=[r16],16 // load cr.ipsr
  594. ld8 rCRIIP=[r17],16 // load cr.iip
  595. ;;
  596. ld8 rCRIFS=[r16],16 // load cr.ifs
  597. ld8 rARUNAT=[r17],16 // load ar.unat
  598. cmp.eq p9,p0=r0,r0 // set p9 to indicate that we should restore cr.ifs
  599. ;;
  600. ld8 rARPFS=[r16],16 // load ar.pfs
  601. ld8 rARRSC=[r17],16 // load ar.rsc
  602. ;;
  603. ld8 rARRNAT=[r16],16 // load ar.rnat (may be garbage)
  604. ld8 rARBSPSTORE=[r17],16 // load ar.bspstore (may be garbage)
  605. ;;
  606. ld8 rARPR=[r16],16 // load predicates
  607. ld8 rB6=[r17],16 // load b6
  608. ;;
  609. ld8 r19=[r16],16 // load ar.rsc value for "loadrs"
  610. ld8.fill r1=[r17],16 // load r1
  611. ;;
  612. ld8.fill r2=[r16],16
  613. ld8.fill r3=[r17],16
  614. ;;
  615. ld8.fill r12=[r16],16
  616. ld8.fill r13=[r17],16
  617. ;;
  618. ld8.fill r14=[r16]
  619. ld8.fill r15=[r17]
  620. shr.u r18=r19,16 // get byte size of existing "dirty" partition
  621. ;;
  622. mov r16=ar.bsp // get existing backing store pointer
  623. movl r17=PERCPU_ADDR+IA64_CPU_PHYS_STACKED_SIZE_P8_OFFSET
  624. ;;
  625. ld4 r17=[r17] // r17 = cpu_data->phys_stacked_size_p8
  626. (pKern) br.cond.dpnt skip_rbs_switch
  627. /*
  628.  * Restore user backing store.
  629.  *
  630.  * NOTE: alloc, loadrs, and cover can't be predicated.
  631.  */
  632. (pNonSys) br.cond.dpnt dont_preserve_current_frame
  633. cover // add current frame into dirty partition
  634. ;;
  635. mov r19=ar.bsp // get new backing store pointer
  636. sub r16=r16,r18 // krbs = old bsp - size of dirty partition
  637. cmp.ne p9,p0=r0,r0 // clear p9 to skip restore of cr.ifs
  638. ;;
  639. sub r19=r19,r16 // calculate total byte size of dirty partition
  640. add r18=64,r18 // don't force in0-in7 into memory...
  641. ;;
  642. shl r19=r19,16 // shift size of dirty partition into loadrs position
  643. ;;
  644. dont_preserve_current_frame:
  645. /*
  646.  * To prevent leaking bits between the kernel and user-space,
  647.  * we must clear the stacked registers in the "invalid" partition here.
  648.  * Not pretty, but at least it's fast (3.34 registers/cycle on Itanium,
  649.  * 5 registers/cycle on McKinley).
  650.  */
  651. # define pRecurse p6
  652. # define pReturn p7
  653. #ifdef CONFIG_ITANIUM
  654. # define Nregs 10
  655. #else
  656. # define Nregs 14
  657. #endif
  658. alloc loc0=ar.pfs,2,Nregs-2,2,0
  659. shr.u loc1=r18,9 // RNaTslots <= dirtySize / (64*8) + 1
  660. sub r17=r17,r18 // r17 = (physStackedSize + 8) - dirtySize
  661. ;;
  662. #if 1
  663. .align 32 // see comment below about gas bug...
  664. #endif
  665. mov ar.rsc=r19 // load ar.rsc to be used for "loadrs"
  666. shladd in0=loc1,3,r17
  667. mov in1=0
  668. #if 0
  669. // gas-2.11.90 is unable to generate a stop bit after .align, which is bad,
  670. // because alloc must be at the beginning of an insn-group.
  671. .align 32
  672. #else
  673. nop 0
  674. nop 0
  675. nop 0
  676. #endif
  677. ;;
  678. rse_clear_invalid:
  679. #ifdef CONFIG_ITANIUM
  680. // cycle 0
  681.  { .mii
  682. alloc loc0=ar.pfs,2,Nregs-2,2,0
  683. cmp.lt pRecurse,p0=Nregs*8,in0 // if more than Nregs regs left to clear, (re)curse
  684. add out0=-Nregs*8,in0
  685. }{ .mfb
  686. add out1=1,in1 // increment recursion count
  687. nop.f 0
  688. nop.b 0 // can't do br.call here because of alloc (WAW on CFM)
  689. ;;
  690. }{ .mfi // cycle 1
  691. mov loc1=0
  692. nop.f 0
  693. mov loc2=0
  694. }{ .mib
  695. mov loc3=0
  696. mov loc4=0
  697. (pRecurse) br.call.sptk.many b6=rse_clear_invalid
  698. }{ .mfi // cycle 2
  699. mov loc5=0
  700. nop.f 0
  701. cmp.ne pReturn,p0=r0,in1 // if recursion count != 0, we need to do a br.ret
  702. }{ .mib
  703. mov loc6=0
  704. mov loc7=0
  705. (pReturn) br.ret.sptk.many b6
  706. }
  707. #else /* !CONFIG_ITANIUM */
  708. alloc loc0=ar.pfs,2,Nregs-2,2,0
  709. cmp.lt pRecurse,p0=Nregs*8,in0 // if more than Nregs regs left to clear, (re)curse
  710. add out0=-Nregs*8,in0
  711. add out1=1,in1 // increment recursion count
  712. mov loc1=0
  713. mov loc2=0
  714. ;;
  715. mov loc3=0
  716. mov loc4=0
  717. mov loc9=0
  718. mov loc5=0
  719. mov loc6=0
  720. (pRecurse) br.call.sptk.many b6=rse_clear_invalid
  721. ;;
  722. mov loc7=0
  723. mov loc8=0
  724. cmp.ne pReturn,p0=r0,in1 // if recursion count != 0, we need to do a br.ret
  725. mov loc10=0
  726. mov loc11=0
  727. (pReturn) br.ret.sptk.many b6
  728. #endif /* !CONFIG_ITANIUM */
  729. # undef pRecurse
  730. # undef pReturn
  731. ;;
  732. alloc r17=ar.pfs,0,0,0,0 // drop current register frame
  733. ;;
  734. loadrs
  735. ;;
  736. skip_rbs_switch:
  737. mov b6=rB6
  738. mov ar.pfs=rARPFS
  739. (pUser) mov ar.bspstore=rARBSPSTORE
  740. (p9) mov cr.ifs=rCRIFS
  741. mov cr.ipsr=rCRIPSR
  742. mov cr.iip=rCRIIP
  743. ;;
  744. (pUser) mov ar.rnat=rARRNAT // must happen with RSE in lazy mode
  745. mov ar.rsc=rARRSC
  746. mov ar.unat=rARUNAT
  747. mov pr=rARPR,-1
  748. rfi
  749. END(ia64_leave_kernel)
  750. ENTRY(handle_syscall_error)
  751. /*
  752.  * Some system calls (e.g., ptrace, mmap) can return arbitrary
  753.  * values which could lead us to mistake a negative return
  754.  * value as a failed syscall.  Those syscall must deposit
  755.  * a non-zero value in pt_regs.r8 to indicate an error.
  756.  * If pt_regs.r8 is zero, we assume that the call completed
  757.  * successfully.
  758.  */
  759. PT_REGS_UNWIND_INFO(0)
  760. ld8 r3=[r2] // load pt_regs.r8
  761. sub r9=0,r8 // negate return value to get errno
  762. ;;
  763. mov r10=-1 // return -1 in pt_regs.r10 to indicate error
  764. cmp.eq p6,p7=r3,r0 // is pt_regs.r8==0?
  765. adds r3=16,r2 // r3=&pt_regs.r10
  766. ;;
  767. (p6) mov r9=r8
  768. (p6) mov r10=0
  769. ;;
  770. .mem.offset 0,0; st8.spill [r2]=r9 // store errno in pt_regs.r8 and set unat bit
  771. .mem.offset 8,0; st8.spill [r3]=r10 // store error indication in pt_regs.r10 and set unat bit
  772. br.cond.sptk ia64_leave_kernel
  773. END(handle_syscall_error)
  774. /*
  775.  * Invoke schedule_tail(task) while preserving in0-in7, which may be needed
  776.  * in case a system call gets restarted.
  777.  */
  778. GLOBAL_ENTRY(ia64_invoke_schedule_tail)
  779. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
  780. alloc loc1=ar.pfs,8,2,1,0
  781. mov loc0=rp
  782. mov out0=r8 // Address of previous task
  783. ;;
  784. br.call.sptk.many rp=schedule_tail
  785. .ret11: mov ar.pfs=loc1
  786. mov rp=loc0
  787. br.ret.sptk.many rp
  788. END(ia64_invoke_schedule_tail)
  789. #if __GNUC__ < 3
  790. /*
  791.  * Invoke schedule() while preserving in0-in7, which may be needed
  792.  * in case a system call gets restarted.  Note that declaring schedule()
  793.  * with asmlinkage() is NOT enough because that will only preserve as many
  794.  * registers as there are formal arguments.
  795.  *
  796.  * XXX fix me: with gcc 3.0, we won't need this anymore because syscall_linkage
  797.  * renders all eight input registers (in0-in7) as "untouchable".
  798.  */
  799. ENTRY(invoke_schedule)
  800. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
  801. alloc loc1=ar.pfs,8,2,0,0
  802. mov loc0=rp
  803. ;;
  804. .body
  805. br.call.sptk.many rp=schedule
  806. .ret14: mov ar.pfs=loc1
  807. mov rp=loc0
  808. br.ret.sptk.many rp
  809. END(invoke_schedule)
  810. #endif /* __GNUC__ < 3 */
  811. /*
  812.  * Setup stack and call ia64_do_signal.  Note that pSys and pNonSys need to
  813.  * be set up by the caller.  We declare 8 input registers so the system call
  814.  * args get preserved, in case we need to restart a system call.
  815.  */
  816. ENTRY(handle_signal_delivery)
  817. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
  818. alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart!
  819. mov r9=ar.unat
  820. mov loc0=rp // save return address
  821. mov out0=0 // there is no "oldset"
  822. adds out1=0,sp // out1=&sigscratch
  823. (pSys) mov out2=1 // out2==1 => we're in a syscall
  824. ;;
  825. (pNonSys) mov out2=0 // out2==0 => not a syscall
  826. .fframe 16
  827. .spillpsp ar.unat, 16 // (note that offset is relative to psp+0x10!)
  828. st8 [sp]=r9,-16 // allocate space for ar.unat and save it
  829. .body
  830. br.call.sptk.many rp=ia64_do_signal
  831. .ret15: .restore sp
  832. adds sp=16,sp // pop scratch stack space
  833. ;;
  834. ld8 r9=[sp] // load new unat from sw->caller_unat
  835. mov rp=loc0
  836. ;;
  837. mov ar.unat=r9
  838. mov ar.pfs=loc1
  839. br.ret.sptk.many rp
  840. END(handle_signal_delivery)
  841. GLOBAL_ENTRY(sys_rt_sigsuspend)
  842. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
  843. alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart!
  844. mov r9=ar.unat
  845. mov loc0=rp // save return address
  846. mov out0=in0 // mask
  847. mov out1=in1 // sigsetsize
  848. adds out2=0,sp // out2=&sigscratch
  849. ;;
  850. .fframe 16
  851. .spillpsp ar.unat, 16 // (note that offset is relative to psp+0x10!)
  852. st8 [sp]=r9,-16 // allocate space for ar.unat and save it
  853. .body
  854. br.call.sptk.many rp=ia64_rt_sigsuspend
  855. .ret17: .restore sp
  856. adds sp=16,sp // pop scratch stack space
  857. ;;
  858. ld8 r9=[sp] // load new unat from sw->caller_unat
  859. mov rp=loc0
  860. ;;
  861. mov ar.unat=r9
  862. mov ar.pfs=loc1
  863. br.ret.sptk.many rp
  864. END(sys_rt_sigsuspend)
  865. ENTRY(sys_rt_sigreturn)
  866. PT_REGS_UNWIND_INFO(0)
  867. alloc r2=ar.pfs,0,0,1,0
  868. .prologue
  869. PT_REGS_SAVES(16)
  870. adds sp=-16,sp
  871. .body
  872. cmp.eq pNonSys,pSys=r0,r0 // sigreturn isn't a normal syscall...
  873. ;;
  874. adds out0=16,sp // out0 = &sigscratch
  875. br.call.sptk.many rp=ia64_rt_sigreturn
  876. .ret19: .restore sp 0
  877. adds sp=16,sp
  878. ;;
  879. ld8 r9=[sp] // load new ar.unat
  880. mov.sptk b7=r8,ia64_leave_kernel
  881. ;;
  882. mov ar.unat=r9
  883. br.many b7
  884. END(sys_rt_sigreturn)
  885. GLOBAL_ENTRY(ia64_prepare_handle_unaligned)
  886. //
  887. // r16 = fake ar.pfs, we simply need to make sure
  888. // privilege is still 0
  889. //
  890. mov r16=r0
  891. .prologue
  892. DO_SAVE_SWITCH_STACK
  893. br.call.sptk.many rp=ia64_handle_unaligned // stack frame setup in ivt
  894. .ret21: .body
  895. DO_LOAD_SWITCH_STACK
  896. br.cond.sptk.many rp   // goes to ia64_leave_kernel
  897. END(ia64_prepare_handle_unaligned)
  898. //
  899. // unw_init_running(void (*callback)(info, arg), void *arg)
  900. //
  901. # define EXTRA_FRAME_SIZE ((UNW_FRAME_INFO_SIZE+15)&~15)
  902. GLOBAL_ENTRY(unw_init_running)
  903. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
  904. alloc loc1=ar.pfs,2,3,3,0
  905. ;;
  906. ld8 loc2=[in0],8
  907. mov loc0=rp
  908. mov r16=loc1
  909. DO_SAVE_SWITCH_STACK
  910. .body
  911. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
  912. .fframe IA64_SWITCH_STACK_SIZE+EXTRA_FRAME_SIZE
  913. SWITCH_STACK_SAVES(EXTRA_FRAME_SIZE)
  914. adds sp=-EXTRA_FRAME_SIZE,sp
  915. .body
  916. ;;
  917. adds out0=16,sp // &info
  918. mov out1=r13 // current
  919. adds out2=16+EXTRA_FRAME_SIZE,sp // &switch_stack
  920. br.call.sptk.many rp=unw_init_frame_info
  921. 1: adds out0=16,sp // &info
  922. mov b6=loc2
  923. mov loc2=gp // save gp across indirect function call
  924. ;;
  925. ld8 gp=[in0]
  926. mov out1=in1 // arg
  927. br.call.sptk.many rp=b6 // invoke the callback function
  928. 1: mov gp=loc2 // restore gp
  929. // For now, we don't allow changing registers from within
  930. // unw_init_running; if we ever want to allow that, we'd
  931. // have to do a load_switch_stack here:
  932. .restore sp
  933. adds sp=IA64_SWITCH_STACK_SIZE+EXTRA_FRAME_SIZE,sp
  934. mov ar.pfs=loc1
  935. mov rp=loc0
  936. br.ret.sptk.many rp
  937. END(unw_init_running)
  938. .rodata
  939. .align 8
  940. .globl sys_call_table
  941. sys_call_table:
  942. data8 sys_ni_syscall //  This must be sys_ni_syscall!  See ivt.S.
  943. data8 sys_exit // 1025
  944. data8 sys_read
  945. data8 sys_write
  946. data8 sys_open
  947. data8 sys_close
  948. data8 sys_creat // 1030
  949. data8 sys_link
  950. data8 sys_unlink
  951. data8 ia64_execve
  952. data8 sys_chdir
  953. data8 sys_fchdir // 1035
  954. data8 sys_utimes
  955. data8 sys_mknod
  956. data8 sys_chmod
  957. data8 sys_chown
  958. data8 sys_lseek // 1040
  959. data8 sys_getpid
  960. data8 sys_getppid
  961. data8 sys_mount
  962. data8 sys_umount
  963. data8 sys_setuid // 1045
  964. data8 sys_getuid
  965. data8 sys_geteuid
  966. data8 sys_ptrace
  967. data8 sys_access
  968. data8 sys_sync // 1050
  969. data8 sys_fsync
  970. data8 sys_fdatasync
  971. data8 sys_kill
  972. data8 sys_rename
  973. data8 sys_mkdir // 1055
  974. data8 sys_rmdir
  975. data8 sys_dup
  976. data8 sys_pipe
  977. data8 sys_times
  978. data8 ia64_brk // 1060
  979. data8 sys_setgid
  980. data8 sys_getgid
  981. data8 sys_getegid
  982. data8 sys_acct
  983. data8 sys_ioctl // 1065
  984. data8 sys_fcntl
  985. data8 sys_umask
  986. data8 sys_chroot
  987. data8 sys_ustat
  988. data8 sys_dup2 // 1070
  989. data8 sys_setreuid
  990. data8 sys_setregid
  991. data8 sys_getresuid
  992. data8 sys_setresuid
  993. data8 sys_getresgid // 1075
  994. data8 sys_setresgid
  995. data8 sys_getgroups
  996. data8 sys_setgroups
  997. data8 sys_getpgid
  998. data8 sys_setpgid // 1080
  999. data8 sys_setsid
  1000. data8 sys_getsid
  1001. data8 sys_sethostname
  1002. data8 sys_setrlimit
  1003. data8 sys_getrlimit // 1085
  1004. data8 sys_getrusage
  1005. data8 sys_gettimeofday
  1006. data8 sys_settimeofday
  1007. data8 sys_select
  1008. data8 sys_poll // 1090
  1009. data8 sys_symlink
  1010. data8 sys_readlink
  1011. data8 sys_uselib
  1012. data8 sys_swapon
  1013. data8 sys_swapoff // 1095
  1014. data8 sys_reboot
  1015. data8 sys_truncate
  1016. data8 sys_ftruncate
  1017. data8 sys_fchmod
  1018. data8 sys_fchown // 1100
  1019. data8 ia64_getpriority
  1020. data8 sys_setpriority
  1021. data8 sys_statfs
  1022. data8 sys_fstatfs
  1023. data8 sys_gettid // 1105
  1024. data8 sys_semget
  1025. data8 sys_semop
  1026. data8 sys_semctl
  1027. data8 sys_msgget
  1028. data8 sys_msgsnd // 1110
  1029. data8 sys_msgrcv
  1030. data8 sys_msgctl
  1031. data8 sys_shmget
  1032. data8 ia64_shmat
  1033. data8 sys_shmdt // 1115
  1034. data8 sys_shmctl
  1035. data8 sys_syslog
  1036. data8 sys_setitimer
  1037. data8 sys_getitimer
  1038. data8 ia64_oldstat // 1120
  1039. data8 ia64_oldlstat
  1040. data8 ia64_oldfstat
  1041. data8 sys_vhangup
  1042. data8 sys_lchown
  1043. data8 sys_vm86 // 1125
  1044. data8 sys_wait4
  1045. data8 sys_sysinfo
  1046. data8 sys_clone
  1047. data8 sys_setdomainname
  1048. data8 sys_newuname // 1130
  1049. data8 sys_adjtimex
  1050. data8 ia64_create_module
  1051. data8 sys_init_module
  1052. data8 sys_delete_module
  1053. data8 sys_get_kernel_syms // 1135
  1054. data8 sys_query_module
  1055. data8 sys_quotactl
  1056. data8 sys_bdflush
  1057. data8 sys_sysfs
  1058. data8 sys_personality // 1140
  1059. data8 ia64_ni_syscall // sys_afs_syscall
  1060. data8 sys_setfsuid
  1061. data8 sys_setfsgid
  1062. data8 sys_getdents
  1063. data8 sys_flock // 1145
  1064. data8 sys_readv
  1065. data8 sys_writev
  1066. data8 sys_pread
  1067. data8 sys_pwrite
  1068. data8 sys_sysctl // 1150
  1069. data8 sys_mmap
  1070. data8 sys_munmap
  1071. data8 sys_mlock
  1072. data8 sys_mlockall
  1073. data8 sys_mprotect // 1155
  1074. data8 sys_mremap
  1075. data8 sys_msync
  1076. data8 sys_munlock
  1077. data8 sys_munlockall
  1078. data8 sys_sched_getparam // 1160
  1079. data8 sys_sched_setparam
  1080. data8 sys_sched_getscheduler
  1081. data8 sys_sched_setscheduler
  1082. data8 sys_sched_yield
  1083. data8 sys_sched_get_priority_max // 1165
  1084. data8 sys_sched_get_priority_min
  1085. data8 sys_sched_rr_get_interval
  1086. data8 sys_nanosleep
  1087. data8 sys_nfsservctl
  1088. data8 sys_prctl // 1170
  1089. data8 sys_getpagesize
  1090. data8 sys_mmap2
  1091. data8 sys_pciconfig_read
  1092. data8 sys_pciconfig_write
  1093. data8 sys_perfmonctl // 1175
  1094. data8 sys_sigaltstack
  1095. data8 sys_rt_sigaction
  1096. data8 sys_rt_sigpending
  1097. data8 sys_rt_sigprocmask
  1098. data8 sys_rt_sigqueueinfo // 1180
  1099. data8 sys_rt_sigreturn
  1100. data8 sys_rt_sigsuspend
  1101. data8 sys_rt_sigtimedwait
  1102. data8 sys_getcwd
  1103. data8 sys_capget // 1185
  1104. data8 sys_capset
  1105. data8 sys_sendfile
  1106. data8 sys_ni_syscall // sys_getpmsg (STREAMS)
  1107. data8 sys_ni_syscall // sys_putpmsg (STREAMS)
  1108. data8 sys_socket // 1190
  1109. data8 sys_bind
  1110. data8 sys_connect
  1111. data8 sys_listen
  1112. data8 sys_accept
  1113. data8 sys_getsockname // 1195
  1114. data8 sys_getpeername
  1115. data8 sys_socketpair
  1116. data8 sys_send
  1117. data8 sys_sendto
  1118. data8 sys_recv // 1200
  1119. data8 sys_recvfrom
  1120. data8 sys_shutdown
  1121. data8 sys_setsockopt
  1122. data8 sys_getsockopt
  1123. data8 sys_sendmsg // 1205
  1124. data8 sys_recvmsg
  1125. data8 sys_pivot_root
  1126. data8 sys_mincore
  1127. data8 sys_madvise
  1128. data8 sys_newstat // 1210
  1129. data8 sys_newlstat
  1130. data8 sys_newfstat
  1131. data8 sys_clone2
  1132. data8 sys_getdents64
  1133. data8 sys_getunwind // 1215
  1134. data8 sys_readahead
  1135. data8 ia64_ni_syscall
  1136. data8 ia64_ni_syscall
  1137. data8 ia64_ni_syscall
  1138. data8 ia64_ni_syscall // 1220
  1139. data8 ia64_ni_syscall
  1140. data8 ia64_ni_syscall
  1141. data8 ia64_ni_syscall
  1142. data8 ia64_ni_syscall
  1143. data8 ia64_ni_syscall // 1225
  1144. data8 ia64_ni_syscall
  1145. data8 ia64_ni_syscall
  1146. data8 ia64_ni_syscall
  1147. data8 sys_tkill
  1148. data8 ia64_ni_syscall // 1230
  1149. data8 ia64_ni_syscall
  1150. data8 ia64_ni_syscall
  1151. data8 ia64_ni_syscall
  1152. data8 ia64_ni_syscall
  1153. data8 ia64_ni_syscall // 1235
  1154. data8 ia64_ni_syscall
  1155. data8 ia64_ni_syscall
  1156. data8 ia64_ni_syscall
  1157. data8 ia64_ni_syscall
  1158. data8 ia64_ni_syscall // 1240
  1159. data8 ia64_ni_syscall
  1160. data8 ia64_ni_syscall
  1161. data8 ia64_ni_syscall
  1162. data8 ia64_ni_syscall
  1163. data8 ia64_ni_syscall // 1245
  1164. data8 ia64_ni_syscall
  1165. data8 ia64_ni_syscall
  1166. data8 ia64_ni_syscall
  1167. data8 ia64_ni_syscall
  1168. data8 ia64_ni_syscall // 1250
  1169. data8 ia64_ni_syscall
  1170. data8 ia64_ni_syscall
  1171. data8 ia64_ni_syscall
  1172. data8 ia64_ni_syscall
  1173. data8 ia64_ni_syscall // 1255
  1174. data8 ia64_ni_syscall
  1175. data8 ia64_ni_syscall
  1176. data8 ia64_ni_syscall
  1177. data8 ia64_ni_syscall
  1178. data8 ia64_ni_syscall // 1260
  1179. data8 ia64_ni_syscall
  1180. data8 ia64_ni_syscall
  1181. data8 ia64_ni_syscall
  1182. data8 ia64_ni_syscall
  1183. data8 ia64_ni_syscall // 1265
  1184. data8 ia64_ni_syscall
  1185. data8 ia64_ni_syscall
  1186. data8 ia64_ni_syscall
  1187. data8 ia64_ni_syscall
  1188. data8 ia64_ni_syscall // 1270
  1189. data8 ia64_ni_syscall
  1190. data8 ia64_ni_syscall
  1191. data8 ia64_ni_syscall
  1192. data8 ia64_ni_syscall
  1193. data8 ia64_ni_syscall // 1275
  1194. data8 ia64_ni_syscall
  1195. data8 ia64_ni_syscall
  1196. data8 ia64_ni_syscall