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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: entry.S,v 1.71 2001/07/27 11:47:50 gniibe Exp $
  2.  *
  3.  *  linux/arch/sh/entry.S
  4.  *
  5.  *  Copyright (C) 1999, 2000  Niibe Yutaka
  6.  *
  7.  * This file is subject to the terms and conditions of the GNU General Public
  8.  * License.  See the file "COPYING" in the main directory of this archive
  9.  * for more details.
  10.  *
  11.  */
  12. #include <linux/sys.h>
  13. #include <linux/linkage.h>
  14. #include <linux/config.h>
  15. /*
  16.  * Define this to turn on compatibility with the previous
  17.  * system call ABI.  This feature is not properly maintained.
  18.  */
  19. #undef COMPAT_OLD_SYSCALL_ABI
  20. ! NOTE:
  21. ! GNU as (as of 2.9.1) changes bf/s into bt/s and bra, when the address
  22. ! to be jumped is too far, but it causes illegal slot exception.
  23. /*
  24.  * entry.S contains the system-call and fault low-level handling routines.
  25.  * This also contains the timer-interrupt handler, as well as all interrupts
  26.  * and faults that can result in a task-switch.
  27.  *
  28.  * NOTE: This code handles signal-recognition, which happens every time
  29.  * after a timer-interrupt and after each system call.
  30.  *
  31.  * NOTE: This code uses a convention that instructions in the delay slot
  32.  * of a transfer-control instruction are indented by an extra space, thus:
  33.  *
  34.  *    jmp @k0     ! control-transfer instruction
  35.  *     ldc k1, ssr     ! delay slot
  36.  *
  37.  * Stack layout in 'ret_from_syscall':
  38.  *  ptrace needs to have all regs on the stack.
  39.  * if the order here is changed, it needs to be
  40.  * updated in ptrace.c and ptrace.h
  41.  *
  42.  * r0
  43.  *      ...
  44.  * r15 = stack pointer
  45.  * spc
  46.  * pr
  47.  * ssr
  48.  * gbr
  49.  * mach
  50.  * macl
  51.  * syscall #
  52.  *
  53.  */
  54. /*
  55.  * These are offsets into the task-struct.
  56.  */
  57. flags =  4
  58. sigpending =  8
  59. need_resched = 20
  60. tsk_ptrace = 24
  61. PT_TRACESYS  = 0x00000002
  62. PF_USEDFPU   = 0x00100000
  63. ENOSYS = 38
  64. EINVAL = 22
  65. #if defined(__sh3__)
  66. TRA     = 0xffffffd0
  67. EXPEVT  = 0xffffffd4
  68. #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709)
  69. INTEVT  = 0xa4000000 ! INTEVTE2(0xa4000000)
  70. #else
  71. INTEVT  = 0xffffffd8
  72. #endif
  73. MMU_TEA = 0xfffffffc ! TLB Exception Address Register
  74. #elif defined(__SH4__)
  75. TRA     = 0xff000020
  76. EXPEVT  = 0xff000024
  77. INTEVT  = 0xff000028
  78. MMU_TEA = 0xff00000c ! TLB Exception Address Register
  79. #endif
  80. /* Offsets to the stack */
  81. OFF_R0         =  0 /* Return value. New ABI also arg4 */
  82. OFF_R1         =  4      /* New ABI: arg5 */
  83. OFF_R2         =  8      /* New ABI: arg6 */
  84. OFF_R3         =  12      /* New ABI: syscall_nr */
  85. OFF_R4         =  16      /* New ABI: arg0 */
  86. OFF_R5         =  20      /* New ABI: arg1 */
  87. OFF_R6         =  24      /* New ABI: arg2 */
  88. OFF_R7         =  28      /* New ABI: arg3 */
  89. OFF_SP    =  (15*4)
  90. OFF_SR    =  (16*4+8)
  91. SYSCALL_NR =  (16*4+6*4)
  92. #define k0 r0
  93. #define k1 r1
  94. #define k2 r2
  95. #define k3 r3
  96. #define k4 r4
  97. #define current r7 /* r7_bank1 */
  98. #define g_imask r6 /* r6_bank1 */
  99. #define k_current r7_bank /* r7_bank1 */
  100. #define k_g_imask r6_bank /* r6_bank1 */
  101. #define k_ex_code r2_bank /* r2_bank1 */
  102. /*
  103.  * Kernel mode register usage:
  104.  * k0 scratch
  105.  * k1 scratch
  106.  * k2 scratch (Exception code)
  107.  * k3 scratch (Return address)
  108.  * k4 scratch
  109.  * k5 reserved
  110.  * k6 Global Interrupt Mask (0--15 << 4)
  111.  * k7 CURRENT (pointer to current task)
  112.  */
  113. !
  114. ! TLB Miss / Initial Page write exception handling
  115. ! _and_
  116. ! TLB hits, but the access violate the protection.
  117. ! It can be valid access, such as stack grow and/or C-O-W.
  118. !
  119. !
  120. ! Find the pmd/pte entry and loadtlb
  121. ! If it's not found, cause address error (SEGV)
  122. !
  123. ! Although this could be written in assembly language (and it'd be faster),
  124. ! this first version depends *much* on C implementation.
  125. !
  126. #define STI()
  127. mov.l __INV_IMASK, r11;
  128. stc sr, r10;
  129. and r11, r10;
  130. stc k_g_imask, r11;
  131. or r11, r10;
  132. ldc r10, sr
  133. .align 2
  134. tlb_miss_load:
  135. bra call_dpf
  136.  mov #0, r5
  137. .align 2
  138. tlb_miss_store:
  139. bra call_dpf
  140.  mov #1, r5
  141. .align 2
  142. initial_page_write:
  143. bra call_dpf
  144.  mov #1, r5
  145. .align 2
  146. tlb_protection_violation_load:
  147. bra call_dpf
  148.  mov #0, r5
  149. .align 2
  150. tlb_protection_violation_store:
  151. bra call_dpf
  152.  mov #1, r5
  153. call_dpf:
  154. mov.l 1f, r0
  155. mov r5, r8
  156. mov.l @r0, r6
  157. mov r6, r9
  158. mov.l 2f, r0
  159. sts pr, r10
  160. jsr @r0
  161.  mov r15, r4
  162. !
  163. tst r0, r0
  164. bf/s 0f
  165.  lds r10, pr
  166. rts
  167.  nop
  168. 0: STI()
  169. mov.l 3f, r0
  170. mov r9, r6
  171. mov r8, r5
  172. jmp @r0
  173.  mov r15, r4
  174. .align 2
  175. 1: .long MMU_TEA
  176. 2: .long SYMBOL_NAME(__do_page_fault)
  177. 3: .long SYMBOL_NAME(do_page_fault)
  178. .align 2
  179. address_error_load:
  180. bra call_dae
  181.  mov #0,r5 ! writeaccess = 0
  182. .align 2
  183. address_error_store:
  184. bra call_dae
  185.  mov #1,r5 ! writeaccess = 1
  186. call_dae:
  187. mov.l 1f, r0
  188. mov.l @r0, r6 ! address
  189. mov.l 2f, r0
  190. jmp @r0
  191.  mov r15, r4 ! regs
  192. .align 2
  193. 1: .long MMU_TEA
  194. 2: .long   SYMBOL_NAME(do_address_error)
  195. #if defined(CONFIG_SH_STANDARD_BIOS)
  196. .align 2
  197. /* Unwind the stack and jmp to the debug entry */
  198. debug_kernel:
  199. mov.l @r15+, r0
  200. mov.l @r15+, r1
  201. mov.l @r15+, r2
  202. mov.l @r15+, r3
  203. mov.l @r15+, r4
  204. mov.l @r15+, r5
  205. mov.l @r15+, r6
  206. mov.l @r15+, r7
  207. stc sr, r8
  208. mov.l 1f, r9 ! BL =1, RB=1, IMASK=0x0F
  209. or r9, r8
  210. ldc r8, sr ! here, change the register bank
  211. mov.l @r15+, r8
  212. mov.l @r15+, r9
  213. mov.l @r15+, r10
  214. mov.l @r15+, r11
  215. mov.l @r15+, r12
  216. mov.l @r15+, r13
  217. mov.l @r15+, r14
  218. mov.l @r15+, k0
  219. ldc.l @r15+, spc
  220. lds.l @r15+, pr
  221. mov.l @r15+, k1
  222. ldc.l @r15+, gbr
  223. lds.l @r15+, mach
  224. lds.l @r15+, macl
  225. mov k0, r15
  226. !
  227. mov.l 2f, k0
  228. mov.l @k0, k0
  229. jmp @k0
  230.  ldc k1, ssr
  231. .align 2
  232. 1: .long 0x300000f0
  233. 2: .long SYMBOL_NAME(gdb_vbr_vector)
  234. #endif
  235. .align 2
  236. debug_trap:
  237. #if defined(CONFIG_SH_STANDARD_BIOS)
  238. mov #OFF_SR, r0
  239. mov.l @(r0,r15), r0 ! get status register
  240. shll r0
  241. shll r0 ! kernel space?
  242. bt/s debug_kernel
  243. #endif
  244.  mov.l @r15, r0
  245. mov.l 1f, r8
  246. jmp @r8
  247.  nop
  248. .align 2
  249. 1: .long SYMBOL_NAME(break_point_trap_software)
  250. .align 2
  251. error:
  252. !
  253. STI()
  254. mov.l 1f, r0
  255. jmp @r0
  256.  nop
  257. .align 2
  258. 1: .long SYMBOL_NAME(do_exception_error)
  259. !
  260. !
  261. !
  262. ENTRY(ret_from_fork)
  263. mov.l @r15+,r0
  264. ! Call schedule_tail
  265. mov.l 1f, r1
  266. jsr @r1
  267.  mov r0, r4
  268. ! If we're being traced, return via syscall_ret_trace, otherwise
  269. ! return directly to ret_from_syscall
  270. stc k_current, r0
  271. mov.l @(tsk_ptrace,r0), r0 ! Is current PTRACE_SYSCALL'd?
  272. mov #PT_TRACESYS, r1
  273. tst r1, r0
  274. bt ret_from_syscall
  275. bra syscall_ret_trace
  276.  nop  
  277. .align 2
  278. 1: .long SYMBOL_NAME(schedule_tail)
  279. /*
  280.  * Old syscall interface:
  281.  *
  282.  * Syscall #: R0
  283.  * Arguments #0 to #3: R4--R7
  284.  * more arguments: On the stack
  285.  * TRA: (number of arguments on the stack) x 4
  286.  *
  287.  * New syscall interface:
  288.  *
  289.  * Syscall #: R3
  290.  * Arguments #0 to #3: R4--R7
  291.  * Arguments #4 to #6: R0, R1, R2
  292.  * TRA: (number of arguments + 0x10) x 4
  293.  *
  294.  * This code also handles delegating other traps to the BIOS/gdb stub
  295.  * according to:
  296.  *
  297.  * Trap number
  298.  * (TRA>>2)      Purpose
  299.  * --------      -------
  300.  * 0x0-0xf       old syscall ABI
  301.  * 0x10-0x1f       new syscall ABI
  302.  * 0x20-0xff       delegated through debug_trap to BIOS/gdb stub.
  303.  *
  304.  * Note: When we're first called, the TRA value must be shifted
  305.  * right 2 bits in order to get the value that was used as the "trapa"
  306.  * argument.
  307.  */
  308. system_call:
  309. mov.l __TRA, r9
  310. mov.l @r9, r8
  311. !
  312. ! Is the trap argument >= 0x20? (TRA will be >= 0x80)
  313. mov #0x20, r9
  314. extu.b r9, r9
  315. shll2 r9
  316. cmp/hs r9, r8
  317. bt debug_trap
  318. !
  319. mov #SYSCALL_NR, r14
  320. add r15, r14
  321. !
  322. #ifdef COMPAT_OLD_SYSCALL_ABI
  323. mov #0x40, r9
  324. cmp/hs r9, r8
  325. bf/s old_abi_system_call
  326.  nop
  327. #endif
  328. ! New Syscall ABI
  329. add #-0x40, r8
  330. shlr2 r8
  331. shll8 r8
  332. shll8 r8       ! r8 = num_args<<16
  333. mov r3, r10
  334. or r8, r10 ! Encode syscall # and # of arguments
  335. mov.l r10, @r14 ! set syscall_nr
  336. STI()
  337. !
  338. stc k_current, r11
  339. mov.l @(tsk_ptrace,r11), r10 ! Is current PTRACE_SYSCALL'd?
  340. mov #PT_TRACESYS, r11
  341. tst r11, r10
  342. bt 5f
  343. !                      Yes it is traced.
  344. mov.l __syscall_trace, r11 ! Call syscall_trace() which notifies
  345. jsr @r11           ! superior (will chomp R[0-7])
  346.  nop
  347. ! Reload R0-R4 from kernel stack, where the
  348. !              parent may have modified them using
  349. !              ptrace(POKEUSR).  (Note that R0-R2 are
  350. !              used by the system call handler directly
  351. !              from the kernel stack anyway, so don't need
  352. !              to be reloaded here.)  This allows the parent
  353. !              to rewrite system calls and args on the fly.
  354. mov.l @(OFF_R4,r15), r4   ! arg0
  355. mov.l @(OFF_R5,r15), r5
  356. mov.l @(OFF_R6,r15), r6
  357. mov.l @(OFF_R7,r15), r7   ! arg3
  358. mov.l @(OFF_R3,r15), r3   ! syscall_nr
  359. !             Arrange for syscall_trace() to be called
  360. !             again as the system call returns.
  361. mov.l __syscall_ret_trace, r10
  362. bra 6f
  363.  lds r10, pr
  364. !             No it isn't traced.
  365. !             Arrange for normal system call return.
  366. 5: mov.l __syscall_ret, r10
  367. lds r10, pr
  368. !             Call the system call handler through the table.
  369. !             (both normal and ptrace'd)
  370. !             First check for bad syscall number
  371. 6: mov r3, r9
  372. mov.l __n_sys, r10
  373. cmp/hs r10, r9
  374. bf 2f
  375. !             Bad syscall number
  376. rts ! go to syscall_ret or syscall_ret_trace
  377.       mov #-ENOSYS, r0
  378. !             Good syscall number
  379. 2: shll2 r9 ! x4
  380. mov.l __sct, r11
  381. add r11, r9
  382. mov.l @r9, r11
  383. jmp @r11      ! jump to specific syscall handler
  384.  nop
  385. ! In case of trace
  386. syscall_ret_trace:
  387. mov.l r0, @(OFF_R0,r15) ! save the return value
  388. mov.l __syscall_trace, r1
  389. mova SYMBOL_NAME(ret_from_syscall), r0
  390. jmp @r1     ! Call syscall_trace() which notifies superior
  391.  lds r0, pr     ! Then return to ret_from_syscall()
  392. #ifdef COMPAT_OLD_SYSCALL_ABI
  393. ! Handle old ABI system call.
  394. ! Note that ptrace(SYSCALL) is not supported for the old ABI.
  395. ! At this point:
  396. !   r0, r4-7 as per ABI
  397. !   r8  = value of TRA register (= num_args<<2)
  398. !   r14 = points to SYSCALL_NR in stack frame
  399. old_abi_system_call:
  400. mov  r0, r9          ! Save system call number in r9
  401. !                   ! arrange for return which pops stack
  402. mov.l __old_abi_syscall_ret, r10
  403. lds r10, pr
  404. !   Build the stack frame if TRA > 0
  405. mov r8, r10
  406. cmp/pl r10
  407. bf 0f
  408. mov.l @(OFF_SP,r15), r0 ! get original user stack
  409. 7: add #-4, r10
  410. 4: mov.l @(r0,r10), r1 ! May cause address error exception..
  411. mov.l r1, @-r15
  412. cmp/pl r10
  413. bt 7b
  414. 0:
  415. mov.l r9, @r14      ! set syscall_nr
  416. STI()
  417. !             Call the system call handler through the table.
  418. !             First check for bad syscall number
  419. mov.l __n_sys, r10
  420. cmp/hs r10, r9
  421. bf 2f
  422. !             Bad syscall number
  423. rts ! return to old_abi_syscall_ret
  424.       mov #-ENOSYS, r0
  425. !             Good syscall number
  426. 2: shll2 r9 ! x4
  427. mov.l __sct, r11
  428. add r11, r9
  429. mov.l @r9, r11
  430. jmp @r11      ! call specific syscall handler,
  431.  nop
  432.      .align 2
  433. __old_abi_syscall_ret:
  434. .long old_abi_syscall_ret
  435.      ! This code gets called on address error exception when copying
  436. ! syscall arguments from user stack to kernel stack.  It is
  437. ! supposed to return -EINVAL through old_abi_syscall_ret, but it
  438. ! appears to have been broken for a long time in that the r0
  439. ! return value will be saved into the kernel stack relative to r15
  440. ! but the value of r15 is not correct partway through the loop.
  441. ! So the user prog is returned its old r0 value, not -EINVAL.
  442. ! Greg Banks 28 Aug 2000.
  443. .section .fixup,"ax"
  444. fixup_syscall_argerr:
  445.      ! First get r15 back to 
  446. rts
  447.       mov #-EINVAL, r0
  448.      .previous
  449. .section __ex_table, "a"
  450. .align 2
  451. .long 4b,fixup_syscall_argerr
  452.      .previous
  453. #endif
  454. .align 2
  455. __TRA: .long TRA
  456. __syscall_trace:
  457.      .long SYMBOL_NAME(syscall_trace)
  458. __n_sys:.long NR_syscalls
  459. __sct: .long SYMBOL_NAME(sys_call_table)
  460. __syscall_ret_trace:
  461. .long syscall_ret_trace
  462. __syscall_ret:
  463. .long syscall_ret
  464. __INV_IMASK:
  465. .long 0xffffff0f ! ~(IMASK)
  466. .align 2
  467. reschedule:
  468. mova SYMBOL_NAME(ret_from_syscall), r0
  469. mov.l 1f, r1
  470. jmp @r1
  471.  lds r0, pr
  472. .align 2
  473. 1: .long SYMBOL_NAME(schedule)
  474. ret_from_irq:
  475. ret_from_exception:
  476. mov #OFF_SR, r0
  477. mov.l @(r0,r15), r0 ! get status register
  478. shll r0
  479. shll r0 ! kernel space?
  480. bt restore_all ! Yes, it's from kernel, go back soon
  481. !
  482. bra ret_from_syscall
  483.  nop
  484. .align 2
  485. #ifdef COMPAT_OLD_SYSCALL_ABI
  486. old_abi_syscall_ret:
  487. add r8, r15 ! pop off the arguments
  488. /* fall through */
  489. #endif
  490. syscall_ret:
  491. mov.l r0, @(OFF_R0,r15) ! save the return value
  492. /* fall through */
  493. ENTRY(ret_from_syscall)
  494. /* CLI */
  495. stc sr, r0
  496. or #0xf0, r0
  497. ldc r0, sr
  498. !
  499. stc k_current, r1
  500. mov.l @(need_resched,r1), r0
  501. tst r0, r0
  502. bf reschedule
  503. mov.l @(sigpending,r1), r0
  504. tst r0, r0
  505. bt restore_all
  506. signal_return:
  507. mov r15, r4
  508. mov #0, r5
  509. mov.l __do_signal, r1
  510. mova restore_all, r0
  511. jmp @r1
  512.  lds r0, pr
  513. .align 2
  514. __do_signal:
  515. .long SYMBOL_NAME(do_signal)
  516. __irq_stat:
  517. .long SYMBOL_NAME(irq_stat)
  518. .align 2
  519. restore_all:
  520. #if defined(__SH4__)
  521. mov.l __fpu_prepare_fd, r0
  522. jsr @r0
  523.  stc sr, r4
  524. #endif
  525. !
  526. mov.l @r15+, r0
  527. mov.l @r15+, r1
  528. mov.l @r15+, r2
  529. mov.l @r15+, r3
  530. mov.l @r15+, r4
  531. mov.l @r15+, r5
  532. mov.l @r15+, r6
  533. mov.l @r15+, r7
  534. !
  535. stc sr, r8
  536. mov.l __blrb_flags, r9 ! BL =1, RB=1
  537. or r9, r8
  538. ldc r8, sr ! here, change the register bank
  539. !
  540. mov.l @r15+, r8
  541. mov.l @r15+, r9
  542. mov.l @r15+, r10
  543. mov.l @r15+, r11
  544. mov.l @r15+, r12
  545. mov.l @r15+, r13
  546. mov.l @r15+, r14
  547. mov.l @r15+, k4 ! original stack pointer
  548. ldc.l @r15+, spc
  549. lds.l @r15+, pr
  550. mov.l @r15+, k3 ! original SR
  551. ldc.l @r15+, gbr
  552. lds.l @r15+, mach
  553. lds.l @r15+, macl
  554. add #4, r15 ! Skip syscall number
  555. !
  556. ! Calculate new SR value
  557. mov k3, k2 ! original SR value
  558. mov.l 1f, k1
  559. stc sr, k0
  560. and k1, k0 ! Get current FD-bit
  561. mov.l 2f, k1
  562. and k1, k2 ! Mask orignal SR value
  563. or k0, k2 ! Inherit current FD-bit
  564. !
  565. mov k3, k0 ! Calculate IMASK-bits
  566. shlr2 k0
  567. and #0x3c, k0
  568. cmp/eq #0x3c, k0
  569. bt/s 7f
  570.  shll2 k0
  571. mov g_imask, k0
  572. !
  573. 7: or k0, k2 ! Set the IMASK-bits
  574. ldc k2, ssr
  575. !
  576. #if defined(__SH4__)
  577. shll k2
  578. shll k2
  579. bf 9f ! user mode
  580. /* Kernel to kernel transition */
  581. mov.l 1f, k1
  582. tst k1, k3
  583. bf 9f ! it hadn't FPU
  584. ! Kernel to kernel and FPU was used
  585. ! There's the case we don't get FPU now
  586. stc sr, k2
  587. tst k1, k2
  588. bt 8f
  589. ! We need to grab FPU here
  590. xor k1, k2
  591. ldc k2, sr ! Grab FPU
  592. mov.l __init_task_flags, k1
  593. mov.l @k1, k2
  594. mov.l __PF_USEDFPU, k0
  595. or k0, k2
  596. mov.l k2, @k1 ! Set init_task.flags |= PF_USEDFPU
  597. !
  598. ! Restoring FPU...
  599. !
  600. 8: mov.l 3f, k1
  601. lds k1, fpscr
  602. fmov.s @r15+, fr0
  603. fmov.s @r15+, fr1
  604. fmov.s @r15+, fr2
  605. fmov.s @r15+, fr3
  606. fmov.s @r15+, fr4
  607. fmov.s @r15+, fr5
  608. fmov.s @r15+, fr6
  609. fmov.s @r15+, fr7
  610. fmov.s @r15+, fr8
  611. fmov.s @r15+, fr9
  612. fmov.s @r15+, fr10
  613. fmov.s @r15+, fr11
  614. fmov.s @r15+, fr12
  615. fmov.s @r15+, fr13
  616. fmov.s @r15+, fr14
  617. fmov.s @r15+, fr15
  618. lds.l @r15+, fpscr
  619. lds.l @r15+, fpul
  620. 9:
  621. #endif
  622. mov k4, r15
  623. rte
  624.  nop
  625. .align 2
  626. __blrb_flags: .long 0x30000000
  627. #if defined(__SH4__)
  628. __fpu_prepare_fd:
  629. .long SYMBOL_NAME(fpu_prepare_fd)
  630. __init_task_flags:
  631. .long SYMBOL_NAME(init_task_union)+4
  632. __PF_USEDFPU:
  633. .long PF_USEDFPU
  634. #endif
  635. 1: .long 0x00008000 ! FD
  636. 2: .long 0xffff7f0f ! ~(IMASK+FD)
  637. 3: .long 0x00080000 ! SZ=0, PR=1
  638. ! Exception Vector Base
  639. !
  640. ! Should be aligned page boundary.
  641. !
  642. .balign  4096,0,4096
  643. ENTRY(vbr_base)
  644. .long 0
  645. !
  646. .balign  256,0,256
  647. general_exception:
  648. mov.l 1f, k2
  649. mov.l 2f, k3
  650. bra handle_exception
  651.  mov.l @k2, k2
  652. .align 2
  653. 2: .long ret_from_exception
  654. 1: .long EXPEVT
  655. !
  656. !
  657. .balign  1024,0,1024
  658. tlb_miss:
  659. mov.l 1f, k2
  660. mov.l 4f, k3
  661. bra handle_exception
  662.  mov.l @k2, k2
  663. !
  664. .balign  512,0,512
  665. interrupt:
  666. mov.l 2f, k2
  667. mov.l 3f, k3
  668. bra handle_exception
  669.  mov.l @k2, k2
  670. .align 2
  671. 1: .long EXPEVT
  672. 2: .long INTEVT
  673. 3: .long ret_from_irq
  674. 4: .long ret_from_exception
  675. !
  676. !
  677. handle_exception:
  678. ! Using k0, k1 for scratch registers (r0_bank1, r1_bank),
  679. ! save all registers onto stack.
  680. !
  681. stc ssr, k0 ! from kernel space?
  682. shll k0 ! Check MD bit (bit30) by shifting it into the T bit
  683. shll k0
  684. #if defined(__SH4__)
  685. bf/s 8f ! it's from user to kernel transition
  686.  mov r15, k0 ! save original stack to k0
  687. /* It's a kernel to kernel transition. */
  688. /* Is the FPU disabled? */
  689. mov.l 2f, k1
  690. stc ssr, k0
  691. tst k1, k0
  692. mov.l 4f, k1
  693. bf/s 9f ! FPU is not enabled, no need to save it
  694.  mov r15, k0 ! save original stack to k0
  695. ! FPU is enabled, save it
  696. ! /* XXX: Need to save another bank of FPU if all FPU feature is used */
  697. ! /* Currently it's not the case for GCC (only udivsi3_i4, divsi3_i4) */
  698. sts.l fpul,  @-r15
  699. sts.l fpscr, @-r15
  700. mov.l 6f, k1
  701. lds k1, fpscr
  702. mov.l 3f, k1
  703. fmov.s fr15, @-r15
  704. fmov.s fr14, @-r15
  705. fmov.s fr13, @-r15
  706. fmov.s fr12, @-r15
  707. fmov.s fr11, @-r15
  708. fmov.s fr10, @-r15
  709. fmov.s fr9, @-r15
  710. fmov.s fr8, @-r15
  711. fmov.s fr7, @-r15
  712. fmov.s fr6, @-r15
  713. fmov.s fr5, @-r15
  714. fmov.s fr4, @-r15
  715. fmov.s fr3, @-r15
  716. fmov.s fr2, @-r15
  717. fmov.s fr1, @-r15
  718. bra 9f
  719.  fmov.s fr0, @-r15
  720. #else
  721. mov.l 3f, k1
  722. bt/s 9f ! it's a kernel to kernel transition, and skip the FPU save.
  723.  mov r15, k0 ! save original stack to k0 anyway
  724. #endif
  725. 8: /* User space to kernel */
  726. mov #0x20, k1
  727. shll8 k1 ! k1 <= 8192 == THREAD_SIZE
  728. add current, k1
  729. mov k1, r15 ! change to kernel stack
  730. !
  731. mov.l 4f, k1 ! let kernel release FPU
  732. 9: ! Save the user registers on the stack.
  733. ! At this point, k1 should have been set to the new SR value
  734.    mov #-1, k4
  735. mov.l k4, @-r15 ! syscall_nr (default: -1)
  736. !
  737. sts.l macl, @-r15
  738. sts.l mach, @-r15
  739. stc.l gbr, @-r15
  740. stc.l ssr, @-r15
  741. sts.l pr, @-r15
  742. stc.l spc, @-r15
  743. !
  744. lds k3, pr ! Set the return address to pr
  745. !
  746. mov.l k0, @-r15 ! save orignal stack
  747. mov.l r14, @-r15
  748. mov.l r13, @-r15
  749. mov.l r12, @-r15
  750. mov.l r11, @-r15
  751. mov.l r10, @-r15
  752. mov.l r9, @-r15
  753. mov.l r8, @-r15
  754. !
  755. stc sr, r8 ! Back to normal register bank, and
  756. or k1, r8 ! Block all interrupts, may release FPU
  757. mov.l 5f, k1
  758. and k1, r8 ! ...
  759. ldc r8, sr ! ...changed here.
  760. !
  761. mov.l r7, @-r15
  762. mov.l r6, @-r15
  763. mov.l r5, @-r15
  764. mov.l r4, @-r15
  765. mov.l r3, @-r15
  766. mov.l r2, @-r15
  767. mov.l r1, @-r15
  768. mov.l r0, @-r15
  769. ! Then, dispatch to the handler, according to the exception code.
  770. stc k_ex_code, r8
  771. shlr2 r8
  772. shlr r8
  773. mov.l 1f, r9
  774. add r8, r9
  775. mov.l @r9, r9
  776. jmp @r9
  777.  nop
  778. .align 2
  779. 1: .long SYMBOL_NAME(exception_handling_table)
  780. 2: .long 0x00008000 ! FD=1
  781. 3: .long 0x000000f0 ! FD=0, IMASK=15
  782. 4: .long 0x000080f0 ! FD=1, IMASK=15
  783. 5: .long 0xcfffffff ! RB=0, BL=0
  784. 6: .long 0x00080000 ! SZ=0, PR=1
  785. none:
  786. rts
  787.  nop
  788. .data
  789. ENTRY(exception_handling_table)
  790. .long error
  791. .long error
  792. .long tlb_miss_load
  793. .long tlb_miss_store
  794. .long initial_page_write
  795. .long tlb_protection_violation_load
  796. .long tlb_protection_violation_store
  797. .long address_error_load
  798. .long address_error_store
  799. #if defined(__SH4__)
  800. .long SYMBOL_NAME(do_fpu_error)
  801. #else
  802. .long error ! fpu_exception
  803. #endif
  804. .long error
  805. .long system_call ! Unconditional Trap
  806. .long error ! reserved_instruction      (filled by trap_init)
  807. .long error ! illegal_slot_instruction  (filled by trap_init)
  808. ENTRY(nmi_slot)
  809. .long none ! Not implemented yet
  810. ENTRY(user_break_point_trap)
  811. .long break_point_trap
  812. ENTRY(interrupt_table)
  813. ! external hardware
  814. .long SYMBOL_NAME(do_IRQ) ! 0000
  815. .long SYMBOL_NAME(do_IRQ) ! 0001
  816. .long SYMBOL_NAME(do_IRQ) ! 0010
  817. .long SYMBOL_NAME(do_IRQ) ! 0011
  818. .long SYMBOL_NAME(do_IRQ) ! 0100
  819. .long SYMBOL_NAME(do_IRQ) ! 0101
  820. .long SYMBOL_NAME(do_IRQ) ! 0110
  821. .long SYMBOL_NAME(do_IRQ) ! 0111
  822. .long SYMBOL_NAME(do_IRQ) ! 1000
  823. .long SYMBOL_NAME(do_IRQ) ! 1001
  824. .long SYMBOL_NAME(do_IRQ) ! 1010
  825. .long SYMBOL_NAME(do_IRQ) ! 1011
  826. .long SYMBOL_NAME(do_IRQ) ! 1100
  827. .long SYMBOL_NAME(do_IRQ) ! 1101
  828. .long SYMBOL_NAME(do_IRQ) ! 1110
  829. .long error
  830. ! Internal hardware
  831. .long SYMBOL_NAME(do_IRQ) ! TMU0 tuni0
  832. .long SYMBOL_NAME(do_IRQ) ! TMU1 tuni1
  833. .long SYMBOL_NAME(do_IRQ) ! TMU2 tuni2
  834. .long SYMBOL_NAME(do_IRQ) !      ticpi2
  835. .long SYMBOL_NAME(do_IRQ) ! RTC  ati
  836. .long SYMBOL_NAME(do_IRQ) !      pri
  837. .long SYMBOL_NAME(do_IRQ) !      cui
  838. .long SYMBOL_NAME(do_IRQ) ! SCI  eri
  839. .long SYMBOL_NAME(do_IRQ) !      rxi
  840. .long SYMBOL_NAME(do_IRQ) !      txi
  841. .long SYMBOL_NAME(do_IRQ) !      tei
  842. .long SYMBOL_NAME(do_IRQ) ! WDT  iti
  843. .long SYMBOL_NAME(do_IRQ) ! REF  rcmi
  844. .long SYMBOL_NAME(do_IRQ) !      rovi
  845. .long SYMBOL_NAME(do_IRQ)
  846. .long SYMBOL_NAME(do_IRQ)
  847. #if  defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709)
  848. .long SYMBOL_NAME(do_IRQ) ! 32 IRQ  irq0
  849. .long SYMBOL_NAME(do_IRQ) ! 33      irq1
  850. .long SYMBOL_NAME(do_IRQ) ! 34      irq2
  851. .long SYMBOL_NAME(do_IRQ) ! 35      irq3
  852. .long SYMBOL_NAME(do_IRQ) ! 36      irq4
  853. .long SYMBOL_NAME(do_IRQ) ! 37      irq5
  854. .long SYMBOL_NAME(do_IRQ) ! 38
  855. .long SYMBOL_NAME(do_IRQ) ! 39
  856. .long SYMBOL_NAME(do_IRQ) ! 40 PINT pint0-7
  857. .long SYMBOL_NAME(do_IRQ) ! 41      pint8-15
  858. .long SYMBOL_NAME(do_IRQ) ! 42
  859. .long SYMBOL_NAME(do_IRQ) ! 43
  860. .long SYMBOL_NAME(do_IRQ) ! 44
  861. .long SYMBOL_NAME(do_IRQ) ! 45
  862. .long SYMBOL_NAME(do_IRQ) ! 46
  863. .long SYMBOL_NAME(do_IRQ) ! 47
  864. .long SYMBOL_NAME(do_IRQ) ! 48 DMAC dei0
  865. .long SYMBOL_NAME(do_IRQ) ! 49      dei1
  866. .long SYMBOL_NAME(do_IRQ) ! 50      dei2
  867. .long SYMBOL_NAME(do_IRQ) ! 51      dei3
  868. .long SYMBOL_NAME(do_IRQ) ! 52 IrDA eri1
  869. .long SYMBOL_NAME(do_IRQ) ! 53      rxi1
  870. .long SYMBOL_NAME(do_IRQ) ! 54      bri1
  871. .long SYMBOL_NAME(do_IRQ) ! 55      txi1
  872. .long SYMBOL_NAME(do_IRQ) ! 56 SCIF eri2
  873. .long SYMBOL_NAME(do_IRQ) ! 57      rxi2
  874. .long SYMBOL_NAME(do_IRQ) ! 58      bri2
  875. .long SYMBOL_NAME(do_IRQ) ! 59      txi2
  876. .long SYMBOL_NAME(do_IRQ) ! 60 ADC  adi
  877. #if defined(CONFIG_CPU_SUBTYPE_SH7707)
  878. .long   SYMBOL_NAME(do_IRQ) ! 61 LCDC lcdi
  879. .long   SYMBOL_NAME(do_IRQ) ! 62 PCC  pcc0i
  880. .long   SYMBOL_NAME(do_IRQ) ! 63      pcc1i
  881. #endif
  882. #elif defined(__SH4__)
  883. .long SYMBOL_NAME(do_IRQ) ! 32 Hitachi UDI
  884. .long SYMBOL_NAME(do_IRQ) ! 33 GPIO
  885. .long SYMBOL_NAME(do_IRQ) ! 34 DMAC dmte0
  886. .long SYMBOL_NAME(do_IRQ) ! 35      dmte1
  887. .long SYMBOL_NAME(do_IRQ) ! 36      dmte2
  888. .long SYMBOL_NAME(do_IRQ) ! 37      dmte3
  889. .long SYMBOL_NAME(do_IRQ) ! 38      dmae
  890. .long error ! 39
  891. .long SYMBOL_NAME(do_IRQ) ! 40 SCIF eri
  892. .long SYMBOL_NAME(do_IRQ) ! 41      rxi
  893. .long SYMBOL_NAME(do_IRQ) ! 42      bri
  894. .long SYMBOL_NAME(do_IRQ) ! 43      txi
  895. .long error ! 44
  896. .long error ! 45
  897. .long error ! 46
  898. .long error ! 47
  899. .long SYMBOL_NAME(do_fpu_state_restore) ! 48
  900. .long SYMBOL_NAME(do_fpu_state_restore) ! 49
  901. #endif
  902. #if defined(CONFIG_CPU_SUBTYPE_SH7751)
  903. .long error
  904. .long error
  905. .long error
  906. .long error
  907. .long error
  908. .long error
  909. .long error
  910. .long error
  911. .long error
  912. .long error
  913. .long error
  914. .long error
  915. .long error
  916. .long error
  917. .long SYMBOL_NAME(do_IRQ) ! PCI serr
  918. .long SYMBOL_NAME(do_IRQ) !     dma3
  919. .long SYMBOL_NAME(do_IRQ) !     dma2
  920. .long SYMBOL_NAME(do_IRQ) !     dma1
  921. .long SYMBOL_NAME(do_IRQ) !     dma0
  922. .long SYMBOL_NAME(do_IRQ) !     pwon
  923. .long SYMBOL_NAME(do_IRQ) !     pwdwn
  924. .long SYMBOL_NAME(do_IRQ) !     err
  925. #elif defined(CONFIG_CPU_SUBTYPE_ST40STB1)
  926. .long error !  50 0x840
  927. .long error !  51 0x860
  928. .long error !  52 0x880
  929. .long error !  53 0x8a0
  930. .long error !  54 0x8c0
  931. .long error !  55 0x8e0
  932. .long error !  56 0x900
  933. .long error !  57 0x920
  934. .long error !  58 0x940
  935. .long error !  59 0x960
  936. .long error !  60 0x980
  937. .long error !  61 0x9a0
  938. .long error !  62 0x9c0
  939. .long error !  63 0x9e0
  940. .long SYMBOL_NAME(do_IRQ) !  64 0xa00 PCI serr
  941. .long SYMBOL_NAME(do_IRQ) !  65 0xa20     err
  942. .long SYMBOL_NAME(do_IRQ) !  66 0xa40     ad
  943. .long SYMBOL_NAME(do_IRQ) !  67 0xa60     pwr_dwn
  944. .long error !  68 0xa80
  945. .long error !  69 0xaa0
  946. .long error !  70 0xac0
  947. .long error !  71 0xae0
  948. .long SYMBOL_NAME(do_IRQ) !  72 0xb00 DMA INT0
  949. .long SYMBOL_NAME(do_IRQ) !  73 0xb20     INT1
  950. .long SYMBOL_NAME(do_IRQ) !  74 0xb40     INT2
  951. .long SYMBOL_NAME(do_IRQ) !  75 0xb60     INT3
  952. .long SYMBOL_NAME(do_IRQ) !  76 0xb80     INT4
  953. .long error !  77 0xba0
  954. .long SYMBOL_NAME(do_IRQ) !  78 0xbc0 DMA ERR
  955. .long error !  79 0xbe0
  956. .long SYMBOL_NAME(do_IRQ) !  80 0xc00 PIO0
  957. .long SYMBOL_NAME(do_IRQ) !  81 0xc20 PIO1
  958. .long SYMBOL_NAME(do_IRQ) !  82 0xc40 PIO2
  959. .long error !  83 0xc60
  960. .long error !  84 0xc80
  961. .long error !  85 0xca0
  962. .long error !  86 0xcc0
  963. .long error !  87 0xce0
  964. .long error !  88 0xd00
  965. .long error !  89 0xd20
  966. .long error !  90 0xd40
  967. .long error !  91 0xd60
  968. .long error !  92 0xd80
  969. .long error !  93 0xda0
  970. .long error !  94 0xdc0
  971. .long error !  95 0xde0
  972. .long error !  96 0xe00
  973. .long error !  97 0xe20
  974. .long error !  98 0xe40
  975. .long error !  99 0xe60
  976. .long error ! 100 0xe80
  977. .long error ! 101 0xea0
  978. .long error ! 102 0xec0
  979. .long error ! 103 0xee0
  980. .long error ! 104 0xf00
  981. .long error ! 105 0xf20
  982. .long error ! 106 0xf40
  983. .long error ! 107 0xf60
  984. .long error ! 108 0xf80
  985. .long error ! 109 0xfa0
  986. .long error ! 110 0xfc0
  987. .long error ! 111 0xfe0
  988. .long SYMBOL_NAME(do_IRQ) ! 112 0x1000 Mailbox
  989. .long error ! 113 0x1020
  990. .long error ! 114 0x1040
  991. .long error ! 115 0x1060
  992. .long error ! 116 0x1080
  993. .long error ! 117 0x10a0
  994. .long error ! 118 0x10c0
  995. .long error ! 119 0x10e0
  996. .long error ! 120 0x1100
  997. .long error ! 121 0x1120
  998. .long error ! 122 0x1140
  999. .long error ! 123 0x1160
  1000. .long error ! 124 0x1180
  1001. .long error ! 125 0x11a0
  1002. .long error ! 126 0x11c0
  1003. .long error ! 127 0x11e0
  1004. .long error ! 128 0x1200
  1005. .long error ! 129 0x1220
  1006. .long error ! 130 0x1240
  1007. .long error ! 131 0x1260
  1008. .long error ! 132 0x1280
  1009. .long error ! 133 0x12a0
  1010. .long error ! 134 0x12c0
  1011. .long error ! 135 0x12e0
  1012. .long error ! 136 0x1300
  1013. .long error ! 137 0x1320
  1014. .long error ! 138 0x1340
  1015. .long error ! 139 0x1360
  1016. .long SYMBOL_NAME(do_IRQ) ! 140 0x1380 EMPI INV_ADDR
  1017. .long error ! 141 0x13a0
  1018. .long error ! 142 0x13c0
  1019. .long error ! 143 0x13e0
  1020. #endif
  1021. ENTRY(sys_call_table)
  1022. .long SYMBOL_NAME(sys_ni_syscall) /* 0  -  old "setup()" system call*/
  1023. .long SYMBOL_NAME(sys_exit)
  1024. .long SYMBOL_NAME(sys_fork)
  1025. .long SYMBOL_NAME(sys_read)
  1026. .long SYMBOL_NAME(sys_write)
  1027. .long SYMBOL_NAME(sys_open) /* 5 */
  1028. .long SYMBOL_NAME(sys_close)
  1029. .long SYMBOL_NAME(sys_waitpid)
  1030. .long SYMBOL_NAME(sys_creat)
  1031. .long SYMBOL_NAME(sys_link)
  1032. .long SYMBOL_NAME(sys_unlink) /* 10 */
  1033. .long SYMBOL_NAME(sys_execve)
  1034. .long SYMBOL_NAME(sys_chdir)
  1035. .long SYMBOL_NAME(sys_time)
  1036. .long SYMBOL_NAME(sys_mknod)
  1037. .long SYMBOL_NAME(sys_chmod) /* 15 */
  1038. .long SYMBOL_NAME(sys_lchown16)
  1039. .long SYMBOL_NAME(sys_ni_syscall) /* old break syscall holder */
  1040. .long SYMBOL_NAME(sys_stat)
  1041. .long SYMBOL_NAME(sys_lseek)
  1042. .long SYMBOL_NAME(sys_getpid) /* 20 */
  1043. .long SYMBOL_NAME(sys_mount)
  1044. .long SYMBOL_NAME(sys_oldumount)
  1045. .long SYMBOL_NAME(sys_setuid16)
  1046. .long SYMBOL_NAME(sys_getuid16)
  1047. .long SYMBOL_NAME(sys_stime) /* 25 */
  1048. .long SYMBOL_NAME(sys_ptrace)
  1049. .long SYMBOL_NAME(sys_alarm)
  1050. .long SYMBOL_NAME(sys_fstat)
  1051. .long SYMBOL_NAME(sys_pause)
  1052. .long SYMBOL_NAME(sys_utime) /* 30 */
  1053. .long SYMBOL_NAME(sys_ni_syscall) /* old stty syscall holder */
  1054. .long SYMBOL_NAME(sys_ni_syscall) /* old gtty syscall holder */
  1055. .long SYMBOL_NAME(sys_access)
  1056. .long SYMBOL_NAME(sys_nice)
  1057. .long SYMBOL_NAME(sys_ni_syscall) /* 35 */ /* old ftime syscall holder */
  1058. .long SYMBOL_NAME(sys_sync)
  1059. .long SYMBOL_NAME(sys_kill)
  1060. .long SYMBOL_NAME(sys_rename)
  1061. .long SYMBOL_NAME(sys_mkdir)
  1062. .long SYMBOL_NAME(sys_rmdir) /* 40 */
  1063. .long SYMBOL_NAME(sys_dup)
  1064. .long SYMBOL_NAME(sys_pipe)
  1065. .long SYMBOL_NAME(sys_times)
  1066. .long SYMBOL_NAME(sys_ni_syscall) /* old prof syscall holder */
  1067. .long SYMBOL_NAME(sys_brk) /* 45 */
  1068. .long SYMBOL_NAME(sys_setgid16)
  1069. .long SYMBOL_NAME(sys_getgid16)
  1070. .long SYMBOL_NAME(sys_signal)
  1071. .long SYMBOL_NAME(sys_geteuid16)
  1072. .long SYMBOL_NAME(sys_getegid16) /* 50 */
  1073. .long SYMBOL_NAME(sys_acct)
  1074. .long SYMBOL_NAME(sys_umount) /* recycled never used phys() */
  1075. .long SYMBOL_NAME(sys_ni_syscall) /* old lock syscall holder */
  1076. .long SYMBOL_NAME(sys_ioctl)
  1077. .long SYMBOL_NAME(sys_fcntl) /* 55 */
  1078. .long SYMBOL_NAME(sys_ni_syscall) /* old mpx syscall holder */
  1079. .long SYMBOL_NAME(sys_setpgid)
  1080. .long SYMBOL_NAME(sys_ni_syscall) /* old ulimit syscall holder */
  1081. .long SYMBOL_NAME(sys_ni_syscall) /* sys_olduname */
  1082. .long SYMBOL_NAME(sys_umask) /* 60 */
  1083. .long SYMBOL_NAME(sys_chroot)
  1084. .long SYMBOL_NAME(sys_ustat)
  1085. .long SYMBOL_NAME(sys_dup2)
  1086. .long SYMBOL_NAME(sys_getppid)
  1087. .long SYMBOL_NAME(sys_getpgrp) /* 65 */
  1088. .long SYMBOL_NAME(sys_setsid)
  1089. .long SYMBOL_NAME(sys_sigaction)
  1090. .long SYMBOL_NAME(sys_sgetmask)
  1091. .long SYMBOL_NAME(sys_ssetmask)
  1092. .long SYMBOL_NAME(sys_setreuid16) /* 70 */
  1093. .long SYMBOL_NAME(sys_setregid16)
  1094. .long SYMBOL_NAME(sys_sigsuspend)
  1095. .long SYMBOL_NAME(sys_sigpending)
  1096. .long SYMBOL_NAME(sys_sethostname)
  1097. .long SYMBOL_NAME(sys_setrlimit) /* 75 */
  1098. .long SYMBOL_NAME(sys_old_getrlimit)
  1099. .long SYMBOL_NAME(sys_getrusage)
  1100. .long SYMBOL_NAME(sys_gettimeofday)
  1101. .long SYMBOL_NAME(sys_settimeofday)
  1102. .long SYMBOL_NAME(sys_getgroups16) /* 80 */
  1103. .long SYMBOL_NAME(sys_setgroups16)
  1104. .long SYMBOL_NAME(sys_ni_syscall) /* sys_oldselect */
  1105. .long SYMBOL_NAME(sys_symlink)
  1106. .long SYMBOL_NAME(sys_lstat)
  1107. .long SYMBOL_NAME(sys_readlink) /* 85 */
  1108. .long SYMBOL_NAME(sys_uselib)
  1109. .long SYMBOL_NAME(sys_swapon)
  1110. .long SYMBOL_NAME(sys_reboot)
  1111. .long SYMBOL_NAME(old_readdir)
  1112. .long SYMBOL_NAME(old_mmap) /* 90 */
  1113. .long SYMBOL_NAME(sys_munmap)
  1114. .long SYMBOL_NAME(sys_truncate)
  1115. .long SYMBOL_NAME(sys_ftruncate)
  1116. .long SYMBOL_NAME(sys_fchmod)
  1117. .long SYMBOL_NAME(sys_fchown16) /* 95 */
  1118. .long SYMBOL_NAME(sys_getpriority)
  1119. .long SYMBOL_NAME(sys_setpriority)
  1120. .long SYMBOL_NAME(sys_ni_syscall) /* old profil syscall holder */
  1121. .long SYMBOL_NAME(sys_statfs)
  1122. .long SYMBOL_NAME(sys_fstatfs) /* 100 */
  1123. .long SYMBOL_NAME(sys_ni_syscall) /* ioperm */
  1124. .long SYMBOL_NAME(sys_socketcall)
  1125. .long SYMBOL_NAME(sys_syslog)
  1126. .long SYMBOL_NAME(sys_setitimer)
  1127. .long SYMBOL_NAME(sys_getitimer) /* 105 */
  1128. .long SYMBOL_NAME(sys_newstat)
  1129. .long SYMBOL_NAME(sys_newlstat)
  1130. .long SYMBOL_NAME(sys_newfstat)
  1131. .long SYMBOL_NAME(sys_uname)
  1132. .long SYMBOL_NAME(sys_ni_syscall) /* 110 */ /* iopl */
  1133. .long SYMBOL_NAME(sys_vhangup)
  1134. .long SYMBOL_NAME(sys_ni_syscall) /* idle */
  1135. .long SYMBOL_NAME(sys_ni_syscall) /* vm86old */
  1136. .long SYMBOL_NAME(sys_wait4)
  1137. .long SYMBOL_NAME(sys_swapoff) /* 115 */
  1138. .long SYMBOL_NAME(sys_sysinfo)
  1139. .long SYMBOL_NAME(sys_ipc)
  1140. .long SYMBOL_NAME(sys_fsync)
  1141. .long SYMBOL_NAME(sys_sigreturn)
  1142. .long SYMBOL_NAME(sys_clone) /* 120 */
  1143. .long SYMBOL_NAME(sys_setdomainname)
  1144. .long SYMBOL_NAME(sys_newuname)
  1145. .long SYMBOL_NAME(sys_ni_syscall) /* sys_modify_ldt */
  1146. .long SYMBOL_NAME(sys_adjtimex)
  1147. .long SYMBOL_NAME(sys_mprotect) /* 125 */
  1148. .long SYMBOL_NAME(sys_sigprocmask)
  1149. .long SYMBOL_NAME(sys_create_module)
  1150. .long SYMBOL_NAME(sys_init_module)
  1151. .long SYMBOL_NAME(sys_delete_module)
  1152. .long SYMBOL_NAME(sys_get_kernel_syms) /* 130 */
  1153. .long SYMBOL_NAME(sys_quotactl)
  1154. .long SYMBOL_NAME(sys_getpgid)
  1155. .long SYMBOL_NAME(sys_fchdir)
  1156. .long SYMBOL_NAME(sys_bdflush)
  1157. .long SYMBOL_NAME(sys_sysfs) /* 135 */
  1158. .long SYMBOL_NAME(sys_personality)
  1159. .long SYMBOL_NAME(sys_ni_syscall) /* for afs_syscall */
  1160. .long SYMBOL_NAME(sys_setfsuid16)
  1161. .long SYMBOL_NAME(sys_setfsgid16)
  1162. .long SYMBOL_NAME(sys_llseek) /* 140 */
  1163. .long SYMBOL_NAME(sys_getdents)
  1164. .long SYMBOL_NAME(sys_select)
  1165. .long SYMBOL_NAME(sys_flock)
  1166. .long SYMBOL_NAME(sys_msync)
  1167. .long SYMBOL_NAME(sys_readv) /* 145 */
  1168. .long SYMBOL_NAME(sys_writev)
  1169. .long SYMBOL_NAME(sys_getsid)
  1170. .long SYMBOL_NAME(sys_fdatasync)
  1171. .long SYMBOL_NAME(sys_sysctl)
  1172. .long SYMBOL_NAME(sys_mlock) /* 150 */
  1173. .long SYMBOL_NAME(sys_munlock)
  1174. .long SYMBOL_NAME(sys_mlockall)
  1175. .long SYMBOL_NAME(sys_munlockall)
  1176. .long SYMBOL_NAME(sys_sched_setparam)
  1177. .long SYMBOL_NAME(sys_sched_getparam)   /* 155 */
  1178. .long SYMBOL_NAME(sys_sched_setscheduler)
  1179. .long SYMBOL_NAME(sys_sched_getscheduler)
  1180. .long SYMBOL_NAME(sys_sched_yield)
  1181. .long SYMBOL_NAME(sys_sched_get_priority_max)
  1182. .long SYMBOL_NAME(sys_sched_get_priority_min)  /* 160 */
  1183. .long SYMBOL_NAME(sys_sched_rr_get_interval)
  1184. .long SYMBOL_NAME(sys_nanosleep)
  1185. .long SYMBOL_NAME(sys_mremap)
  1186. .long SYMBOL_NAME(sys_setresuid16)
  1187. .long SYMBOL_NAME(sys_getresuid16) /* 165 */
  1188. .long SYMBOL_NAME(sys_ni_syscall) /* vm86 */
  1189. .long SYMBOL_NAME(sys_query_module)
  1190. .long SYMBOL_NAME(sys_poll)
  1191. .long SYMBOL_NAME(sys_nfsservctl)
  1192. .long SYMBOL_NAME(sys_setresgid16) /* 170 */
  1193. .long SYMBOL_NAME(sys_getresgid16)
  1194. .long SYMBOL_NAME(sys_prctl)
  1195. .long SYMBOL_NAME(sys_rt_sigreturn)
  1196. .long SYMBOL_NAME(sys_rt_sigaction)
  1197. .long SYMBOL_NAME(sys_rt_sigprocmask) /* 175 */
  1198. .long SYMBOL_NAME(sys_rt_sigpending)
  1199. .long SYMBOL_NAME(sys_rt_sigtimedwait)
  1200. .long SYMBOL_NAME(sys_rt_sigqueueinfo)
  1201. .long SYMBOL_NAME(sys_rt_sigsuspend)
  1202. .long SYMBOL_NAME(sys_pread) /* 180 */
  1203. .long SYMBOL_NAME(sys_pwrite)
  1204. .long SYMBOL_NAME(sys_chown16)
  1205. .long SYMBOL_NAME(sys_getcwd)
  1206. .long SYMBOL_NAME(sys_capget)
  1207. .long SYMBOL_NAME(sys_capset)           /* 185 */
  1208. .long SYMBOL_NAME(sys_sigaltstack)
  1209. .long SYMBOL_NAME(sys_sendfile)
  1210. .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
  1211. .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
  1212. .long SYMBOL_NAME(sys_vfork)            /* 190 */
  1213. .long SYMBOL_NAME(sys_getrlimit)
  1214. .long SYMBOL_NAME(sys_mmap2)
  1215. .long SYMBOL_NAME(sys_truncate64)
  1216. .long SYMBOL_NAME(sys_ftruncate64)
  1217. .long SYMBOL_NAME(sys_stat64) /* 195 */
  1218. .long SYMBOL_NAME(sys_lstat64)
  1219. .long SYMBOL_NAME(sys_fstat64)
  1220. .long SYMBOL_NAME(sys_lchown)
  1221. .long SYMBOL_NAME(sys_getuid)
  1222. .long SYMBOL_NAME(sys_getgid) /* 200 */
  1223. .long SYMBOL_NAME(sys_geteuid)
  1224. .long SYMBOL_NAME(sys_getegid)
  1225. .long SYMBOL_NAME(sys_setreuid)
  1226. .long SYMBOL_NAME(sys_setregid)
  1227. .long SYMBOL_NAME(sys_getgroups) /* 205 */
  1228. .long SYMBOL_NAME(sys_setgroups)
  1229. .long SYMBOL_NAME(sys_fchown)
  1230. .long SYMBOL_NAME(sys_setresuid)
  1231. .long SYMBOL_NAME(sys_getresuid)
  1232. .long SYMBOL_NAME(sys_setresgid) /* 210 */
  1233. .long SYMBOL_NAME(sys_getresgid)
  1234. .long SYMBOL_NAME(sys_chown)
  1235. .long SYMBOL_NAME(sys_setuid)
  1236. .long SYMBOL_NAME(sys_setgid)
  1237. .long SYMBOL_NAME(sys_setfsuid) /* 215 */
  1238. .long SYMBOL_NAME(sys_setfsgid)
  1239. .long SYMBOL_NAME(sys_pivot_root)
  1240. .long SYMBOL_NAME(sys_mincore)
  1241. .long SYMBOL_NAME(sys_madvise)
  1242. .long SYMBOL_NAME(sys_getdents64) /* 220 */
  1243. .long SYMBOL_NAME(sys_fcntl64)
  1244. /*
  1245.  * NOTE!! This doesn't have to be exact - we just have
  1246.  * to make sure we have _enough_ of the "sys_ni_syscall"
  1247.  * entries. Don't panic if you notice that this hasn't
  1248.  * been shrunk every time we add a new system call.
  1249.  */
  1250. .rept NR_syscalls-221
  1251. .long SYMBOL_NAME(sys_ni_syscall)
  1252. .endr
  1253. /* End of entry.S */