entry.S 26 KB

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