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 .word 0xf4f8
238 movel %a0@(LTASK_BLOCKED),%d0
239 movel %d0,%d1 | save blocked in d1 for sig handling
240 notl %d0
241 andl %a0@(LTASK_SIGNAL),%d0
242 jne Lsignal_return
243 2: RESTORE_ALL
244
245 Lsignal_return:
246 subql #4,%sp | dummy return address
247 SAVE_SWITCH_STACK
248 pea %sp@(SWITCH_STACK_SIZE)
249 movel %d1,%sp@-
250 bsrl SYMBOL_NAME(do_signal)
251 addql #8,%sp
252 RESTORE_SWITCH_STACK
253 addql #4,%sp
254 RESTORE_ALL
255
256
257
258
259 SYMBOL_NAME_LABEL(inthandler)
260 SAVE_ALL
261 moveq #-1,%d0
262 movel %d0,%sp@(LORIG_D0) | a -1 in the ORIG_D0 field
263 | signifies that the stack frame
264 | is NOT for syscall
265
266 addql #1,SYMBOL_NAME(intr_count)
267
268 movew %sp@(LFORMATVEC),%d0 | put exception # in d0
269 andil #0xfff,%d0 | mask out format nybble
270
271 movel %sp,%sp@-
272 movel %d0,%sp@- | put vector # on stack
273 jbsr SYMBOL_NAME(process_int)| process the IRQ
274 addql #8,%sp | pop parameters off stack
275
276 SYMBOL_NAME_LABEL(ret_from_interrupt)
277
278 1:
279 movel SYMBOL_NAME(intr_count),%d2
280 subql #1,%d2
281 jne 2f
282
283 movel SYMBOL_NAME(bh_active),%d0
284 andl SYMBOL_NAME(bh_mask),%d0
285 jne 3f
286
287 movel %d2,SYMBOL_NAME(intr_count)
288
289 jra SYMBOL_NAME(ret_from_exception)
290 | deliver signals, reschedule etc..
291
292 2: movel %d2,SYMBOL_NAME(intr_count)
293 RESTORE_ALL
294 3:
295 movew %sr,%sp@-
296 andiw #(ALLOWINT),%sr | allow interrupts
297 jbsr SYMBOL_NAME(do_bottom_half)
298 movew %sp@+,%sr
299 jra 1b
300
301
302
303
304 SYMBOL_NAME_LABEL(bad_interrupt)
305 addql #1,SYMBOL_NAME(num_spurious)
306 rte
307
308 ENTRY(sys_fork)
309 SAVE_SWITCH_STACK
310 pea %sp@(SWITCH_STACK_SIZE)
311 jbsr SYMBOL_NAME(m68k_fork)
312 addql #4,%sp
313 RESTORE_SWITCH_STACK
314 rts
315
316 ENTRY(sys_clone)
317 SAVE_SWITCH_STACK
318 pea %sp@(SWITCH_STACK_SIZE)
319 jbsr SYMBOL_NAME(m68k_clone)
320 addql #4,%sp
321 RESTORE_SWITCH_STACK
322 rts
323
324 ENTRY(sys_sigsuspend)
325 SAVE_SWITCH_STACK
326 pea %sp@(SWITCH_STACK_SIZE)
327 jbsr SYMBOL_NAME(do_sigsuspend)
328 addql #4,%sp
329 RESTORE_SWITCH_STACK
330 rts
331
332 ENTRY(sys_sigreturn)
333 SAVE_SWITCH_STACK
334 jbsr SYMBOL_NAME(do_sigreturn)
335 RESTORE_SWITCH_STACK
336 rts
337
338 LFLUSH_I_AND_D = 0x00000808
339 LBI_CPU = 4
340 LTSS_KSP = 0
341 LTSS_USP = 4
342 LTSS_SR = 8
343 LTSS_FS = 10
344 LTSS_CRP = 20
345 LTSS_FPCTXT = 32
346
347 SYMBOL_NAME_LABEL(resume)
348
349
350
351
352
353
354
355 movel SYMBOL_NAME(current_set),%a0
356
357
358
359
360
361
362 addl %a1,%a0
363
364
365 movew %sr,%a0@(LTSS_SR)
366
367
368 oriw #0x0700,%sr
369
370
371 movec %sfc,%d0
372 movew %d0,%a0@(LTSS_FS)
373
374
375
376 movec %usp,%d0
377 movel %d0,%a0@(LTSS_USP)
378
379
380
381
382
383
384
385 SAVE_SWITCH_STACK
386
387
388 movel %sp,%a0@(LTSS_KSP)
389
390
391 fsave %a0@(LTSS_FPCTXT+27*4)
392 tstb %a0@(LTSS_FPCTXT+27*4)
393 jeq 1f
394 fmovemx %fp0-%fp7,%a0@(LTSS_FPCTXT)
395 fmoveml %fpcr/%fpsr/%fpiar,%a0@(LTSS_FPCTXT+24*4)
396 1:
397
398
399 movel %d1,SYMBOL_NAME(current_set)
400 movel %d1,%a0
401 addl %a1,%a0
402
403
404 btst #2,SYMBOL_NAME(boot_info)+LBI_CPU+3
405 bnes 1f
406 btst #3,SYMBOL_NAME(boot_info)+LBI_CPU+3
407 bnes 1f
408
409
410
411
412
413
414 movec %cacr,%d0
415 oril #LFLUSH_I_AND_D,%d0
416 movec %d0,%cacr
417
418
419 pmove %a0@(LTSS_CRP),%crp
420
421
422 pflusha
423
424 jra 2f
425
426 1:
427
428
429
430
431
432 .word 0xf510
433
434
435 movel %a0@(LTSS_CRP+4),%d0
436 .long 0x4e7b0806
437
438
439 btst #3,SYMBOL_NAME(boot_info)+LBI_CPU+3
440 beqs 2f
441
442 movec %cacr,%d0
443 orl #0x00200000,%d0
444 movec %d0,%cacr
445
446 2:
447
448 tstb %a0@(LTSS_FPCTXT+27*4)
449 jeq 1f
450 fmovemx %a0@(LTSS_FPCTXT),%fp0-%fp7
451 fmoveml %a0@(LTSS_FPCTXT+24*4),%fpcr/%fpsr/%fpiar
452 1: frestore %a0@(LTSS_FPCTXT+27*4)
453
454
455 movel %a0@(LTSS_KSP),%sp
456
457
458 RESTORE_SWITCH_STACK
459
460
461 movel %a0@(LTSS_USP),%d0
462 movec %d0,%usp
463
464
465 movew %a0@(LTSS_FS),%a1
466 movec %a1,%sfc
467 movec %a1,%dfc
468
469
470 movew %a0@(LTSS_SR),%sr
471
472 rts
473
474 .data
475 ALIGN
476 SYMBOL_NAME_LABEL(sys_call_table)
477 .long SYMBOL_NAME(sys_setup)
478 .long SYMBOL_NAME(sys_exit)
479 .long SYMBOL_NAME(sys_fork)
480 .long SYMBOL_NAME(sys_read)
481 .long SYMBOL_NAME(sys_write)
482 .long SYMBOL_NAME(sys_open)
483 .long SYMBOL_NAME(sys_close)
484 .long SYMBOL_NAME(sys_waitpid)
485 .long SYMBOL_NAME(sys_creat)
486 .long SYMBOL_NAME(sys_link)
487 .long SYMBOL_NAME(sys_unlink)
488 .long SYMBOL_NAME(sys_execve)
489 .long SYMBOL_NAME(sys_chdir)
490 .long SYMBOL_NAME(sys_time)
491 .long SYMBOL_NAME(sys_mknod)
492 .long SYMBOL_NAME(sys_chmod)
493 .long SYMBOL_NAME(sys_chown)
494 .long SYMBOL_NAME(sys_break)
495 .long SYMBOL_NAME(sys_stat)
496 .long SYMBOL_NAME(sys_lseek)
497 .long SYMBOL_NAME(sys_getpid)
498 .long SYMBOL_NAME(sys_mount)
499 .long SYMBOL_NAME(sys_umount)
500 .long SYMBOL_NAME(sys_setuid)
501 .long SYMBOL_NAME(sys_getuid)
502 .long SYMBOL_NAME(sys_stime)
503 .long SYMBOL_NAME(sys_ptrace)
504 .long SYMBOL_NAME(sys_alarm)
505 .long SYMBOL_NAME(sys_fstat)
506 .long SYMBOL_NAME(sys_pause)
507 .long SYMBOL_NAME(sys_utime)
508 .long SYMBOL_NAME(sys_stty)
509 .long SYMBOL_NAME(sys_gtty)
510 .long SYMBOL_NAME(sys_access)
511 .long SYMBOL_NAME(sys_nice)
512 .long SYMBOL_NAME(sys_ftime)
513 .long SYMBOL_NAME(sys_sync)
514 .long SYMBOL_NAME(sys_kill)
515 .long SYMBOL_NAME(sys_rename)
516 .long SYMBOL_NAME(sys_mkdir)
517 .long SYMBOL_NAME(sys_rmdir)
518 .long SYMBOL_NAME(sys_dup)
519 .long SYMBOL_NAME(sys_pipe)
520 .long SYMBOL_NAME(sys_times)
521 .long SYMBOL_NAME(sys_prof)
522 .long SYMBOL_NAME(sys_brk)
523 .long SYMBOL_NAME(sys_setgid)
524 .long SYMBOL_NAME(sys_getgid)
525 .long SYMBOL_NAME(sys_signal)
526 .long SYMBOL_NAME(sys_geteuid)
527 .long SYMBOL_NAME(sys_getegid)
528 .long SYMBOL_NAME(sys_acct)
529 .long SYMBOL_NAME(sys_phys)
530 .long SYMBOL_NAME(sys_lock)
531 .long SYMBOL_NAME(sys_ioctl)
532 .long SYMBOL_NAME(sys_fcntl)
533 .long SYMBOL_NAME(sys_mpx)
534 .long SYMBOL_NAME(sys_setpgid)
535 .long SYMBOL_NAME(sys_ulimit)
536 .long SYMBOL_NAME(sys_olduname)
537 .long SYMBOL_NAME(sys_umask)
538 .long SYMBOL_NAME(sys_chroot)
539 .long SYMBOL_NAME(sys_ustat)
540 .long SYMBOL_NAME(sys_dup2)
541 .long SYMBOL_NAME(sys_getppid)
542 .long SYMBOL_NAME(sys_getpgrp)
543 .long SYMBOL_NAME(sys_setsid)
544 .long SYMBOL_NAME(sys_sigaction)
545 .long SYMBOL_NAME(sys_sgetmask)
546 .long SYMBOL_NAME(sys_ssetmask)
547 .long SYMBOL_NAME(sys_setreuid)
548 .long SYMBOL_NAME(sys_setregid)
549 .long SYMBOL_NAME(sys_sigsuspend)
550 .long SYMBOL_NAME(sys_sigpending)
551 .long SYMBOL_NAME(sys_sethostname)
552 .long SYMBOL_NAME(sys_setrlimit)
553 .long SYMBOL_NAME(sys_getrlimit)
554 .long SYMBOL_NAME(sys_getrusage)
555 .long SYMBOL_NAME(sys_gettimeofday)
556 .long SYMBOL_NAME(sys_settimeofday)
557 .long SYMBOL_NAME(sys_getgroups)
558 .long SYMBOL_NAME(sys_setgroups)
559 .long SYMBOL_NAME(old_select)
560 .long SYMBOL_NAME(sys_symlink)
561 .long SYMBOL_NAME(sys_lstat)
562 .long SYMBOL_NAME(sys_readlink)
563 .long SYMBOL_NAME(sys_uselib)
564 .long SYMBOL_NAME(sys_swapon)
565 .long SYMBOL_NAME(sys_reboot)
566 .long SYMBOL_NAME(old_readdir)
567 .long SYMBOL_NAME(old_mmap)
568 .long SYMBOL_NAME(sys_munmap)
569 .long SYMBOL_NAME(sys_truncate)
570 .long SYMBOL_NAME(sys_ftruncate)
571 .long SYMBOL_NAME(sys_fchmod)
572 .long SYMBOL_NAME(sys_fchown)
573 .long SYMBOL_NAME(sys_getpriority)
574 .long SYMBOL_NAME(sys_setpriority)
575 .long SYMBOL_NAME(sys_profil)
576 .long SYMBOL_NAME(sys_statfs)
577 .long SYMBOL_NAME(sys_fstatfs)
578 .long SYMBOL_NAME(sys_ioperm)
579 .long SYMBOL_NAME(sys_socketcall)
580 .long SYMBOL_NAME(sys_syslog)
581 .long SYMBOL_NAME(sys_setitimer)
582 .long SYMBOL_NAME(sys_getitimer)
583 .long SYMBOL_NAME(sys_newstat)
584 .long SYMBOL_NAME(sys_newlstat)
585 .long SYMBOL_NAME(sys_newfstat)
586 .long SYMBOL_NAME(sys_uname)
587 .long SYMBOL_NAME(sys_ni_syscall)
588 .long SYMBOL_NAME(sys_vhangup)
589 .long SYMBOL_NAME(sys_idle)
590 .long SYMBOL_NAME(sys_ni_syscall)
591 .long SYMBOL_NAME(sys_wait4)
592 .long SYMBOL_NAME(sys_swapoff)
593 .long SYMBOL_NAME(sys_sysinfo)
594 .long SYMBOL_NAME(sys_ipc)
595 .long SYMBOL_NAME(sys_fsync)
596 .long SYMBOL_NAME(sys_sigreturn)
597 .long SYMBOL_NAME(sys_clone)
598 .long SYMBOL_NAME(sys_setdomainname)
599 .long SYMBOL_NAME(sys_newuname)
600 .long SYMBOL_NAME(sys_ni_syscall)
601 .long SYMBOL_NAME(sys_adjtimex)
602 .long SYMBOL_NAME(sys_mprotect)
603 .long SYMBOL_NAME(sys_sigprocmask)
604 .long SYMBOL_NAME(sys_create_module)
605 .long SYMBOL_NAME(sys_init_module)
606 .long SYMBOL_NAME(sys_delete_module)
607 .long SYMBOL_NAME(sys_get_kernel_syms)
608 .long SYMBOL_NAME(sys_quotactl)
609 .long SYMBOL_NAME(sys_getpgid)
610 .long SYMBOL_NAME(sys_fchdir)
611 .long SYMBOL_NAME(sys_bdflush)
612 .long SYMBOL_NAME(sys_sysfs)
613 .long SYMBOL_NAME(sys_personality)
614 .long SYMBOL_NAME(sys_ni_syscall)
615 .long SYMBOL_NAME(sys_setfsuid)
616 .long SYMBOL_NAME(sys_setfsgid)
617 .long SYMBOL_NAME(sys_llseek)
618 .long SYMBOL_NAME(sys_getdents)
619 .long SYMBOL_NAME(sys_select)
620 .long SYMBOL_NAME(sys_flock)
621 .long SYMBOL_NAME(sys_msync)
622 .long SYMBOL_NAME(sys_readv)
623 .long SYMBOL_NAME(sys_writev)
624 .long SYMBOL_NAME(sys_getsid)
625 .long SYMBOL_NAME(sys_fdatasync)
626 .long SYMBOL_NAME(sys_sysctl)
627 .long SYMBOL_NAME(sys_mlock)
628 .long SYMBOL_NAME(sys_munlock)
629 .long SYMBOL_NAME(sys_mlockall)
630 .long SYMBOL_NAME(sys_munlockall)
631 .long SYMBOL_NAME(sys_sched_setparam)
632 .long SYMBOL_NAME(sys_sched_getparam)
633 .long SYMBOL_NAME(sys_sched_setscheduler)
634 .long SYMBOL_NAME(sys_sched_getscheduler)
635 .long SYMBOL_NAME(sys_sched_yield)
636 .long SYMBOL_NAME(sys_sched_get_priority_max)
637 .long SYMBOL_NAME(sys_sched_get_priority_min)
638 .long SYMBOL_NAME(sys_sched_rr_get_interval)
639 .long SYMBOL_NAME(sys_nanosleep)
640 .long SYMBOL_NAME(sys_mremap)
641 .space (NR_syscalls-163)*4