#include "system.h" #include "em_abs.h" #define MOVL movl (sp)+,(ap)+ #define MOVQ movq (sp)+,(ap)+ # $Header$ .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: clrl (ap)+ Lnores: jsb Lsyscall movl r3,ap jmp (r2) Lgetpid: clrl (ap)+ Lr0: jsb Lsyscall pushl r0 movl r3,ap jmp (r2) Lgetuid: Lgetgid: clrl (ap)+ Lr0r1: jsb Lsyscall pushl r0 pushl r1 movl r3,ap jmp (r2) Lpipe: Lwait: Lfork: clrl (ap)+ Ler0r1: jsb Lsyscall pushl r0 pushl r1 clrl -(sp) movl r3,ap 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 Lsyscall clrl -(sp) movl r3,ap 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 Lsyscall pushl r0 clrl -(sp) movl r3,ap 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 Lsyscall: movl $args,ap chmk (ap)+ bcc L1 cvtwl r0,(sp) # Push the error returned twice, cvtwl r0,-(sp) # overwrite the return address movl r3,ap 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 movl r3,ap jmp (r2) L4: clrl -(sp) movl r3,ap jmp (r2) badsig: movl $-1,(sp) pushl (sp) movl r3,ap jmp (r2) badtrp: movl sigtrp0 [r1],(sp) pushl $-1 movl r3,ap 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