#
! $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
