#
! $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
	
! Perform a Linux system call.

.define __syscall
__syscall:
	move.l (4, sp), d0
	move.l (8, sp), d1
	move.l (12, sp), d2
	move.l (16, sp), d3
	trap #0
	
	tst.l d0
	bmi 1f
	rts
	
1:
	neg.l d0
	! It just so happens that errnos 1-34 are the same in Linux as in ACK.
	cmp.l #1, d0
	blt 2f
	cmp.l #34, d0
	bgt 2f
	move.l d0, (_errno)
3:
	move.l #-1, d0
	rts
	
2:
	move.l #EINVAL, (_errno)
	bra 3b