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