1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 #include <linux/sys.h>
49
50 #include <asm/segment.h>
51
52 LCF_MASK = 0x0001
53
54 LENOSYS = 38
55
56
57
58
59 LTASK_STATE = 0
60 LTASK_COUNTER = 4
61 LTASK_PRIORITY = 8
62 LTASK_SIGNAL = 12
63 LTASK_BLOCKED = 16
64 LTASK_FLAGS = 20
65 LTASK_ERRNO = 24
66
67 #include <linux/config.h>
68 #include <linux/linkage.h>
69
70
71 #if defined(CONFIG_ATARI) && !defined(CONFIG_AMIGA) && !defined(CONFIG_MAC)
72
73 #define ALLOWINT 0xfbff
74 #else
75
76 #define ALLOWINT 0xf8ff
77 #endif
78
79 LD0 = 0x1C
80 LORIG_D0 = 0x20
81 LSR = 0x28
82 LFORMATVEC = 0x2E
83
84
85
86
87
88
89
90 #define SAVE_ALL \
91 clrl %sp@-; \
92 movel %d0,%sp@-; \
93 movel %d0,%sp@-; \
94 moveml %d1-%d5/%a0-%a1,%sp@-
95
96 #define RESTORE_ALL \
97 moveml %sp@+,%a0-%a1/%d1-%d5; \
98 movel %sp@+,%d0; \
99 addql #4,%sp; \
100 addl %sp@+,%sp; \
101 rte
102
103 #define SWITCH_STACK_SIZE (7*4+4)
104
105 #define SAVE_SWITCH_STACK \
106 moveml %a2-%a6/%d6-%d7,%sp@-
107
108 #define RESTORE_SWITCH_STACK \
109 moveml %sp@+,%a2-%a6/%d6-%d7
110
111 .globl SYMBOL_NAME(system_call), SYMBOL_NAME(buserr), SYMBOL_NAME(trap)
112 .globl SYMBOL_NAME(resume), SYMBOL_NAME(ret_from_exception)
113 .globl SYMBOL_NAME(ret_from_signal)
114 .globl SYMBOL_NAME(inthandler), SYMBOL_NAME(sys_call_table)
115 .globl SYMBOL_NAME(sys_fork), SYMBOL_NAME(sys_clone)
116 .globl SYMBOL_NAME(ret_from_interrupt), SYMBOL_NAME(bad_interrupt)
117
118 .text
119 ENTRY(buserr)
120 SAVE_ALL
121 moveq #-1,%d0
122 movel %d0,%sp@(LORIG_D0) | a -1 in the ORIG_D0 field
123 | signifies that the stack frame
124 | is NOT for syscall
125
126 movel %sp,%sp@- | stack frame pointer argument
127 bsrl SYMBOL_NAME(buserr_c)
128 addql #4,%sp
129 jra SYMBOL_NAME(ret_from_exception)
130
131 ENTRY(trap)
132 SAVE_ALL
133 moveq #-1,%d0
134 movel %d0,%sp@(LORIG_D0) | a -1 in the ORIG_D0 field
135 | signifies that the stack frame
136 | is NOT for syscall
137 movel %sp,%sp@- | stack frame pointer argument
138 bsrl SYMBOL_NAME(trap_c)
139 addql #4,%sp
140 jra SYMBOL_NAME(ret_from_exception)
141
142 ENTRY(reschedule)
143 | save top of frame
144 pea %sp@
145 jbsr SYMBOL_NAME(set_esp0)
146 addql #4,%sp
147
148 pea SYMBOL_NAME(ret_from_exception)
149 jmp SYMBOL_NAME(schedule)
150
151 ENTRY(system_call)
152 SAVE_ALL
153 movel #-LENOSYS,LD0(%sp) | default return value in d0
154 | original D0 is in orig_d0
155 movel %d0,%d2
156
157 | save top of frame
158 pea %sp@
159 jbsr SYMBOL_NAME(set_esp0)
160 addql #4,%sp
161
162 cmpl #NR_syscalls,%d2
163 jcc SYMBOL_NAME(ret_from_exception)
164 lea SYMBOL_NAME(sys_call_table),%a0
165 movel %a0@(%d2:l:4),%d3
166 jeq SYMBOL_NAME(ret_from_exception)
167 andw #~LCF_MASK,%sp@(LSR) | assume syscall success
168 movel SYMBOL_NAME(current_set),%a0
169 clrl %a0@(LTASK_ERRNO)
170 btst #5,%a0@(LTASK_FLAGS+3) | PF_TRACESYS
171 bnes 1f
172 movel %d3,%a0
173 jbsr %a0@
174 movel %d0,%sp@(LD0) | save the return value
175 jpl 2f
176 orw #LCF_MASK,%sp@(LSR) | set carry to indicate error
177 2:
178 movel SYMBOL_NAME(current_set),%a0
179 movel %a0@(LTASK_ERRNO),%d1
180 negl %d1
181 jeq SYMBOL_NAME(ret_from_exception)
182 movel %d1,%sp@(LD0)
183 orw #LCF_MASK,%sp@(LSR) | set carry to indicate error
184 jra SYMBOL_NAME(ret_from_exception)
185 1:
186 subql #4,%sp
187 SAVE_SWITCH_STACK
188 jbsr SYMBOL_NAME(syscall_trace)
189 RESTORE_SWITCH_STACK
190 addql #4,%sp
191 movel %d3,%a0
192 jbsr %a0@
193 movel %d0,%sp@(LD0) | save the return value
194 jpl 2f
195 orw #LCF_MASK,%sp@(LSR) | set carry to indicate error
196 2:
197 movel SYMBOL_NAME(current_set),%a0
198 movel %a0@(LTASK_ERRNO),%d1
199 negl %d1
200 jeq 2f
201 movel %d1,%sp@(LD0)
202 orw #LCF_MASK,%sp@(LSR) | set carry to indicate error
203 2: subql #4,%sp | dummy return address
204 SAVE_SWITCH_STACK
205 jbsr SYMBOL_NAME(syscall_trace)
206
207 SYMBOL_NAME_LABEL(ret_from_signal)
208 RESTORE_SWITCH_STACK
209 addql #4,%sp
210
211 SYMBOL_NAME_LABEL(ret_from_exception)
212 btst #5,%sp@(LSR) | check if returning to kernel
213 bnes 2f | if so, skip resched, signals
214 tstl SYMBOL_NAME(need_resched)
215 jne SYMBOL_NAME(reschedule)
216 movel SYMBOL_NAME(current_set),%a0
217 cmpl #SYMBOL_NAME(task),%a0 | task[0] cannot have signals
218 jeq 2f
219 bclr #5,%a0@(LTASK_FLAGS+1) | check for delayed trace
220 jeq 1f
221 bclr #7,%sp@(LSR) | clear trace bit in SR
222 pea 1 | send SIGTRAP
223 movel %a0,%sp@-
224 pea 5
225 jbsr SYMBOL_NAME(send_sig)
226 addql #8,%sp
227 addql #4,%sp
228
229 1:
230 moveq #0,%d0
231 movel SYMBOL_NAME(current_set),%a0
232 cmpl %a0@(LTASK_STATE),%d0 | state
233 jne SYMBOL_NAME(reschedule)
234 cmpl %a0@(LTASK_COUNTER),%d0 | counter
235 jeq SYMBOL_NAME(reschedule)
236
237 movel %a0@(LTASK_BLOCKED),%d0
238 movel %d0,%d1 | save blocked in d1 for sig handling
239 notl %d0
240 andl %a0@(LTASK_SIGNAL),%d0
241 jne Lsignal_return
242 2: RESTORE_ALL
243
244 Lsignal_return:
245 subql #4,%sp | dummy return address
246 SAVE_SWITCH_STACK
247 pea %sp@(SWITCH_STACK_SIZE)
248 movel %d1,%sp@-
249 bsrl SYMBOL_NAME(do_signal)
250 addql #8,%sp
251 RESTORE_SWITCH_STACK
252 addql #4,%sp
253 RESTORE_ALL
254
255
256
257
258 SYMBOL_NAME_LABEL(inthandler)
259 SAVE_ALL
260 moveq #-1,%d0
261 movel %d0,%sp@(LORIG_D0) | a -1 in the ORIG_D0 field
262 | signifies that the stack frame
263 | is NOT for syscall
264
265 addql #1,SYMBOL_NAME(intr_count)
266
267 movew %sp@(LFORMATVEC),%d0 | put exception # in d0
268 andil #0xfff,%d0 | mask out format nybble
269
270 movel %sp,%sp@-
271 movel %d0,%sp@- | put vector # on stack
272 jbsr SYMBOL_NAME(process_int)| process the IRQ
273 addql #8,%sp | pop parameters off stack
274
275 SYMBOL_NAME_LABEL(ret_from_interrupt)
276
277 1:
278 movel SYMBOL_NAME(intr_count),%d2
279 subql #1,%d2
280 jne 2f
281
282 movel SYMBOL_NAME(bh_active),%d0
283 andl SYMBOL_NAME(bh_mask),%d0
284 jne 3f
285
286 movel %d2,SYMBOL_NAME(intr_count)
287
288 jra SYMBOL_NAME(ret_from_exception)
289 | deliver signals, reschedule etc..
290
291 2: movel %d2,SYMBOL_NAME(intr_count)
292 RESTORE_ALL
293 3:
294 movew %sr,%sp@-
295 andiw #(ALLOWINT),%sr | allow interrupts
296 jbsr SYMBOL_NAME(do_bottom_half)
297 movew %sp@+,%sr
298 jra 1b
299
300
301
302
303 SYMBOL_NAME_LABEL(bad_interrupt)
304 addql #1,SYMBOL_NAME(num_spurious)
305 rte
306
307 ENTRY(sys_fork)
308 SAVE_SWITCH_STACK
309 pea %sp@(SWITCH_STACK_SIZE)
310 jbsr SYMBOL_NAME(m68k_fork)
311 addql #4,%sp
312 RESTORE_SWITCH_STACK
313 rts
314
315 ENTRY(sys_clone)
316 SAVE_SWITCH_STACK
317 pea %sp@(SWITCH_STACK_SIZE)
318 jbsr SYMBOL_NAME(m68k_clone)
319 addql #4,%sp
320 RESTORE_SWITCH_STACK
321 rts
322
323 ENTRY(sys_sigsuspend)
324 SAVE_SWITCH_STACK
325 pea %sp@(SWITCH_STACK_SIZE)
326 jbsr SYMBOL_NAME(do_sigsuspend)
327 addql #4,%sp
328 RESTORE_SWITCH_STACK
329 rts
330
331 ENTRY(sys_sigreturn)
332 SAVE_SWITCH_STACK
333 jbsr SYMBOL_NAME(do_sigreturn)
334 RESTORE_SWITCH_STACK
335 rts
336
337 LFLUSH_I_AND_D = 0x00000808
338 LBI_CPU = 4
339 LTSS_KSP = 0
340 LTSS_USP = 4
341 LTSS_SR = 8
342 LTSS_FS = 10
343 LTSS_CRP = 20
344 LTSS_FPCTXT = 32
345
346 SYMBOL_NAME_LABEL(resume)
347
348
349
350
351
352
353
354 movel SYMBOL_NAME(current_set),%a0
355
356
357
358 addl %a1,%a0
359
360
361 movew %sr,%a0@(LTSS_SR)
362
363
364 oriw #0x0700,%sr
365
366
367 movec %sfc,%d0
368 movew %d0,%a0@(LTSS_FS)
369
370
371
372 movec %usp,%d0
373 movel %d0,%a0@(LTSS_USP)
374
375
376
377
378
379
380
381 SAVE_SWITCH_STACK
382
383
384 movel %sp,%a0@(LTSS_KSP)
385
386
387 fsave %a0@(LTSS_FPCTXT+27*4)
388 tstb %a0@(LTSS_FPCTXT+27*4)
389 jeq 1f
390 fmovemx %fp0-%fp7,%a0@(LTSS_FPCTXT)
391 fmoveml %fpcr/%fpsr/%fpiar,%a0@(LTSS_FPCTXT+24*4)
392 1:
393
394
395 movel %d1,SYMBOL_NAME(current_set)
396 movel %d1,%a0
397 addl %a1,%a0
398
399
400 btst #2,SYMBOL_NAME(boot_info)+LBI_CPU+3
401 bnes 1f
402 btst #3,SYMBOL_NAME(boot_info)+LBI_CPU+3
403 bnes 1f
404
405
406
407
408
409
410 movec %cacr,%d0
411 oril #LFLUSH_I_AND_D,%d0
412 movec %d0,%cacr
413
414
415 pmove %a0@(LTSS_CRP),%crp
416
417
418 pflusha
419
420 jra 2f
421
422 1:
423
424
425
426
427
428 .word 0xf510
429
430
431 movel %a0@(LTSS_CRP+4),%d0
432 .long 0x4e7b0806
433
434
435 btst #3,SYMBOL_NAME(boot_info)+LBI_CPU+3
436 beqs 2f
437
438 movec %cacr,%d0
439 orl #0x00200000,%d0
440 movec %d0,%cacr
441
442 2:
443
444 tstb %a0@(LTSS_FPCTXT+27*4)
445 jeq 1f
446 fmovemx %a0@(LTSS_FPCTXT),%fp0-%fp7
447 fmoveml %a0@(LTSS_FPCTXT+24*4),%fpcr/%fpsr/%fpiar
448 1: frestore %a0@(LTSS_FPCTXT+27*4)
449
450
451 movel %a0@(LTSS_KSP),%sp
452
453
454 RESTORE_SWITCH_STACK
455
456
457 movel %a0@(LTSS_USP),%d0
458 movec %d0,%usp
459
460
461 movew %a0@(LTSS_FS),%a1
462 movec %a1,%sfc
463 movec %a1,%dfc
464
465
466 movew %a0@(LTSS_SR),%sr
467
468 rts
469
470 .data
471 ALIGN
472 SYMBOL_NAME_LABEL(sys_call_table)
473 .long SYMBOL_NAME(sys_setup)
474 .long SYMBOL_NAME(sys_exit)
475 .long SYMBOL_NAME(sys_fork)
476 .long SYMBOL_NAME(sys_read)
477 .long SYMBOL_NAME(sys_write)
478 .long SYMBOL_NAME(sys_open)
479 .long SYMBOL_NAME(sys_close)
480 .long SYMBOL_NAME(sys_waitpid)
481 .long SYMBOL_NAME(sys_creat)
482 .long SYMBOL_NAME(sys_link)
483 .long SYMBOL_NAME(sys_unlink)
484 .long SYMBOL_NAME(sys_execve)
485 .long SYMBOL_NAME(sys_chdir)
486 .long SYMBOL_NAME(sys_time)
487 .long SYMBOL_NAME(sys_mknod)
488 .long SYMBOL_NAME(sys_chmod)
489 .long SYMBOL_NAME(sys_chown)
490 .long SYMBOL_NAME(sys_break)
491 .long SYMBOL_NAME(sys_stat)
492 .long SYMBOL_NAME(sys_lseek)
493 .long SYMBOL_NAME(sys_getpid)
494 .long SYMBOL_NAME(sys_mount)
495 .long SYMBOL_NAME(sys_umount)
496 .long SYMBOL_NAME(sys_setuid)
497 .long SYMBOL_NAME(sys_getuid)
498 .long SYMBOL_NAME(sys_stime)
499 .long SYMBOL_NAME(sys_ptrace)
500 .long SYMBOL_NAME(sys_alarm)
501 .long SYMBOL_NAME(sys_fstat)
502 .long SYMBOL_NAME(sys_pause)
503 .long SYMBOL_NAME(sys_utime)
504 .long SYMBOL_NAME(sys_stty)
505 .long SYMBOL_NAME(sys_gtty)
506 .long SYMBOL_NAME(sys_access)
507 .long SYMBOL_NAME(sys_nice)
508 .long SYMBOL_NAME(sys_ftime)
509 .long SYMBOL_NAME(sys_sync)
510 .long SYMBOL_NAME(sys_kill)
511 .long SYMBOL_NAME(sys_rename)
512 .long SYMBOL_NAME(sys_mkdir)
513 .long SYMBOL_NAME(sys_rmdir)
514 .long SYMBOL_NAME(sys_dup)
515 .long SYMBOL_NAME(sys_pipe)
516 .long SYMBOL_NAME(sys_times)
517 .long SYMBOL_NAME(sys_prof)
518 .long SYMBOL_NAME(sys_brk)
519 .long SYMBOL_NAME(sys_setgid)
520 .long SYMBOL_NAME(sys_getgid)
521 .long SYMBOL_NAME(sys_signal)
522 .long SYMBOL_NAME(sys_geteuid)
523 .long SYMBOL_NAME(sys_getegid)
524 .long SYMBOL_NAME(sys_acct)
525 .long SYMBOL_NAME(sys_phys)
526 .long SYMBOL_NAME(sys_lock)
527 .long SYMBOL_NAME(sys_ioctl)
528 .long SYMBOL_NAME(sys_fcntl)
529 .long SYMBOL_NAME(sys_mpx)
530 .long SYMBOL_NAME(sys_setpgid)
531 .long SYMBOL_NAME(sys_ulimit)
532 .long SYMBOL_NAME(sys_olduname)
533 .long SYMBOL_NAME(sys_umask)
534 .long SYMBOL_NAME(sys_chroot)
535 .long SYMBOL_NAME(sys_ustat)
536 .long SYMBOL_NAME(sys_dup2)
537 .long SYMBOL_NAME(sys_getppid)
538 .long SYMBOL_NAME(sys_getpgrp)
539 .long SYMBOL_NAME(sys_setsid)
540 .long SYMBOL_NAME(sys_sigaction)
541 .long SYMBOL_NAME(sys_sgetmask)
542 .long SYMBOL_NAME(sys_ssetmask)
543 .long SYMBOL_NAME(sys_setreuid)
544 .long SYMBOL_NAME(sys_setregid)
545 .long SYMBOL_NAME(sys_sigsuspend)
546 .long SYMBOL_NAME(sys_sigpending)
547 .long SYMBOL_NAME(sys_sethostname)
548 .long SYMBOL_NAME(sys_setrlimit)
549 .long SYMBOL_NAME(sys_getrlimit)
550 .long SYMBOL_NAME(sys_getrusage)
551 .long SYMBOL_NAME(sys_gettimeofday)
552 .long SYMBOL_NAME(sys_settimeofday)
553 .long SYMBOL_NAME(sys_getgroups)
554 .long SYMBOL_NAME(sys_setgroups)
555 .long SYMBOL_NAME(old_select)
556 .long SYMBOL_NAME(sys_symlink)
557 .long SYMBOL_NAME(sys_lstat)
558 .long SYMBOL_NAME(sys_readlink)
559 .long SYMBOL_NAME(sys_uselib)
560 .long SYMBOL_NAME(sys_swapon)
561 .long SYMBOL_NAME(sys_reboot)
562 .long SYMBOL_NAME(old_readdir)
563 .long SYMBOL_NAME(old_mmap)
564 .long SYMBOL_NAME(sys_munmap)
565 .long SYMBOL_NAME(sys_truncate)
566 .long SYMBOL_NAME(sys_ftruncate)
567 .long SYMBOL_NAME(sys_fchmod)
568 .long SYMBOL_NAME(sys_fchown)
569 .long SYMBOL_NAME(sys_getpriority)
570 .long SYMBOL_NAME(sys_setpriority)
571 .long SYMBOL_NAME(sys_profil)
572 .long SYMBOL_NAME(sys_statfs)
573 .long SYMBOL_NAME(sys_fstatfs)
574 .long SYMBOL_NAME(sys_ioperm)
575 .long SYMBOL_NAME(sys_socketcall)
576 .long SYMBOL_NAME(sys_syslog)
577 .long SYMBOL_NAME(sys_setitimer)
578 .long SYMBOL_NAME(sys_getitimer)
579 .long SYMBOL_NAME(sys_newstat)
580 .long SYMBOL_NAME(sys_newlstat)
581 .long SYMBOL_NAME(sys_newfstat)
582 .long SYMBOL_NAME(sys_uname)
583 .long SYMBOL_NAME(sys_ni_syscall)
584 .long SYMBOL_NAME(sys_vhangup)
585 .long SYMBOL_NAME(sys_idle)
586 .long SYMBOL_NAME(sys_ni_syscall)
587 .long SYMBOL_NAME(sys_wait4)
588 .long SYMBOL_NAME(sys_swapoff)
589 .long SYMBOL_NAME(sys_sysinfo)
590 .long SYMBOL_NAME(sys_ipc)
591 .long SYMBOL_NAME(sys_fsync)
592 .long SYMBOL_NAME(sys_sigreturn)
593 .long SYMBOL_NAME(sys_clone)
594 .long SYMBOL_NAME(sys_setdomainname)
595 .long SYMBOL_NAME(sys_newuname)
596 .long SYMBOL_NAME(sys_ni_syscall)
597 .long SYMBOL_NAME(sys_adjtimex)
598 .long SYMBOL_NAME(sys_mprotect)
599 .long SYMBOL_NAME(sys_sigprocmask)
600 .long SYMBOL_NAME(sys_create_module)
601 .long SYMBOL_NAME(sys_init_module)
602 .long SYMBOL_NAME(sys_delete_module)
603 .long SYMBOL_NAME(sys_get_kernel_syms)
604 .long SYMBOL_NAME(sys_quotactl)
605 .long SYMBOL_NAME(sys_getpgid)
606 .long SYMBOL_NAME(sys_fchdir)
607 .long SYMBOL_NAME(sys_bdflush)
608 .long SYMBOL_NAME(sys_sysfs)
609 .long SYMBOL_NAME(sys_personality)
610 .long SYMBOL_NAME(sys_ni_syscall)
611 .long SYMBOL_NAME(sys_setfsuid)
612 .long SYMBOL_NAME(sys_setfsgid)
613 .long SYMBOL_NAME(sys_llseek)
614 .long SYMBOL_NAME(sys_getdents)
615 .long SYMBOL_NAME(sys_select)
616 .long SYMBOL_NAME(sys_flock)
617 .long SYMBOL_NAME(sys_msync)
618 .long SYMBOL_NAME(sys_readv)
619 .long SYMBOL_NAME(sys_writev)
620 .long SYMBOL_NAME(sys_getsid)
621 .long SYMBOL_NAME(sys_fdatasync)
622 .long SYMBOL_NAME(sys_sysctl)
623 .long SYMBOL_NAME(sys_mlock)
624 .long SYMBOL_NAME(sys_munlock)
625 .long SYMBOL_NAME(sys_mlockall)
626 .long SYMBOL_NAME(sys_munlockall)
627 .long SYMBOL_NAME(sys_sched_setparam)
628 .long SYMBOL_NAME(sys_sched_getparam)
629 .long SYMBOL_NAME(sys_sched_setscheduler)
630 .long SYMBOL_NAME(sys_sched_getscheduler)
631 .long SYMBOL_NAME(sys_sched_yield)
632 .long SYMBOL_NAME(sys_sched_get_priority_max)
633 .long SYMBOL_NAME(sys_sched_get_priority_min)
634 .long SYMBOL_NAME(sys_sched_rr_get_interval)
635 .long SYMBOL_NAME(sys_nanosleep)
636 .long SYMBOL_NAME(sys_mremap)
637 .space (NR_syscalls-163)*4