33c81637db
vi jmp (r0).
355 lines
5.5 KiB
ArmAsm
355 lines
5.5 KiB
ArmAsm
#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
|