entry.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:30k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * ia64/kernel/entry.S
  3.  *
  4.  * Kernel entry points.
  5.  *
  6.  * Copyright (C) 1998-2001 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=0
  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. adds r17=IA64_TASK_NEED_RESCHED_OFFSET,r13
  503. adds r18=IA64_TASK_SIGPENDING_OFFSET,r13
  504. #ifdef CONFIG_PERFMON
  505. adds r19=IA64_TASK_PFM_MUST_BLOCK_OFFSET,r13
  506. #endif
  507. ;;
  508. #ifdef CONFIG_PERFMON
  509. (pUser) ld8 r19=[r19] // load current->thread.pfm_must_block
  510. #endif
  511. (pUser) ld8 r17=[r17] // load current->need_resched
  512. (pUser) ld4 r18=[r18] // load current->sigpending
  513. ;;
  514. #ifdef CONFIG_PERFMON
  515. (pUser) cmp.ne.unc p9,p0=r19,r0 // current->thread.pfm_must_block != 0?
  516. #endif
  517. (pUser) cmp.ne.unc p7,p0=r17,r0 // current->need_resched != 0?
  518. (pUser) cmp.ne.unc p8,p0=r18,r0 // current->sigpending != 0?
  519. ;;
  520. adds r2=PT(R8)+16,r12
  521. adds r3=PT(R9)+16,r12
  522. #ifdef CONFIG_PERFMON
  523. (p9) br.call.spnt.many b7=pfm_block_on_overflow
  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 b7=handle_signal_delivery // check & deliver pending signals
  531. ;;
  532. // start restoring the state saved on the kernel stack (struct pt_regs):
  533. ld8.fill r8=[r2],16
  534. ld8.fill r9=[r3],16
  535. ;;
  536. ld8.fill r10=[r2],16
  537. ld8.fill r11=[r3],16
  538. ;;
  539. ld8.fill r16=[r2],16
  540. ld8.fill r17=[r3],16
  541. ;;
  542. ld8.fill r18=[r2],16
  543. ld8.fill r19=[r3],16
  544. ;;
  545. ld8.fill r20=[r2],16
  546. ld8.fill r21=[r3],16
  547. ;;
  548. ld8.fill r22=[r2],16
  549. ld8.fill r23=[r3],16
  550. ;;
  551. ld8.fill r24=[r2],16
  552. ld8.fill r25=[r3],16
  553. ;;
  554. ld8.fill r26=[r2],16
  555. ld8.fill r27=[r3],16
  556. ;;
  557. ld8.fill r28=[r2],16
  558. ld8.fill r29=[r3],16
  559. ;;
  560. ld8.fill r30=[r2],16
  561. ld8.fill r31=[r3],16
  562. ;;
  563. rsm psr.i | psr.ic // initiate turning off of interrupts & interruption collection
  564. invala // invalidate ALAT
  565. ;;
  566. ld8 r1=[r2],16 // ar.ccv
  567. ld8 r13=[r3],16 // ar.fpsr
  568. ;;
  569. ld8 r14=[r2],16 // b0
  570. ld8 r15=[r3],16+8 // b7
  571. ;;
  572. ldf.fill f6=[r2],32
  573. ldf.fill f7=[r3],32
  574. ;;
  575. ldf.fill f8=[r2],32
  576. ldf.fill f9=[r3],32
  577. ;;
  578. mov ar.ccv=r1
  579. mov ar.fpsr=r13
  580. mov b0=r14
  581. ;;
  582. srlz.i // ensure interrupts & interruption collection are off
  583. mov b7=r15
  584. ;;
  585. bsw.0 // switch back to bank 0
  586. ;;
  587. adds r16=16,r12
  588. adds r17=24,r12
  589. ;;
  590. ld8 rCRIPSR=[r16],16 // load cr.ipsr
  591. ld8 rCRIIP=[r17],16 // load cr.iip
  592. ;;
  593. ld8 rCRIFS=[r16],16 // load cr.ifs
  594. ld8 rARUNAT=[r17],16 // load ar.unat
  595. cmp.eq p9,p0=r0,r0 // set p9 to indicate that we should restore cr.ifs
  596. ;;
  597. ld8 rARPFS=[r16],16 // load ar.pfs
  598. ld8 rARRSC=[r17],16 // load ar.rsc
  599. ;;
  600. ld8 rARRNAT=[r16],16 // load ar.rnat (may be garbage)
  601. ld8 rARBSPSTORE=[r17],16 // load ar.bspstore (may be garbage)
  602. ;;
  603. ld8 rARPR=[r16],16 // load predicates
  604. ld8 rB6=[r17],16 // load b6
  605. ;;
  606. ld8 r19=[r16],16 // load ar.rsc value for "loadrs"
  607. ld8.fill r1=[r17],16 // load r1
  608. ;;
  609. ld8.fill r2=[r16],16
  610. ld8.fill r3=[r17],16
  611. ;;
  612. ld8.fill r12=[r16],16
  613. ld8.fill r13=[r17],16
  614. ;;
  615. ld8.fill r14=[r16]
  616. ld8.fill r15=[r17]
  617. shr.u r18=r19,16 // get byte size of existing "dirty" partition
  618. ;;
  619. mov r16=ar.bsp // get existing backing store pointer
  620. movl r17=PERCPU_ADDR+IA64_CPU_PHYS_STACKED_SIZE_P8_OFFSET
  621. ;;
  622. ld4 r17=[r17] // r17 = cpu_data->phys_stacked_size_p8
  623. (pKern) br.cond.dpnt skip_rbs_switch
  624. /*
  625.  * Restore user backing store.
  626.  *
  627.  * NOTE: alloc, loadrs, and cover can't be predicated.
  628.  */
  629. (pNonSys) br.cond.dpnt dont_preserve_current_frame
  630. cover // add current frame into dirty partition
  631. ;;
  632. mov r19=ar.bsp // get new backing store pointer
  633. sub r16=r16,r18 // krbs = old bsp - size of dirty partition
  634. cmp.ne p9,p0=r0,r0 // clear p9 to skip restore of cr.ifs
  635. ;;
  636. sub r19=r19,r16 // calculate total byte size of dirty partition
  637. add r18=64,r18 // don't force in0-in7 into memory...
  638. ;;
  639. shl r19=r19,16 // shift size of dirty partition into loadrs position
  640. ;;
  641. dont_preserve_current_frame:
  642. /*
  643.  * To prevent leaking bits between the kernel and user-space,
  644.  * we must clear the stacked registers in the "invalid" partition here.
  645.  * Not pretty, but at least it's fast (3.34 registers/cycle).
  646.  * Architecturally, this loop could go at 4.67 registers/cycle, but that would
  647.  * oversubscribe Itanium.
  648.  */
  649. # define pRecurse p6
  650. # define pReturn p7
  651. # define Nregs 10
  652. alloc loc0=ar.pfs,2,Nregs-2,2,0
  653. shr.u loc1=r18,9 // RNaTslots <= dirtySize / (64*8) + 1
  654. sub r17=r17,r18 // r17 = (physStackedSize + 8) - dirtySize
  655. ;;
  656. mov ar.rsc=r19 // load ar.rsc to be used for "loadrs"
  657. shladd in0=loc1,3,r17
  658. mov in1=0
  659. ;;
  660. // .align 32 // gas-2.11.90 is unable to generate a stop bit after .align
  661. rse_clear_invalid:
  662. // cycle 0
  663.  { .mii
  664. alloc loc0=ar.pfs,2,Nregs-2,2,0
  665. cmp.lt pRecurse,p0=Nregs*8,in0 // if more than Nregs regs left to clear, (re)curse
  666. add out0=-Nregs*8,in0
  667. }{ .mfb
  668. add out1=1,in1 // increment recursion count
  669. nop.f 0
  670. nop.b 0 // can't do br.call here because of alloc (WAW on CFM)
  671. ;;
  672. }{ .mfi // cycle 1
  673. mov loc1=0
  674. nop.f 0
  675. mov loc2=0
  676. }{ .mib
  677. mov loc3=0
  678. mov loc4=0
  679. (pRecurse) br.call.sptk.many b6=rse_clear_invalid
  680. }{ .mfi // cycle 2
  681. mov loc5=0
  682. nop.f 0
  683. cmp.ne pReturn,p0=r0,in1 // if recursion count != 0, we need to do a br.ret
  684. }{ .mib
  685. mov loc6=0
  686. mov loc7=0
  687. (pReturn) br.ret.sptk.many b6
  688. }
  689. # undef pRecurse
  690. # undef pReturn
  691. alloc r17=ar.pfs,0,0,0,0 // drop current register frame
  692. ;;
  693. loadrs
  694. ;;
  695. skip_rbs_switch:
  696. mov b6=rB6
  697. mov ar.pfs=rARPFS
  698. (pUser) mov ar.bspstore=rARBSPSTORE
  699. (p9) mov cr.ifs=rCRIFS
  700. mov cr.ipsr=rCRIPSR
  701. mov cr.iip=rCRIIP
  702. ;;
  703. (pUser) mov ar.rnat=rARRNAT // must happen with RSE in lazy mode
  704. mov ar.rsc=rARRSC
  705. mov ar.unat=rARUNAT
  706. mov pr=rARPR,-1
  707. rfi
  708. END(ia64_leave_kernel)
  709. ENTRY(handle_syscall_error)
  710. /*
  711.  * Some system calls (e.g., ptrace, mmap) can return arbitrary
  712.  * values which could lead us to mistake a negative return
  713.  * value as a failed syscall.  Those syscall must deposit
  714.  * a non-zero value in pt_regs.r8 to indicate an error.
  715.  * If pt_regs.r8 is zero, we assume that the call completed
  716.  * successfully.
  717.  */
  718. PT_REGS_UNWIND_INFO(0)
  719. ld8 r3=[r2] // load pt_regs.r8
  720. sub r9=0,r8 // negate return value to get errno
  721. ;;
  722. mov r10=-1 // return -1 in pt_regs.r10 to indicate error
  723. cmp.eq p6,p7=r3,r0 // is pt_regs.r8==0?
  724. adds r3=16,r2 // r3=&pt_regs.r10
  725. ;;
  726. (p6) mov r9=r8
  727. (p6) mov r10=0
  728. ;;
  729. .mem.offset 0,0; st8.spill [r2]=r9 // store errno in pt_regs.r8 and set unat bit
  730. .mem.offset 8,0; st8.spill [r3]=r10 // store error indication in pt_regs.r10 and set unat bit
  731. br.cond.sptk ia64_leave_kernel
  732. END(handle_syscall_error)
  733. /*
  734.  * Invoke schedule_tail(task) while preserving in0-in7, which may be needed
  735.  * in case a system call gets restarted.
  736.  */
  737. GLOBAL_ENTRY(ia64_invoke_schedule_tail)
  738. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
  739. alloc loc1=ar.pfs,8,2,1,0
  740. mov loc0=rp
  741. mov out0=r8 // Address of previous task
  742. ;;
  743. br.call.sptk.many rp=schedule_tail
  744. .ret11: mov ar.pfs=loc1
  745. mov rp=loc0
  746. br.ret.sptk.many rp
  747. END(ia64_invoke_schedule_tail)
  748. #if __GNUC__ < 3
  749. /*
  750.  * Invoke schedule() while preserving in0-in7, which may be needed
  751.  * in case a system call gets restarted.  Note that declaring schedule()
  752.  * with asmlinkage() is NOT enough because that will only preserve as many
  753.  * registers as there are formal arguments.
  754.  *
  755.  * XXX fix me: with gcc 3.0, we won't need this anymore because syscall_linkage
  756.  * renders all eight input registers (in0-in7) as "untouchable".
  757.  */
  758. ENTRY(invoke_schedule)
  759. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
  760. alloc loc1=ar.pfs,8,2,0,0
  761. mov loc0=rp
  762. ;;
  763. .body
  764. br.call.sptk.many rp=schedule
  765. .ret14: mov ar.pfs=loc1
  766. mov rp=loc0
  767. br.ret.sptk.many rp
  768. END(invoke_schedule)
  769. #endif /* __GNUC__ < 3 */
  770. /*
  771.  * Setup stack and call ia64_do_signal.  Note that pSys and pNonSys need to
  772.  * be set up by the caller.  We declare 8 input registers so the system call
  773.  * args get preserved, in case we need to restart a system call.
  774.  */
  775. ENTRY(handle_signal_delivery)
  776. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
  777. alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart!
  778. mov r9=ar.unat
  779. mov loc0=rp // save return address
  780. mov out0=0 // there is no "oldset"
  781. adds out1=0,sp // out1=&sigscratch
  782. (pSys) mov out2=1 // out2==1 => we're in a syscall
  783. ;;
  784. (pNonSys) mov out2=0 // out2==0 => not a syscall
  785. .fframe 16
  786. .spillpsp ar.unat, 16 // (note that offset is relative to psp+0x10!)
  787. st8 [sp]=r9,-16 // allocate space for ar.unat and save it
  788. .body
  789. br.call.sptk.many rp=ia64_do_signal
  790. .ret15: .restore sp
  791. adds sp=16,sp // pop scratch stack space
  792. ;;
  793. ld8 r9=[sp] // load new unat from sw->caller_unat
  794. mov rp=loc0
  795. ;;
  796. mov ar.unat=r9
  797. mov ar.pfs=loc1
  798. br.ret.sptk.many rp
  799. END(handle_signal_delivery)
  800. GLOBAL_ENTRY(sys_rt_sigsuspend)
  801. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
  802. alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart!
  803. mov r9=ar.unat
  804. mov loc0=rp // save return address
  805. mov out0=in0 // mask
  806. mov out1=in1 // sigsetsize
  807. adds out2=0,sp // out2=&sigscratch
  808. ;;
  809. .fframe 16
  810. .spillpsp ar.unat, 16 // (note that offset is relative to psp+0x10!)
  811. st8 [sp]=r9,-16 // allocate space for ar.unat and save it
  812. .body
  813. br.call.sptk.many rp=ia64_rt_sigsuspend
  814. .ret17: .restore sp
  815. adds sp=16,sp // pop scratch stack space
  816. ;;
  817. ld8 r9=[sp] // load new unat from sw->caller_unat
  818. mov rp=loc0
  819. ;;
  820. mov ar.unat=r9
  821. mov ar.pfs=loc1
  822. br.ret.sptk.many rp
  823. END(sys_rt_sigsuspend)
  824. ENTRY(sys_rt_sigreturn)
  825. PT_REGS_UNWIND_INFO(0)
  826. alloc r2=ar.pfs,0,0,1,0
  827. .prologue
  828. PT_REGS_SAVES(16)
  829. adds sp=-16,sp
  830. .body
  831. cmp.eq pNonSys,pSys=r0,r0 // sigreturn isn't a normal syscall...
  832. ;;
  833. adds out0=16,sp // out0 = &sigscratch
  834. br.call.sptk.many rp=ia64_rt_sigreturn
  835. .ret19: .restore sp 0
  836. adds sp=16,sp
  837. ;;
  838. ld8 r9=[sp] // load new ar.unat
  839. mov.sptk b7=r8,ia64_leave_kernel
  840. ;;
  841. mov ar.unat=r9
  842. br.many b7
  843. END(sys_rt_sigreturn)
  844. GLOBAL_ENTRY(ia64_prepare_handle_unaligned)
  845. //
  846. // r16 = fake ar.pfs, we simply need to make sure
  847. // privilege is still 0
  848. //
  849. mov r16=r0
  850. .prologue
  851. DO_SAVE_SWITCH_STACK
  852. br.call.sptk.many rp=ia64_handle_unaligned // stack frame setup in ivt
  853. .ret21: .body
  854. DO_LOAD_SWITCH_STACK
  855. br.cond.sptk.many rp   // goes to ia64_leave_kernel
  856. END(ia64_prepare_handle_unaligned)
  857. //
  858. // unw_init_running(void (*callback)(info, arg), void *arg)
  859. //
  860. # define EXTRA_FRAME_SIZE ((UNW_FRAME_INFO_SIZE+15)&~15)
  861. GLOBAL_ENTRY(unw_init_running)
  862. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
  863. alloc loc1=ar.pfs,2,3,3,0
  864. ;;
  865. ld8 loc2=[in0],8
  866. mov loc0=rp
  867. mov r16=loc1
  868. DO_SAVE_SWITCH_STACK
  869. .body
  870. .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
  871. .fframe IA64_SWITCH_STACK_SIZE+EXTRA_FRAME_SIZE
  872. SWITCH_STACK_SAVES(EXTRA_FRAME_SIZE)
  873. adds sp=-EXTRA_FRAME_SIZE,sp
  874. .body
  875. ;;
  876. adds out0=16,sp // &info
  877. mov out1=r13 // current
  878. adds out2=16+EXTRA_FRAME_SIZE,sp // &switch_stack
  879. br.call.sptk.many rp=unw_init_frame_info
  880. 1: adds out0=16,sp // &info
  881. mov b6=loc2
  882. mov loc2=gp // save gp across indirect function call
  883. ;;
  884. ld8 gp=[in0]
  885. mov out1=in1 // arg
  886. br.call.sptk.many rp=b6 // invoke the callback function
  887. 1: mov gp=loc2 // restore gp
  888. // For now, we don't allow changing registers from within
  889. // unw_init_running; if we ever want to allow that, we'd
  890. // have to do a load_switch_stack here:
  891. .restore sp
  892. adds sp=IA64_SWITCH_STACK_SIZE+EXTRA_FRAME_SIZE,sp
  893. mov ar.pfs=loc1
  894. mov rp=loc0
  895. br.ret.sptk.many rp
  896. END(unw_init_running)
  897. .rodata
  898. .align 8
  899. .globl sys_call_table
  900. sys_call_table:
  901. data8 sys_ni_syscall //  This must be sys_ni_syscall!  See ivt.S.
  902. data8 sys_exit // 1025
  903. data8 sys_read
  904. data8 sys_write
  905. data8 sys_open
  906. data8 sys_close
  907. data8 sys_creat // 1030
  908. data8 sys_link
  909. data8 sys_unlink
  910. data8 ia64_execve
  911. data8 sys_chdir
  912. data8 sys_fchdir // 1035
  913. data8 sys_utimes
  914. data8 sys_mknod
  915. data8 sys_chmod
  916. data8 sys_chown
  917. data8 sys_lseek // 1040
  918. data8 sys_getpid
  919. data8 sys_getppid
  920. data8 sys_mount
  921. data8 sys_umount
  922. data8 sys_setuid // 1045
  923. data8 sys_getuid
  924. data8 sys_geteuid
  925. data8 sys_ptrace
  926. data8 sys_access
  927. data8 sys_sync // 1050
  928. data8 sys_fsync
  929. data8 sys_fdatasync
  930. data8 sys_kill
  931. data8 sys_rename
  932. data8 sys_mkdir // 1055
  933. data8 sys_rmdir
  934. data8 sys_dup
  935. data8 sys_pipe
  936. data8 sys_times
  937. data8 ia64_brk // 1060
  938. data8 sys_setgid
  939. data8 sys_getgid
  940. data8 sys_getegid
  941. data8 sys_acct
  942. data8 sys_ioctl // 1065
  943. data8 sys_fcntl
  944. data8 sys_umask
  945. data8 sys_chroot
  946. data8 sys_ustat
  947. data8 sys_dup2 // 1070
  948. data8 sys_setreuid
  949. data8 sys_setregid
  950. data8 sys_getresuid
  951. data8 sys_setresuid
  952. data8 sys_getresgid // 1075
  953. data8 sys_setresgid
  954. data8 sys_getgroups
  955. data8 sys_setgroups
  956. data8 sys_getpgid
  957. data8 sys_setpgid // 1080
  958. data8 sys_setsid
  959. data8 sys_getsid
  960. data8 sys_sethostname
  961. data8 sys_setrlimit
  962. data8 sys_getrlimit // 1085
  963. data8 sys_getrusage
  964. data8 sys_gettimeofday
  965. data8 sys_settimeofday
  966. data8 sys_select
  967. data8 sys_poll // 1090
  968. data8 sys_symlink
  969. data8 sys_readlink
  970. data8 sys_uselib
  971. data8 sys_swapon
  972. data8 sys_swapoff // 1095
  973. data8 sys_reboot
  974. data8 sys_truncate
  975. data8 sys_ftruncate
  976. data8 sys_fchmod
  977. data8 sys_fchown // 1100
  978. data8 ia64_getpriority
  979. data8 sys_setpriority
  980. data8 sys_statfs
  981. data8 sys_fstatfs
  982. data8 sys_gettid // 1105
  983. data8 sys_semget
  984. data8 sys_semop
  985. data8 sys_semctl
  986. data8 sys_msgget
  987. data8 sys_msgsnd // 1110
  988. data8 sys_msgrcv
  989. data8 sys_msgctl
  990. data8 sys_shmget
  991. data8 ia64_shmat
  992. data8 sys_shmdt // 1115
  993. data8 sys_shmctl
  994. data8 sys_syslog
  995. data8 sys_setitimer
  996. data8 sys_getitimer
  997. data8 ia64_oldstat // 1120
  998. data8 ia64_oldlstat
  999. data8 ia64_oldfstat
  1000. data8 sys_vhangup
  1001. data8 sys_lchown
  1002. data8 sys_vm86 // 1125
  1003. data8 sys_wait4
  1004. data8 sys_sysinfo
  1005. data8 sys_clone
  1006. data8 sys_setdomainname
  1007. data8 sys_newuname // 1130
  1008. data8 sys_adjtimex
  1009. data8 ia64_create_module
  1010. data8 sys_init_module
  1011. data8 sys_delete_module
  1012. data8 sys_get_kernel_syms // 1135
  1013. data8 sys_query_module
  1014. data8 sys_quotactl
  1015. data8 sys_bdflush
  1016. data8 sys_sysfs
  1017. data8 sys_personality // 1140
  1018. data8 ia64_ni_syscall // sys_afs_syscall
  1019. data8 sys_setfsuid
  1020. data8 sys_setfsgid
  1021. data8 sys_getdents
  1022. data8 sys_flock // 1145
  1023. data8 sys_readv
  1024. data8 sys_writev
  1025. data8 sys_pread
  1026. data8 sys_pwrite
  1027. data8 sys_sysctl // 1150
  1028. data8 sys_mmap
  1029. data8 sys_munmap
  1030. data8 sys_mlock
  1031. data8 sys_mlockall
  1032. data8 sys_mprotect // 1155
  1033. data8 sys_mremap
  1034. data8 sys_msync
  1035. data8 sys_munlock
  1036. data8 sys_munlockall
  1037. data8 sys_sched_getparam // 1160
  1038. data8 sys_sched_setparam
  1039. data8 sys_sched_getscheduler
  1040. data8 sys_sched_setscheduler
  1041. data8 sys_sched_yield
  1042. data8 sys_sched_get_priority_max // 1165
  1043. data8 sys_sched_get_priority_min
  1044. data8 sys_sched_rr_get_interval
  1045. data8 sys_nanosleep
  1046. data8 sys_nfsservctl
  1047. data8 sys_prctl // 1170
  1048. data8 sys_getpagesize
  1049. data8 sys_mmap2
  1050. data8 sys_pciconfig_read
  1051. data8 sys_pciconfig_write
  1052. data8 sys_perfmonctl // 1175
  1053. data8 sys_sigaltstack
  1054. data8 sys_rt_sigaction
  1055. data8 sys_rt_sigpending
  1056. data8 sys_rt_sigprocmask
  1057. data8 sys_rt_sigqueueinfo // 1180
  1058. data8 sys_rt_sigreturn
  1059. data8 sys_rt_sigsuspend
  1060. data8 sys_rt_sigtimedwait
  1061. data8 sys_getcwd
  1062. data8 sys_capget // 1185
  1063. data8 sys_capset
  1064. data8 sys_sendfile
  1065. data8 sys_ni_syscall // sys_getpmsg (STREAMS)
  1066. data8 sys_ni_syscall // sys_putpmsg (STREAMS)
  1067. data8 sys_socket // 1190
  1068. data8 sys_bind
  1069. data8 sys_connect
  1070. data8 sys_listen
  1071. data8 sys_accept
  1072. data8 sys_getsockname // 1195
  1073. data8 sys_getpeername
  1074. data8 sys_socketpair
  1075. data8 sys_send
  1076. data8 sys_sendto
  1077. data8 sys_recv // 1200
  1078. data8 sys_recvfrom
  1079. data8 sys_shutdown
  1080. data8 sys_setsockopt
  1081. data8 sys_getsockopt
  1082. data8 sys_sendmsg // 1205
  1083. data8 sys_recvmsg
  1084. data8 sys_pivot_root
  1085. data8 sys_mincore
  1086. data8 sys_madvise
  1087. data8 sys_newstat // 1210
  1088. data8 sys_newlstat
  1089. data8 sys_newfstat
  1090. data8 sys_clone2
  1091. data8 sys_getdents64
  1092. data8 sys_getunwind // 1215
  1093. data8 sys_readahead
  1094. data8 ia64_ni_syscall
  1095. data8 ia64_ni_syscall
  1096. data8 ia64_ni_syscall
  1097. data8 ia64_ni_syscall // 1220
  1098. data8 ia64_ni_syscall
  1099. data8 ia64_ni_syscall
  1100. data8 ia64_ni_syscall
  1101. data8 ia64_ni_syscall
  1102. data8 ia64_ni_syscall // 1225
  1103. data8 ia64_ni_syscall
  1104. data8 ia64_ni_syscall
  1105. data8 ia64_ni_syscall
  1106. data8 ia64_ni_syscall
  1107. data8 ia64_ni_syscall // 1230
  1108. data8 ia64_ni_syscall
  1109. data8 ia64_ni_syscall
  1110. data8 ia64_ni_syscall
  1111. data8 ia64_ni_syscall
  1112. data8 ia64_ni_syscall // 1235
  1113. data8 ia64_ni_syscall
  1114. data8 ia64_ni_syscall
  1115. data8 ia64_ni_syscall
  1116. data8 ia64_ni_syscall
  1117. data8 ia64_ni_syscall // 1240
  1118. data8 ia64_ni_syscall
  1119. data8 ia64_ni_syscall
  1120. data8 ia64_ni_syscall
  1121. data8 ia64_ni_syscall
  1122. data8 ia64_ni_syscall // 1245
  1123. data8 ia64_ni_syscall
  1124. data8 ia64_ni_syscall
  1125. data8 ia64_ni_syscall
  1126. data8 ia64_ni_syscall
  1127. data8 ia64_ni_syscall // 1250
  1128. data8 ia64_ni_syscall
  1129. data8 ia64_ni_syscall
  1130. data8 ia64_ni_syscall
  1131. data8 ia64_ni_syscall
  1132. data8 ia64_ni_syscall // 1255
  1133. data8 ia64_ni_syscall
  1134. data8 ia64_ni_syscall
  1135. data8 ia64_ni_syscall
  1136. data8 ia64_ni_syscall
  1137. data8 ia64_ni_syscall // 1260
  1138. data8 ia64_ni_syscall
  1139. data8 ia64_ni_syscall
  1140. data8 ia64_ni_syscall
  1141. data8 ia64_ni_syscall
  1142. data8 ia64_ni_syscall // 1265
  1143. data8 ia64_ni_syscall
  1144. data8 ia64_ni_syscall
  1145. data8 ia64_ni_syscall
  1146. data8 ia64_ni_syscall
  1147. data8 ia64_ni_syscall // 1270
  1148. data8 ia64_ni_syscall
  1149. data8 ia64_ni_syscall
  1150. data8 ia64_ni_syscall
  1151. data8 ia64_ni_syscall
  1152. data8 ia64_ni_syscall // 1275
  1153. data8 ia64_ni_syscall
  1154. data8 ia64_ni_syscall
  1155. data8 ia64_ni_syscall