53 lines
		
	
	
	
		
			802 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			802 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
#
 | 
						|
! $Source: /cvsroot/tack/Ack/plat/linux386/libsys/_syscall.s,v $
 | 
						|
! $State: Exp $
 | 
						|
! $Revision: 1.1 $
 | 
						|
 | 
						|
! Declare segments (the order is important).
 | 
						|
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
 | 
						|
.sect .text
 | 
						|
 | 
						|
EINVAL = 22
 | 
						|
 | 
						|
#define IFFALSE 4
 | 
						|
#define IFTRUE 12
 | 
						|
#define ALWAYS 20
 | 
						|
 | 
						|
#define LT 0
 | 
						|
#define GT 1
 | 
						|
#define EQ 2
 | 
						|
#define OV 3
 | 
						|
	
 | 
						|
! Perform a Linux system call.
 | 
						|
 | 
						|
.define __syscall
 | 
						|
__syscall:
 | 
						|
	lwz r0, 0(sp)
 | 
						|
	lwz r3, 4(sp)
 | 
						|
	lwz r4, 8(sp)
 | 
						|
	lwz r5, 12(sp)
 | 
						|
	sc 0
 | 
						|
	bclr IFFALSE, OV, 0
 | 
						|
	
 | 
						|
	! On error, r3 contains the errno.	
 | 
						|
	! It just so happens that errnos 1-34 are the same in Linux as in ACK.
 | 
						|
	cmpi cr0, 0, r3, 1
 | 
						|
	bc IFTRUE, LT, 2f
 | 
						|
	cmpi cr0, 0, r3, 34
 | 
						|
	bc IFTRUE, GT, 2f
 | 
						|
	
 | 
						|
3:
 | 
						|
	addis r4, r0, <_errno
 | 
						|
	ori r4, r4, >_errno
 | 
						|
	stw r3, 0(r4)
 | 
						|
	addi r3, r0, -1
 | 
						|
	bclr ALWAYS, 0, 0
 | 
						|
	
 | 
						|
2:
 | 
						|
	addi r3, r0, EINVAL
 | 
						|
	b 3b
 |