--- /dev/null
+ # $Header$
+#include "system.h"
+#include "em_abs.h"
+#define MOVL movl (sp)+,(ap)+
+#define MOVQ movq (sp)+,(ap)+
+
+.set sigvec,108
+
+.globl .mon
+
+.mon:
+ movl (sp)+,r2 # return address in r2
+ movl (sp)+,r0 # monitor call in r0
+ movl ap,r3
+ movl $args,ap
+ cvtlw r0,(ap)+
+ cmpl r0,$61
+ jgtru Lbadmon
+ ashl $2,r0,r0
+ jmp *L0(r0)
+.data
+.align 2
+L0:
+#ifndef BSD41a
+.long Lbadmon, Lexit, Lfork, Lread, Lwrite
+.long Lopen, Lclose, Lwait, Lcreat, Llink
+.long Lunlink, Lbadmon, Lchdir, Lbadmon, Lbadmon
+.long Lchmod, Lchown, Lbadmon, Lstat, Llseek
+.long Lgetpid, Lbadmon, Lbadmon, Lbadmon, Lgetuid
+.long Lbadmon, Lptrace, Lalarm, Lfstat, Lpause
+.long Lutime, Lbadmon, Lbadmon, Laccess, Lnice
+.long Lbadmon, Lsync, Lkill, Lbadmon, Lbadmon
+.long Lbadmon, Ldup, Lpipe, Lbadmon, Lprofil
+.long Lbadmon, Lbadmon, Lgetgid, Lsigtrp, Lbadmon
+.long Lbadmon, Lacct, Lbadmon, Lbadmon, Lioctl
+.long Lbadmon, Lbadmon, Lbadmon, Lbadmon, Lexece
+.long Lumask, Lchroot
+#else
+.long Lbadmon, Lexit, Lfork, Lread, Lwrite
+.long Lopen, Lclose, Lwait, Lcreat, Llink
+.long Lunlink, Lbadmon, Lchdir, Lbadmon, Lmknod
+.long Lchmod, Lchown, Lbadmon, Lstat, Llseek
+.long Lgetpid, Lmount, Lumount, Lsetuid, Lgetuid
+.long Lstime, Lptrace, Lalarm, Lfstat, Lpause
+.long Lutime, Lbadmon, Lbadmon, Laccess, Lnice
+.long Lftime, Lsync, Lkill, Lbadmon, Lbadmon
+.long Lbadmon, Ldup, Lpipe, Ltimes, Lprofil
+.long Lbadmon, Lsetgid, Lgetgid, Lsigtrp, Lbadmon
+.long Lbadmon, Lacct, Lbadmon, Llock, Lioctl
+.long Lbadmon, Lmpxall, Lbadmon, Lbadmon, Lexece
+.long Lumask, Lchroot
+#endif
+.text
+
+ # Each system call first stores its number of arguments, then the
+ # arguments themselves.
+ # The system calls are grouped according to their number of arguments
+ # and their results.
+ # Le*: an errornumber is expected
+ # L*r0*: the value of r0 is expected
+ # L*r1*: the value of r1 is expected
+ # Lnores: no results expected
+
+ # 0 arguments.
+Lsync:
+Lpause:
+Lpause:
+ clrl (ap)+
+Lnores:
+ jsb syscall
+ movl r3,ap
+ jmp (r2)
+Lgetpid:
+ clrl (ap)+
+Lr0:
+ jsb syscall
+ pushl r0
+ jmp (r2)
+Lgetuid:
+Lgetgid:
+ clrl (ap)+
+Lr0r1:
+ jsb syscall
+ pushl r0
+ pushl r1
+ jmp (r2)
+Lpipe:
+Lwait:
+Lfork:
+ clrl (ap)+
+Ler0r1:
+ jsb syscall
+ pushl r0
+ pushl r1
+ clrl -(sp)
+ jmp (r2)
+
+ # 1 argument.
+Lexit:
+Ltimes:
+ cvtbl $1,(ap)+
+ MOVL
+ jbr Lnores
+Lclose:
+Lunlink:
+Lchdir:
+Lumount:
+Lsetuid:
+Lstime:
+Lnice:
+Lftime:
+Lsetgid:
+Lacct:
+Llock:
+Lchroot:
+ cvtbl $1,(ap)+
+ MOVL
+Le:
+ jsb syscall
+ clrl -(sp)
+ jmp (r2)
+Lalarm:
+Lumask:
+ cvtbl $1,(ap)+
+ MOVL
+ jbr Lr0
+
+ # 2 arguments.
+Llink:
+Lchmod:
+Lstat:
+Lfstat:
+Lutime:
+Laccess:
+Lkill:
+Lmpxall:
+ cvtbl $2,(ap)+
+ MOVQ
+ jbr Le
+Ldup:
+ cvtbl $2,(ap)+
+ MOVQ
+Ler0:
+ jsb syscall
+ pushl r0
+ clrl -(sp)
+ jmp (r2)
+
+ # 3 arguments.
+Lioctl:
+Lexece:
+Lmknod:
+Lchown:
+Lmount:
+ cvtbl $3,(ap)+
+ MOVL
+ MOVQ
+ jbr Le
+Llseek:
+Lread:
+Lwrite:
+ cvtbl $3,(ap)+
+ MOVL
+ MOVQ
+ jbr Ler0
+
+ # 4 arguments.
+Lprofil:
+ cvtbl $4,(ap)+
+ MOVQ
+ MOVQ
+ jbr Lnores
+Lptrace:
+ cvtbl $4,(ap)+
+ MOVQ
+ MOVQ
+ jbr Ler0
+
+Lopen:
+#ifndef BSD41a
+ # The old open(name, mode) system call is simulated by
+ # open(name, mode, 0).
+ cvtbl $3,(ap)+
+#else
+ cvtbl $2,(ap)+
+#endif
+ MOVQ
+#ifndef BSD41a
+ clrl (ap)+
+#endif
+ jbr Ler0
+Lcreat:
+#ifndef BSD41a
+ # The old creat(name, mode) system call is simulated by
+ # open(name, O_WRONLY | O_CREAT | O_TRUNC, mode).
+ cvtbl $5,-2(ap)
+ cvtbl $3,(ap)+
+#else
+ cvtbl $2,(ap)+
+#endif
+ MOVL
+#ifndef BSD41a
+ movl $0x601,(ap)+
+#endif
+ MOVL
+ jbr Ler0
+
+syscall:
+ movl $args,ap
+ chmk (ap)+
+ bcc L1
+ cvtwl r0,(sp) # Push the error returned twice,
+ cvtwl r0,-(sp) # overwrite the return address
+ jmp (r2)
+L1:
+ rsb
+Lbadmon:
+ pushl $EBADMON
+ jmp .fat
+Lsigtrp:
+ movl 4(sp),r1 # Sig in r1
+ movl (sp)+,(sp) # Trapno on top of stack
+ cmpl r1,$16
+ bgtru badsig
+ tstl r1
+ beql badsig
+#ifdef BSD42
+ movl $3,(ap)+ # sigvec(sig, vec, ovec)
+#else BSD42
+ movl $2,(ap)+ # signal(sig, func)
+#endif BSD42
+ movl r1,(ap)+
+ movl sigadr0 [r1],r0
+ tstl (sp)
+ blss L2
+ cmpl (sp),$252
+ bgtr badtrp
+ movl r0,(ap)+
+ brb sys
+L2: cmpl $-3,(sp)
+ bneq L3
+ movl $1,(ap)+ # SIG_IGN
+ brb sys
+L3: cmpl $-2,(sp)
+ bneq badtrp
+ clrl (ap)+ # SIG_DFL
+sys:
+#ifdef BSD42
+ movl -(ap),vec # vec->sv_handler = func
+ movl $vec,(ap)+
+ movl $ovec,(ap)+ # Not used.
+#endif BSD42
+ pushl sigtrp0 [r1]
+ movl 4(sp),sigtrp0 [r1]
+ movl (sp)+,(sp) # Old trap number on top of stack.
+ movl $args,ap
+#ifdef BSD42
+ movw $sigvec,(ap)
+#endif
+ chmk (ap)+
+ bcc L4
+ movl (sp),sigtrp0 [r1] # Error, reset old trap number.
+ pushl r0
+ jmp (r2)
+L4: clrl -(sp)
+ jmp (r2)
+badsig:
+ movl $-1,(sp)
+ pushl (sp)
+ jmp (r2)
+badtrp:
+ movl sigtrp0 [r1],(sp)
+ pushl $-1
+ jmp (r2)
+
+sigs:
+ .word 0x0000
+ # Routine to catch signals.
+ pushl fp
+ movl 12(fp),fp
+ movl 12(fp),fp # Restore local base, two levels!
+ movl 4(ap),ap
+ pushl sigtrp0 [ap]
+ jsb .trp
+ movl (sp)+,fp
+ ret
+
+.data
+#ifdef BSD42
+vec:
+ .long 0 # sv_handler
+ .long 0 # sv_mask
+ .long 0 # sv_onstack
+ovec:
+ .long 0 # sv_onstack
+ .long 0 # sv_mask
+ .long 0 # sv_onstack
+#endif BSD42
+args:
+ .word 0
+ .long 0
+ .long 0
+ .long 0
+ .long 0
+ .long 0
+ .long 0
+
+sigadr0:
+ .long 0 #0
+ .long sigs #1
+ .long sigs #2
+ .long sigs #3
+ .long sigs #4
+ .long sigs #5
+ .long sigs #6
+ .long sigs #7
+ .long sigs #8
+ .long sigs #9
+ .long sigs #10
+ .long sigs #11
+ .long sigs #12
+ .long sigs #13
+ .long sigs #14
+ .long sigs #15
+ .long sigs #16
+
+sigtrp0:
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2
+ .long -2