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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * alpha/entry.S
  3.  *
  4.  * kernel entry-points
  5.  */
  6. #include <linux/config.h>
  7. #include <asm/system.h>
  8. #include <asm/cache.h>
  9. #define SIGCHLD 20
  10. #define NR_SYSCALLS 378
  11. /*
  12.  * These offsets must match with alpha_mv in <asm/machvec.h>.
  13.  */
  14. #define HAE_CACHE 0
  15. #define HAE_REG 8
  16. /*
  17.  * stack offsets
  18.  */
  19. #define SP_OFF 184
  20. #define SWITCH_STACK_SIZE 320
  21. /*
  22.  * task structure offsets
  23.  */
  24. #define TASK_STATE 0
  25. #define TASK_FLAGS 8
  26. #define TASK_SIGPENDING 16
  27. #define TASK_ADDR_LIMIT 24
  28. #define TASK_EXEC_DOMAIN 32
  29. #define TASK_NEED_RESCHED 40
  30. #define TASK_PTRACE 48
  31. #define TASK_PROCESSOR 100
  32. /*
  33.  * task flags (must match include/linux/sched.h):
  34.  */
  35. #define PT_PTRACED 0x00000001
  36. #define CLONE_VM        0x00000100 
  37. /*
  38.  * This defines the normal kernel pt-regs layout.
  39.  *
  40.  * regs 9-15 preserved by C code
  41.  * regs 16-18 saved by PAL-code
  42.  * regs 29-30 saved and set up by PAL-code
  43.  * JRP - Save regs 16-18 in a special area of the stack, so that
  44.  * the palcode-provided values are available to the signal handler.
  45.  */
  46. #define SAVE_ALL
  47. subq $30,184,$30;
  48. stq $0,0($30);
  49. stq $1,8($30);
  50. stq $2,16($30);
  51. stq $3,24($30);
  52. stq $4,32($30);
  53. stq $28,144($30);
  54. lda $2,alpha_mv;
  55. stq $5,40($30);
  56. stq $6,48($30);
  57. stq $7,56($30);
  58. stq $8,64($30);
  59. stq $19,72($30);
  60. stq $20,80($30);
  61. stq $21,88($30);
  62. ldq $2,HAE_CACHE($2);
  63. stq $22,96($30);
  64. stq $23,104($30);
  65. stq $24,112($30);
  66. stq $25,120($30);
  67. stq $26,128($30);
  68. stq $27,136($30);
  69. stq $2,152($30);
  70. stq $16,160($30);
  71. stq $17,168($30);
  72. stq $18,176($30)
  73. #define RESTORE_ALL
  74. lda $19,alpha_mv;
  75. ldq $0,0($30);
  76. ldq $1,8($30);
  77. ldq $2,16($30);
  78. ldq $3,24($30);
  79. ldq $21,152($30);
  80. ldq $20,HAE_CACHE($19);
  81. ldq $4,32($30);
  82. ldq $5,40($30);
  83. ldq $6,48($30);
  84. ldq $7,56($30);
  85. subq $20,$21,$20;
  86. ldq $8,64($30);
  87. beq $20,99f;
  88. ldq $20,HAE_REG($19);
  89. addq $31,7,$16;
  90. call_pal PAL_swpipl;
  91. stq $21,HAE_CACHE($19);
  92. stq $21,0($20);
  93. mov $0,$16;
  94. call_pal PAL_swpipl;
  95. ldq $0,0($30);
  96. ldq $1,8($30);
  97. 99:;
  98. ldq $19,72($30);
  99. ldq $20,80($30);
  100. ldq $21,88($30);
  101. ldq $22,96($30);
  102. ldq $23,104($30);
  103. ldq $24,112($30);
  104. ldq $25,120($30);
  105. ldq $26,128($30);
  106. ldq $27,136($30);
  107. ldq $28,144($30);
  108. addq $30,184,$30
  109. .text
  110. .set noat
  111. #if defined(__linux__) && !defined(__ELF__)
  112.   .set singlegp
  113. #endif
  114. .align 3
  115. .globl entInt
  116. .ent entInt
  117. entInt:
  118. SAVE_ALL
  119. lda $8,0x3fff
  120. lda $26,ret_from_sys_call
  121. bic $30,$8,$8
  122. jsr $31,do_entInt
  123. .end entInt
  124. .align 3
  125. .globl entMM
  126. .ent entMM
  127. entMM:
  128. SAVE_ALL
  129. /* save $9 - $15 so the inline exception code can manipulate them.  */
  130. subq $30,56,$30
  131. stq $9,0($30)
  132. stq $10,8($30)
  133. stq $11,16($30)
  134. stq $12,24($30)
  135. stq $13,32($30)
  136. stq $14,40($30)
  137. stq $15,48($30)
  138. addq $30,56,$19
  139. /* handle the fault */
  140. lda $8,0x3fff
  141. bic $30,$8,$8
  142. jsr $26,do_page_fault
  143. /* reload the registers after the exception code played.  */
  144. ldq $9,0($30)
  145. ldq $10,8($30)
  146. ldq $11,16($30)
  147. ldq $12,24($30)
  148. ldq $13,32($30)
  149. ldq $14,40($30)
  150. ldq $15,48($30)
  151. addq $30,56,$30
  152. /* finish up the syscall as normal.  */
  153. br ret_from_sys_call
  154. .end entMM
  155. .align 3
  156. .globl entArith
  157. .ent entArith
  158. entArith:
  159. SAVE_ALL
  160. lda $8,0x3fff
  161. lda $26,ret_from_sys_call
  162. bic $30,$8,$8
  163. jsr $31,do_entArith
  164. .end entArith
  165. .align 3
  166. .globl entIF
  167. .ent entIF
  168. entIF:
  169. SAVE_ALL
  170. lda $8,0x3fff
  171. lda $26,ret_from_sys_call
  172. bic $30,$8,$8
  173. jsr $31,do_entIF
  174. .end entIF
  175. .align 3
  176. .globl entDbg
  177. .ent entDbg
  178. entDbg:
  179. SAVE_ALL
  180. lda $8,0x3fff
  181. lda $26,ret_from_sys_call
  182. bic $30,$8,$8
  183. jsr $31,do_entDbg
  184. .end entDbg
  185. /*
  186.  * Fork() is one of the special system calls: it needs to
  187.  * save the callee-saved regs so that the regs can be found
  188.  * for the new process.. We save them in the "context switch"
  189.  * stack format (see arch/alpha/kernel/process.c).
  190.  *
  191.  * Also, for the kernel fork, we need to fake the system call
  192.  * stack buildup, as we can't do system calls from kernel space.
  193.  */
  194. .align 3
  195. .ent kernel_clone
  196. kernel_clone:
  197. .frame $30, 0, $26
  198. .prologue 0
  199. subq $30,6*8,$30
  200. stq $31,0($30)
  201. stq $26,8($30)
  202. stq $29,16($30)
  203. stq $16,24($30)
  204. stq $17,32($30)
  205. stq $18,40($30)
  206. bis $31,2,$0 /* Register v0: syscall nr for fork() */
  207. SAVE_ALL
  208. bsr $26,sys_clone
  209. stq $0,0($30)
  210. br ret_from_sys_call
  211. .end kernel_clone
  212. /*
  213.  * kernel_thread(fn, arg, clone_flags)
  214.  */
  215. .align 3
  216. .globl kernel_thread
  217. .ent kernel_thread
  218. kernel_thread:
  219. ldgp $29,0($27) /* we can be called from a module */
  220. .frame $30, 4*8, $26
  221. subq $30,4*8,$30
  222. stq $10,16($30)
  223. stq $9,8($30)
  224. lda $0,CLONE_VM
  225. stq $26,0($30)
  226. .prologue 1
  227. mov $16,$9 /* save fn */
  228. mov $17,$10 /* save arg */
  229. or $18,$0,$16 /* shuffle flags to front; add CLONE_VM.  */
  230. bsr $26,kernel_clone
  231. bne $20,1f /* $20 is non-zero in child */
  232. ldq $26,0($30)
  233. ldq $9,8($30)
  234. ldq $10,16($30)
  235. addq $30,4*8,$30
  236. ret $31,($26),1
  237. /* this is in child: look out as we don't have any stack here.. */
  238. 1: mov $9,$27 /* get fn */
  239. lda $8,0x3fff
  240. mov $10,$16 /* get arg */
  241. bic $30,$8,$8 /* get current */
  242. jsr $26,($27)
  243. ldgp $29,0($26)
  244. mov $0,$16
  245. mov $31,$26
  246. jsr $31,sys_exit
  247. .end kernel_thread
  248. /*
  249.  * __kernel_execve(path, argv, envp, regs)
  250.  */
  251. .align 3
  252. .globl __kernel_execve
  253. .ent __kernel_execve
  254. __kernel_execve:
  255. ldgp $29,0($27) /* we can be called from modules.  */
  256. subq $30,16,$30
  257. .frame $30,16,$26,0
  258. stq $26,0($30)
  259. stq $19,8($30)
  260. .prologue 1
  261. jsr $26,do_execve
  262. bne $0,1f /* error! */
  263. ldq $30,8($30)
  264. br $31,ret_from_sys_call
  265. 1: ldq $26,0($30)
  266. addq $30,16,$30
  267. ret
  268. .end __kernel_execve
  269. .align 3
  270. .ent do_switch_stack
  271. do_switch_stack:
  272. lda $30,-SWITCH_STACK_SIZE($30)
  273. stq $9,0($30)
  274. stq $10,8($30)
  275. stq $11,16($30)
  276. stq $12,24($30)
  277. stq $13,32($30)
  278. stq $14,40($30)
  279. stq $15,48($30)
  280. stq $26,56($30)
  281. stt $f0,64($30)
  282. stt $f1,72($30)
  283. stt $f2,80($30)
  284. stt $f3,88($30)
  285. stt $f4,96($30)
  286. stt $f5,104($30)
  287. stt $f6,112($30)
  288. stt $f7,120($30)
  289. stt $f8,128($30)
  290. stt $f9,136($30)
  291. stt $f10,144($30)
  292. stt $f11,152($30)
  293. stt $f12,160($30)
  294. stt $f13,168($30)
  295. stt $f14,176($30)
  296. stt $f15,184($30)
  297. stt $f16,192($30)
  298. stt $f17,200($30)
  299. stt $f18,208($30)
  300. stt $f19,216($30)
  301. stt $f20,224($30)
  302. stt $f21,232($30)
  303. stt $f22,240($30)
  304. stt $f23,248($30)
  305. stt $f24,256($30)
  306. stt $f25,264($30)
  307. stt $f26,272($30)
  308. stt $f27,280($30)
  309. mf_fpcr $f0 # get fpcr
  310. stt $f28,288($30)
  311. stt $f29,296($30)
  312. stt $f30,304($30)
  313. stt $f0,312($30) # save fpcr in slot of $f31
  314. ldt $f0,64($30) # dont let "do_switch_stack" change fp state.
  315. ret $31,($1),1
  316. .end do_switch_stack
  317. .align 3
  318. .ent undo_switch_stack
  319. undo_switch_stack:
  320. ldq $9,0($30)
  321. ldq $10,8($30)
  322. ldq $11,16($30)
  323. ldq $12,24($30)
  324. ldq $13,32($30)
  325. ldq $14,40($30)
  326. ldq $15,48($30)
  327. ldq $26,56($30)
  328. ldt $f30,312($30) # get saved fpcr
  329. ldt $f0,64($30)
  330. ldt $f1,72($30)
  331. ldt $f2,80($30)
  332. ldt $f3,88($30)
  333. mt_fpcr $f30 # install saved fpcr
  334. ldt $f4,96($30)
  335. ldt $f5,104($30)
  336. ldt $f6,112($30)
  337. ldt $f7,120($30)
  338. ldt $f8,128($30)
  339. ldt $f9,136($30)
  340. ldt $f10,144($30)
  341. ldt $f11,152($30)
  342. ldt $f12,160($30)
  343. ldt $f13,168($30)
  344. ldt $f14,176($30)
  345. ldt $f15,184($30)
  346. ldt $f16,192($30)
  347. ldt $f17,200($30)
  348. ldt $f18,208($30)
  349. ldt $f19,216($30)
  350. ldt $f20,224($30)
  351. ldt $f21,232($30)
  352. ldt $f22,240($30)
  353. ldt $f23,248($30)
  354. ldt $f24,256($30)
  355. ldt $f25,264($30)
  356. ldt $f26,272($30)
  357. ldt $f27,280($30)
  358. ldt $f28,288($30)
  359. ldt $f29,296($30)
  360. ldt $f30,304($30)
  361. lda $30,SWITCH_STACK_SIZE($30)
  362. ret $31,($1),1
  363. .end undo_switch_stack
  364. .align 3
  365. .globl entUna
  366. .ent entUna
  367. entUna:
  368. lda $30,-256($30)
  369. stq $0,0($30)
  370. ldq $0,256($30) /* get PS */
  371. stq $1,8($30)
  372. stq $2,16($30)
  373. stq $3,24($30)
  374. and $0,8,$0 /* user mode? */
  375. stq $4,32($30)
  376. bne $0,entUnaUser /* yup -> do user-level unaligned fault */
  377. stq $5,40($30)
  378. stq $6,48($30)
  379. stq $7,56($30)
  380. stq $8,64($30)
  381. stq $9,72($30)
  382. stq $10,80($30)
  383. stq $11,88($30)
  384. stq $12,96($30)
  385. stq $13,104($30)
  386. stq $14,112($30)
  387. stq $15,120($30)
  388. /* 16-18 PAL-saved */
  389. stq $19,152($30)
  390. stq $20,160($30)
  391. stq $21,168($30)
  392. stq $22,176($30)
  393. stq $23,184($30)
  394. stq $24,192($30)
  395. stq $25,200($30)
  396. stq $26,208($30)
  397. stq $27,216($30)
  398. stq $28,224($30)
  399. stq $29,232($30)
  400. lda $8,0x3fff
  401. stq $31,248($30)
  402. bic $30,$8,$8
  403. jsr $26,do_entUna
  404. ldq $0,0($30)
  405. ldq $1,8($30)
  406. ldq $2,16($30)
  407. ldq $3,24($30)
  408. ldq $4,32($30)
  409. ldq $5,40($30)
  410. ldq $6,48($30)
  411. ldq $7,56($30)
  412. ldq $8,64($30)
  413. ldq $9,72($30)
  414. ldq $10,80($30)
  415. ldq $11,88($30)
  416. ldq $12,96($30)
  417. ldq $13,104($30)
  418. ldq $14,112($30)
  419. ldq $15,120($30)
  420. /* 16-18 PAL-saved */
  421. ldq $19,152($30)
  422. ldq $20,160($30)
  423. ldq $21,168($30)
  424. ldq $22,176($30)
  425. ldq $23,184($30)
  426. ldq $24,192($30)
  427. ldq $25,200($30)
  428. ldq $26,208($30)
  429. ldq $27,216($30)
  430. ldq $28,224($30)
  431. ldq $29,232($30)
  432. lda $30,256($30)
  433. call_pal PAL_rti
  434. .end entUna
  435. .align 3
  436. .ent entUnaUser
  437. entUnaUser:
  438. ldq $0,0($30) /* restore original $0 */
  439. lda $30,256($30) /* pop entUna's stack frame */
  440. SAVE_ALL /* setup normal kernel stack */
  441. lda $30,-56($30)
  442. stq $9,0($30)
  443. stq $10,8($30)
  444. stq $11,16($30)
  445. stq $12,24($30)
  446. stq $13,32($30)
  447. stq $14,40($30)
  448. stq $15,48($30)
  449. lda $8,0x3fff
  450. addq $30,56,$19
  451. bic $30,$8,$8
  452. jsr $26,do_entUnaUser
  453. ldq $9,0($30)
  454. ldq $10,8($30)
  455. ldq $11,16($30)
  456. ldq $12,24($30)
  457. ldq $13,32($30)
  458. ldq $14,40($30)
  459. ldq $15,48($30)
  460. lda $30,56($30)
  461. br ret_from_sys_call
  462. .end entUnaUser
  463. /*
  464.  * A fork is the same as clone(SIGCHLD, 0);
  465.  */
  466. .align 3
  467. .globl sys_fork
  468. .ent sys_fork
  469. sys_fork:
  470. bsr $1,do_switch_stack
  471. bis $31,SIGCHLD,$16
  472. mov $31,$17
  473. mov $30,$18
  474. jsr $26,alpha_clone
  475. bsr $1,undo_switch_stack
  476. ret $31,($26),1
  477. .end sys_fork
  478. .align 3
  479. .globl sys_clone
  480. .ent sys_clone
  481. sys_clone:
  482. bsr $1,do_switch_stack
  483. /* arg1 and arg2 come from the user */
  484. mov $30,$18
  485. jsr $26,alpha_clone
  486. bsr $1,undo_switch_stack
  487. ret $31,($26),1
  488. .end sys_clone
  489. .align 3
  490. .globl sys_vfork
  491. .ent sys_vfork
  492. sys_vfork:
  493. bsr $1,do_switch_stack
  494. mov $30,$16
  495. jsr $26,alpha_vfork
  496. bsr $1,undo_switch_stack
  497. ret $31,($26),1
  498. .end sys_vfork
  499. .align 3
  500. .globl  alpha_switch_to
  501. .ent    alpha_switch_to
  502. alpha_switch_to:
  503. .prologue 0
  504. bsr $1,do_switch_stack
  505. call_pal PAL_swpctx
  506. unop
  507. bsr $1,undo_switch_stack
  508. mov $17,$0
  509. ret $31,($26),1
  510. .end alpha_switch_to
  511. /*
  512.  * Oh, well.. Disassembling OSF/1 binaries to find out how the
  513.  * system calls work isn't much fun.
  514.  *
  515.  * entSys is special in that the PAL-code doesn't save a0-a2, so
  516.  * we start off by doing that by hand.
  517.  */
  518. .align 3
  519. .globl entSys
  520. .globl ret_from_sys_call
  521. .ent entSys
  522. entSys:
  523. SAVE_ALL
  524. lda $8,0x3fff
  525. bic $30,$8,$8
  526. lda $4,NR_SYSCALLS($31)
  527. stq $16,SP_OFF+24($30)
  528. lda $5,sys_call_table
  529. lda $27,sys_ni_syscall
  530. cmpult $0,$4,$4
  531. ldq $3,TASK_PTRACE($8)
  532. stq $17,SP_OFF+32($30)
  533. s8addq $0,$5,$5
  534. and     $3,PT_PTRACED,$3
  535. stq $18,SP_OFF+40($30)
  536. bne     $3,strace
  537. beq $4,1f
  538. ldq $27,0($5)
  539. 1: jsr $26,($27),alpha_ni_syscall
  540. ldgp $29,0($26)
  541. blt $0,syscall_error /* the call failed */
  542. stq $0,0($30)
  543. stq $31,72($30) /* a3=0 => no error */
  544. .align 3
  545. ret_from_sys_call:
  546. cmovne $26,0,$19 /* $19 = 0 => non-restartable */
  547. ldq $0,SP_OFF($30)
  548. and $0,8,$0
  549. beq $0,restore_all
  550. ret_from_reschedule:
  551. ldq $2,TASK_NEED_RESCHED($8)
  552. lda $4,init_task_union
  553. bne $2,reschedule
  554. xor $4,$8,$4
  555. ldl $5,TASK_SIGPENDING($8)
  556. beq $4,restore_all
  557. bne $5,signal_return
  558. restore_all:
  559. RESTORE_ALL
  560. call_pal PAL_rti
  561. /* PTRACE syscall handler */
  562. .align 3
  563. strace:
  564. /* set up signal stack, call syscall_trace */
  565. bsr $1,do_switch_stack
  566. jsr     $26,syscall_trace
  567. bsr $1,undo_switch_stack
  568. /* get the system call number and the arguments back.. */
  569. ldq     $0,0($30)
  570. ldq     $16,SP_OFF+24($30)
  571. ldq     $17,SP_OFF+32($30)
  572. ldq     $18,SP_OFF+40($30)
  573. ldq     $19,72($30)
  574. ldq     $20,80($30)
  575. ldq     $21,88($30)
  576. /* get the system call pointer.. */
  577. lda $1,NR_SYSCALLS($31)
  578. lda $2,sys_call_table
  579. lda $27,alpha_ni_syscall
  580. cmpult $0,$1,$1
  581. s8addq $0,$2,$2
  582. beq $1,1f
  583. ldq $27,0($2)
  584. 1: jsr $26,($27),sys_gettimeofday
  585. ldgp $29,0($26)
  586. /* check return.. */
  587. blt $0,strace_error /* the call failed */
  588. stq $31,72($30) /* a3=0 => no error */
  589. strace_success:
  590. stq $0,0($30) /* save return value */
  591. bsr $1,do_switch_stack
  592. jsr     $26,syscall_trace
  593. bsr $1,undo_switch_stack
  594. br $31,ret_from_sys_call
  595. .align  3
  596. strace_error:
  597. ldq $19,0($30) /* old syscall nr (zero if success) */
  598. beq $19,strace_success
  599. ldq $20,72($30) /* .. and this a3 */
  600. subq $31,$0,$0 /* with error in v0 */
  601. addq $31,1,$1 /* set a3 for errno return */
  602. stq $0,0($30)
  603. stq $1,72($30) /* a3 for return */
  604. bsr $1,do_switch_stack
  605. mov $19,$9 /* save old syscall number */
  606. mov $20,$10 /* save old a3 */
  607. jsr     $26,syscall_trace
  608. mov $9,$19
  609. mov $10,$20
  610. bsr $1,undo_switch_stack
  611. mov $31,$26 /* tell "ret_from_sys_call" we can restart */
  612. br ret_from_sys_call
  613. .align 3
  614. syscall_error:
  615. /*
  616.  * Some system calls (e.g., ptrace) can return arbitrary
  617.  * values which might normally be mistaken as error numbers.
  618.  * Those functions must zero $0 (v0) directly in the stack
  619.  * frame to indicate that a negative return value wasn't an
  620.  * error number..
  621.  */
  622. ldq $19,0($30) /* old syscall nr (zero if success) */
  623. beq $19,ret_success
  624. ldq $20,72($30) /* .. and this a3 */
  625. subq $31,$0,$0 /* with error in v0 */
  626. addq $31,1,$1 /* set a3 for errno return */
  627. stq $0,0($30)
  628. mov $31,$26 /* tell "ret_from_sys_call" we can restart */
  629. stq $1,72($30) /* a3 for return */
  630. br ret_from_sys_call
  631. ret_success:
  632. stq $0,0($30)
  633. stq $31,72($30) /* a3=0 => no error */
  634. br ret_from_sys_call
  635. .align 3
  636. signal_return:
  637. mov $30,$17
  638. br $1,do_switch_stack
  639. mov $30,$18
  640. mov $31,$16
  641. jsr $26,do_signal
  642. bsr $1,undo_switch_stack
  643. br restore_all
  644. .end entSys
  645.         .globl  ret_from_fork
  646. .align 3
  647. .ent ret_from_fork
  648. ret_from_fork:
  649. lda $26,ret_from_sys_call
  650. mov $17,$16
  651. jsr $31,schedule_tail
  652. .end ret_from_fork
  653. .align 3
  654. .ent reschedule
  655. reschedule:
  656. subq $30,16,$30
  657. stq $19,0($30) /* save syscall nr */
  658. stq $20,8($30) /* and error indication (a3) */
  659. jsr $26,schedule
  660. ldq $19,0($30)
  661. ldq $20,8($30)
  662. addq $30,16,$30
  663. br ret_from_reschedule
  664. .end reschedule
  665. .align 3
  666. .ent sys_sigreturn
  667. sys_sigreturn:
  668. mov $30,$17
  669. lda $18,-SWITCH_STACK_SIZE($30)
  670. lda $30,-SWITCH_STACK_SIZE($30)
  671. jsr $26,do_sigreturn
  672. br $1,undo_switch_stack
  673. br ret_from_sys_call
  674. .end sys_sigreturn
  675. .align 3
  676. .ent sys_rt_sigreturn
  677. sys_rt_sigreturn:
  678. mov $30,$17
  679. lda $18,-SWITCH_STACK_SIZE($30)
  680. lda $30,-SWITCH_STACK_SIZE($30)
  681. jsr $26,do_rt_sigreturn
  682. br $1,undo_switch_stack
  683. br ret_from_sys_call
  684. .end sys_rt_sigreturn
  685. .align 3
  686. .ent sys_sigsuspend
  687. sys_sigsuspend:
  688. mov $30,$17
  689. br $1,do_switch_stack
  690. mov $30,$18
  691. subq $30,16,$30
  692. stq $26,0($30)
  693. jsr $26,do_sigsuspend
  694. ldq $26,0($30)
  695. lda $30,SWITCH_STACK_SIZE+16($30)
  696. ret $31,($26),1
  697. .end sys_sigsuspend
  698. .align 3
  699. .ent sys_rt_sigsuspend
  700. sys_rt_sigsuspend:
  701. mov $30,$18
  702. br $1,do_switch_stack
  703. mov $30,$19
  704. subq $30,16,$30
  705. stq $26,0($30)
  706. jsr $26,do_rt_sigsuspend
  707. ldq $26,0($30)
  708. lda $30,SWITCH_STACK_SIZE+16($30)
  709. ret $31,($26),1
  710. .end sys_rt_sigsuspend
  711. .data
  712. .align 3
  713. .globl sys_call_table
  714. sys_call_table:
  715. .quad alpha_ni_syscall /* 0 */
  716. .quad sys_exit
  717. .quad sys_fork
  718. .quad sys_read
  719. .quad sys_write
  720. .quad alpha_ni_syscall /* 5 */
  721. .quad sys_close
  722. .quad osf_wait4
  723. .quad alpha_ni_syscall
  724. .quad sys_link
  725. .quad sys_unlink /* 10 */
  726. .quad alpha_ni_syscall
  727. .quad sys_chdir
  728. .quad sys_fchdir
  729. .quad sys_mknod
  730. .quad sys_chmod /* 15 */
  731. .quad sys_chown
  732. .quad osf_brk
  733. .quad alpha_ni_syscall
  734. .quad sys_lseek
  735. .quad sys_getxpid /* 20 */
  736. .quad osf_mount
  737. .quad sys_umount
  738. .quad sys_setuid
  739. .quad sys_getxuid
  740. .quad alpha_ni_syscall /* 25 */
  741. .quad sys_ptrace
  742. .quad alpha_ni_syscall
  743. .quad alpha_ni_syscall
  744. .quad alpha_ni_syscall
  745. .quad alpha_ni_syscall /* 30 */
  746. .quad alpha_ni_syscall
  747. .quad alpha_ni_syscall
  748. .quad sys_access
  749. .quad alpha_ni_syscall
  750. .quad alpha_ni_syscall /* 35 */
  751. .quad sys_sync
  752. .quad sys_kill
  753. .quad alpha_ni_syscall
  754. .quad sys_setpgid
  755. .quad alpha_ni_syscall /* 40 */
  756. .quad sys_dup
  757. .quad sys_pipe
  758. .quad osf_set_program_attributes
  759. .quad alpha_ni_syscall
  760. .quad sys_open /* 45 */
  761. .quad alpha_ni_syscall
  762. .quad sys_getxgid
  763. .quad osf_sigprocmask
  764. .quad alpha_ni_syscall
  765. .quad alpha_ni_syscall /* 50 */
  766. .quad sys_acct
  767. .quad sys_sigpending
  768. .quad alpha_ni_syscall
  769. .quad sys_ioctl
  770. .quad alpha_ni_syscall /* 55 */
  771. .quad alpha_ni_syscall
  772. .quad sys_symlink
  773. .quad sys_readlink
  774. .quad sys_execve
  775. .quad sys_umask /* 60 */
  776. .quad sys_chroot
  777. .quad alpha_ni_syscall
  778. .quad sys_getpgrp
  779. .quad sys_getpagesize
  780. .quad alpha_ni_syscall /* 65 */
  781. .quad sys_vfork
  782. .quad sys_newstat
  783. .quad sys_newlstat
  784. .quad alpha_ni_syscall
  785. .quad alpha_ni_syscall /* 70 */
  786. .quad osf_mmap
  787. .quad alpha_ni_syscall
  788. .quad sys_munmap
  789. .quad sys_mprotect
  790. .quad sys_madvise /* 75 */
  791. .quad sys_vhangup
  792. .quad alpha_ni_syscall
  793. .quad alpha_ni_syscall
  794. .quad sys_getgroups
  795. /* map BSD's setpgrp to sys_setpgid for binary compatibility: */
  796. .quad sys_setgroups /* 80 */
  797. .quad alpha_ni_syscall
  798. .quad sys_setpgid
  799. .quad osf_setitimer
  800. .quad alpha_ni_syscall
  801. .quad alpha_ni_syscall /* 85 */
  802. .quad osf_getitimer
  803. .quad sys_gethostname
  804. .quad sys_sethostname
  805. .quad sys_getdtablesize
  806. .quad sys_dup2 /* 90 */
  807. .quad sys_newfstat
  808. .quad sys_fcntl
  809. .quad osf_select
  810. .quad sys_poll
  811. .quad sys_fsync /* 95 */
  812. .quad sys_setpriority
  813. .quad sys_socket
  814. .quad sys_connect
  815. .quad sys_accept
  816. .quad osf_getpriority /* 100 */
  817. .quad sys_send
  818. .quad sys_recv
  819. .quad sys_sigreturn
  820. .quad sys_bind
  821. .quad sys_setsockopt /* 105 */
  822. .quad sys_listen
  823. .quad alpha_ni_syscall
  824. .quad alpha_ni_syscall
  825. .quad alpha_ni_syscall
  826. .quad alpha_ni_syscall /* 110 */
  827. .quad sys_sigsuspend
  828. .quad osf_sigstack
  829. .quad sys_recvmsg
  830. .quad sys_sendmsg
  831. .quad alpha_ni_syscall /* 115 */
  832. .quad osf_gettimeofday
  833. .quad osf_getrusage
  834. .quad sys_getsockopt
  835. .quad alpha_ni_syscall
  836. .quad sys_readv /* 120 */
  837. .quad sys_writev
  838. .quad osf_settimeofday
  839. .quad sys_fchown
  840. .quad sys_fchmod
  841. .quad sys_recvfrom /* 125 */
  842. .quad sys_setreuid
  843. .quad sys_setregid
  844. .quad sys_rename
  845. .quad sys_truncate
  846. .quad sys_ftruncate /* 130 */
  847. .quad sys_flock
  848. .quad sys_setgid
  849. .quad sys_sendto
  850. .quad sys_shutdown
  851. .quad sys_socketpair /* 135 */
  852. .quad sys_mkdir
  853. .quad sys_rmdir
  854. .quad osf_utimes
  855. .quad alpha_ni_syscall
  856. .quad alpha_ni_syscall /* 140 */
  857. .quad sys_getpeername
  858. .quad alpha_ni_syscall
  859. .quad alpha_ni_syscall
  860. .quad sys_getrlimit
  861. .quad sys_setrlimit /* 145 */
  862. .quad alpha_ni_syscall
  863. .quad sys_setsid
  864. .quad sys_quotactl
  865. .quad alpha_ni_syscall
  866. .quad sys_getsockname /* 150 */
  867. .quad alpha_ni_syscall
  868. .quad alpha_ni_syscall
  869. .quad alpha_ni_syscall
  870. .quad alpha_ni_syscall
  871. .quad alpha_ni_syscall /* 155 */
  872. .quad osf_sigaction
  873. .quad alpha_ni_syscall
  874. .quad alpha_ni_syscall
  875. .quad osf_getdirentries
  876. .quad osf_statfs /* 160 */
  877. .quad osf_fstatfs
  878. .quad alpha_ni_syscall
  879. .quad alpha_ni_syscall
  880. .quad alpha_ni_syscall
  881. .quad osf_getdomainname /* 165 */
  882. .quad sys_setdomainname
  883. .quad alpha_ni_syscall
  884. .quad alpha_ni_syscall
  885. .quad alpha_ni_syscall
  886. .quad alpha_ni_syscall /* 170 */
  887. .quad alpha_ni_syscall
  888. .quad alpha_ni_syscall
  889. .quad alpha_ni_syscall
  890. .quad alpha_ni_syscall
  891. .quad alpha_ni_syscall /* 175 */
  892. .quad alpha_ni_syscall
  893. .quad alpha_ni_syscall
  894. .quad alpha_ni_syscall
  895. .quad alpha_ni_syscall
  896. .quad alpha_ni_syscall /* 180 */
  897. .quad alpha_ni_syscall
  898. .quad alpha_ni_syscall
  899. .quad alpha_ni_syscall
  900. .quad alpha_ni_syscall
  901. .quad alpha_ni_syscall /* 185 */
  902. .quad alpha_ni_syscall
  903. .quad alpha_ni_syscall
  904. .quad alpha_ni_syscall
  905. .quad alpha_ni_syscall
  906. .quad alpha_ni_syscall /* 190 */
  907. .quad alpha_ni_syscall
  908. .quad alpha_ni_syscall
  909. .quad alpha_ni_syscall
  910. .quad alpha_ni_syscall
  911. .quad alpha_ni_syscall /* 195 */
  912. .quad alpha_ni_syscall
  913. .quad alpha_ni_syscall
  914. .quad alpha_ni_syscall
  915. .quad osf_swapon
  916. .quad sys_msgctl /* 200 */
  917. .quad sys_msgget
  918. .quad sys_msgrcv
  919. .quad sys_msgsnd
  920. .quad sys_semctl
  921. .quad sys_semget /* 205 */
  922. .quad sys_semop
  923. .quad osf_utsname
  924. .quad sys_lchown
  925. .quad osf_shmat
  926. .quad sys_shmctl /* 210 */
  927. .quad sys_shmdt
  928. .quad sys_shmget
  929. .quad alpha_ni_syscall
  930. .quad alpha_ni_syscall
  931. .quad alpha_ni_syscall /* 215 */
  932. .quad alpha_ni_syscall
  933. .quad sys_msync
  934. .quad alpha_ni_syscall
  935. .quad alpha_ni_syscall
  936. .quad alpha_ni_syscall /* 220 */
  937. .quad alpha_ni_syscall
  938. .quad alpha_ni_syscall
  939. .quad alpha_ni_syscall
  940. .quad alpha_ni_syscall
  941. .quad alpha_ni_syscall /* 225 */
  942. .quad alpha_ni_syscall
  943. .quad alpha_ni_syscall
  944. .quad alpha_ni_syscall
  945. .quad alpha_ni_syscall
  946. .quad alpha_ni_syscall /* 230 */
  947. .quad alpha_ni_syscall
  948. .quad alpha_ni_syscall
  949. .quad sys_getpgid
  950. .quad sys_getsid
  951. .quad sys_sigaltstack /* 235 */
  952. .quad alpha_ni_syscall
  953. .quad alpha_ni_syscall
  954. .quad alpha_ni_syscall
  955. .quad alpha_ni_syscall
  956. .quad alpha_ni_syscall /* 240 */
  957. .quad osf_sysinfo
  958. .quad alpha_ni_syscall
  959. .quad alpha_ni_syscall
  960. .quad osf_proplist_syscall
  961. .quad alpha_ni_syscall /* 245 */
  962. .quad alpha_ni_syscall
  963. .quad alpha_ni_syscall
  964. .quad alpha_ni_syscall
  965. .quad alpha_ni_syscall
  966. .quad alpha_ni_syscall /* 250 */
  967. .quad osf_usleep_thread
  968. .quad alpha_ni_syscall
  969. .quad alpha_ni_syscall
  970. .quad sys_sysfs
  971. .quad alpha_ni_syscall /* 255 */
  972. .quad osf_getsysinfo
  973. .quad osf_setsysinfo
  974. .quad alpha_ni_syscall
  975. .quad alpha_ni_syscall
  976. .quad alpha_ni_syscall /* 260 */
  977. .quad alpha_ni_syscall
  978. .quad alpha_ni_syscall
  979. .quad alpha_ni_syscall
  980. .quad alpha_ni_syscall
  981. .quad alpha_ni_syscall /* 265 */
  982. .quad alpha_ni_syscall
  983. .quad alpha_ni_syscall
  984. .quad alpha_ni_syscall
  985. .quad alpha_ni_syscall
  986. .quad alpha_ni_syscall /* 270 */
  987. .quad alpha_ni_syscall
  988. .quad alpha_ni_syscall
  989. .quad alpha_ni_syscall
  990. .quad alpha_ni_syscall
  991. .quad alpha_ni_syscall /* 275 */
  992. .quad alpha_ni_syscall
  993. .quad alpha_ni_syscall
  994. .quad alpha_ni_syscall
  995. .quad alpha_ni_syscall
  996. .quad alpha_ni_syscall /* 280 */
  997. .quad alpha_ni_syscall
  998. .quad alpha_ni_syscall
  999. .quad alpha_ni_syscall
  1000. .quad alpha_ni_syscall
  1001. .quad alpha_ni_syscall /* 285 */
  1002. .quad alpha_ni_syscall
  1003. .quad alpha_ni_syscall
  1004. .quad alpha_ni_syscall
  1005. .quad alpha_ni_syscall
  1006. .quad alpha_ni_syscall /* 290 */
  1007. .quad alpha_ni_syscall
  1008. .quad alpha_ni_syscall
  1009. .quad alpha_ni_syscall
  1010. .quad alpha_ni_syscall
  1011. .quad alpha_ni_syscall /* 295 */
  1012. .quad alpha_ni_syscall
  1013. .quad alpha_ni_syscall
  1014. .quad alpha_ni_syscall
  1015. .quad alpha_ni_syscall
  1016. /* linux-specific system calls start at 300 */
  1017. .quad sys_bdflush /* 300 */
  1018. .quad sys_sethae
  1019. .quad sys_mount
  1020. .quad sys_old_adjtimex
  1021. .quad sys_swapoff
  1022. .quad sys_getdents /* 305 */
  1023. .quad alpha_create_module
  1024. .quad sys_init_module
  1025. .quad sys_delete_module
  1026. .quad sys_get_kernel_syms
  1027. .quad sys_syslog /* 310 */
  1028. .quad sys_reboot
  1029. .quad sys_clone
  1030. .quad sys_uselib
  1031. .quad sys_mlock
  1032. .quad sys_munlock /* 315 */
  1033. .quad sys_mlockall
  1034. .quad sys_munlockall
  1035. .quad sys_sysinfo
  1036. .quad sys_sysctl
  1037. .quad sys_ni_syscall /* 320 */
  1038. .quad sys_oldumount
  1039. .quad sys_swapon
  1040. .quad sys_times
  1041. .quad sys_personality
  1042. .quad sys_setfsuid /* 325 */
  1043. .quad sys_setfsgid
  1044. .quad sys_ustat
  1045. .quad sys_statfs
  1046. .quad sys_fstatfs
  1047. .quad sys_sched_setparam /* 330 */
  1048. .quad sys_sched_getparam
  1049. .quad sys_sched_setscheduler
  1050. .quad sys_sched_getscheduler
  1051. .quad sys_sched_yield
  1052. .quad sys_sched_get_priority_max /* 335 */
  1053. .quad sys_sched_get_priority_min
  1054. .quad sys_sched_rr_get_interval
  1055. .quad sys_ni_syscall /* sys_afs_syscall */
  1056. .quad sys_newuname
  1057. .quad sys_nanosleep /* 340 */
  1058. .quad sys_mremap
  1059. .quad sys_nfsservctl
  1060. .quad sys_setresuid
  1061. .quad sys_getresuid
  1062. .quad sys_pciconfig_read /* 345 */
  1063. .quad sys_pciconfig_write
  1064. .quad sys_query_module
  1065. .quad sys_prctl
  1066. .quad sys_pread
  1067. .quad sys_pwrite /* 350 */
  1068. .quad sys_rt_sigreturn
  1069. .quad sys_rt_sigaction
  1070. .quad sys_rt_sigprocmask
  1071. .quad sys_rt_sigpending
  1072. .quad sys_rt_sigtimedwait /* 355 */
  1073. .quad sys_rt_sigqueueinfo
  1074. .quad sys_rt_sigsuspend
  1075. .quad sys_select
  1076. .quad sys_gettimeofday
  1077. .quad sys_settimeofday /* 360 */
  1078. .quad sys_getitimer
  1079. .quad sys_setitimer
  1080. .quad sys_utimes
  1081. .quad sys_getrusage
  1082. .quad sys_wait4 /* 365 */
  1083. .quad sys_adjtimex
  1084. .quad sys_getcwd
  1085. .quad sys_capget
  1086. .quad sys_capset
  1087. .quad sys_sendfile /* 370 */
  1088. .quad sys_setresgid
  1089. .quad sys_getresgid
  1090. .quad sys_ni_syscall /* sys_dipc */
  1091. .quad sys_pivot_root
  1092. .quad sys_mincore /* 375 */
  1093. .quad sys_pciconfig_iobase
  1094. .quad sys_getdents64
  1095. .quad sys_gettid
  1096. .quad sys_readahead
  1097. .quad sys_ni_syscall /* 380, sys_security */