diff options
Diffstat (limited to 'arch/cris/arch-v10/kernel/entry.S')
-rw-r--r-- | arch/cris/arch-v10/kernel/entry.S | 1132 |
1 files changed, 1132 insertions, 0 deletions
diff --git a/arch/cris/arch-v10/kernel/entry.S b/arch/cris/arch-v10/kernel/entry.S new file mode 100644 index 000000000000..1bc44f481c34 --- /dev/null +++ b/arch/cris/arch-v10/kernel/entry.S | |||
@@ -0,0 +1,1132 @@ | |||
1 | /* $Id: entry.S,v 1.23 2004/10/19 13:07:37 starvik Exp $ | ||
2 | * | ||
3 | * linux/arch/cris/entry.S | ||
4 | * | ||
5 | * Copyright (C) 2000, 2001, 2002 Axis Communications AB | ||
6 | * | ||
7 | * Authors: Bjorn Wesen (bjornw@axis.com) | ||
8 | * | ||
9 | * $Log: entry.S,v $ | ||
10 | * Revision 1.23 2004/10/19 13:07:37 starvik | ||
11 | * Merge of Linux 2.6.9 | ||
12 | * | ||
13 | * Revision 1.22 2004/06/21 10:29:55 starvik | ||
14 | * Merge of Linux 2.6.7 | ||
15 | * | ||
16 | * Revision 1.21 2004/06/09 05:30:27 starvik | ||
17 | * Clean up multiple interrupt handling. | ||
18 | * Prevent interrupts from interrupting each other. | ||
19 | * Handle all active interrupts. | ||
20 | * | ||
21 | * Revision 1.20 2004/06/08 08:55:32 starvik | ||
22 | * Removed unused code | ||
23 | * | ||
24 | * Revision 1.19 2004/06/04 11:56:15 starvik | ||
25 | * Implemented page table lookup for refills in assembler for improved performance. | ||
26 | * | ||
27 | * Revision 1.18 2004/05/11 12:28:25 starvik | ||
28 | * Merge of Linux 2.6.6 | ||
29 | * | ||
30 | * Revision 1.17 2003/09/11 07:29:49 starvik | ||
31 | * Merge of Linux 2.6.0-test5 | ||
32 | * | ||
33 | * Revision 1.16 2003/07/04 08:27:41 starvik | ||
34 | * Merge of Linux 2.5.74 | ||
35 | * | ||
36 | * Revision 1.15 2003/04/09 07:32:55 starvik | ||
37 | * resume should return task_struct, not thread_info | ||
38 | * | ||
39 | * Revision 1.14 2003/04/09 05:20:44 starvik | ||
40 | * Merge of Linux 2.5.67 | ||
41 | * | ||
42 | * Revision 1.13 2002/12/11 15:42:02 starvik | ||
43 | * Extracted v10 (ETRAX 100LX) specific stuff from arch/cris/kernel/*.c | ||
44 | * | ||
45 | * Revision 1.12 2002/12/10 09:00:10 starvik | ||
46 | * Merge of Linux 2.5.51 | ||
47 | * | ||
48 | * Revision 1.11 2002/12/05 07:53:10 starvik | ||
49 | * Corrected constants used with btstq | ||
50 | * | ||
51 | * Revision 1.10 2002/11/27 08:45:10 starvik | ||
52 | * pid is in task_struct, not thread_info | ||
53 | * | ||
54 | * Revision 1.9 2002/11/26 09:52:05 starvik | ||
55 | * Added preemptive kernel scheduling (if CONFIG_PREEMPT) | ||
56 | * | ||
57 | * Revision 1.8 2002/11/20 11:56:11 starvik | ||
58 | * Merge of Linux 2.5.48 | ||
59 | * | ||
60 | * Revision 1.7 2002/11/18 13:02:42 starvik | ||
61 | * Added fourth parameter to do_notify_resume | ||
62 | * Minor cleanup | ||
63 | * | ||
64 | * Revision 1.6 2002/11/11 10:37:50 starvik | ||
65 | * Use new asm-offset defines | ||
66 | * Modified for new location of current->work etc | ||
67 | * Removed SYMBOL_NAME from syscalls | ||
68 | * Added some new syscalls | ||
69 | * | ||
70 | * Revision 1.5 2002/11/05 06:45:11 starvik | ||
71 | * Merge of Linux 2.5.45 | ||
72 | * | ||
73 | * Revision 1.4 2002/02/05 15:41:31 bjornw | ||
74 | * Rewritten to conform better to current 2.5 code (similar to arch/i386) | ||
75 | * | ||
76 | * Revision 1.3 2002/01/21 15:22:20 bjornw | ||
77 | * NICE_DOGGY fix from 2.4 arch/cris | ||
78 | * | ||
79 | * Revision 1.37 2001/12/07 17:03:55 bjornw | ||
80 | * Call a c-hook called watchdog_bite_hook instead of show_registers directly | ||
81 | * | ||
82 | * Revision 1.36 2001/11/22 13:36:36 bjornw | ||
83 | * * In ret_from_intr, check regs->dccr for usermode reentrance instead of | ||
84 | * DCCR explicitely (because the latter might not reflect current reality) | ||
85 | * * In mmu_bus_fault, set $r9 _after_ calling the C-code instead of before | ||
86 | * since $r9 is call-clobbered and is potentially needed afterwards | ||
87 | * | ||
88 | * Revision 1.35 2001/10/30 17:10:15 bjornw | ||
89 | * Add some syscalls | ||
90 | * | ||
91 | * Revision 1.34 2001/10/01 14:45:03 bjornw | ||
92 | * Removed underscores and added register prefixes | ||
93 | * | ||
94 | * Revision 1.33 2001/08/21 13:48:01 jonashg | ||
95 | * Added fix by HP to avoid oops when doing a hard_reset_now. | ||
96 | * | ||
97 | * Revision 1.32 2001/08/14 04:32:02 hp | ||
98 | * In _resume, add comment why R9 is saved; don't sound like it's call-saved. | ||
99 | * | ||
100 | * Revision 1.31 2001/07/25 16:07:42 bjornw | ||
101 | * softirq_active/mask -> softirq_pending only | ||
102 | * | ||
103 | * Revision 1.30 2001/07/05 01:03:32 hp | ||
104 | * - include asm/errno.h to get ENOSYS. | ||
105 | * - Use ENOSYS, not local constant LENOSYS; tweak comments. | ||
106 | * - Explain why .include, not #include is used. | ||
107 | * - Make oops-register-dump if watchdog bits and it's not expected. | ||
108 | * - Don't jsr, use jump _hard_reset_now, and skip spurious nop. | ||
109 | * - Use correct section attribute for section .rodata. | ||
110 | * - Adjust sys_ni_syscall fill number. | ||
111 | * | ||
112 | * Revision 1.29 2001/06/25 14:07:00 hp | ||
113 | * Fix review comment. | ||
114 | * * head.S: Use IO_STATE, IO_FIELD and IO_MASK constructs instead of | ||
115 | * magic numbers. Add comment that -traditional must not be used. | ||
116 | * * entry.S (SYMBOL_NAME): Change redefinition to use ## concatenation. | ||
117 | * Correct and update comment. | ||
118 | * * Makefile (.S.o): Don't use -traditional. Add comment why the | ||
119 | * toplevel rule can't be used (now that there's a reason). | ||
120 | * | ||
121 | * Revision 1.28 2001/06/21 02:00:40 hp | ||
122 | * * entry.S: Include asm/unistd.h. | ||
123 | * (_sys_call_table): Use section .rodata, not .data. | ||
124 | * (_kernel_thread): Move from... | ||
125 | * * process.c: ... here. | ||
126 | * * entryoffsets.c (VAL): Break out from... | ||
127 | * (OF): Use VAL. | ||
128 | * (LCLONE_VM): New asmified value from CLONE_VM. | ||
129 | * | ||
130 | * Revision 1.27 2001/05/29 11:25:27 markusl | ||
131 | * In case of "spurious_interrupt", do hard_reset instead of hanging system in a loop... | ||
132 | * | ||
133 | * Revision 1.26 2001/05/15 15:46:03 bjornw | ||
134 | * Include config.h now that we use some CONFIG_ options | ||
135 | * | ||
136 | * Revision 1.25 2001/05/15 05:38:47 hp | ||
137 | * Tweaked code in _ret_from_sys_call | ||
138 | * | ||
139 | * Revision 1.24 2001/05/15 05:27:49 hp | ||
140 | * Save r9 in r1 over function call rather than on stack. | ||
141 | * | ||
142 | * Revision 1.23 2001/05/15 05:10:00 hp | ||
143 | * Generate entry.S structure offsets from C | ||
144 | * | ||
145 | * Revision 1.22 2001/04/17 13:58:39 orjanf | ||
146 | * * Renamed CONFIG_KGDB to CONFIG_ETRAX_KGDB. | ||
147 | * | ||
148 | * Revision 1.21 2001/04/17 11:33:29 orjanf | ||
149 | * Updated according to review: | ||
150 | * * Included asm/sv_addr_ag.h to get macro for internal register. | ||
151 | * * Corrected comment regarding system call argument passing. | ||
152 | * * Removed comment about instruction being in a delay slot. | ||
153 | * * Added comment about SYMBOL_NAME macro. | ||
154 | * | ||
155 | * Revision 1.20 2001/04/12 08:51:07 hp | ||
156 | * - Add entry for sys_fcntl64. In fact copy last piece from i386 including ... | ||
157 | * - .rept to fill table to safe state with sys_ni_syscall. | ||
158 | * | ||
159 | * Revision 1.19 2001/04/04 09:43:32 orjanf | ||
160 | * * Moved do_sigtrap from traps.c to entry.S. | ||
161 | * * LTASK_PID need not be global anymore. | ||
162 | * | ||
163 | * Revision 1.18 2001/03/26 09:25:02 markusl | ||
164 | * Updated after review, should now handle USB interrupts correctly. | ||
165 | * | ||
166 | * Revision 1.17 2001/03/21 16:12:55 bjornw | ||
167 | * * Always make room for the cpu status record in the frame, in order to | ||
168 | * use the same framelength and layout for both mmu busfaults and normal | ||
169 | * irqs. No need to check for the explicit CRIS_FRAME_FIXUP type anymore. | ||
170 | * * Fixed bug with using addq for popping the stack in the epilogue - it | ||
171 | * destroyed the flag register. Use instructions that don't affect the | ||
172 | * flag register instead. | ||
173 | * * Removed write to R_PORT_PA_DATA during spurious_interrupt | ||
174 | * | ||
175 | * Revision 1.16 2001/03/20 19:43:02 bjornw | ||
176 | * * Get rid of esp0 setting | ||
177 | * * Give a 7th argument to a systemcall - the stackframe | ||
178 | * | ||
179 | * Revision 1.15 2001/03/05 13:14:30 bjornw | ||
180 | * Spelling fix | ||
181 | * | ||
182 | * Revision 1.14 2001/02/23 08:36:36 perf | ||
183 | * New ABI; syscallnr=r9, arg5=mof, arg6=srp. | ||
184 | * Corrected tracesys call check. | ||
185 | * | ||
186 | * Revision 1.13 2001/02/15 08:40:55 perf | ||
187 | * H-P by way of perf; | ||
188 | * - (_system_call): Don't read system call function address into r1. | ||
189 | * - (RBFExit): There is no such thing as a null pop. Adjust sp by addq. | ||
190 | * - (_system_call): Don't use r10 and don't save and restore it. | ||
191 | * - (THREAD_ESP0): New constant. | ||
192 | * - (_system_call): Inline set_esp0. | ||
193 | * | ||
194 | * Revision 1.12 2001/01/31 17:56:25 orjanf | ||
195 | * Added definition of LTASK_PID and made it global. | ||
196 | * | ||
197 | * Revision 1.11 2001/01/10 21:13:29 bjornw | ||
198 | * SYMBOL_NAME is defined incorrectly for the compiler options we currently use | ||
199 | * | ||
200 | * Revision 1.10 2000/12/18 23:47:56 bjornw | ||
201 | * * Added syscall trace support (ptrace), completely untested of course | ||
202 | * * Removed redundant check for NULL entries in syscall_table | ||
203 | * | ||
204 | * Revision 1.9 2000/11/21 16:40:51 bjornw | ||
205 | * * New frame type used when an SBFS frame needs to be popped without | ||
206 | * actually restarting the instruction | ||
207 | * * Enable interrupts in signal_return (they did so in x86, I hope it's a good | ||
208 | * idea) | ||
209 | * | ||
210 | * Revision 1.8 2000/11/17 16:53:35 bjornw | ||
211 | * Added detection of frame-type in Rexit, so that mmu_bus_fault can | ||
212 | * use ret_from_intr in the return-path to check for signals (like SEGV) | ||
213 | * and other foul things that might have occurred during the fault. | ||
214 | * | ||
215 | * Revision 1.7 2000/10/06 15:04:28 bjornw | ||
216 | * Include mof in register savings | ||
217 | * | ||
218 | * Revision 1.6 2000/09/12 16:02:44 bjornw | ||
219 | * Linux-2.4.0-test7 derived updates | ||
220 | * | ||
221 | * Revision 1.5 2000/08/17 15:35:15 bjornw | ||
222 | * 2.4.0-test6 changed local_irq_count and friends API | ||
223 | * | ||
224 | * Revision 1.4 2000/08/02 13:59:30 bjornw | ||
225 | * Removed olduname and uname from the syscall list | ||
226 | * | ||
227 | * Revision 1.3 2000/07/31 13:32:58 bjornw | ||
228 | * * Export ret_from_intr | ||
229 | * * _resume updated (prev/last tjohejsan) | ||
230 | * * timer_interrupt obsolete | ||
231 | * * SIGSEGV detection in mmu_bus_fault temporarily disabled | ||
232 | * | ||
233 | * | ||
234 | */ | ||
235 | |||
236 | /* | ||
237 | * entry.S contains the system-call and fault low-level handling routines. | ||
238 | * | ||
239 | * NOTE: This code handles signal-recognition, which happens every time | ||
240 | * after a timer-interrupt and after each system call. | ||
241 | * | ||
242 | * Stack layout in 'ret_from_system_call': | ||
243 | * ptrace needs to have all regs on the stack. | ||
244 | * if the order here is changed, it needs to be | ||
245 | * updated in fork.c:copy_process, signal.c:do_signal, | ||
246 | * ptrace.c and ptrace.h | ||
247 | * | ||
248 | */ | ||
249 | |||
250 | #include <linux/config.h> | ||
251 | #include <linux/linkage.h> | ||
252 | #include <linux/sys.h> | ||
253 | #include <asm/unistd.h> | ||
254 | #include <asm/arch/sv_addr_ag.h> | ||
255 | #include <asm/errno.h> | ||
256 | #include <asm/thread_info.h> | ||
257 | #include <asm/arch/offset.h> | ||
258 | #include <asm/page.h> | ||
259 | #include <asm/pgtable.h> | ||
260 | |||
261 | ;; functions exported from this file | ||
262 | |||
263 | .globl system_call | ||
264 | .globl ret_from_intr | ||
265 | .globl ret_from_fork | ||
266 | .globl resume | ||
267 | .globl multiple_interrupt | ||
268 | .globl hwbreakpoint | ||
269 | .globl IRQ1_interrupt | ||
270 | .globl spurious_interrupt | ||
271 | .globl hw_bp_trigs | ||
272 | .globl mmu_bus_fault | ||
273 | .globl do_sigtrap | ||
274 | .globl gdb_handle_breakpoint | ||
275 | .globl sys_call_table | ||
276 | |||
277 | ;; below are various parts of system_call which are not in the fast-path | ||
278 | |||
279 | #ifdef CONFIG_PREEMPT | ||
280 | ; Check if preemptive kernel scheduling should be done | ||
281 | _resume_kernel: | ||
282 | ; Load current task struct | ||
283 | movs.w -8192, $r0 ; THREAD_SIZE = 8192 | ||
284 | and.d $sp, $r0 | ||
285 | move.d [$r0+TI_preempt_count], $r10 ; Preemption disabled? | ||
286 | bne _Rexit | ||
287 | nop | ||
288 | _need_resched: | ||
289 | move.d [$r0+TI_flags], $r10 | ||
290 | btstq TIF_NEED_RESCHED, $r10 ; Check if need_resched is set | ||
291 | bpl _Rexit | ||
292 | nop | ||
293 | ; Ok, lets's do some preemptive kernel scheduling | ||
294 | move.d PREEMPT_ACTIVE, $r10 | ||
295 | move.d $r10, [$r0+TI_preempt_count] ; Mark as active | ||
296 | ei | ||
297 | jsr schedule | ||
298 | clear.d [$r0+TI_preempt_count] ; Mark as inactive | ||
299 | di | ||
300 | ; Load new task struct | ||
301 | movs.w -8192, $r0 ; THREAD_SIZE = 8192 | ||
302 | and.d $sp, $r0 | ||
303 | ; One more time (with new task) | ||
304 | ba _need_resched | ||
305 | nop | ||
306 | #else | ||
307 | #define _resume_kernel _Rexit | ||
308 | #endif | ||
309 | |||
310 | ; Called at exit from fork. schedule_tail must be called to drop | ||
311 | ; spinlock if CONFIG_PREEMPT | ||
312 | ret_from_fork: | ||
313 | jsr schedule_tail | ||
314 | ba ret_from_sys_call | ||
315 | nop | ||
316 | |||
317 | ret_from_intr: | ||
318 | ;; check for resched if preemptive kernel or if we're going back to user-mode | ||
319 | ;; this test matches the user_regs(regs) macro | ||
320 | ;; we cannot simply test $dccr, because that does not necessarily | ||
321 | ;; reflect what mode we'll return into. | ||
322 | |||
323 | move.d [$sp + PT_dccr], $r0; regs->dccr | ||
324 | btstq 8, $r0 ; U-flag | ||
325 | bpl _resume_kernel | ||
326 | ; Note that di below is in delay slot | ||
327 | |||
328 | _resume_userspace: | ||
329 | di ; so need_resched and sigpending don't change | ||
330 | |||
331 | movs.w -8192, $r0 ; THREAD_SIZE == 8192 | ||
332 | and.d $sp, $r0 | ||
333 | |||
334 | move.d [$r0+TI_flags], $r10 ; current->work | ||
335 | and.d _TIF_WORK_MASK, $r10 ; is there any work to be done on return | ||
336 | bne _work_pending | ||
337 | nop | ||
338 | ba _Rexit | ||
339 | nop | ||
340 | |||
341 | ;; The system_call is called by a BREAK instruction, which works like | ||
342 | ;; an interrupt call but it stores the return PC in BRP instead of IRP. | ||
343 | ;; Since we dont really want to have two epilogues (one for system calls | ||
344 | ;; and one for interrupts) we push the contents of BRP instead of IRP in the | ||
345 | ;; system call prologue, to make it look like an ordinary interrupt on the | ||
346 | ;; stackframe. | ||
347 | ;; | ||
348 | ;; Since we can't have system calls inside interrupts, it should not matter | ||
349 | ;; that we don't stack IRP. | ||
350 | ;; | ||
351 | ;; In r9 we have the wanted syscall number. Arguments come in r10,r11,r12,r13,mof,srp | ||
352 | ;; | ||
353 | ;; This function looks on the _surface_ like spaghetti programming, but it's | ||
354 | ;; really designed so that the fast-path does not force cache-loading of non-used | ||
355 | ;; instructions. Only the non-common cases cause the outlined code to run.. | ||
356 | |||
357 | system_call: | ||
358 | ;; stack-frame similar to the irq heads, which is reversed in ret_from_sys_call | ||
359 | move $brp,[$sp=$sp-16]; instruction pointer and room for a fake SBFS frame | ||
360 | push $srp | ||
361 | push $dccr | ||
362 | push $mof | ||
363 | subq 14*4, $sp ; make room for r0-r13 | ||
364 | movem $r13, [$sp] ; push r0-r13 | ||
365 | push $r10 ; push orig_r10 | ||
366 | clear.d [$sp=$sp-4] ; frametype == 0, normal stackframe | ||
367 | |||
368 | movs.w -ENOSYS, $r0 | ||
369 | move.d $r0, [$sp+PT_r10] ; put the default return value in r10 in the frame | ||
370 | |||
371 | ;; check if this process is syscall-traced | ||
372 | |||
373 | movs.w -8192, $r0 ; THREAD_SIZE == 8192 | ||
374 | and.d $sp, $r0 | ||
375 | |||
376 | move.d [$r0+TI_flags], $r0 | ||
377 | btstq TIF_SYSCALL_TRACE, $r0 | ||
378 | bmi _syscall_trace_entry | ||
379 | nop | ||
380 | |||
381 | _syscall_traced: | ||
382 | |||
383 | ;; check for sanity in the requested syscall number | ||
384 | |||
385 | cmpu.w NR_syscalls, $r9 | ||
386 | bcc ret_from_sys_call | ||
387 | lslq 2, $r9 ; multiply by 4, in the delay slot | ||
388 | |||
389 | ;; as a bonus 7th parameter, we give the location on the stack | ||
390 | ;; of the register structure itself. some syscalls need this. | ||
391 | |||
392 | push $sp | ||
393 | |||
394 | ;; the parameter carrying registers r10, r11, r12 and 13 are intact. | ||
395 | ;; the fifth and sixth parameters (if any) was in mof and srp | ||
396 | ;; respectively, and we need to put them on the stack. | ||
397 | |||
398 | push $srp | ||
399 | push $mof | ||
400 | |||
401 | jsr [$r9+sys_call_table] ; actually do the system call | ||
402 | addq 3*4, $sp ; pop the mof, srp and regs parameters | ||
403 | move.d $r10, [$sp+PT_r10] ; save the return value | ||
404 | |||
405 | moveq 1, $r9 ; "parameter" to ret_from_sys_call to show it was a sys call | ||
406 | |||
407 | ;; fall through into ret_from_sys_call to return | ||
408 | |||
409 | ret_from_sys_call: | ||
410 | ;; r9 is a parameter - if >=1 we came from a syscall, if 0, from an irq | ||
411 | |||
412 | ;; get the current task-struct pointer (see top for defs) | ||
413 | |||
414 | movs.w -8192, $r0 ; THREAD_SIZE == 8192 | ||
415 | and.d $sp, $r0 | ||
416 | |||
417 | di ; make sure need_resched and sigpending don't change | ||
418 | move.d [$r0+TI_flags],$r1 | ||
419 | and.d _TIF_ALLWORK_MASK, $r1 | ||
420 | bne _syscall_exit_work | ||
421 | nop | ||
422 | |||
423 | _Rexit: | ||
424 | ;; this epilogue MUST match the prologues in multiple_interrupt, irq.h and ptregs.h | ||
425 | pop $r10 ; frametype | ||
426 | bne _RBFexit ; was not CRIS_FRAME_NORMAL, handle otherwise | ||
427 | addq 4, $sp ; skip orig_r10, in delayslot | ||
428 | movem [$sp+], $r13 ; registers r0-r13 | ||
429 | pop $mof ; multiply overflow register | ||
430 | pop $dccr ; condition codes | ||
431 | pop $srp ; subroutine return pointer | ||
432 | ;; now we have a 4-word SBFS frame which we do not want to restore | ||
433 | ;; using RBF since it was not stacked with SBFS. instead we would like to | ||
434 | ;; just get the PC value to restart it with, and skip the rest of | ||
435 | ;; the frame. | ||
436 | ;; Also notice that it's important to use instructions here that | ||
437 | ;; keep the interrupts disabled (since we've already popped DCCR) | ||
438 | move [$sp=$sp+16], $p8; pop the SBFS frame from the sp | ||
439 | jmpu [$sp-16] ; return through the irp field in the sbfs frame | ||
440 | |||
441 | _RBFexit: | ||
442 | movem [$sp+], $r13 ; registers r0-r13, in delay slot | ||
443 | pop $mof ; multiply overflow register | ||
444 | pop $dccr ; condition codes | ||
445 | pop $srp ; subroutine return pointer | ||
446 | rbf [$sp+] ; return by popping the CPU status | ||
447 | |||
448 | ;; We get here after doing a syscall if extra work might need to be done | ||
449 | ;; perform syscall exit tracing if needed | ||
450 | |||
451 | _syscall_exit_work: | ||
452 | ;; $r0 contains current at this point and irq's are disabled | ||
453 | |||
454 | move.d [$r0+TI_flags], $r1 | ||
455 | btstq TIF_SYSCALL_TRACE, $r1 | ||
456 | bpl _work_pending | ||
457 | nop | ||
458 | |||
459 | ei | ||
460 | |||
461 | move.d $r9, $r1 ; preserve r9 | ||
462 | jsr do_syscall_trace | ||
463 | move.d $r1, $r9 | ||
464 | |||
465 | ba _resume_userspace | ||
466 | nop | ||
467 | |||
468 | _work_pending: | ||
469 | move.d [$r0+TI_flags], $r1 | ||
470 | btstq TIF_NEED_RESCHED, $r1 | ||
471 | bpl _work_notifysig ; was neither trace nor sched, must be signal/notify | ||
472 | nop | ||
473 | |||
474 | _work_resched: | ||
475 | move.d $r9, $r1 ; preserve r9 | ||
476 | jsr schedule | ||
477 | move.d $r1, $r9 | ||
478 | di | ||
479 | |||
480 | move.d [$r0+TI_flags], $r1 | ||
481 | and.d _TIF_WORK_MASK, $r1; ignore the syscall trace counter | ||
482 | beq _Rexit | ||
483 | nop | ||
484 | btstq TIF_NEED_RESCHED, $r1 | ||
485 | bmi _work_resched ; current->work.need_resched | ||
486 | nop | ||
487 | |||
488 | _work_notifysig: | ||
489 | ;; deal with pending signals and notify-resume requests | ||
490 | |||
491 | move.d $r9, $r10 ; do_notify_resume syscall/irq param | ||
492 | moveq 0, $r11 ; oldset param - 0 in this case | ||
493 | move.d $sp, $r12 ; the regs param | ||
494 | move.d $r1, $r13 ; the thread_info_flags parameter | ||
495 | jsr do_notify_resume | ||
496 | |||
497 | ba _Rexit | ||
498 | nop | ||
499 | |||
500 | ;; We get here as a sidetrack when we've entered a syscall with the | ||
501 | ;; trace-bit set. We need to call do_syscall_trace and then continue | ||
502 | ;; with the call. | ||
503 | |||
504 | _syscall_trace_entry: | ||
505 | ;; PT_r10 in the frame contains -ENOSYS as required, at this point | ||
506 | |||
507 | jsr do_syscall_trace | ||
508 | |||
509 | ;; now re-enter the syscall code to do the syscall itself | ||
510 | ;; we need to restore $r9 here to contain the wanted syscall, and | ||
511 | ;; the other parameter-bearing registers | ||
512 | |||
513 | move.d [$sp+PT_r9], $r9 | ||
514 | move.d [$sp+PT_orig_r10], $r10 ; PT_r10 is already filled with -ENOSYS. | ||
515 | move.d [$sp+PT_r11], $r11 | ||
516 | move.d [$sp+PT_r12], $r12 | ||
517 | move.d [$sp+PT_r13], $r13 | ||
518 | move [$sp+PT_mof], $mof | ||
519 | move [$sp+PT_srp], $srp | ||
520 | |||
521 | ba _syscall_traced | ||
522 | nop | ||
523 | |||
524 | ;; resume performs the actual task-switching, by switching stack pointers | ||
525 | ;; input arguments: r10 = prev, r11 = next, r12 = thread offset in task struct | ||
526 | ;; returns old current in r10 | ||
527 | ;; | ||
528 | ;; TODO: see the i386 version. The switch_to which calls resume in our version | ||
529 | ;; could really be an inline asm of this. | ||
530 | |||
531 | resume: | ||
532 | push $srp ; we keep the old/new PC on the stack | ||
533 | add.d $r12, $r10 ; r10 = current tasks tss | ||
534 | move $dccr, [$r10+THREAD_dccr]; save irq enable state | ||
535 | di | ||
536 | |||
537 | move $usp, [$r10+ THREAD_usp] ; save user-mode stackpointer | ||
538 | |||
539 | ;; See copy_thread for the reason why register R9 is saved. | ||
540 | subq 10*4, $sp | ||
541 | movem $r9, [$sp] ; save non-scratch registers and R9. | ||
542 | |||
543 | move.d $sp, [$r10+THREAD_ksp] ; save the kernel stack pointer for the old task | ||
544 | move.d $sp, $r10 ; return last running task in r10 | ||
545 | and.d -8192, $r10 ; get thread_info from stackpointer | ||
546 | move.d [$r10+TI_task], $r10 ; get task | ||
547 | add.d $r12, $r11 ; find the new tasks tss | ||
548 | move.d [$r11+THREAD_ksp], $sp ; switch into the new stackframe by restoring kernel sp | ||
549 | |||
550 | movem [$sp+], $r9 ; restore non-scratch registers and R9. | ||
551 | |||
552 | move [$r11+THREAD_usp], $usp ; restore user-mode stackpointer | ||
553 | |||
554 | move [$r11+THREAD_dccr], $dccr ; restore irq enable status | ||
555 | jump [$sp+] ; restore PC | ||
556 | |||
557 | ;; This is the MMU bus fault handler. | ||
558 | ;; It needs to stack the CPU status and overall is different | ||
559 | ;; from the other interrupt handlers. | ||
560 | |||
561 | mmu_bus_fault: | ||
562 | ;; For refills we try to do a quick page table lookup. If it is | ||
563 | ;; a real fault we let the mm subsystem handle it. | ||
564 | |||
565 | ;; the first longword in the sbfs frame was the interrupted PC | ||
566 | ;; which fits nicely with the "IRP" slot in pt_regs normally used to | ||
567 | ;; contain the return address. used by Oops to print kernel errors. | ||
568 | sbfs [$sp=$sp-16] ; push the internal CPU status | ||
569 | push $dccr | ||
570 | di | ||
571 | subq 2*4, $sp | ||
572 | movem $r1, [$sp] | ||
573 | move.d [R_MMU_CAUSE], $r1 | ||
574 | ;; ETRAX 100LX TR89 bugfix: if the second half of an unaligned | ||
575 | ;; write causes a MMU-fault, it will not be restarted correctly. | ||
576 | ;; This could happen if a write crosses a page-boundary and the | ||
577 | ;; second page is not yet COW'ed or even loaded. The workaround | ||
578 | ;; is to clear the unaligned bit in the CPU status record, so | ||
579 | ;; that the CPU will rerun both the first and second halves of | ||
580 | ;; the instruction. This will not have any sideeffects unless | ||
581 | ;; the first half goes to any device or memory that can't be | ||
582 | ;; written twice, and which is mapped through the MMU. | ||
583 | ;; | ||
584 | ;; We only need to do this for writes. | ||
585 | btstq 8, $r1 ; Write access? | ||
586 | bpl 1f | ||
587 | nop | ||
588 | move.d [$sp+16], $r0 ; Clear unaligned bit in csrinstr | ||
589 | and.d ~(1<<5), $r0 | ||
590 | move.d $r0, [$sp+16] | ||
591 | 1: btstq 12, $r1 ; Refill? | ||
592 | bpl 2f | ||
593 | lsrq PMD_SHIFT, $r1 ; Get PMD index into PGD (bit 24-31) | ||
594 | move.d [current_pgd], $r0 ; PGD for the current process | ||
595 | move.d [$r0+$r1.d], $r0 ; Get PMD | ||
596 | beq 2f | ||
597 | nop | ||
598 | and.w PAGE_MASK, $r0 ; Remove PMD flags | ||
599 | move.d [R_MMU_CAUSE], $r1 | ||
600 | lsrq PAGE_SHIFT, $r1 | ||
601 | and.d 0x7ff, $r1 ; Get PTE index into PMD (bit 13-24) | ||
602 | move.d [$r0+$r1.d], $r1 ; Get PTE | ||
603 | beq 2f | ||
604 | nop | ||
605 | ;; Store in TLB | ||
606 | move.d $r1, [R_TLB_LO] | ||
607 | ;; Return | ||
608 | movem [$sp+], $r1 | ||
609 | pop $dccr | ||
610 | rbf [$sp+] ; return by popping the CPU status | ||
611 | |||
612 | 2: ; PMD or PTE missing, let the mm subsystem fix it up. | ||
613 | movem [$sp+], $r1 | ||
614 | pop $dccr | ||
615 | |||
616 | ; Ok, not that easy, pass it on to the mm subsystem | ||
617 | ; The MMU status record is now on the stack | ||
618 | push $srp ; make a stackframe similar to pt_regs | ||
619 | push $dccr | ||
620 | push $mof | ||
621 | di | ||
622 | subq 14*4, $sp | ||
623 | movem $r13, [$sp] | ||
624 | push $r10 ; dummy orig_r10 | ||
625 | moveq 1, $r10 | ||
626 | push $r10 ; frametype == 1, BUSFAULT frame type | ||
627 | |||
628 | move.d $sp, $r10 ; pt_regs argument to handle_mmu_bus_fault | ||
629 | |||
630 | jsr handle_mmu_bus_fault ; in arch/cris/arch-v10/mm/fault.c | ||
631 | |||
632 | ;; now we need to return through the normal path, we cannot just | ||
633 | ;; do the RBFexit since we might have killed off the running | ||
634 | ;; process due to a SEGV, scheduled due to a page blocking or | ||
635 | ;; whatever. | ||
636 | |||
637 | moveq 0, $r9 ; busfault is equivalent to an irq | ||
638 | |||
639 | ba ret_from_intr | ||
640 | nop | ||
641 | |||
642 | ;; special handlers for breakpoint and NMI | ||
643 | hwbreakpoint: | ||
644 | push $dccr | ||
645 | di | ||
646 | push $r10 | ||
647 | push $r11 | ||
648 | move.d [hw_bp_trig_ptr],$r10 | ||
649 | move $brp,$r11 | ||
650 | move.d $r11,[$r10+] | ||
651 | move.d $r10,[hw_bp_trig_ptr] | ||
652 | 1: pop $r11 | ||
653 | pop $r10 | ||
654 | pop $dccr | ||
655 | retb | ||
656 | nop | ||
657 | |||
658 | IRQ1_interrupt: | ||
659 | |||
660 | #if defined(CONFIG_ETRAX_WATCHDOG) && !defined(CONFIG_SVINTO_SIM) | ||
661 | ;; If we receive a watchdog interrupt while it is not expected, then set | ||
662 | ;; up a canonical frame and dump register contents before dying. | ||
663 | |||
664 | ;; this prologue MUST match the one in irq.h and the struct in ptregs.h!!! | ||
665 | move $brp,[$sp=$sp-16]; instruction pointer and room for a fake SBFS frame | ||
666 | push $srp | ||
667 | push $dccr | ||
668 | push $mof | ||
669 | di | ||
670 | subq 14*4, $sp | ||
671 | movem $r13, [$sp] | ||
672 | push $r10 ; push orig_r10 | ||
673 | clear.d [$sp=$sp-4] ; frametype == 0, normal frame | ||
674 | |||
675 | ;; We don't check that we actually were bit by the watchdog as opposed to | ||
676 | ;; an external NMI, since there is currently no handler for external NMI. | ||
677 | |||
678 | ;; Check if we're waiting for reset to happen, as signalled by | ||
679 | ;; hard_reset_now setting cause_of_death to a magic value. If so, just | ||
680 | ;; get stuck until reset happens. | ||
681 | .comm cause_of_death, 4 ;; Don't declare this anywhere. | ||
682 | move.d [cause_of_death], $r10 | ||
683 | cmp.d 0xbedead, $r10 | ||
684 | _killed_by_death: | ||
685 | beq _killed_by_death | ||
686 | nop | ||
687 | |||
688 | ;; We'll see this in ksymoops dumps. | ||
689 | Watchdog_bite: | ||
690 | |||
691 | #ifdef CONFIG_ETRAX_WATCHDOG_NICE_DOGGY | ||
692 | ;; We just restart the watchdog here to be sure we dont get | ||
693 | ;; hit while printing the watchdogmsg below | ||
694 | ;; This restart is compatible with the rest of the C-code, so | ||
695 | ;; the C-code can keep restarting the watchdog after this point. | ||
696 | ;; The non-NICE_DOGGY code below though, disables the possibility | ||
697 | ;; to restart since it changes the watchdog key, to avoid any | ||
698 | ;; buggy loops etc. keeping the watchdog alive after this. | ||
699 | jsr reset_watchdog | ||
700 | #else | ||
701 | |||
702 | ;; We need to extend the 3.3ms after the NMI at watchdog bite, so we have | ||
703 | ;; time for an oops-dump over a 115k2 serial wire. Another 100ms should do. | ||
704 | |||
705 | ;; Change the watchdog key to an arbitrary 3-bit value and restart the | ||
706 | ;; watchdog. | ||
707 | #define WD_INIT 2 | ||
708 | moveq IO_FIELD (R_WATCHDOG, key, WD_INIT), $r10 | ||
709 | move.d R_WATCHDOG, $r11 | ||
710 | |||
711 | move.d $r10, [$r11] | ||
712 | moveq IO_FIELD (R_WATCHDOG, key, \ | ||
713 | IO_EXTRACT (R_WATCHDOG, key, \ | ||
714 | IO_MASK (R_WATCHDOG, key)) \ | ||
715 | ^ WD_INIT) \ | ||
716 | | IO_STATE (R_WATCHDOG, enable, start), $r10 | ||
717 | move.d $r10, [$r11] | ||
718 | |||
719 | #endif | ||
720 | |||
721 | ;; Note that we don't do "setf m" here (or after two necessary NOPs), | ||
722 | ;; since *not* doing that saves us from re-entrancy checks. We don't want | ||
723 | ;; to get here again due to possible subsequent NMIs; we want the watchdog | ||
724 | ;; to reset us. | ||
725 | |||
726 | move.d _watchdogmsg,$r10 | ||
727 | jsr printk | ||
728 | |||
729 | move.d $sp, $r10 | ||
730 | jsr watchdog_bite_hook | ||
731 | |||
732 | ;; This nop is here so we see the "Watchdog_bite" label in ksymoops dumps | ||
733 | ;; rather than "spurious_interrupt". | ||
734 | nop | ||
735 | ;; At this point we drop down into spurious_interrupt, which will do a | ||
736 | ;; hard reset. | ||
737 | |||
738 | .section .rodata,"a" | ||
739 | _watchdogmsg: | ||
740 | .ascii "Oops: bitten by watchdog\n\0" | ||
741 | .previous | ||
742 | |||
743 | #endif /* CONFIG_ETRAX_WATCHDOG and not CONFIG_SVINTO_SIM */ | ||
744 | |||
745 | spurious_interrupt: | ||
746 | di | ||
747 | jump hard_reset_now | ||
748 | |||
749 | ;; this handles the case when multiple interrupts arrive at the same time | ||
750 | ;; we jump to the first set interrupt bit in a priority fashion | ||
751 | ;; the hardware will call the unserved interrupts after the handler finishes | ||
752 | |||
753 | multiple_interrupt: | ||
754 | ;; this prologue MUST match the one in irq.h and the struct in ptregs.h!!! | ||
755 | move $irp,[$sp=$sp-16]; instruction pointer and room for a fake SBFS frame | ||
756 | push $srp | ||
757 | push $dccr | ||
758 | push $mof | ||
759 | di | ||
760 | subq 14*4, $sp | ||
761 | movem $r13, [$sp] | ||
762 | push $r10 ; push orig_r10 | ||
763 | clear.d [$sp=$sp-4] ; frametype == 0, normal frame | ||
764 | |||
765 | moveq 2, $r2 ; first bit we care about is the timer0 irq | ||
766 | move.d [R_VECT_MASK_RD], $r0; read the irq bits that triggered the multiple irq | ||
767 | move.d $r0, [R_VECT_MASK_CLR] ; Block all active IRQs | ||
768 | 1: | ||
769 | btst $r2, $r0 ; check for the irq given by bit r2 | ||
770 | bpl 2f | ||
771 | move.d $r2, $r10 ; First argument to do_IRQ | ||
772 | move.d $sp, $r11 ; second argument to do_IRQ | ||
773 | jsr do_IRQ | ||
774 | 2: | ||
775 | addq 1, $r2 ; next vector bit | ||
776 | cmp.b 32, $r2 | ||
777 | bne 1b ; process all irq's up to and including number 31 | ||
778 | moveq 0, $r9 ; make ret_from_intr realise we came from an ir | ||
779 | |||
780 | move.d $r0, [R_VECT_MASK_SET] ; Unblock all the IRQs | ||
781 | jump ret_from_intr | ||
782 | |||
783 | do_sigtrap: | ||
784 | ;; | ||
785 | ;; SIGTRAP the process that executed the break instruction. | ||
786 | ;; Make a frame that Rexit in entry.S expects. | ||
787 | ;; | ||
788 | move $brp, [$sp=$sp-16] ; Push BRP while faking a cpu status record. | ||
789 | push $srp ; Push subroutine return pointer. | ||
790 | push $dccr ; Push condition codes. | ||
791 | push $mof ; Push multiply overflow reg. | ||
792 | di ; Need to disable irq's at this point. | ||
793 | subq 14*4, $sp ; Make room for r0-r13. | ||
794 | movem $r13, [$sp] ; Push the r0-r13 registers. | ||
795 | push $r10 ; Push orig_r10. | ||
796 | clear.d [$sp=$sp-4] ; Frametype - this is a normal stackframe. | ||
797 | |||
798 | movs.w -8192,$r9 ; THREAD_SIZE == 8192 | ||
799 | and.d $sp, $r9 | ||
800 | move.d [$r9+TI_task], $r10 | ||
801 | move.d [$r10+TASK_pid], $r10 ; current->pid as arg1. | ||
802 | moveq 5, $r11 ; SIGTRAP as arg2. | ||
803 | jsr sys_kill | ||
804 | jump ret_from_intr ; Use the return routine for interrupts. | ||
805 | |||
806 | gdb_handle_breakpoint: | ||
807 | push $dccr | ||
808 | push $r0 | ||
809 | #ifdef CONFIG_ETRAX_KGDB | ||
810 | move $dccr, $r0 ; U-flag not affected by previous insns. | ||
811 | btstq 8, $r0 ; Test the U-flag. | ||
812 | bmi _ugdb_handle_breakpoint ; Go to user mode debugging. | ||
813 | nop ; Empty delay slot (cannot pop r0 here). | ||
814 | pop $r0 ; Restore r0. | ||
815 | ba kgdb_handle_breakpoint ; Go to kernel debugging. | ||
816 | pop $dccr ; Restore dccr in delay slot. | ||
817 | #endif | ||
818 | |||
819 | _ugdb_handle_breakpoint: | ||
820 | move $brp, $r0 ; Use r0 temporarily for calculation. | ||
821 | subq 2, $r0 ; Set to address of previous instruction. | ||
822 | move $r0, $brp | ||
823 | pop $r0 ; Restore r0. | ||
824 | ba do_sigtrap ; SIGTRAP the offending process. | ||
825 | pop $dccr ; Restore dccr in delay slot. | ||
826 | |||
827 | .data | ||
828 | |||
829 | hw_bp_trigs: | ||
830 | .space 64*4 | ||
831 | hw_bp_trig_ptr: | ||
832 | .dword hw_bp_trigs | ||
833 | |||
834 | .section .rodata,"a" | ||
835 | sys_call_table: | ||
836 | .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ | ||
837 | .long sys_exit | ||
838 | .long sys_fork | ||
839 | .long sys_read | ||
840 | .long sys_write | ||
841 | .long sys_open /* 5 */ | ||
842 | .long sys_close | ||
843 | .long sys_waitpid | ||
844 | .long sys_creat | ||
845 | .long sys_link | ||
846 | .long sys_unlink /* 10 */ | ||
847 | .long sys_execve | ||
848 | .long sys_chdir | ||
849 | .long sys_time | ||
850 | .long sys_mknod | ||
851 | .long sys_chmod /* 15 */ | ||
852 | .long sys_lchown16 | ||
853 | .long sys_ni_syscall /* old break syscall holder */ | ||
854 | .long sys_stat | ||
855 | .long sys_lseek | ||
856 | .long sys_getpid /* 20 */ | ||
857 | .long sys_mount | ||
858 | .long sys_oldumount | ||
859 | .long sys_setuid16 | ||
860 | .long sys_getuid16 | ||
861 | .long sys_stime /* 25 */ | ||
862 | .long sys_ptrace | ||
863 | .long sys_alarm | ||
864 | .long sys_fstat | ||
865 | .long sys_pause | ||
866 | .long sys_utime /* 30 */ | ||
867 | .long sys_ni_syscall /* old stty syscall holder */ | ||
868 | .long sys_ni_syscall /* old gtty syscall holder */ | ||
869 | .long sys_access | ||
870 | .long sys_nice | ||
871 | .long sys_ni_syscall /* 35 old ftime syscall holder */ | ||
872 | .long sys_sync | ||
873 | .long sys_kill | ||
874 | .long sys_rename | ||
875 | .long sys_mkdir | ||
876 | .long sys_rmdir /* 40 */ | ||
877 | .long sys_dup | ||
878 | .long sys_pipe | ||
879 | .long sys_times | ||
880 | .long sys_ni_syscall /* old prof syscall holder */ | ||
881 | .long sys_brk /* 45 */ | ||
882 | .long sys_setgid16 | ||
883 | .long sys_getgid16 | ||
884 | .long sys_signal | ||
885 | .long sys_geteuid16 | ||
886 | .long sys_getegid16 /* 50 */ | ||
887 | .long sys_acct | ||
888 | .long sys_umount /* recycled never used phys( */ | ||
889 | .long sys_ni_syscall /* old lock syscall holder */ | ||
890 | .long sys_ioctl | ||
891 | .long sys_fcntl /* 55 */ | ||
892 | .long sys_ni_syscall /* old mpx syscall holder */ | ||
893 | .long sys_setpgid | ||
894 | .long sys_ni_syscall /* old ulimit syscall holder */ | ||
895 | .long sys_ni_syscall /* old sys_olduname holder */ | ||
896 | .long sys_umask /* 60 */ | ||
897 | .long sys_chroot | ||
898 | .long sys_ustat | ||
899 | .long sys_dup2 | ||
900 | .long sys_getppid | ||
901 | .long sys_getpgrp /* 65 */ | ||
902 | .long sys_setsid | ||
903 | .long sys_sigaction | ||
904 | .long sys_sgetmask | ||
905 | .long sys_ssetmask | ||
906 | .long sys_setreuid16 /* 70 */ | ||
907 | .long sys_setregid16 | ||
908 | .long sys_sigsuspend | ||
909 | .long sys_sigpending | ||
910 | .long sys_sethostname | ||
911 | .long sys_setrlimit /* 75 */ | ||
912 | .long sys_old_getrlimit | ||
913 | .long sys_getrusage | ||
914 | .long sys_gettimeofday | ||
915 | .long sys_settimeofday | ||
916 | .long sys_getgroups16 /* 80 */ | ||
917 | .long sys_setgroups16 | ||
918 | .long sys_select /* was old_select in Linux/E100 */ | ||
919 | .long sys_symlink | ||
920 | .long sys_lstat | ||
921 | .long sys_readlink /* 85 */ | ||
922 | .long sys_uselib | ||
923 | .long sys_swapon | ||
924 | .long sys_reboot | ||
925 | .long old_readdir | ||
926 | .long old_mmap /* 90 */ | ||
927 | .long sys_munmap | ||
928 | .long sys_truncate | ||
929 | .long sys_ftruncate | ||
930 | .long sys_fchmod | ||
931 | .long sys_fchown16 /* 95 */ | ||
932 | .long sys_getpriority | ||
933 | .long sys_setpriority | ||
934 | .long sys_ni_syscall /* old profil syscall holder */ | ||
935 | .long sys_statfs | ||
936 | .long sys_fstatfs /* 100 */ | ||
937 | .long sys_ni_syscall /* sys_ioperm in i386 */ | ||
938 | .long sys_socketcall | ||
939 | .long sys_syslog | ||
940 | .long sys_setitimer | ||
941 | .long sys_getitimer /* 105 */ | ||
942 | .long sys_newstat | ||
943 | .long sys_newlstat | ||
944 | .long sys_newfstat | ||
945 | .long sys_ni_syscall /* old sys_uname holder */ | ||
946 | .long sys_ni_syscall /* sys_iopl in i386 */ | ||
947 | .long sys_vhangup | ||
948 | .long sys_ni_syscall /* old "idle" system call */ | ||
949 | .long sys_ni_syscall /* vm86old in i386 */ | ||
950 | .long sys_wait4 | ||
951 | .long sys_swapoff /* 115 */ | ||
952 | .long sys_sysinfo | ||
953 | .long sys_ipc | ||
954 | .long sys_fsync | ||
955 | .long sys_sigreturn | ||
956 | .long sys_clone /* 120 */ | ||
957 | .long sys_setdomainname | ||
958 | .long sys_newuname | ||
959 | .long sys_ni_syscall /* sys_modify_ldt */ | ||
960 | .long sys_adjtimex | ||
961 | .long sys_mprotect /* 125 */ | ||
962 | .long sys_sigprocmask | ||
963 | .long sys_ni_syscall /* old "create_module" */ | ||
964 | .long sys_init_module | ||
965 | .long sys_delete_module | ||
966 | .long sys_ni_syscall /* 130: old "get_kernel_syms" */ | ||
967 | .long sys_quotactl | ||
968 | .long sys_getpgid | ||
969 | .long sys_fchdir | ||
970 | .long sys_bdflush | ||
971 | .long sys_sysfs /* 135 */ | ||
972 | .long sys_personality | ||
973 | .long sys_ni_syscall /* for afs_syscall */ | ||
974 | .long sys_setfsuid16 | ||
975 | .long sys_setfsgid16 | ||
976 | .long sys_llseek /* 140 */ | ||
977 | .long sys_getdents | ||
978 | .long sys_select | ||
979 | .long sys_flock | ||
980 | .long sys_msync | ||
981 | .long sys_readv /* 145 */ | ||
982 | .long sys_writev | ||
983 | .long sys_getsid | ||
984 | .long sys_fdatasync | ||
985 | .long sys_sysctl | ||
986 | .long sys_mlock /* 150 */ | ||
987 | .long sys_munlock | ||
988 | .long sys_mlockall | ||
989 | .long sys_munlockall | ||
990 | .long sys_sched_setparam | ||
991 | .long sys_sched_getparam /* 155 */ | ||
992 | .long sys_sched_setscheduler | ||
993 | .long sys_sched_getscheduler | ||
994 | .long sys_sched_yield | ||
995 | .long sys_sched_get_priority_max | ||
996 | .long sys_sched_get_priority_min /* 160 */ | ||
997 | .long sys_sched_rr_get_interval | ||
998 | .long sys_nanosleep | ||
999 | .long sys_mremap | ||
1000 | .long sys_setresuid16 | ||
1001 | .long sys_getresuid16 /* 165 */ | ||
1002 | .long sys_ni_syscall /* sys_vm86 */ | ||
1003 | .long sys_ni_syscall /* Old sys_query_module */ | ||
1004 | .long sys_poll | ||
1005 | .long sys_nfsservctl | ||
1006 | .long sys_setresgid16 /* 170 */ | ||
1007 | .long sys_getresgid16 | ||
1008 | .long sys_prctl | ||
1009 | .long sys_rt_sigreturn | ||
1010 | .long sys_rt_sigaction | ||
1011 | .long sys_rt_sigprocmask /* 175 */ | ||
1012 | .long sys_rt_sigpending | ||
1013 | .long sys_rt_sigtimedwait | ||
1014 | .long sys_rt_sigqueueinfo | ||
1015 | .long sys_rt_sigsuspend | ||
1016 | .long sys_pread64 /* 180 */ | ||
1017 | .long sys_pwrite64 | ||
1018 | .long sys_chown16 | ||
1019 | .long sys_getcwd | ||
1020 | .long sys_capget | ||
1021 | .long sys_capset /* 185 */ | ||
1022 | .long sys_sigaltstack | ||
1023 | .long sys_sendfile | ||
1024 | .long sys_ni_syscall /* streams1 */ | ||
1025 | .long sys_ni_syscall /* streams2 */ | ||
1026 | .long sys_vfork /* 190 */ | ||
1027 | .long sys_getrlimit | ||
1028 | .long sys_mmap2 | ||
1029 | .long sys_truncate64 | ||
1030 | .long sys_ftruncate64 | ||
1031 | .long sys_stat64 /* 195 */ | ||
1032 | .long sys_lstat64 | ||
1033 | .long sys_fstat64 | ||
1034 | .long sys_lchown | ||
1035 | .long sys_getuid | ||
1036 | .long sys_getgid /* 200 */ | ||
1037 | .long sys_geteuid | ||
1038 | .long sys_getegid | ||
1039 | .long sys_setreuid | ||
1040 | .long sys_setregid | ||
1041 | .long sys_getgroups /* 205 */ | ||
1042 | .long sys_setgroups | ||
1043 | .long sys_fchown | ||
1044 | .long sys_setresuid | ||
1045 | .long sys_getresuid | ||
1046 | .long sys_setresgid /* 210 */ | ||
1047 | .long sys_getresgid | ||
1048 | .long sys_chown | ||
1049 | .long sys_setuid | ||
1050 | .long sys_setgid | ||
1051 | .long sys_setfsuid /* 215 */ | ||
1052 | .long sys_setfsgid | ||
1053 | .long sys_pivot_root | ||
1054 | .long sys_mincore | ||
1055 | .long sys_madvise | ||
1056 | .long sys_getdents64 /* 220 */ | ||
1057 | .long sys_fcntl64 | ||
1058 | .long sys_ni_syscall /* reserved for TUX */ | ||
1059 | .long sys_ni_syscall | ||
1060 | .long sys_gettid | ||
1061 | .long sys_readahead /* 225 */ | ||
1062 | .long sys_setxattr | ||
1063 | .long sys_lsetxattr | ||
1064 | .long sys_fsetxattr | ||
1065 | .long sys_getxattr | ||
1066 | .long sys_lgetxattr /* 230 */ | ||
1067 | .long sys_fgetxattr | ||
1068 | .long sys_listxattr | ||
1069 | .long sys_llistxattr | ||
1070 | .long sys_flistxattr | ||
1071 | .long sys_removexattr /* 235 */ | ||
1072 | .long sys_lremovexattr | ||
1073 | .long sys_fremovexattr | ||
1074 | .long sys_tkill | ||
1075 | .long sys_sendfile64 | ||
1076 | .long sys_futex /* 240 */ | ||
1077 | .long sys_sched_setaffinity | ||
1078 | .long sys_sched_getaffinity | ||
1079 | .long sys_ni_syscall /* sys_set_thread_area */ | ||
1080 | .long sys_ni_syscall /* sys_get_thread_area */ | ||
1081 | .long sys_io_setup /* 245 */ | ||
1082 | .long sys_io_destroy | ||
1083 | .long sys_io_getevents | ||
1084 | .long sys_io_submit | ||
1085 | .long sys_io_cancel | ||
1086 | .long sys_fadvise64 /* 250 */ | ||
1087 | .long sys_ni_syscall | ||
1088 | .long sys_exit_group | ||
1089 | .long sys_lookup_dcookie | ||
1090 | .long sys_epoll_create | ||
1091 | .long sys_epoll_ctl /* 255 */ | ||
1092 | .long sys_epoll_wait | ||
1093 | .long sys_remap_file_pages | ||
1094 | .long sys_set_tid_address | ||
1095 | .long sys_timer_create | ||
1096 | .long sys_timer_settime /* 260 */ | ||
1097 | .long sys_timer_gettime | ||
1098 | .long sys_timer_getoverrun | ||
1099 | .long sys_timer_delete | ||
1100 | .long sys_clock_settime | ||
1101 | .long sys_clock_gettime /* 265 */ | ||
1102 | .long sys_clock_getres | ||
1103 | .long sys_clock_nanosleep | ||
1104 | .long sys_statfs64 | ||
1105 | .long sys_fstatfs64 | ||
1106 | .long sys_tgkill /* 270 */ | ||
1107 | .long sys_utimes | ||
1108 | .long sys_fadvise64_64 | ||
1109 | .long sys_ni_syscall /* sys_vserver */ | ||
1110 | .long sys_ni_syscall /* sys_mbind */ | ||
1111 | .long sys_ni_syscall /* 275 sys_get_mempolicy */ | ||
1112 | .long sys_ni_syscall /* sys_set_mempolicy */ | ||
1113 | .long sys_mq_open | ||
1114 | .long sys_mq_unlink | ||
1115 | .long sys_mq_timedsend | ||
1116 | .long sys_mq_timedreceive /* 280 */ | ||
1117 | .long sys_mq_notify | ||
1118 | .long sys_mq_getsetattr | ||
1119 | .long sys_ni_syscall /* reserved for kexec */ | ||
1120 | .long sys_waitid | ||
1121 | |||
1122 | /* | ||
1123 | * NOTE!! This doesn't have to be exact - we just have | ||
1124 | * to make sure we have _enough_ of the "sys_ni_syscall" | ||
1125 | * entries. Don't panic if you notice that this hasn't | ||
1126 | * been shrunk every time we add a new system call. | ||
1127 | */ | ||
1128 | |||
1129 | .rept NR_syscalls-(.-sys_call_table)/4 | ||
1130 | .long sys_ni_syscall | ||
1131 | .endr | ||
1132 | |||