entry.S 25 KB

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