354 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			354 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
 |