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