Milán Major

netscape-revival

1 branch
Code

nspr/src/os_SINIX-N.s

/* We want position independent code */
#define PIC

#include <sys/asm.h>
#include <sys/regdef.h>
#include <sys/syscall.h>

	.file 1 "os_SINIX-N.s"
	.option	pic2
	.text

/*
** Stub for garbage collectors. Save "saved" registers into memory pointed
** at by a0. The registers are being saved into the "gregs" portion of the
** uc_mcontext structure defined in <sys/ucontext.h>.
** cmk: is the gregs part to be reused? s0-s8 are not continuous
**      in gregs!! s0-s7 -> r16-r23, but s8 -> r30 !!!
*/
LEAF(_MD_SaveSRegs)
	sw	s0,0(a0)
	sw	s1,4(a0)
	sw	s2,8(a0)
	sw	s3,12(a0)
	sw	s4,16(a0)
	sw	s5,20(a0)
	sw	s6,24(a0)
	sw	s7,28(a0)
	sw	s8,32(a0)
	jr	ra
	END(_MD_SaveSRegs)

/************************************************************************/

/*
** Thread safe versions of blocking system calls. These are wrapped up in
** C code to keep the NSPR threads from blocking each other by doing
** blocking system calls. They also return a negative version of errno
** when an error occurs so that we don't have a non-thread-safe errno.
*/

#define OS_SYS_CALL(n)	    \
	.set	noreorder;  \
			    \
	li	v0,SYS_##n; \
	syscall;	    \
	beq	a3,zero,9f; \
	nop;		    \
	neg	v0;	    \
			    \
9:	j	ra;	    \
	nop;		    \
			    \
	.set	reorder

#if 0
LEAF(_OS_SELECT)
	OS_SYS_CALL(select)
	END(_OS_SELECT)

LEAF(_OS_CONNECT)
	OS_SYS_CALL(connect)
	END(_OS_CONNECT)
#endif

LEAF(_OS_OPEN)
	OS_SYS_CALL(open)
	END(_OS_OPEN)

LEAF(_OS_CLOSE)
	OS_SYS_CALL(close)
	END(_OS_CLOSE)

LEAF(_OS_FCNTL)
	OS_SYS_CALL(fcntl)
	END(_OS_FCNTL)

LEAF(_OS_IOCTL)
	OS_SYS_CALL(ioctl)
	END(_OS_IOCTL)

#if 0
LEAF(_OS_SOCKET)
	OS_SYS_CALL(socket)
	END(_OS_SOCKET)
#endif

/* Data reception calls */

LEAF(_OS_READ)
	OS_SYS_CALL(read)
	END(_OS_READ)

#if 0
LEAF(_OS_RECV)
	OS_SYS_CALL(recv)
	END(_OS_RECV)

LEAF(_OS_RECVFROM)
	OS_SYS_CALL(recvfrom)
	END(_OS_RECVFROM)

LEAF(_OS_RECVMSG)
	OS_SYS_CALL(recvmsg)
	END(_OS_RECVMSG)

LEAF(_OS_READV)
	OS_SYS_CALL(readv)
	END(_OS_READV)

/* Data transmission calls */

LEAF(_OS_SEND)
	OS_SYS_CALL(send)
	END(_OS_SEND)

LEAF(_OS_SENDTO)
	OS_SYS_CALL(sendto)
	END(_OS_SENDTO)

LEAF(_OS_SENDMSG)
	OS_SYS_CALL(sendmsg)
	END(_OS_SENDMSG)
#endif

LEAF(_OS_WRITE)
	OS_SYS_CALL(write)
	END(_OS_WRITE)

#if 0
LEAF(_OS_WRITEV)
	OS_SYS_CALL(writev)
	END(_OS_WRITEV)
#endif

/* Stream calls */

LEAF(_OS_GETMSG)
	OS_SYS_CALL(getmsg)
	END(_OS_GETMSG)

LEAF(_OS_PUTMSG)
	OS_SYS_CALL(putmsg)
	END(_OS_PUTMSG)

LEAF(_OS_POLL)
	OS_SYS_CALL(poll)
	END(_OS_POLL)