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

#define EINVAL 22

! 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
	bnslr

	! On error, r3 contains the errno.	
	! It just so happens that errnos 1-34 are the same in Linux as in ACK.
	cmpwi r3, 1
	blt 2f
	cmpwi r3, 34
	bgt 2f

3:
	lis r4, ha16[_errno]
	stw r3, lo16[_errno](r4)
	li r3, -1
	blr

2:
	li r3, EINVAL
	b 3b