1/* entry.S: FR-V entry
2 *
3 * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 *
11 *
12 * Entry to the kernel is "interesting":
13 *  (1) There are no stack pointers, not even for the kernel
14 *  (2) General Registers should not be clobbered
15 *  (3) There are no kernel-only data registers
16 *  (4) Since all addressing modes are wrt to a General Register, no global
17 *      variables can be reached
18 *
19 * We deal with this by declaring that we shall kill GR28 on entering the
20 * kernel from userspace
21 *
22 * However, since break interrupts can interrupt the CPU even when PSR.ET==0,
23 * they can't rely on GR28 to be anything useful, and so need to clobber a
24 * separate register (GR31). Break interrupts are managed in break.S
25 *
26 * GR29 _is_ saved, and holds the current task pointer globally
27 *
28 */
29
30#include <linux/linkage.h>
31#include <asm/thread_info.h>
32#include <asm/setup.h>
33#include <asm/segment.h>
34#include <asm/ptrace.h>
35#include <asm/errno.h>
36#include <asm/cache.h>
37#include <asm/spr-regs.h>
38
39#define nr_syscalls ((syscall_table_size)/4)
40
41	.section	.text..entry
42	.balign		4
43
44.macro LEDS val
45#	sethi.p		%hi(0xe1200004),gr30
46#	setlo		%lo(0xe1200004),gr30
47#	setlos		#~\val,gr31
48#	st		gr31,@(gr30,gr0)
49#	sethi.p		%hi(0xffc00100),gr30
50#	setlo		%lo(0xffc00100),gr30
51#	sth		gr0,@(gr30,gr0)
52#	membar
53.endm
54
55.macro LEDS32
56#	not		gr31,gr31
57#	sethi.p		%hi(0xe1200004),gr30
58#	setlo		%lo(0xe1200004),gr30
59#	st.p		gr31,@(gr30,gr0)
60#	srli		gr31,#16,gr31
61#	sethi.p		%hi(0xffc00100),gr30
62#	setlo		%lo(0xffc00100),gr30
63#	sth		gr31,@(gr30,gr0)
64#	membar
65.endm
66
67###############################################################################
68#
69# entry point for External interrupts received whilst executing userspace code
70#
71###############################################################################
72	.globl		__entry_uspace_external_interrupt
73        .type		__entry_uspace_external_interrupt,@function
74__entry_uspace_external_interrupt:
75	LEDS		0x6200
76	sethi.p		%hi(__kernel_frame0_ptr),gr28
77	setlo		%lo(__kernel_frame0_ptr),gr28
78	ldi		@(gr28,#0),gr28
79
80	# handle h/w single-step through exceptions
81	sti		gr0,@(gr28,#REG__STATUS)
82
83	.globl		__entry_uspace_external_interrupt_reentry
84__entry_uspace_external_interrupt_reentry:
85	LEDS		0x6201
86
87	setlos		#REG__END,gr30
88	dcpl		gr28,gr30,#0
89
90	# finish building the exception frame
91	sti		sp,  @(gr28,#REG_SP)
92	stdi		gr2, @(gr28,#REG_GR(2))
93	stdi		gr4, @(gr28,#REG_GR(4))
94	stdi		gr6, @(gr28,#REG_GR(6))
95	stdi		gr8, @(gr28,#REG_GR(8))
96	stdi		gr10,@(gr28,#REG_GR(10))
97	stdi		gr12,@(gr28,#REG_GR(12))
98	stdi		gr14,@(gr28,#REG_GR(14))
99	stdi		gr16,@(gr28,#REG_GR(16))
100	stdi		gr18,@(gr28,#REG_GR(18))
101	stdi		gr20,@(gr28,#REG_GR(20))
102	stdi		gr22,@(gr28,#REG_GR(22))
103	stdi		gr24,@(gr28,#REG_GR(24))
104	stdi		gr26,@(gr28,#REG_GR(26))
105	sti		gr0, @(gr28,#REG_GR(28))
106	sti		gr29,@(gr28,#REG_GR(29))
107	stdi.p		gr30,@(gr28,#REG_GR(30))
108
109	# set up the kernel stack pointer
110	ori		gr28,0,sp
111
112	movsg		tbr ,gr20
113	movsg		psr ,gr22
114	movsg		pcsr,gr21
115	movsg		isr ,gr23
116	movsg		ccr ,gr24
117	movsg		cccr,gr25
118	movsg		lr  ,gr26
119	movsg		lcr ,gr27
120
121	setlos.p	#-1,gr4
122	andi		gr22,#PSR_PS,gr5		/* try to rebuild original PSR value */
123	andi.p		gr22,#~(PSR_PS|PSR_S),gr6
124	slli		gr5,#1,gr5
125	or		gr6,gr5,gr5
126	andi		gr5,#~PSR_ET,gr5
127
128	sti		gr20,@(gr28,#REG_TBR)
129	sti		gr21,@(gr28,#REG_PC)
130	sti		gr5 ,@(gr28,#REG_PSR)
131	sti		gr23,@(gr28,#REG_ISR)
132	stdi		gr24,@(gr28,#REG_CCR)
133	stdi		gr26,@(gr28,#REG_LR)
134	sti		gr4 ,@(gr28,#REG_SYSCALLNO)
135
136	movsg		iacc0h,gr4
137	movsg		iacc0l,gr5
138	stdi		gr4,@(gr28,#REG_IACC0)
139
140	movsg		gner0,gr4
141	movsg		gner1,gr5
142	stdi.p		gr4,@(gr28,#REG_GNER0)
143
144	# interrupts start off fully disabled in the interrupt handler
145	subcc		gr0,gr0,gr0,icc2		/* set Z and clear C */
146
147	# set up kernel global registers
148	sethi.p		%hi(__kernel_current_task),gr5
149	setlo		%lo(__kernel_current_task),gr5
150	sethi.p		%hi(_gp),gr16
151	setlo		%lo(_gp),gr16
152	ldi		@(gr5,#0),gr29
153	ldi.p		@(gr29,#4),gr15		; __current_thread_info = current->thread_info
154
155	# make sure we (the kernel) get div-zero and misalignment exceptions
156	setlos		#ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
157	movgs		gr5,isr
158
159	# switch to the kernel trap table
160	sethi.p		%hi(__entry_kerneltrap_table),gr6
161	setlo		%lo(__entry_kerneltrap_table),gr6
162	movgs		gr6,tbr
163
164	# set the return address
165	sethi.p		%hi(__entry_return_from_user_interrupt),gr4
166	setlo		%lo(__entry_return_from_user_interrupt),gr4
167	movgs		gr4,lr
168
169	# raise the minimum interrupt priority to 15 (NMI only) and enable exceptions
170	movsg		psr,gr4
171
172	ori		gr4,#PSR_PIL_14,gr4
173	movgs		gr4,psr
174	ori		gr4,#PSR_PIL_14|PSR_ET,gr4
175	movgs		gr4,psr
176
177	LEDS		0x6202
178	bra		do_IRQ
179
180	.size		__entry_uspace_external_interrupt,.-__entry_uspace_external_interrupt
181
182###############################################################################
183#
184# entry point for External interrupts received whilst executing kernel code
185# - on arriving here, the following registers should already be set up:
186#	GR15	- current thread_info struct pointer
187#	GR16	- kernel GP-REL pointer
188#	GR29	- current task struct pointer
189#	TBR	- kernel trap vector table
190#	ISR	- kernel's preferred integer controls
191#
192###############################################################################
193	.globl		__entry_kernel_external_interrupt
194        .type		__entry_kernel_external_interrupt,@function
195__entry_kernel_external_interrupt:
196	LEDS		0x6210
197//	sub		sp,gr15,gr31
198//	LEDS32
199
200	# set up the stack pointer
201	or.p		sp,gr0,gr30
202	subi		sp,#REG__END,sp
203	sti		gr30,@(sp,#REG_SP)
204
205	# handle h/w single-step through exceptions
206	sti		gr0,@(sp,#REG__STATUS)
207
208	.globl		__entry_kernel_external_interrupt_reentry
209__entry_kernel_external_interrupt_reentry:
210	LEDS		0x6211
211
212	# set up the exception frame
213	setlos		#REG__END,gr30
214	dcpl		sp,gr30,#0
215
216	sti.p		gr28,@(sp,#REG_GR(28))
217	ori		sp,0,gr28
218
219	# finish building the exception frame
220	stdi		gr2,@(gr28,#REG_GR(2))
221	stdi		gr4,@(gr28,#REG_GR(4))
222	stdi		gr6,@(gr28,#REG_GR(6))
223	stdi		gr8,@(gr28,#REG_GR(8))
224	stdi		gr10,@(gr28,#REG_GR(10))
225	stdi		gr12,@(gr28,#REG_GR(12))
226	stdi		gr14,@(gr28,#REG_GR(14))
227	stdi		gr16,@(gr28,#REG_GR(16))
228	stdi		gr18,@(gr28,#REG_GR(18))
229	stdi		gr20,@(gr28,#REG_GR(20))
230	stdi		gr22,@(gr28,#REG_GR(22))
231	stdi		gr24,@(gr28,#REG_GR(24))
232	stdi		gr26,@(gr28,#REG_GR(26))
233	sti		gr29,@(gr28,#REG_GR(29))
234	stdi.p		gr30,@(gr28,#REG_GR(30))
235
236	# note virtual interrupts will be fully enabled upon return
237	subicc		gr0,#1,gr0,icc2			/* clear Z, set C */
238
239	movsg		tbr ,gr20
240	movsg		psr ,gr22
241	movsg		pcsr,gr21
242	movsg		isr ,gr23
243	movsg		ccr ,gr24
244	movsg		cccr,gr25
245	movsg		lr  ,gr26
246	movsg		lcr ,gr27
247
248	setlos.p	#-1,gr4
249	andi		gr22,#PSR_PS,gr5		/* try to rebuild original PSR value */
250	andi.p		gr22,#~(PSR_PS|PSR_S),gr6
251	slli		gr5,#1,gr5
252	or		gr6,gr5,gr5
253	andi.p		gr5,#~PSR_ET,gr5
254
255	# set CCCR.CC3 to Undefined to abort atomic-modify completion inside the kernel
256	# - for an explanation of how it works, see: Documentation/frv/atomic-ops.txt
257	andi		gr25,#~0xc0,gr25
258
259	sti		gr20,@(gr28,#REG_TBR)
260	sti		gr21,@(gr28,#REG_PC)
261	sti		gr5 ,@(gr28,#REG_PSR)
262	sti		gr23,@(gr28,#REG_ISR)
263	stdi		gr24,@(gr28,#REG_CCR)
264	stdi		gr26,@(gr28,#REG_LR)
265	sti		gr4 ,@(gr28,#REG_SYSCALLNO)
266
267	movsg		iacc0h,gr4
268	movsg		iacc0l,gr5
269	stdi		gr4,@(gr28,#REG_IACC0)
270
271	movsg		gner0,gr4
272	movsg		gner1,gr5
273	stdi.p		gr4,@(gr28,#REG_GNER0)
274
275	# interrupts start off fully disabled in the interrupt handler
276	subcc		gr0,gr0,gr0,icc2			/* set Z and clear C */
277
278	# set the return address
279	sethi.p		%hi(__entry_return_from_kernel_interrupt),gr4
280	setlo		%lo(__entry_return_from_kernel_interrupt),gr4
281	movgs		gr4,lr
282
283	# clear power-saving mode flags
284	movsg		hsr0,gr4
285	andi		gr4,#~HSR0_PDM,gr4
286	movgs		gr4,hsr0
287
288	# raise the minimum interrupt priority to 15 (NMI only) and enable exceptions
289	movsg		psr,gr4
290	ori		gr4,#PSR_PIL_14,gr4
291	movgs		gr4,psr
292	ori		gr4,#PSR_ET,gr4
293	movgs		gr4,psr
294
295	LEDS		0x6212
296	bra		do_IRQ
297
298	.size		__entry_kernel_external_interrupt,.-__entry_kernel_external_interrupt
299
300###############################################################################
301#
302# deal with interrupts that were actually virtually disabled
303# - we need to really disable them, flag the fact and return immediately
304# - if you change this, you must alter break.S also
305#
306###############################################################################
307	.balign		L1_CACHE_BYTES
308	.globl		__entry_kernel_external_interrupt_virtually_disabled
309	.type		__entry_kernel_external_interrupt_virtually_disabled,@function
310__entry_kernel_external_interrupt_virtually_disabled:
311	movsg		psr,gr30
312	andi		gr30,#~PSR_PIL,gr30
313	ori		gr30,#PSR_PIL_14,gr30		; debugging interrupts only
314	movgs		gr30,psr
315	subcc		gr0,gr0,gr0,icc2		; leave Z set, clear C
316	rett		#0
317
318	.size		__entry_kernel_external_interrupt_virtually_disabled,.-__entry_kernel_external_interrupt_virtually_disabled
319
320###############################################################################
321#
322# deal with re-enablement of interrupts that were pending when virtually re-enabled
323# - set ICC2.C, re-enable the real interrupts and return
324# - we can clear ICC2.Z because we shouldn't be here if it's not 0 [due to TIHI]
325# - if you change this, you must alter break.S also
326#
327###############################################################################
328	.balign		L1_CACHE_BYTES
329	.globl		__entry_kernel_external_interrupt_virtual_reenable
330	.type		__entry_kernel_external_interrupt_virtual_reenable,@function
331__entry_kernel_external_interrupt_virtual_reenable:
332	movsg		psr,gr30
333	andi		gr30,#~PSR_PIL,gr30		; re-enable interrupts
334	movgs		gr30,psr
335	subicc		gr0,#1,gr0,icc2			; clear Z, set C
336	rett		#0
337
338	.size		__entry_kernel_external_interrupt_virtual_reenable,.-__entry_kernel_external_interrupt_virtual_reenable
339
340###############################################################################
341#
342# entry point for Software and Progam interrupts generated whilst executing userspace code
343#
344###############################################################################
345	.globl		__entry_uspace_softprog_interrupt
346        .type		__entry_uspace_softprog_interrupt,@function
347	.globl		__entry_uspace_handle_mmu_fault
348__entry_uspace_softprog_interrupt:
349	LEDS		0x6000
350#ifdef CONFIG_MMU
351	movsg		ear0,gr28
352__entry_uspace_handle_mmu_fault:
353	movgs		gr28,scr2
354#endif
355	sethi.p		%hi(__kernel_frame0_ptr),gr28
356	setlo		%lo(__kernel_frame0_ptr),gr28
357	ldi		@(gr28,#0),gr28
358
359	# handle h/w single-step through exceptions
360	sti		gr0,@(gr28,#REG__STATUS)
361
362	.globl		__entry_uspace_softprog_interrupt_reentry
363__entry_uspace_softprog_interrupt_reentry:
364	LEDS		0x6001
365
366	setlos		#REG__END,gr30
367	dcpl		gr28,gr30,#0
368
369	# set up the kernel stack pointer
370	sti.p		sp,@(gr28,#REG_SP)
371	ori		gr28,0,sp
372	sti		gr0,@(gr28,#REG_GR(28))
373
374	stdi		gr20,@(gr28,#REG_GR(20))
375	stdi		gr22,@(gr28,#REG_GR(22))
376
377	movsg		tbr,gr20
378	movsg		pcsr,gr21
379	movsg		psr,gr22
380
381	sethi.p		%hi(__entry_return_from_user_exception),gr23
382	setlo		%lo(__entry_return_from_user_exception),gr23
383
384	bra		__entry_common
385
386	.size		__entry_uspace_softprog_interrupt,.-__entry_uspace_softprog_interrupt
387
388	# single-stepping was disabled on entry to a TLB handler that then faulted
389#ifdef CONFIG_MMU
390	.globl		__entry_uspace_handle_mmu_fault_sstep
391__entry_uspace_handle_mmu_fault_sstep:
392	movgs		gr28,scr2
393	sethi.p		%hi(__kernel_frame0_ptr),gr28
394	setlo		%lo(__kernel_frame0_ptr),gr28
395	ldi		@(gr28,#0),gr28
396
397	# flag single-step re-enablement
398	sti		gr0,@(gr28,#REG__STATUS)
399	bra		__entry_uspace_softprog_interrupt_reentry
400#endif
401
402
403###############################################################################
404#
405# entry point for Software and Progam interrupts generated whilst executing kernel code
406#
407###############################################################################
408	.globl		__entry_kernel_softprog_interrupt
409        .type		__entry_kernel_softprog_interrupt,@function
410__entry_kernel_softprog_interrupt:
411	LEDS		0x6004
412
413#ifdef CONFIG_MMU
414	movsg		ear0,gr30
415	movgs		gr30,scr2
416#endif
417
418	.globl		__entry_kernel_handle_mmu_fault
419__entry_kernel_handle_mmu_fault:
420	# set up the stack pointer
421	subi		sp,#REG__END,sp
422	sti		sp,@(sp,#REG_SP)
423	sti		sp,@(sp,#REG_SP-4)
424	andi		sp,#~7,sp
425
426	# handle h/w single-step through exceptions
427	sti		gr0,@(sp,#REG__STATUS)
428
429	.globl		__entry_kernel_softprog_interrupt_reentry
430__entry_kernel_softprog_interrupt_reentry:
431	LEDS		0x6005
432
433	setlos		#REG__END,gr30
434	dcpl		sp,gr30,#0
435
436	# set up the exception frame
437	sti.p		gr28,@(sp,#REG_GR(28))
438	ori		sp,0,gr28
439
440	stdi		gr20,@(gr28,#REG_GR(20))
441	stdi		gr22,@(gr28,#REG_GR(22))
442
443	ldi		@(sp,#REG_SP),gr22		/* reconstruct the old SP */
444	addi		gr22,#REG__END,gr22
445	sti		gr22,@(sp,#REG_SP)
446
447	# set CCCR.CC3 to Undefined to abort atomic-modify completion inside the kernel
448	# - for an explanation of how it works, see: Documentation/frv/atomic-ops.txt
449	movsg		cccr,gr20
450	andi		gr20,#~0xc0,gr20
451	movgs		gr20,cccr
452
453	movsg		tbr,gr20
454	movsg		pcsr,gr21
455	movsg		psr,gr22
456
457	sethi.p		%hi(__entry_return_from_kernel_exception),gr23
458	setlo		%lo(__entry_return_from_kernel_exception),gr23
459	bra		__entry_common
460
461	.size		__entry_kernel_softprog_interrupt,.-__entry_kernel_softprog_interrupt
462
463	# single-stepping was disabled on entry to a TLB handler that then faulted
464#ifdef CONFIG_MMU
465	.globl		__entry_kernel_handle_mmu_fault_sstep
466__entry_kernel_handle_mmu_fault_sstep:
467	# set up the stack pointer
468	subi		sp,#REG__END,sp
469	sti		sp,@(sp,#REG_SP)
470	sti		sp,@(sp,#REG_SP-4)
471	andi		sp,#~7,sp
472
473	# flag single-step re-enablement
474	sethi		#REG__STATUS_STEP,gr30
475	sti		gr30,@(sp,#REG__STATUS)
476	bra		__entry_kernel_softprog_interrupt_reentry
477#endif
478
479
480###############################################################################
481#
482# the rest of the kernel entry point code
483# - on arriving here, the following registers should be set up:
484#	GR1	- kernel stack pointer
485#	GR7	- syscall number (trap 0 only)
486#	GR8-13	- syscall args (trap 0 only)
487#	GR20	- saved TBR
488#	GR21	- saved PC
489#	GR22	- saved PSR
490#	GR23	- return handler address
491#	GR28	- exception frame on stack
492#	SCR2	- saved EAR0 where applicable (clobbered by ICI & ICEF insns on FR451)
493#	PSR	- PSR.S 1, PSR.ET 0
494#
495###############################################################################
496	.globl		__entry_common
497        .type		__entry_common,@function
498__entry_common:
499	LEDS		0x6008
500
501	# finish building the exception frame
502	stdi		gr2,@(gr28,#REG_GR(2))
503	stdi		gr4,@(gr28,#REG_GR(4))
504	stdi		gr6,@(gr28,#REG_GR(6))
505	stdi		gr8,@(gr28,#REG_GR(8))
506	stdi		gr10,@(gr28,#REG_GR(10))
507	stdi		gr12,@(gr28,#REG_GR(12))
508	stdi		gr14,@(gr28,#REG_GR(14))
509	stdi		gr16,@(gr28,#REG_GR(16))
510	stdi		gr18,@(gr28,#REG_GR(18))
511	stdi		gr24,@(gr28,#REG_GR(24))
512	stdi		gr26,@(gr28,#REG_GR(26))
513	sti		gr29,@(gr28,#REG_GR(29))
514	stdi		gr30,@(gr28,#REG_GR(30))
515
516	movsg		lcr ,gr27
517	movsg		lr  ,gr26
518	movgs		gr23,lr
519	movsg		cccr,gr25
520	movsg		ccr ,gr24
521	movsg		isr ,gr23
522
523	setlos.p	#-1,gr4
524	andi		gr22,#PSR_PS,gr5		/* try to rebuild original PSR value */
525	andi.p		gr22,#~(PSR_PS|PSR_S),gr6
526	slli		gr5,#1,gr5
527	or		gr6,gr5,gr5
528	andi		gr5,#~PSR_ET,gr5
529
530	sti		gr20,@(gr28,#REG_TBR)
531	sti		gr21,@(gr28,#REG_PC)
532	sti		gr5 ,@(gr28,#REG_PSR)
533	sti		gr23,@(gr28,#REG_ISR)
534	stdi		gr24,@(gr28,#REG_CCR)
535	stdi		gr26,@(gr28,#REG_LR)
536	sti		gr4 ,@(gr28,#REG_SYSCALLNO)
537
538	movsg		iacc0h,gr4
539	movsg		iacc0l,gr5
540	stdi		gr4,@(gr28,#REG_IACC0)
541
542	movsg		gner0,gr4
543	movsg		gner1,gr5
544	stdi.p		gr4,@(gr28,#REG_GNER0)
545
546	# set up virtual interrupt disablement
547	subicc		gr0,#1,gr0,icc2			/* clear Z flag, set C flag */
548
549	# set up kernel global registers
550	sethi.p		%hi(__kernel_current_task),gr5
551	setlo		%lo(__kernel_current_task),gr5
552	sethi.p		%hi(_gp),gr16
553	setlo		%lo(_gp),gr16
554	ldi		@(gr5,#0),gr29
555	ldi		@(gr29,#4),gr15		; __current_thread_info = current->thread_info
556
557	# switch to the kernel trap table
558	sethi.p		%hi(__entry_kerneltrap_table),gr6
559	setlo		%lo(__entry_kerneltrap_table),gr6
560	movgs		gr6,tbr
561
562	# make sure we (the kernel) get div-zero and misalignment exceptions
563	setlos		#ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
564	movgs		gr5,isr
565
566	# clear power-saving mode flags
567	movsg		hsr0,gr4
568	andi		gr4,#~HSR0_PDM,gr4
569	movgs		gr4,hsr0
570
571	# multiplex again using old TBR as a guide
572	setlos.p	#TBR_TT,gr3
573	sethi		%hi(__entry_vector_table),gr6
574	and.p		gr20,gr3,gr5
575	setlo		%lo(__entry_vector_table),gr6
576	srli		gr5,#2,gr5
577	ld		@(gr5,gr6),gr5
578
579	LEDS		0x6009
580	jmpl		@(gr5,gr0)
581
582
583	.size		__entry_common,.-__entry_common
584
585###############################################################################
586#
587# handle instruction MMU fault
588#
589###############################################################################
590#ifdef CONFIG_MMU
591	.globl		__entry_insn_mmu_fault
592__entry_insn_mmu_fault:
593	LEDS		0x6010
594	setlos		#0,gr8
595	movsg		esr0,gr9
596	movsg		scr2,gr10
597
598	# now that we've accessed the exception regs, we can enable exceptions
599	movsg		psr,gr4
600	ori		gr4,#PSR_ET,gr4
601	movgs		gr4,psr
602
603	sethi.p		%hi(do_page_fault),gr5
604	setlo		%lo(do_page_fault),gr5
605	jmpl		@(gr5,gr0)	; call do_page_fault(0,esr0,ear0)
606#endif
607
608
609###############################################################################
610#
611# handle instruction access error
612#
613###############################################################################
614	.globl		__entry_insn_access_error
615__entry_insn_access_error:
616	LEDS		0x6011
617	sethi.p		%hi(insn_access_error),gr5
618	setlo		%lo(insn_access_error),gr5
619	movsg		esfr1,gr8
620	movsg		epcr0,gr9
621	movsg		esr0,gr10
622
623	# now that we've accessed the exception regs, we can enable exceptions
624	movsg		psr,gr4
625	ori		gr4,#PSR_ET,gr4
626	movgs		gr4,psr
627	jmpl		@(gr5,gr0)	; call insn_access_error(esfr1,epcr0,esr0)
628
629###############################################################################
630#
631# handle various instructions of dubious legality
632#
633###############################################################################
634	.globl		__entry_unsupported_trap
635	.globl		__entry_illegal_instruction
636	.globl		__entry_privileged_instruction
637	.globl		__entry_debug_exception
638__entry_unsupported_trap:
639	subi		gr21,#4,gr21
640	sti		gr21,@(gr28,#REG_PC)
641__entry_illegal_instruction:
642__entry_privileged_instruction:
643__entry_debug_exception:
644	LEDS		0x6012
645	sethi.p		%hi(illegal_instruction),gr5
646	setlo		%lo(illegal_instruction),gr5
647	movsg		esfr1,gr8
648	movsg		epcr0,gr9
649	movsg		esr0,gr10
650
651	# now that we've accessed the exception regs, we can enable exceptions
652	movsg		psr,gr4
653	ori		gr4,#PSR_ET,gr4
654	movgs		gr4,psr
655	jmpl		@(gr5,gr0)	; call ill_insn(esfr1,epcr0,esr0)
656
657###############################################################################
658#
659# handle atomic operation emulation for userspace
660#
661###############################################################################
662	.globl		__entry_atomic_op
663__entry_atomic_op:
664	LEDS		0x6012
665	sethi.p		%hi(atomic_operation),gr5
666	setlo		%lo(atomic_operation),gr5
667	movsg		esfr1,gr8
668	movsg		epcr0,gr9
669	movsg		esr0,gr10
670
671	# now that we've accessed the exception regs, we can enable exceptions
672	movsg		psr,gr4
673	ori		gr4,#PSR_ET,gr4
674	movgs		gr4,psr
675	jmpl		@(gr5,gr0)	; call atomic_operation(esfr1,epcr0,esr0)
676
677###############################################################################
678#
679# handle media exception
680#
681###############################################################################
682	.globl		__entry_media_exception
683__entry_media_exception:
684	LEDS		0x6013
685	sethi.p		%hi(media_exception),gr5
686	setlo		%lo(media_exception),gr5
687	movsg		msr0,gr8
688	movsg		msr1,gr9
689
690	# now that we've accessed the exception regs, we can enable exceptions
691	movsg		psr,gr4
692	ori		gr4,#PSR_ET,gr4
693	movgs		gr4,psr
694	jmpl		@(gr5,gr0)	; call media_excep(msr0,msr1)
695
696###############################################################################
697#
698# handle data MMU fault
699# handle data DAT fault (write-protect exception)
700#
701###############################################################################
702#ifdef CONFIG_MMU
703	.globl		__entry_data_mmu_fault
704__entry_data_mmu_fault:
705	.globl		__entry_data_dat_fault
706__entry_data_dat_fault:
707	LEDS		0x6014
708	setlos		#1,gr8
709	movsg		esr0,gr9
710	movsg		scr2,gr10	; saved EAR0
711
712	# now that we've accessed the exception regs, we can enable exceptions
713	movsg		psr,gr4
714	ori		gr4,#PSR_ET,gr4
715	movgs		gr4,psr
716
717	sethi.p		%hi(do_page_fault),gr5
718	setlo		%lo(do_page_fault),gr5
719	jmpl		@(gr5,gr0)	; call do_page_fault(1,esr0,ear0)
720#endif
721
722###############################################################################
723#
724# handle data and instruction access exceptions
725#
726###############################################################################
727	.globl		__entry_insn_access_exception
728	.globl		__entry_data_access_exception
729__entry_insn_access_exception:
730__entry_data_access_exception:
731	LEDS		0x6016
732	sethi.p		%hi(memory_access_exception),gr5
733	setlo		%lo(memory_access_exception),gr5
734	movsg		esr0,gr8
735	movsg		scr2,gr9	; saved EAR0
736	movsg		epcr0,gr10
737
738	# now that we've accessed the exception regs, we can enable exceptions
739	movsg		psr,gr4
740	ori		gr4,#PSR_ET,gr4
741	movgs		gr4,psr
742	jmpl		@(gr5,gr0)	; call memory_access_error(esr0,ear0,epcr0)
743
744###############################################################################
745#
746# handle data access error
747#
748###############################################################################
749	.globl		__entry_data_access_error
750__entry_data_access_error:
751	LEDS		0x6016
752	sethi.p		%hi(data_access_error),gr5
753	setlo		%lo(data_access_error),gr5
754	movsg		esfr1,gr8
755	movsg		esr15,gr9
756	movsg		ear15,gr10
757
758	# now that we've accessed the exception regs, we can enable exceptions
759	movsg		psr,gr4
760	ori		gr4,#PSR_ET,gr4
761	movgs		gr4,psr
762	jmpl		@(gr5,gr0)	; call data_access_error(esfr1,esr15,ear15)
763
764###############################################################################
765#
766# handle data store error
767#
768###############################################################################
769	.globl		__entry_data_store_error
770__entry_data_store_error:
771	LEDS		0x6017
772	sethi.p		%hi(data_store_error),gr5
773	setlo		%lo(data_store_error),gr5
774	movsg		esfr1,gr8
775	movsg		esr14,gr9
776
777	# now that we've accessed the exception regs, we can enable exceptions
778	movsg		psr,gr4
779	ori		gr4,#PSR_ET,gr4
780	movgs		gr4,psr
781	jmpl		@(gr5,gr0)	; call data_store_error(esfr1,esr14)
782
783###############################################################################
784#
785# handle division exception
786#
787###############################################################################
788	.globl		__entry_division_exception
789__entry_division_exception:
790	LEDS		0x6018
791	sethi.p		%hi(division_exception),gr5
792	setlo		%lo(division_exception),gr5
793	movsg		esfr1,gr8
794	movsg		esr0,gr9
795	movsg		isr,gr10
796
797	# now that we've accessed the exception regs, we can enable exceptions
798	movsg		psr,gr4
799	ori		gr4,#PSR_ET,gr4
800	movgs		gr4,psr
801	jmpl		@(gr5,gr0)	; call div_excep(esfr1,esr0,isr)
802
803###############################################################################
804#
805# handle compound exception
806#
807###############################################################################
808	.globl		__entry_compound_exception
809__entry_compound_exception:
810	LEDS		0x6019
811	sethi.p		%hi(compound_exception),gr5
812	setlo		%lo(compound_exception),gr5
813	movsg		esfr1,gr8
814	movsg		esr0,gr9
815	movsg		esr14,gr10
816	movsg		esr15,gr11
817	movsg		msr0,gr12
818	movsg		msr1,gr13
819
820	# now that we've accessed the exception regs, we can enable exceptions
821	movsg		psr,gr4
822	ori		gr4,#PSR_ET,gr4
823	movgs		gr4,psr
824	jmpl		@(gr5,gr0)	; call comp_excep(esfr1,esr0,esr14,esr15,msr0,msr1)
825
826###############################################################################
827#
828# handle interrupts and NMIs
829#
830###############################################################################
831	.globl		__entry_do_IRQ
832__entry_do_IRQ:
833	LEDS		0x6020
834
835	# we can enable exceptions
836	movsg		psr,gr4
837	ori		gr4,#PSR_ET,gr4
838	movgs		gr4,psr
839	bra		do_IRQ
840
841	.globl		__entry_do_NMI
842__entry_do_NMI:
843	LEDS		0x6021
844
845	# we can enable exceptions
846	movsg		psr,gr4
847	ori		gr4,#PSR_ET,gr4
848	movgs		gr4,psr
849	bra		do_NMI
850
851###############################################################################
852#
853# the return path for a newly forked child process
854# - __switch_to() saved the old current pointer in GR8 for us
855#
856###############################################################################
857	.globl		ret_from_fork
858ret_from_fork:
859	LEDS		0x6100
860	call		schedule_tail
861
862	# fork & co. return 0 to child
863	setlos.p	#0,gr8
864	bra		__syscall_exit
865
866	.globl		ret_from_kernel_thread
867ret_from_kernel_thread:
868	lddi.p		@(gr28,#REG_GR(8)),gr20
869	call		schedule_tail
870	calll.p		@(gr21,gr0)
871	or		gr20,gr20,gr8
872	bra		__syscall_exit
873
874###################################################################################################
875#
876# Return to user mode is not as complex as all this looks,
877# but we want the default path for a system call return to
878# go as quickly as possible which is why some of this is
879# less clear than it otherwise should be.
880#
881###################################################################################################
882	.balign		L1_CACHE_BYTES
883	.globl		system_call
884system_call:
885	LEDS		0x6101
886	movsg		psr,gr4			; enable exceptions
887	ori		gr4,#PSR_ET,gr4
888	movgs		gr4,psr
889
890	sti		gr7,@(gr28,#REG_SYSCALLNO)
891	sti.p		gr8,@(gr28,#REG_ORIG_GR8)
892
893	subicc		gr7,#nr_syscalls,gr0,icc0
894	bnc		icc0,#0,__syscall_badsys
895
896	ldi		@(gr15,#TI_FLAGS),gr4
897	andicc		gr4,#_TIF_SYSCALL_TRACE,gr0,icc0
898	bne		icc0,#0,__syscall_trace_entry
899
900__syscall_call:
901	slli.p		gr7,#2,gr7
902	sethi		%hi(sys_call_table),gr5
903	setlo		%lo(sys_call_table),gr5
904	ld		@(gr5,gr7),gr4
905	calll		@(gr4,gr0)
906
907
908###############################################################################
909#
910# return to interrupted process
911#
912###############################################################################
913__syscall_exit:
914	LEDS		0x6300
915
916	# keep current PSR in GR23
917	movsg		psr,gr23
918
919	ldi		@(gr28,#REG_PSR),gr22
920
921	sti.p		gr8,@(gr28,#REG_GR(8))	; save return value
922
923	# rebuild saved psr - execve will change it for init/main.c
924	srli		gr22,#1,gr5
925	andi.p		gr22,#~PSR_PS,gr22
926	andi		gr5,#PSR_PS,gr5
927	or		gr5,gr22,gr22
928	ori.p		gr22,#PSR_S,gr22
929
930	# make sure we don't miss an interrupt setting need_resched or sigpending between
931	# sampling and the RETT
932	ori		gr23,#PSR_PIL_14,gr23
933	movgs		gr23,psr
934
935	ldi		@(gr15,#TI_FLAGS),gr4
936	andicc		gr4,#_TIF_ALLWORK_MASK,gr0,icc0
937	bne		icc0,#0,__syscall_exit_work
938
939	# restore all registers and return
940__entry_return_direct:
941	LEDS		0x6301
942
943	andi		gr22,#~PSR_ET,gr22
944	movgs		gr22,psr
945
946	ldi		@(gr28,#REG_ISR),gr23
947	lddi		@(gr28,#REG_CCR),gr24
948	lddi		@(gr28,#REG_LR) ,gr26
949	ldi		@(gr28,#REG_PC) ,gr21
950	ldi		@(gr28,#REG_TBR),gr20
951
952	movgs		gr20,tbr
953	movgs		gr21,pcsr
954	movgs		gr23,isr
955	movgs		gr24,ccr
956	movgs		gr25,cccr
957	movgs		gr26,lr
958	movgs		gr27,lcr
959
960	lddi		@(gr28,#REG_GNER0),gr4
961	movgs		gr4,gner0
962	movgs		gr5,gner1
963
964	lddi		@(gr28,#REG_IACC0),gr4
965	movgs		gr4,iacc0h
966	movgs		gr5,iacc0l
967
968	lddi		@(gr28,#REG_GR(4)) ,gr4
969	lddi		@(gr28,#REG_GR(6)) ,gr6
970	lddi		@(gr28,#REG_GR(8)) ,gr8
971	lddi		@(gr28,#REG_GR(10)),gr10
972	lddi		@(gr28,#REG_GR(12)),gr12
973	lddi		@(gr28,#REG_GR(14)),gr14
974	lddi		@(gr28,#REG_GR(16)),gr16
975	lddi		@(gr28,#REG_GR(18)),gr18
976	lddi		@(gr28,#REG_GR(20)),gr20
977	lddi		@(gr28,#REG_GR(22)),gr22
978	lddi		@(gr28,#REG_GR(24)),gr24
979	lddi		@(gr28,#REG_GR(26)),gr26
980	ldi		@(gr28,#REG_GR(29)),gr29
981	lddi		@(gr28,#REG_GR(30)),gr30
982
983	# check to see if a debugging return is required
984	LEDS		0x67f0
985	movsg		ccr,gr2
986	ldi		@(gr28,#REG__STATUS),gr3
987	andicc		gr3,#REG__STATUS_STEP,gr0,icc0
988	bne		icc0,#0,__entry_return_singlestep
989	movgs		gr2,ccr
990
991	ldi		@(gr28,#REG_SP)    ,sp
992	lddi		@(gr28,#REG_GR(2)) ,gr2
993	ldi		@(gr28,#REG_GR(28)),gr28
994
995	LEDS		0x67fe
996//	movsg		pcsr,gr31
997//	LEDS32
998
999#if 0
1000	# store the current frame in the workram on the FR451
1001	movgs		gr28,scr2
1002	sethi.p		%hi(0xfe800000),gr28
1003	setlo		%lo(0xfe800000),gr28
1004
1005	stdi		gr2,@(gr28,#REG_GR(2))
1006	stdi		gr4,@(gr28,#REG_GR(4))
1007	stdi		gr6,@(gr28,#REG_GR(6))
1008	stdi		gr8,@(gr28,#REG_GR(8))
1009	stdi		gr10,@(gr28,#REG_GR(10))
1010	stdi		gr12,@(gr28,#REG_GR(12))
1011	stdi		gr14,@(gr28,#REG_GR(14))
1012	stdi		gr16,@(gr28,#REG_GR(16))
1013	stdi		gr18,@(gr28,#REG_GR(18))
1014	stdi		gr24,@(gr28,#REG_GR(24))
1015	stdi		gr26,@(gr28,#REG_GR(26))
1016	sti		gr29,@(gr28,#REG_GR(29))
1017	stdi		gr30,@(gr28,#REG_GR(30))
1018
1019	movsg		tbr ,gr30
1020	sti		gr30,@(gr28,#REG_TBR)
1021	movsg		pcsr,gr30
1022	sti		gr30,@(gr28,#REG_PC)
1023	movsg		psr ,gr30
1024	sti		gr30,@(gr28,#REG_PSR)
1025	movsg		isr ,gr30
1026	sti		gr30,@(gr28,#REG_ISR)
1027	movsg		ccr ,gr30
1028	movsg		cccr,gr31
1029	stdi		gr30,@(gr28,#REG_CCR)
1030	movsg		lr  ,gr30
1031	movsg		lcr ,gr31
1032	stdi		gr30,@(gr28,#REG_LR)
1033	sti		gr0 ,@(gr28,#REG_SYSCALLNO)
1034	movsg		scr2,gr28
1035#endif
1036
1037	rett		#0
1038
1039	# return via break.S
1040__entry_return_singlestep:
1041	movgs		gr2,ccr
1042	lddi		@(gr28,#REG_GR(2)) ,gr2
1043	ldi		@(gr28,#REG_SP)    ,sp
1044	ldi		@(gr28,#REG_GR(28)),gr28
1045	LEDS		0x67ff
1046	break
1047	.globl		__entry_return_singlestep_breaks_here
1048__entry_return_singlestep_breaks_here:
1049	nop
1050
1051
1052###############################################################################
1053#
1054# return to a process interrupted in kernel space
1055# - we need to consider preemption if that is enabled
1056#
1057###############################################################################
1058	.balign		L1_CACHE_BYTES
1059__entry_return_from_kernel_exception:
1060	LEDS		0x6302
1061	movsg		psr,gr23
1062	ori		gr23,#PSR_PIL_14,gr23
1063	movgs		gr23,psr
1064	bra		__entry_return_direct
1065
1066	.balign		L1_CACHE_BYTES
1067__entry_return_from_kernel_interrupt:
1068	LEDS		0x6303
1069	movsg		psr,gr23
1070	ori		gr23,#PSR_PIL_14,gr23
1071	movgs		gr23,psr
1072
1073#ifdef CONFIG_PREEMPT
1074	ldi		@(gr15,#TI_PRE_COUNT),gr5
1075	subicc		gr5,#0,gr0,icc0
1076	beq		icc0,#0,__entry_return_direct
1077
1078	subcc		gr0,gr0,gr0,icc2		/* set Z and clear C */
1079	call		preempt_schedule_irq
1080#endif
1081	bra		__entry_return_direct
1082
1083
1084###############################################################################
1085#
1086# perform work that needs to be done immediately before resumption
1087#
1088###############################################################################
1089	.globl		__entry_return_from_user_exception
1090	.balign		L1_CACHE_BYTES
1091__entry_return_from_user_exception:
1092	LEDS		0x6501
1093
1094__entry_resume_userspace:
1095	# make sure we don't miss an interrupt setting need_resched or sigpending between
1096	# sampling and the RETT
1097	movsg		psr,gr23
1098	ori		gr23,#PSR_PIL_14,gr23
1099	movgs		gr23,psr
1100
1101__entry_return_from_user_interrupt:
1102	LEDS		0x6402
1103	ldi		@(gr15,#TI_FLAGS),gr4
1104	andicc		gr4,#_TIF_WORK_MASK,gr0,icc0
1105	beq		icc0,#1,__entry_return_direct
1106
1107__entry_work_pending:
1108	LEDS		0x6404
1109	andicc		gr4,#_TIF_NEED_RESCHED,gr0,icc0
1110	beq		icc0,#1,__entry_work_notifysig
1111
1112__entry_work_resched:
1113	LEDS		0x6408
1114	movsg		psr,gr23
1115	andi		gr23,#~PSR_PIL,gr23
1116	movgs		gr23,psr
1117	call		schedule
1118	movsg		psr,gr23
1119	ori		gr23,#PSR_PIL_14,gr23
1120	movgs		gr23,psr
1121
1122	LEDS		0x6401
1123	ldi		@(gr15,#TI_FLAGS),gr4
1124	andicc		gr4,#_TIF_WORK_MASK,gr0,icc0
1125	beq		icc0,#1,__entry_return_direct
1126	andicc		gr4,#_TIF_NEED_RESCHED,gr0,icc0
1127	bne		icc0,#1,__entry_work_resched
1128
1129__entry_work_notifysig:
1130	LEDS		0x6410
1131	ori.p		gr4,#0,gr8
1132	call		do_notify_resume
1133	bra		__entry_resume_userspace
1134
1135	# perform syscall entry tracing
1136__syscall_trace_entry:
1137	LEDS		0x6320
1138	call		syscall_trace_entry
1139
1140	lddi.p		@(gr28,#REG_GR(8)) ,gr8
1141	ori		gr8,#0,gr7		; syscall_trace_entry() returned new syscallno
1142	lddi		@(gr28,#REG_GR(10)),gr10
1143	lddi.p		@(gr28,#REG_GR(12)),gr12
1144
1145	subicc		gr7,#nr_syscalls,gr0,icc0
1146	bnc		icc0,#0,__syscall_badsys
1147	bra		__syscall_call
1148
1149	# perform syscall exit tracing
1150__syscall_exit_work:
1151	LEDS		0x6340
1152	andicc		gr22,#PSR_PS,gr0,icc1	; don't handle on return to kernel mode
1153	andicc.p	gr4,#_TIF_SYSCALL_TRACE,gr0,icc0
1154	bne		icc1,#0,__entry_return_direct
1155	beq		icc0,#1,__entry_work_pending
1156
1157	movsg		psr,gr23
1158	andi		gr23,#~PSR_PIL,gr23	; could let syscall_trace_exit() call schedule()
1159	movgs		gr23,psr
1160
1161	call		syscall_trace_exit
1162	bra		__entry_resume_userspace
1163
1164__syscall_badsys:
1165	LEDS		0x6380
1166	setlos		#-ENOSYS,gr8
1167	sti		gr8,@(gr28,#REG_GR(8))	; save return value
1168	bra		__entry_resume_userspace
1169
1170
1171###############################################################################
1172#
1173# syscall vector table
1174#
1175###############################################################################
1176	.section .rodata
1177ALIGN
1178	.globl		sys_call_table
1179sys_call_table:
1180	.long sys_restart_syscall	/* 0 - old "setup()" system call, used for restarting */
1181	.long sys_exit
1182	.long sys_fork
1183	.long sys_read
1184	.long sys_write
1185	.long sys_open		/* 5 */
1186	.long sys_close
1187	.long sys_waitpid
1188	.long sys_creat
1189	.long sys_link
1190	.long sys_unlink		/* 10 */
1191	.long sys_execve
1192	.long sys_chdir
1193	.long sys_time
1194	.long sys_mknod
1195	.long sys_chmod		/* 15 */
1196	.long sys_lchown16
1197	.long sys_ni_syscall			/* old break syscall holder */
1198	.long sys_stat
1199	.long sys_lseek
1200	.long sys_getpid		/* 20 */
1201	.long sys_mount
1202	.long sys_oldumount
1203	.long sys_setuid16
1204	.long sys_getuid16
1205	.long sys_ni_syscall // sys_stime		/* 25 */
1206	.long sys_ptrace
1207	.long sys_alarm
1208	.long sys_fstat
1209	.long sys_pause
1210	.long sys_utime		/* 30 */
1211	.long sys_ni_syscall			/* old stty syscall holder */
1212	.long sys_ni_syscall			/* old gtty syscall holder */
1213	.long sys_access
1214	.long sys_nice
1215	.long sys_ni_syscall	/* 35 */	/* old ftime syscall holder */
1216	.long sys_sync
1217	.long sys_kill
1218	.long sys_rename
1219	.long sys_mkdir
1220	.long sys_rmdir		/* 40 */
1221	.long sys_dup
1222	.long sys_pipe
1223	.long sys_times
1224	.long sys_ni_syscall			/* old prof syscall holder */
1225	.long sys_brk		/* 45 */
1226	.long sys_setgid16
1227	.long sys_getgid16
1228	.long sys_ni_syscall // sys_signal
1229	.long sys_geteuid16
1230	.long sys_getegid16	/* 50 */
1231	.long sys_acct
1232	.long sys_umount				/* recycled never used phys( */
1233	.long sys_ni_syscall			/* old lock syscall holder */
1234	.long sys_ioctl
1235	.long sys_fcntl		/* 55 */
1236	.long sys_ni_syscall			/* old mpx syscall holder */
1237	.long sys_setpgid
1238	.long sys_ni_syscall			/* old ulimit syscall holder */
1239	.long sys_ni_syscall			/* old old uname syscall */
1240	.long sys_umask		/* 60 */
1241	.long sys_chroot
1242	.long sys_ustat
1243	.long sys_dup2
1244	.long sys_getppid
1245	.long sys_getpgrp	/* 65 */
1246	.long sys_setsid
1247	.long sys_sigaction
1248	.long sys_ni_syscall // sys_sgetmask
1249	.long sys_ni_syscall // sys_ssetmask
1250	.long sys_setreuid16	/* 70 */
1251	.long sys_setregid16
1252	.long sys_sigsuspend
1253	.long sys_ni_syscall // sys_sigpending
1254	.long sys_sethostname
1255	.long sys_setrlimit	/* 75 */
1256	.long sys_ni_syscall // sys_old_getrlimit
1257	.long sys_getrusage
1258	.long sys_gettimeofday
1259	.long sys_settimeofday
1260	.long sys_getgroups16	/* 80 */
1261	.long sys_setgroups16
1262	.long sys_ni_syscall			/* old_select slot */
1263	.long sys_symlink
1264	.long sys_lstat
1265	.long sys_readlink		/* 85 */
1266	.long sys_uselib
1267	.long sys_swapon
1268	.long sys_reboot
1269	.long sys_ni_syscall // old_readdir
1270	.long sys_ni_syscall	/* 90 */	/* old_mmap slot */
1271	.long sys_munmap
1272	.long sys_truncate
1273	.long sys_ftruncate
1274	.long sys_fchmod
1275	.long sys_fchown16		/* 95 */
1276	.long sys_getpriority
1277	.long sys_setpriority
1278	.long sys_ni_syscall			/* old profil syscall holder */
1279	.long sys_statfs
1280	.long sys_fstatfs		/* 100 */
1281	.long sys_ni_syscall			/* ioperm for i386 */
1282	.long sys_socketcall
1283	.long sys_syslog
1284	.long sys_setitimer
1285	.long sys_getitimer	/* 105 */
1286	.long sys_newstat
1287	.long sys_newlstat
1288	.long sys_newfstat
1289	.long sys_ni_syscall	/* obsolete olduname( syscall */
1290	.long sys_ni_syscall	/* iopl for i386 */ /* 110 */
1291	.long sys_vhangup
1292	.long sys_ni_syscall	/* obsolete idle( syscall */
1293	.long sys_ni_syscall	/* vm86old for i386 */
1294	.long sys_wait4
1295	.long sys_swapoff		/* 115 */
1296	.long sys_sysinfo
1297	.long sys_ipc
1298	.long sys_fsync
1299	.long sys_sigreturn
1300	.long sys_clone		/* 120 */
1301	.long sys_setdomainname
1302	.long sys_newuname
1303	.long sys_ni_syscall	/* old "cacheflush" */
1304	.long sys_adjtimex
1305	.long sys_mprotect	/* 125 */
1306	.long sys_sigprocmask
1307	.long sys_ni_syscall	/* old "create_module" */
1308	.long sys_init_module
1309	.long sys_delete_module
1310	.long sys_ni_syscall	/* old "get_kernel_syms" */
1311	.long sys_quotactl
1312	.long sys_getpgid
1313	.long sys_fchdir
1314	.long sys_bdflush
1315	.long sys_sysfs		/* 135 */
1316	.long sys_personality
1317	.long sys_ni_syscall	/* for afs_syscall */
1318	.long sys_setfsuid16
1319	.long sys_setfsgid16
1320	.long sys_llseek		/* 140 */
1321	.long sys_getdents
1322	.long sys_select
1323	.long sys_flock
1324	.long sys_msync
1325	.long sys_readv		/* 145 */
1326	.long sys_writev
1327	.long sys_getsid
1328	.long sys_fdatasync
1329	.long sys_sysctl
1330	.long sys_mlock		/* 150 */
1331	.long sys_munlock
1332	.long sys_mlockall
1333	.long sys_munlockall
1334	.long sys_sched_setparam
1335	.long sys_sched_getparam   /* 155 */
1336	.long sys_sched_setscheduler
1337	.long sys_sched_getscheduler
1338	.long sys_sched_yield
1339	.long sys_sched_get_priority_max
1340	.long sys_sched_get_priority_min  /* 160 */
1341	.long sys_sched_rr_get_interval
1342	.long sys_nanosleep
1343	.long sys_mremap
1344	.long sys_setresuid16
1345	.long sys_getresuid16	/* 165 */
1346	.long sys_ni_syscall	/* for vm86 */
1347	.long sys_ni_syscall	/* Old sys_query_module */
1348	.long sys_poll
1349	.long sys_ni_syscall	/* Old nfsservctl */
1350	.long sys_setresgid16	/* 170 */
1351	.long sys_getresgid16
1352	.long sys_prctl
1353	.long sys_rt_sigreturn
1354	.long sys_rt_sigaction
1355	.long sys_rt_sigprocmask	/* 175 */
1356	.long sys_rt_sigpending
1357	.long sys_rt_sigtimedwait
1358	.long sys_rt_sigqueueinfo
1359	.long sys_rt_sigsuspend
1360	.long sys_pread64		/* 180 */
1361	.long sys_pwrite64
1362	.long sys_chown16
1363	.long sys_getcwd
1364	.long sys_capget
1365	.long sys_capset           /* 185 */
1366	.long sys_sigaltstack
1367	.long sys_sendfile
1368	.long sys_ni_syscall		/* streams1 */
1369	.long sys_ni_syscall		/* streams2 */
1370	.long sys_vfork            /* 190 */
1371	.long sys_getrlimit
1372	.long sys_mmap2
1373	.long sys_truncate64
1374	.long sys_ftruncate64
1375	.long sys_stat64		/* 195 */
1376	.long sys_lstat64
1377	.long sys_fstat64
1378	.long sys_lchown
1379	.long sys_getuid
1380	.long sys_getgid		/* 200 */
1381	.long sys_geteuid
1382	.long sys_getegid
1383	.long sys_setreuid
1384	.long sys_setregid
1385	.long sys_getgroups	/* 205 */
1386	.long sys_setgroups
1387	.long sys_fchown
1388	.long sys_setresuid
1389	.long sys_getresuid
1390	.long sys_setresgid	/* 210 */
1391	.long sys_getresgid
1392	.long sys_chown
1393	.long sys_setuid
1394	.long sys_setgid
1395	.long sys_setfsuid		/* 215 */
1396	.long sys_setfsgid
1397	.long sys_pivot_root
1398	.long sys_mincore
1399	.long sys_madvise
1400	.long sys_getdents64	/* 220 */
1401	.long sys_fcntl64
1402	.long sys_ni_syscall	/* reserved for TUX */
1403	.long sys_ni_syscall	/* Reserved for Security */
1404	.long sys_gettid
1405	.long sys_readahead	/* 225 */
1406	.long sys_setxattr
1407	.long sys_lsetxattr
1408	.long sys_fsetxattr
1409	.long sys_getxattr
1410	.long sys_lgetxattr	/* 230 */
1411	.long sys_fgetxattr
1412	.long sys_listxattr
1413	.long sys_llistxattr
1414	.long sys_flistxattr
1415	.long sys_removexattr	/* 235 */
1416	.long sys_lremovexattr
1417	.long sys_fremovexattr
1418 	.long sys_tkill
1419	.long sys_sendfile64
1420	.long sys_futex		/* 240 */
1421	.long sys_sched_setaffinity
1422	.long sys_sched_getaffinity
1423	.long sys_ni_syscall	//sys_set_thread_area
1424	.long sys_ni_syscall	//sys_get_thread_area
1425	.long sys_io_setup	/* 245 */
1426	.long sys_io_destroy
1427	.long sys_io_getevents
1428	.long sys_io_submit
1429	.long sys_io_cancel
1430	.long sys_fadvise64	/* 250 */
1431	.long sys_ni_syscall
1432	.long sys_exit_group
1433	.long sys_lookup_dcookie
1434	.long sys_epoll_create
1435	.long sys_epoll_ctl	/* 255 */
1436	.long sys_epoll_wait
1437 	.long sys_remap_file_pages
1438 	.long sys_set_tid_address
1439 	.long sys_timer_create
1440 	.long sys_timer_settime		/* 260 */
1441 	.long sys_timer_gettime
1442 	.long sys_timer_getoverrun
1443 	.long sys_timer_delete
1444 	.long sys_clock_settime
1445 	.long sys_clock_gettime		/* 265 */
1446 	.long sys_clock_getres
1447 	.long sys_clock_nanosleep
1448	.long sys_statfs64
1449	.long sys_fstatfs64
1450	.long sys_tgkill	/* 270 */
1451	.long sys_utimes
1452 	.long sys_fadvise64_64
1453	.long sys_ni_syscall	/* sys_vserver */
1454	.long sys_mbind
1455	.long sys_get_mempolicy
1456	.long sys_set_mempolicy
1457	.long sys_mq_open
1458	.long sys_mq_unlink
1459	.long sys_mq_timedsend
1460	.long sys_mq_timedreceive	/* 280 */
1461	.long sys_mq_notify
1462	.long sys_mq_getsetattr
1463	.long sys_ni_syscall		/* reserved for kexec */
1464	.long sys_waitid
1465	.long sys_ni_syscall		/* 285 */ /* available */
1466	.long sys_add_key
1467	.long sys_request_key
1468	.long sys_keyctl
1469	.long sys_ioprio_set
1470	.long sys_ioprio_get		/* 290 */
1471	.long sys_inotify_init
1472	.long sys_inotify_add_watch
1473	.long sys_inotify_rm_watch
1474	.long sys_migrate_pages
1475	.long sys_openat		/* 295 */
1476	.long sys_mkdirat
1477	.long sys_mknodat
1478	.long sys_fchownat
1479	.long sys_futimesat
1480	.long sys_fstatat64		/* 300 */
1481	.long sys_unlinkat
1482	.long sys_renameat
1483	.long sys_linkat
1484	.long sys_symlinkat
1485	.long sys_readlinkat		/* 305 */
1486	.long sys_fchmodat
1487	.long sys_faccessat
1488	.long sys_pselect6
1489	.long sys_ppoll
1490	.long sys_unshare		/* 310 */
1491	.long sys_set_robust_list
1492	.long sys_get_robust_list
1493	.long sys_splice
1494	.long sys_sync_file_range
1495	.long sys_tee			/* 315 */
1496	.long sys_vmsplice
1497	.long sys_move_pages
1498	.long sys_getcpu
1499	.long sys_epoll_pwait
1500	.long sys_utimensat		/* 320 */
1501	.long sys_signalfd
1502	.long sys_timerfd_create
1503	.long sys_eventfd
1504	.long sys_fallocate
1505	.long sys_timerfd_settime	/* 325 */
1506	.long sys_timerfd_gettime
1507	.long sys_signalfd4
1508	.long sys_eventfd2
1509	.long sys_epoll_create1
1510	.long sys_dup3			/* 330 */
1511	.long sys_pipe2
1512	.long sys_inotify_init1
1513	.long sys_preadv
1514	.long sys_pwritev
1515	.long sys_rt_tgsigqueueinfo	/* 335 */
1516	.long sys_perf_event_open
1517	.long sys_setns
1518
1519syscall_table_size = (. - sys_call_table)
1520