entry.S 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. /*
  2. * linux/arch/m32r/kernel/entry.S
  3. *
  4. * Copyright (c) 2001, 2002 Hirokazu Takata, Hitoshi Yamamoto, H. Kondo
  5. * Copyright (c) 2003 Hitoshi Yamamoto
  6. * Copyright (c) 2004 Hirokazu Takata <takata at linux-m32r.org>
  7. *
  8. * Taken from i386 version.
  9. * Copyright (C) 1991, 1992 Linus Torvalds
  10. */
  11. /*
  12. * entry.S contains the system-call and fault low-level handling routines.
  13. * This also contains the timer-interrupt handler, as well as all interrupts
  14. * and faults that can result in a task-switch.
  15. *
  16. * NOTE: This code handles signal-recognition, which happens every time
  17. * after a timer-interrupt and after each system call.
  18. *
  19. * Stack layout in 'ret_from_system_call':
  20. * ptrace needs to have all regs on the stack.
  21. * if the order here is changed, it needs to be
  22. * updated in fork.c:copy_process, signal.c:do_signal,
  23. * ptrace.c and ptrace.h
  24. *
  25. * M32Rx/M32R2 M32R
  26. * @(sp) - r4 ditto
  27. * @(0x04,sp) - r5 ditto
  28. * @(0x08,sp) - r6 ditto
  29. * @(0x0c,sp) - *pt_regs ditto
  30. * @(0x10,sp) - r0 ditto
  31. * @(0x14,sp) - r1 ditto
  32. * @(0x18,sp) - r2 ditto
  33. * @(0x1c,sp) - r3 ditto
  34. * @(0x20,sp) - r7 ditto
  35. * @(0x24,sp) - r8 ditto
  36. * @(0x28,sp) - r9 ditto
  37. * @(0x2c,sp) - r10 ditto
  38. * @(0x30,sp) - r11 ditto
  39. * @(0x34,sp) - r12 ditto
  40. * @(0x38,sp) - syscall_nr ditto
  41. * @(0x3c,sp) - acc0h @(0x3c,sp) - acch
  42. * @(0x40,sp) - acc0l @(0x40,sp) - accl
  43. * @(0x44,sp) - acc1h @(0x44,sp) - psw
  44. * @(0x48,sp) - acc1l @(0x48,sp) - bpc
  45. * @(0x4c,sp) - psw @(0x4c,sp) - bbpsw
  46. * @(0x50,sp) - bpc @(0x50,sp) - bbpc
  47. * @(0x54,sp) - bbpsw @(0x54,sp) - spu (cr3)
  48. * @(0x58,sp) - bbpc @(0x58,sp) - fp (r13)
  49. * @(0x5c,sp) - spu (cr3) @(0x5c,sp) - lr (r14)
  50. * @(0x60,sp) - fp (r13) @(0x60,sp) - spi (cr12)
  51. * @(0x64,sp) - lr (r14) @(0x64,sp) - orig_r0
  52. * @(0x68,sp) - spi (cr2)
  53. * @(0x6c,sp) - orig_r0
  54. *
  55. */
  56. #include <linux/config.h>
  57. #include <linux/linkage.h>
  58. #include <asm/irq.h>
  59. #include <asm/unistd.h>
  60. #include <asm/assembler.h>
  61. #include <asm/thread_info.h>
  62. #include <asm/errno.h>
  63. #include <asm/segment.h>
  64. #include <asm/smp.h>
  65. #include <asm/page.h>
  66. #include <asm/m32r.h>
  67. #include <asm/mmu_context.h>
  68. #if !defined(CONFIG_MMU)
  69. #define sys_madvise sys_ni_syscall
  70. #define sys_readahead sys_ni_syscall
  71. #define sys_mprotect sys_ni_syscall
  72. #define sys_msync sys_ni_syscall
  73. #define sys_mlock sys_ni_syscall
  74. #define sys_munlock sys_ni_syscall
  75. #define sys_mlockall sys_ni_syscall
  76. #define sys_munlockall sys_ni_syscall
  77. #define sys_mremap sys_ni_syscall
  78. #define sys_mincore sys_ni_syscall
  79. #define sys_remap_file_pages sys_ni_syscall
  80. #endif /* CONFIG_MMU */
  81. #define R4(reg) @reg
  82. #define R5(reg) @(0x04,reg)
  83. #define R6(reg) @(0x08,reg)
  84. #define PTREGS(reg) @(0x0C,reg)
  85. #define R0(reg) @(0x10,reg)
  86. #define R1(reg) @(0x14,reg)
  87. #define R2(reg) @(0x18,reg)
  88. #define R3(reg) @(0x1C,reg)
  89. #define R7(reg) @(0x20,reg)
  90. #define R8(reg) @(0x24,reg)
  91. #define R9(reg) @(0x28,reg)
  92. #define R10(reg) @(0x2C,reg)
  93. #define R11(reg) @(0x30,reg)
  94. #define R12(reg) @(0x34,reg)
  95. #define SYSCALL_NR(reg) @(0x38,reg)
  96. #if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
  97. #define ACC0H(reg) @(0x3C,reg)
  98. #define ACC0L(reg) @(0x40,reg)
  99. #define ACC1H(reg) @(0x44,reg)
  100. #define ACC1L(reg) @(0x48,reg)
  101. #define PSW(reg) @(0x4C,reg)
  102. #define BPC(reg) @(0x50,reg)
  103. #define BBPSW(reg) @(0x54,reg)
  104. #define BBPC(reg) @(0x58,reg)
  105. #define SPU(reg) @(0x5C,reg)
  106. #define FP(reg) @(0x60,reg) /* FP = R13 */
  107. #define LR(reg) @(0x64,reg)
  108. #define SP(reg) @(0x68,reg)
  109. #define ORIG_R0(reg) @(0x6C,reg)
  110. #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
  111. #define ACCH(reg) @(0x3C,reg)
  112. #define ACCL(reg) @(0x40,reg)
  113. #define PSW(reg) @(0x44,reg)
  114. #define BPC(reg) @(0x48,reg)
  115. #define BBPSW(reg) @(0x4C,reg)
  116. #define BBPC(reg) @(0x50,reg)
  117. #define SPU(reg) @(0x54,reg)
  118. #define FP(reg) @(0x58,reg) /* FP = R13 */
  119. #define LR(reg) @(0x5C,reg)
  120. #define SP(reg) @(0x60,reg)
  121. #define ORIG_R0(reg) @(0x64,reg)
  122. #else
  123. #error unknown isa configuration
  124. #endif
  125. CF_MASK = 0x00000001
  126. TF_MASK = 0x00000100
  127. IF_MASK = 0x00000200
  128. DF_MASK = 0x00000400
  129. NT_MASK = 0x00004000
  130. VM_MASK = 0x00020000
  131. #ifdef CONFIG_PREEMPT
  132. #define preempt_stop(x) CLI(x)
  133. #else
  134. #define preempt_stop(x)
  135. #define resume_kernel restore_all
  136. #endif
  137. ENTRY(ret_from_fork)
  138. ld r0, @sp+
  139. bl schedule_tail
  140. GET_THREAD_INFO(r8)
  141. bra syscall_exit
  142. /*
  143. * Return to user mode is not as complex as all this looks,
  144. * but we want the default path for a system call return to
  145. * go as quickly as possible which is why some of this is
  146. * less clear than it otherwise should be.
  147. */
  148. ; userspace resumption stub bypassing syscall exit tracing
  149. ALIGN
  150. ret_from_exception:
  151. preempt_stop(r4)
  152. ret_from_intr:
  153. ld r4, PSW(sp)
  154. #ifdef CONFIG_ISA_M32R2
  155. and3 r4, r4, #0x8800 ; check BSM and BPM bits
  156. #else
  157. and3 r4, r4, #0x8000 ; check BSM bit
  158. #endif
  159. beqz r4, resume_kernel
  160. ENTRY(resume_userspace)
  161. CLI(r4) ; make sure we don't miss an interrupt
  162. ; setting need_resched or sigpending
  163. ; between sampling and the iret
  164. GET_THREAD_INFO(r8)
  165. ld r9, @(TI_FLAGS, r8)
  166. and3 r4, r9, #_TIF_WORK_MASK ; is there any work to be done on
  167. ; int/exception return?
  168. bnez r4, work_pending
  169. bra restore_all
  170. #ifdef CONFIG_PREEMPT
  171. ENTRY(resume_kernel)
  172. GET_THREAD_INFO(r8)
  173. ld r9, @(TI_PRE_COUNT, r8) ; non-zero preempt_count ?
  174. bnez r9, restore_all
  175. need_resched:
  176. ld r9, @(TI_FLAGS, r8) ; need_resched set ?
  177. and3 r4, r9, #_TIF_NEED_RESCHED
  178. beqz r4, restore_all
  179. ld r4, PSW(sp) ; interrupts off (exception path) ?
  180. and3 r4, r4, #0x4000
  181. beqz r4, restore_all
  182. LDIMM (r4, PREEMPT_ACTIVE)
  183. st r4, @(TI_PRE_COUNT, r8)
  184. STI(r4)
  185. bl schedule
  186. ldi r4, #0
  187. st r4, @(TI_PRE_COUNT, r8)
  188. CLI(r4)
  189. bra need_resched
  190. #endif
  191. ; system call handler stub
  192. ENTRY(system_call)
  193. SWITCH_TO_KERNEL_STACK
  194. SAVE_ALL
  195. STI(r4) ; Enable interrupt
  196. st sp, PTREGS(sp) ; implicit pt_regs parameter
  197. cmpui r7, #NR_syscalls
  198. bnc syscall_badsys
  199. st r7, SYSCALL_NR(sp) ; syscall_nr
  200. ; system call tracing in operation
  201. GET_THREAD_INFO(r8)
  202. ld r9, @(TI_FLAGS, r8)
  203. and3 r4, r9, #_TIF_SYSCALL_TRACE
  204. bnez r4, syscall_trace_entry
  205. syscall_call:
  206. slli r7, #2 ; table jump for the system call
  207. LDIMM (r4, sys_call_table)
  208. add r7, r4
  209. ld r7, @r7
  210. jl r7 ; execute system call
  211. st r0, R0(sp) ; save the return value
  212. syscall_exit:
  213. CLI(r4) ; make sure we don't miss an interrupt
  214. ; setting need_resched or sigpending
  215. ; between sampling and the iret
  216. ld r9, @(TI_FLAGS, r8)
  217. and3 r4, r9, #_TIF_ALLWORK_MASK ; current->work
  218. bnez r4, syscall_exit_work
  219. restore_all:
  220. RESTORE_ALL
  221. # perform work that needs to be done immediately before resumption
  222. # r9 : frags
  223. ALIGN
  224. work_pending:
  225. and3 r4, r9, #_TIF_NEED_RESCHED
  226. beqz r4, work_notifysig
  227. work_resched:
  228. bl schedule
  229. CLI(r4) ; make sure we don't miss an interrupt
  230. ; setting need_resched or sigpending
  231. ; between sampling and the iret
  232. ld r9, @(TI_FLAGS, r8)
  233. and3 r4, r9, #_TIF_WORK_MASK ; is there any work to be done other
  234. ; than syscall tracing?
  235. beqz r4, restore_all
  236. and3 r4, r4, #_TIF_NEED_RESCHED
  237. bnez r4, work_resched
  238. work_notifysig: ; deal with pending signals and
  239. ; notify-resume requests
  240. mv r0, sp ; arg1 : struct pt_regs *regs
  241. ldi r1, #0 ; arg2 : sigset_t *oldset
  242. mv r2, r9 ; arg3 : __u32 thread_info_flags
  243. bl do_notify_resume
  244. bra restore_all
  245. ; perform syscall exit tracing
  246. ALIGN
  247. syscall_trace_entry:
  248. ldi r4, #-ENOSYS
  249. st r4, R0(sp)
  250. bl do_syscall_trace
  251. ld r0, ORIG_R0(sp)
  252. ld r1, R1(sp)
  253. ld r2, R2(sp)
  254. ld r3, R3(sp)
  255. ld r4, R4(sp)
  256. ld r5, R5(sp)
  257. ld r6, R6(sp)
  258. ld r7, SYSCALL_NR(sp)
  259. cmpui r7, #NR_syscalls
  260. bc syscall_call
  261. bra syscall_exit
  262. ; perform syscall exit tracing
  263. ALIGN
  264. syscall_exit_work:
  265. ld r9, @(TI_FLAGS, r8)
  266. and3 r4, r9, #_TIF_SYSCALL_TRACE
  267. beqz r4, work_pending
  268. STI(r4) ; could let do_syscall_trace() call
  269. ; schedule() instead
  270. bl do_syscall_trace
  271. bra resume_userspace
  272. ALIGN
  273. syscall_fault:
  274. SAVE_ALL
  275. GET_THREAD_INFO(r8)
  276. ldi r4, #-EFAULT
  277. st r4, R0(sp)
  278. bra resume_userspace
  279. ALIGN
  280. syscall_badsys:
  281. ldi r4, #-ENOSYS
  282. st r4, R0(sp)
  283. bra resume_userspace
  284. .global eit_vector
  285. .equ ei_vec_table, eit_vector + 0x0200
  286. /*
  287. * EI handler routine
  288. */
  289. ENTRY(ei_handler)
  290. #if defined(CONFIG_CHIP_M32700)
  291. SWITCH_TO_KERNEL_STACK
  292. ; WORKAROUND: force to clear SM bit and use the kernel stack (SPI).
  293. #endif
  294. SAVE_ALL
  295. mv r1, sp ; arg1(regs)
  296. #if defined(CONFIG_CHIP_VDEC2) || defined(CONFIG_CHIP_XNUX2) \
  297. || defined(CONFIG_CHIP_M32700) || defined(CONFIG_CHIP_M32102) \
  298. || defined(CONFIG_CHIP_OPSP) || defined(CONFIG_CHIP_M32104)
  299. ; GET_ICU_STATUS;
  300. seth r0, #shigh(M32R_ICU_ISTS_ADDR)
  301. ld r0, @(low(M32R_ICU_ISTS_ADDR),r0)
  302. st r0, @-sp
  303. #if defined(CONFIG_SMP)
  304. /*
  305. * If IRQ == 0 --> Nothing to do, Not write IMASK
  306. * If IRQ == IPI --> Do IPI handler, Not write IMASK
  307. * If IRQ != 0, IPI --> Do do_IRQ(), Write IMASK
  308. */
  309. slli r0, #4
  310. srli r0, #24 ; r0(irq_num<<2)
  311. ;; IRQ exist check
  312. #if defined(CONFIG_CHIP_M32700)
  313. /* WORKAROUND: IMASK bug M32700-TS1, TS2 chip. */
  314. beqz r0, 3f ; if (!irq_num) goto exit
  315. #else
  316. beqz r0, 1f ; if (!irq_num) goto exit
  317. #endif /* WORKAROUND */
  318. ;; IPI check
  319. cmpi r0, #(M32R_IRQ_IPI0<<2) ; ISN < IPI0 check
  320. bc 2f
  321. cmpi r0, #((M32R_IRQ_IPI7+1)<<2) ; ISN > IPI7 check
  322. bnc 2f
  323. LDIMM (r2, ei_vec_table)
  324. add r2, r0
  325. ld r2, @r2
  326. beqz r2, 1f ; if (no IPI handler) goto exit
  327. mv r0, r1 ; arg0(regs)
  328. jl r2
  329. .fillinsn
  330. 1:
  331. addi sp, #4
  332. bra ret_to_intr
  333. #if defined(CONFIG_CHIP_M32700)
  334. /* WORKAROUND: IMASK bug M32700-TS1, TS2 chip. */
  335. .fillinsn
  336. 3:
  337. ld24 r14, #0x00070000
  338. seth r0, #shigh(M32R_ICU_IMASK_ADDR)
  339. st r14, @(low(M32R_ICU_IMASK_ADDR), r0)
  340. addi sp, #4
  341. bra ret_to_intr
  342. #endif /* WORKAROUND */
  343. ;; do_IRQ
  344. .fillinsn
  345. 2:
  346. srli r0, #2
  347. #if defined(CONFIG_PLAT_USRV)
  348. add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt
  349. bnez r2, 9f
  350. ; read ICU status register of PLD
  351. seth r0, #high(PLD_ICUISTS)
  352. or3 r0, r0, #low(PLD_ICUISTS)
  353. lduh r0, @r0
  354. slli r0, #21
  355. srli r0, #27 ; ISN
  356. addi r0, #(M32700UT_PLD_IRQ_BASE)
  357. .fillinsn
  358. 9:
  359. #elif defined(CONFIG_PLAT_M32700UT)
  360. add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt
  361. bnez r2, check_int0
  362. ; read ICU status register of PLD
  363. seth r0, #high(PLD_ICUISTS)
  364. or3 r0, r0, #low(PLD_ICUISTS)
  365. lduh r0, @r0
  366. slli r0, #21
  367. srli r0, #27 ; ISN
  368. addi r0, #(M32700UT_PLD_IRQ_BASE)
  369. bra check_end
  370. .fillinsn
  371. check_int0:
  372. add3 r2, r0, #-(M32R_IRQ_INT0) ; INT0# interrupt
  373. bnez r2, check_int2
  374. ; read ICU status of LAN-board
  375. seth r0, #high(M32700UT_LAN_ICUISTS)
  376. or3 r0, r0, #low(M32700UT_LAN_ICUISTS)
  377. lduh r0, @r0
  378. slli r0, #21
  379. srli r0, #27 ; ISN
  380. add3 r0, r0, #(M32700UT_LAN_PLD_IRQ_BASE)
  381. bra check_end
  382. .fillinsn
  383. check_int2:
  384. add3 r2, r0, #-(M32R_IRQ_INT2) ; INT2# interrupt
  385. bnez r2, check_end
  386. ; read ICU status of LCD-board
  387. seth r0, #high(M32700UT_LCD_ICUISTS)
  388. or3 r0, r0, #low(M32700UT_LCD_ICUISTS)
  389. lduh r0, @r0
  390. slli r0, #21
  391. srli r0, #27 ; ISN
  392. add3 r0, r0, #(M32700UT_LCD_PLD_IRQ_BASE)
  393. bra check_end
  394. .fillinsn
  395. check_end:
  396. #elif defined(CONFIG_PLAT_OPSPUT)
  397. add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt
  398. bnez r2, check_int0
  399. ; read ICU status register of PLD
  400. seth r0, #high(PLD_ICUISTS)
  401. or3 r0, r0, #low(PLD_ICUISTS)
  402. lduh r0, @r0
  403. slli r0, #21
  404. srli r0, #27 ; ISN
  405. addi r0, #(OPSPUT_PLD_IRQ_BASE)
  406. bra check_end
  407. .fillinsn
  408. check_int0:
  409. add3 r2, r0, #-(M32R_IRQ_INT0) ; INT0# interrupt
  410. bnez r2, check_int2
  411. ; read ICU status of LAN-board
  412. seth r0, #high(OPSPUT_LAN_ICUISTS)
  413. or3 r0, r0, #low(OPSPUT_LAN_ICUISTS)
  414. lduh r0, @r0
  415. slli r0, #21
  416. srli r0, #27 ; ISN
  417. add3 r0, r0, #(OPSPUT_LAN_PLD_IRQ_BASE)
  418. bra check_end
  419. .fillinsn
  420. check_int2:
  421. add3 r2, r0, #-(M32R_IRQ_INT2) ; INT2# interrupt
  422. bnez r2, check_end
  423. ; read ICU status of LCD-board
  424. seth r0, #high(OPSPUT_LCD_ICUISTS)
  425. or3 r0, r0, #low(OPSPUT_LCD_ICUISTS)
  426. lduh r0, @r0
  427. slli r0, #21
  428. srli r0, #27 ; ISN
  429. add3 r0, r0, #(OPSPUT_LCD_PLD_IRQ_BASE)
  430. bra check_end
  431. .fillinsn
  432. check_end:
  433. #endif /* CONFIG_PLAT_OPSPUT */
  434. bl do_IRQ ; r0(irq), r1(regs)
  435. #else /* not CONFIG_SMP */
  436. srli r0, #22 ; r0(irq)
  437. #if defined(CONFIG_PLAT_USRV)
  438. add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt
  439. bnez r2, 1f
  440. ; read ICU status register of PLD
  441. seth r0, #high(PLD_ICUISTS)
  442. or3 r0, r0, #low(PLD_ICUISTS)
  443. lduh r0, @r0
  444. slli r0, #21
  445. srli r0, #27 ; ISN
  446. addi r0, #(M32700UT_PLD_IRQ_BASE)
  447. .fillinsn
  448. 1:
  449. #elif defined(CONFIG_PLAT_M32700UT)
  450. add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt
  451. bnez r2, check_int0
  452. ; read ICU status register of PLD
  453. seth r0, #high(PLD_ICUISTS)
  454. or3 r0, r0, #low(PLD_ICUISTS)
  455. lduh r0, @r0
  456. slli r0, #21
  457. srli r0, #27 ; ISN
  458. addi r0, #(M32700UT_PLD_IRQ_BASE)
  459. bra check_end
  460. .fillinsn
  461. check_int0:
  462. add3 r2, r0, #-(M32R_IRQ_INT0) ; INT0# interrupt
  463. bnez r2, check_int2
  464. ; read ICU status of LAN-board
  465. seth r0, #high(M32700UT_LAN_ICUISTS)
  466. or3 r0, r0, #low(M32700UT_LAN_ICUISTS)
  467. lduh r0, @r0
  468. slli r0, #21
  469. srli r0, #27 ; ISN
  470. add3 r0, r0, #(M32700UT_LAN_PLD_IRQ_BASE)
  471. bra check_end
  472. .fillinsn
  473. check_int2:
  474. add3 r2, r0, #-(M32R_IRQ_INT2) ; INT2# interrupt
  475. bnez r2, check_end
  476. ; read ICU status of LCD-board
  477. seth r0, #high(M32700UT_LCD_ICUISTS)
  478. or3 r0, r0, #low(M32700UT_LCD_ICUISTS)
  479. lduh r0, @r0
  480. slli r0, #21
  481. srli r0, #27 ; ISN
  482. add3 r0, r0, #(M32700UT_LCD_PLD_IRQ_BASE)
  483. bra check_end
  484. .fillinsn
  485. check_end:
  486. #elif defined(CONFIG_PLAT_OPSPUT)
  487. add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt
  488. bnez r2, check_int0
  489. ; read ICU status register of PLD
  490. seth r0, #high(PLD_ICUISTS)
  491. or3 r0, r0, #low(PLD_ICUISTS)
  492. lduh r0, @r0
  493. slli r0, #21
  494. srli r0, #27 ; ISN
  495. addi r0, #(OPSPUT_PLD_IRQ_BASE)
  496. bra check_end
  497. .fillinsn
  498. check_int0:
  499. add3 r2, r0, #-(M32R_IRQ_INT0) ; INT0# interrupt
  500. bnez r2, check_int2
  501. ; read ICU status of LAN-board
  502. seth r0, #high(OPSPUT_LAN_ICUISTS)
  503. or3 r0, r0, #low(OPSPUT_LAN_ICUISTS)
  504. lduh r0, @r0
  505. slli r0, #21
  506. srli r0, #27 ; ISN
  507. add3 r0, r0, #(OPSPUT_LAN_PLD_IRQ_BASE)
  508. bra check_end
  509. .fillinsn
  510. check_int2:
  511. add3 r2, r0, #-(M32R_IRQ_INT2) ; INT2# interrupt
  512. bnez r2, check_end
  513. ; read ICU status of LCD-board
  514. seth r0, #high(OPSPUT_LCD_ICUISTS)
  515. or3 r0, r0, #low(OPSPUT_LCD_ICUISTS)
  516. lduh r0, @r0
  517. slli r0, #21
  518. srli r0, #27 ; ISN
  519. add3 r0, r0, #(OPSPUT_LCD_PLD_IRQ_BASE)
  520. bra check_end
  521. .fillinsn
  522. check_end:
  523. #elif defined(CONFIG_PLAT_M32104UT)
  524. add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt
  525. bnez r2, check_end
  526. ; read ICU status register of PLD
  527. seth r0, #high(PLD_ICUISTS)
  528. or3 r0, r0, #low(PLD_ICUISTS)
  529. lduh r0, @r0
  530. slli r0, #21
  531. srli r0, #27 ; ISN
  532. addi r0, #(M32104UT_PLD_IRQ_BASE)
  533. bra check_end
  534. .fillinsn
  535. check_end:
  536. #endif /* CONFIG_PLAT_M32104UT */
  537. bl do_IRQ
  538. #endif /* CONFIG_SMP */
  539. ld r14, @sp+
  540. seth r0, #shigh(M32R_ICU_IMASK_ADDR)
  541. st r14, @(low(M32R_ICU_IMASK_ADDR),r0)
  542. #else
  543. #error no chip configuration
  544. #endif
  545. ret_to_intr:
  546. bra ret_from_intr
  547. /*
  548. * Default EIT handler
  549. */
  550. ALIGN
  551. int_msg:
  552. .asciz "Unknown interrupt\n"
  553. .byte 0
  554. ENTRY(default_eit_handler)
  555. push r0
  556. mvfc r0, psw
  557. push r1
  558. push r2
  559. push r3
  560. push r0
  561. LDIMM (r0, __KERNEL_DS)
  562. mv r0, r1
  563. mv r0, r2
  564. LDIMM (r0, int_msg)
  565. bl printk
  566. pop r0
  567. pop r3
  568. pop r2
  569. pop r1
  570. mvtc r0, psw
  571. pop r0
  572. infinit:
  573. bra infinit
  574. #ifdef CONFIG_MMU
  575. /*
  576. * Access Exception handler
  577. */
  578. ENTRY(ace_handler)
  579. SWITCH_TO_KERNEL_STACK
  580. SAVE_ALL
  581. seth r2, #shigh(MMU_REG_BASE) /* Check status register */
  582. ld r4, @(low(MESTS_offset),r2)
  583. st r4, @(low(MESTS_offset),r2)
  584. srl3 r1, r4, #4
  585. #ifdef CONFIG_CHIP_M32700
  586. and3 r1, r1, #0x0000ffff
  587. ; WORKAROUND: ignore TME bit for the M32700(TS1).
  588. #endif /* CONFIG_CHIP_M32700 */
  589. beqz r1, inst
  590. oprand:
  591. ld r2, @(low(MDEVA_offset),r2) ; set address
  592. srli r2, #12
  593. slli r2, #12
  594. srli r1, #1
  595. bra 1f
  596. inst:
  597. and3 r1, r4, #2
  598. srli r1, #1
  599. or3 r1, r1, #8
  600. mvfc r2, bpc ; set address
  601. .fillinsn
  602. 1:
  603. mvfc r3, psw
  604. mv r0, sp
  605. and3 r3, r3, 0x800
  606. srli r3, #9
  607. or r1, r3
  608. /*
  609. * do_page_fault():
  610. * r0 : struct pt_regs *regs
  611. * r1 : unsigned long error-code
  612. * r2 : unsigned long address
  613. * error-code:
  614. * +------+------+------+------+
  615. * | bit3 | bit2 | bit1 | bit0 |
  616. * +------+------+------+------+
  617. * bit 3 == 0:means data, 1:means instruction
  618. * bit 2 == 0:means kernel, 1:means user-mode
  619. * bit 1 == 0:means read, 1:means write
  620. * bit 0 == 0:means no page found 1:means protection fault
  621. *
  622. */
  623. bl do_page_fault
  624. bra ret_from_intr
  625. #endif /* CONFIG_MMU */
  626. ENTRY(alignment_check)
  627. /* void alignment_check(int error_code) */
  628. SWITCH_TO_KERNEL_STACK
  629. SAVE_ALL
  630. ldi r1, #0x30 ; error_code
  631. mv r0, sp ; pt_regs
  632. bl do_alignment_check
  633. error_code:
  634. bra ret_from_exception
  635. ENTRY(rie_handler)
  636. /* void rie_handler(int error_code) */
  637. SWITCH_TO_KERNEL_STACK
  638. SAVE_ALL
  639. ldi r1, #0x20 ; error_code
  640. mv r0, sp ; pt_regs
  641. bl do_rie_handler
  642. bra error_code
  643. ENTRY(pie_handler)
  644. /* void pie_handler(int error_code) */
  645. SWITCH_TO_KERNEL_STACK
  646. SAVE_ALL
  647. ldi r1, #0 ; error_code ; FIXME
  648. mv r0, sp ; pt_regs
  649. bl do_pie_handler
  650. bra error_code
  651. ENTRY(debug_trap)
  652. .global withdraw_debug_trap
  653. /* void debug_trap(void) */
  654. SWITCH_TO_KERNEL_STACK
  655. SAVE_ALL
  656. mv r0, sp ; pt_regs
  657. bl withdraw_debug_trap
  658. ldi r1, #0 ; error_code
  659. mv r0, sp ; pt_regs
  660. bl do_debug_trap
  661. bra error_code
  662. ENTRY(ill_trap)
  663. /* void ill_trap(void) */
  664. SWITCH_TO_KERNEL_STACK
  665. SAVE_ALL
  666. ldi r1, #0 ; error_code ; FIXME
  667. mv r0, sp ; pt_regs
  668. bl do_ill_trap
  669. bra error_code
  670. /* Cache flushing handler */
  671. ENTRY(cache_flushing_handler)
  672. .global _flush_cache_all
  673. /* void _flush_cache_all(void); */
  674. SWITCH_TO_KERNEL_STACK
  675. push r0
  676. push r1
  677. push r2
  678. push r3
  679. push r4
  680. push r5
  681. push r6
  682. push r7
  683. push lr
  684. bl _flush_cache_all
  685. pop lr
  686. pop r7
  687. pop r6
  688. pop r5
  689. pop r4
  690. pop r3
  691. pop r2
  692. pop r1
  693. pop r0
  694. rte
  695. .data
  696. ENTRY(sys_call_table)
  697. .long sys_restart_syscall /* 0 - old "setup()" system call*/
  698. .long sys_exit
  699. .long sys_fork
  700. .long sys_read
  701. .long sys_write
  702. .long sys_open /* 5 */
  703. .long sys_close
  704. .long sys_waitpid
  705. .long sys_creat
  706. .long sys_link
  707. .long sys_unlink /* 10 */
  708. .long sys_execve
  709. .long sys_chdir
  710. .long sys_time
  711. .long sys_mknod
  712. .long sys_chmod /* 15 */
  713. .long sys_ni_syscall /* lchown16 syscall holder */
  714. .long sys_ni_syscall /* old break syscall holder */
  715. .long sys_ni_syscall /* old stat syscall holder */
  716. .long sys_lseek
  717. .long sys_getpid /* 20 */
  718. .long sys_mount
  719. .long sys_oldumount
  720. .long sys_ni_syscall /* setuid16 syscall holder */
  721. .long sys_ni_syscall /* getuid16 syscall holder */
  722. .long sys_stime /* 25 */
  723. .long sys_ptrace
  724. .long sys_alarm
  725. .long sys_ni_syscall /* old fstat syscall holder */
  726. .long sys_pause
  727. .long sys_utime /* 30 */
  728. .long sys_ni_syscall /* old stty syscall holder */
  729. .long sys_cachectl /* for M32R */ /* old gtty syscall holder */
  730. .long sys_access
  731. .long sys_ni_syscall /* nice syscall holder */
  732. .long sys_ni_syscall /* 35 - old ftime syscall holder */
  733. .long sys_sync
  734. .long sys_kill
  735. .long sys_rename
  736. .long sys_mkdir
  737. .long sys_rmdir /* 40 */
  738. .long sys_dup
  739. .long sys_pipe
  740. .long sys_times
  741. .long sys_ni_syscall /* old prof syscall holder */
  742. .long sys_brk /* 45 */
  743. .long sys_ni_syscall /* setgid16 syscall holder */
  744. .long sys_getgid /* will be unused */
  745. .long sys_ni_syscall /* signal syscall holder */
  746. .long sys_ni_syscall /* geteuid16 syscall holder */
  747. .long sys_ni_syscall /* 50 - getegid16 syscall holder */
  748. .long sys_acct
  749. .long sys_umount /* recycled never used phys() */
  750. .long sys_ni_syscall /* old lock syscall holder */
  751. .long sys_ioctl
  752. .long sys_fcntl /* 55 - will be unused */
  753. .long sys_ni_syscall /* mpx syscall holder */
  754. .long sys_setpgid
  755. .long sys_ni_syscall /* old ulimit syscall holder */
  756. .long sys_ni_syscall /* sys_olduname */
  757. .long sys_umask /* 60 */
  758. .long sys_chroot
  759. .long sys_ustat
  760. .long sys_dup2
  761. .long sys_getppid
  762. .long sys_getpgrp /* 65 */
  763. .long sys_setsid
  764. .long sys_ni_syscall /* sigaction syscall holder */
  765. .long sys_ni_syscall /* sgetmask syscall holder */
  766. .long sys_ni_syscall /* ssetmask syscall holder */
  767. .long sys_ni_syscall /* 70 - setreuid16 syscall holder */
  768. .long sys_ni_syscall /* setregid16 syscall holder */
  769. .long sys_ni_syscall /* sigsuspend syscall holder */
  770. .long sys_ni_syscall /* sigpending syscall holder */
  771. .long sys_sethostname
  772. .long sys_setrlimit /* 75 */
  773. .long sys_getrlimit/*will be unused*/
  774. .long sys_getrusage
  775. .long sys_gettimeofday
  776. .long sys_settimeofday
  777. .long sys_ni_syscall /* 80 - getgroups16 syscall holder */
  778. .long sys_ni_syscall /* setgroups16 syscall holder */
  779. .long sys_ni_syscall /* sys_oldselect */
  780. .long sys_symlink
  781. .long sys_ni_syscall /* old lstat syscall holder */
  782. .long sys_readlink /* 85 */
  783. .long sys_uselib
  784. .long sys_swapon
  785. .long sys_reboot
  786. .long sys_ni_syscall /* readdir syscall holder */
  787. .long sys_ni_syscall /* 90 - old_mmap syscall holder */
  788. .long sys_munmap
  789. .long sys_truncate
  790. .long sys_ftruncate
  791. .long sys_fchmod
  792. .long sys_ni_syscall /* 95 - fchwon16 syscall holder */
  793. .long sys_getpriority
  794. .long sys_setpriority
  795. .long sys_ni_syscall /* old profil syscall holder */
  796. .long sys_statfs
  797. .long sys_fstatfs /* 100 */
  798. .long sys_ni_syscall /* ioperm syscall holder */
  799. .long sys_socketcall
  800. .long sys_syslog
  801. .long sys_setitimer
  802. .long sys_getitimer /* 105 */
  803. .long sys_newstat
  804. .long sys_newlstat
  805. .long sys_newfstat
  806. .long sys_ni_syscall /* old uname syscall holder */
  807. .long sys_ni_syscall /* 110 - iopl syscall holder */
  808. .long sys_vhangup
  809. .long sys_ni_syscall /* idle syscall holder */
  810. .long sys_ni_syscall /* vm86old syscall holder */
  811. .long sys_wait4
  812. .long sys_swapoff /* 115 */
  813. .long sys_sysinfo
  814. .long sys_ipc
  815. .long sys_fsync
  816. .long sys_ni_syscall /* sigreturn syscall holder */
  817. .long sys_clone /* 120 */
  818. .long sys_setdomainname
  819. .long sys_newuname
  820. .long sys_ni_syscall /* modify_ldt syscall holder */
  821. .long sys_adjtimex
  822. .long sys_mprotect /* 125 */
  823. .long sys_ni_syscall /* sigprocmask syscall holder */
  824. .long sys_ni_syscall /* create_module syscall holder */
  825. .long sys_init_module
  826. .long sys_delete_module
  827. .long sys_ni_syscall /* 130 - get_kernel_syms */
  828. .long sys_quotactl
  829. .long sys_getpgid
  830. .long sys_fchdir
  831. .long sys_bdflush
  832. .long sys_sysfs /* 135 */
  833. .long sys_personality
  834. .long sys_ni_syscall /* afs_syscall syscall holder */
  835. .long sys_ni_syscall /* setfsuid16 syscall holder */
  836. .long sys_ni_syscall /* setfsgid16 syscall holder */
  837. .long sys_llseek /* 140 */
  838. .long sys_getdents
  839. .long sys_select
  840. .long sys_flock
  841. .long sys_msync
  842. .long sys_readv /* 145 */
  843. .long sys_writev
  844. .long sys_getsid
  845. .long sys_fdatasync
  846. .long sys_sysctl
  847. .long sys_mlock /* 150 */
  848. .long sys_munlock
  849. .long sys_mlockall
  850. .long sys_munlockall
  851. .long sys_sched_setparam
  852. .long sys_sched_getparam /* 155 */
  853. .long sys_sched_setscheduler
  854. .long sys_sched_getscheduler
  855. .long sys_sched_yield
  856. .long sys_sched_get_priority_max
  857. .long sys_sched_get_priority_min /* 160 */
  858. .long sys_sched_rr_get_interval
  859. .long sys_nanosleep
  860. .long sys_mremap
  861. .long sys_ni_syscall /* setresuid16 syscall holder */
  862. .long sys_ni_syscall /* 165 - getresuid16 syscall holder */
  863. .long sys_tas /* vm86 syscall holder */
  864. .long sys_ni_syscall /* query_module syscall holder */
  865. .long sys_poll
  866. .long sys_nfsservctl
  867. .long sys_setresgid /* 170 */
  868. .long sys_getresgid
  869. .long sys_prctl
  870. .long sys_rt_sigreturn
  871. .long sys_rt_sigaction
  872. .long sys_rt_sigprocmask /* 175 */
  873. .long sys_rt_sigpending
  874. .long sys_rt_sigtimedwait
  875. .long sys_rt_sigqueueinfo
  876. .long sys_rt_sigsuspend
  877. .long sys_pread64 /* 180 */
  878. .long sys_pwrite64
  879. .long sys_ni_syscall /* chown16 syscall holder */
  880. .long sys_getcwd
  881. .long sys_capget
  882. .long sys_capset /* 185 */
  883. .long sys_sigaltstack
  884. .long sys_sendfile
  885. .long sys_ni_syscall /* streams1 */
  886. .long sys_ni_syscall /* streams2 */
  887. .long sys_vfork /* 190 */
  888. .long sys_getrlimit
  889. .long sys_mmap2
  890. .long sys_truncate64
  891. .long sys_ftruncate64
  892. .long sys_stat64 /* 195 */
  893. .long sys_lstat64
  894. .long sys_fstat64
  895. .long sys_lchown
  896. .long sys_getuid
  897. .long sys_getgid /* 200 */
  898. .long sys_geteuid
  899. .long sys_getegid
  900. .long sys_setreuid
  901. .long sys_setregid
  902. .long sys_getgroups /* 205 */
  903. .long sys_setgroups
  904. .long sys_fchown
  905. .long sys_setresuid
  906. .long sys_getresuid
  907. .long sys_setresgid /* 210 */
  908. .long sys_getresgid
  909. .long sys_chown
  910. .long sys_setuid
  911. .long sys_setgid
  912. .long sys_setfsuid /* 215 */
  913. .long sys_setfsgid
  914. .long sys_pivot_root
  915. .long sys_mincore
  916. .long sys_madvise
  917. .long sys_getdents64 /* 220 */
  918. .long sys_fcntl64
  919. .long sys_ni_syscall /* reserved for TUX */
  920. .long sys_ni_syscall /* Reserved for Security */
  921. .long sys_gettid
  922. .long sys_readahead /* 225 */
  923. .long sys_setxattr
  924. .long sys_lsetxattr
  925. .long sys_fsetxattr
  926. .long sys_getxattr
  927. .long sys_lgetxattr /* 230 */
  928. .long sys_fgetxattr
  929. .long sys_listxattr
  930. .long sys_llistxattr
  931. .long sys_flistxattr
  932. .long sys_removexattr /* 235 */
  933. .long sys_lremovexattr
  934. .long sys_fremovexattr
  935. .long sys_tkill
  936. .long sys_sendfile64
  937. .long sys_futex /* 240 */
  938. .long sys_sched_setaffinity
  939. .long sys_sched_getaffinity
  940. .long sys_ni_syscall /* reserved for "set_thread_area" system call */
  941. .long sys_ni_syscall /* reserved for "get_thread_area" system call */
  942. .long sys_io_setup /* 245 */
  943. .long sys_io_destroy
  944. .long sys_io_getevents
  945. .long sys_io_submit
  946. .long sys_io_cancel
  947. .long sys_fadvise64 /* 250 */
  948. .long sys_ni_syscall
  949. .long sys_exit_group
  950. .long sys_lookup_dcookie
  951. .long sys_epoll_create
  952. .long sys_epoll_ctl /* 255 */
  953. .long sys_epoll_wait
  954. .long sys_remap_file_pages
  955. .long sys_set_tid_address
  956. .long sys_timer_create
  957. .long sys_timer_settime /* 260 */
  958. .long sys_timer_gettime
  959. .long sys_timer_getoverrun
  960. .long sys_timer_delete
  961. .long sys_clock_settime
  962. .long sys_clock_gettime /* 265 */
  963. .long sys_clock_getres
  964. .long sys_clock_nanosleep
  965. .long sys_statfs64
  966. .long sys_fstatfs64
  967. .long sys_tgkill /* 270 */
  968. .long sys_utimes
  969. .long sys_fadvise64_64
  970. .long sys_ni_syscall /* Reserved for sys_vserver */
  971. .long sys_ni_syscall /* Reserved for sys_mbind */
  972. .long sys_ni_syscall /* Reserved for sys_get_mempolicy */
  973. .long sys_ni_syscall /* Reserved for sys_set_mempolicy */
  974. .long sys_mq_open
  975. .long sys_mq_unlink
  976. .long sys_mq_timedsend
  977. .long sys_mq_timedreceive /* 280 */
  978. .long sys_mq_notify
  979. .long sys_mq_getsetattr
  980. .long sys_ni_syscall /* reserved for kexec */
  981. .long sys_waitid
  982. syscall_table_size=(.-sys_call_table)