Milán Major

netscape-revival

1 branch
Code

nspr-/src/os_Linux.S

/* Semi-ripped-off of mips.h */

#include <sys/syscall.h>

#ifdef __ELF__
  /* With ELF, external symbols are not preceeded by underscore.  --jwz. */
# define __OS_CONNECT _OS_CONNECT
# define __OS_RECV    _OS_RECV
# define __OS_SELECT  _OS_SELECT
# define __OS_SEND    _OS_SEND
# define __OS_SOCKET  _OS_SOCKET
#endif /* __ELF__ */

#if 0
#define LINUX_SYS_CALL(name, sysname, args) \
    .globl __OS_##name##;		    \
    .align 4;				    \
  __OS_##name##:			    \
    pushl %ebp;				    \
    movl %esp,%ebp;			    \
    PUSH_##args				    \
    movl $(SYS_##sysname), %eax;	    \
    MOVE_##args				    \
    int $0x80;				    \
    POP_##args				    \
    movl %ebp,%esp;			    \
    popl %ebp;				    \
    ret;

#define PUSH_0	/* No arguments to push.  */
#define PUSH_1	pushl %ebx;
#define PUSH_2	PUSH_1
#define PUSH_3	PUSH_1
#define PUSH_4	pushl %esi; PUSH_3
#define PUSH_5	pushl %edi; PUSH_4

#define MOVE_0  /* No arguments to move.  */
#define MOVE_1  movl 8(%ebp),%ebx;
#define MOVE_2  MOVE_1 movl 12(%ebp),%ecx;
#define MOVE_3  MOVE_2 movl 16(%ebp),%edx;
#define MOVE_4  MOVE_3 movl 20(%ebp),%esi;
#define MOVE_5  MOVE_4 movl 24(%ebp),%edi;

#define POP_0	/* No arguments to pop.  */
#define POP_1	popl %ebx;
#define POP_2	POP_1
#define POP_3	POP_1
#define POP_4	POP_3 popl %esi;
#define POP_5	POP_4 popl %edi;

LINUX_SYS_CALL(OPEN, open, 3)

LINUX_SYS_CALL(CLOSE, close, 1)

LINUX_SYS_CALL(READ, read, 3)

LINUX_SYS_CALL(WRITE, write, 3)

LINUX_SYS_CALL(FCNTL, fcntl, 3)
#endif

/* From /usr/include/linux/net.h */
#define SYS_SOCKET      1               /* sys_socket(2)                */
#define SYS_BIND        2               /* sys_bind(2)                  */
#define SYS_CONNECT     3               /* sys_connect(2)               */
#define SYS_LISTEN      4               /* sys_listen(2)                */
#define SYS_ACCEPT      5               /* sys_accept(2)                */
#define SYS_GETSOCKNAME 6               /* sys_getsockname(2)           */
#define SYS_GETPEERNAME 7               /* sys_getpeername(2)           */
#define SYS_SOCKETPAIR  8               /* sys_socketpair(2)            */
#define SYS_SEND        9               /* sys_send(2)                  */
#define SYS_RECV        10              /* sys_recv(2)                  */
#define SYS_SENDTO      11              /* sys_sendto(2)                */
#define SYS_RECVFROM    12              /* sys_recvfrom(2)              */
#define SYS_SHUTDOWN    13              /* sys_shutdown(2)              */
#define SYS_SETSOCKOPT  14              /* sys_setsockopt(2)            */
#define SYS_GETSOCKOPT  15              /* sys_getsockopt(2)            */

	.globl	__OS_SEND
	.align	4
__OS_SEND:
	pushl  %ebp
	movl   %esp,%ebp
	subl   $0x10,%esp
	pushl  %ebx
	movl   0xc(%ebp),%edx
	movl   0x10(%ebp),%ecx
	movl   0x14(%ebp),%ebx
	movl   %ebx,0xfffffffc(%ebp)
	movl   0x8(%ebp),%eax
	movl   %eax,0xfffffff0(%ebp)
	movl   %edx,0xfffffff4(%ebp)
	movl   %ecx,0xfffffff8(%ebp)
	movl   $(SYS_SEND),%edx
	leal   0xfffffff0(%ebp),%ecx
	movl   $(SYS_socketcall),%eax
	movl   %edx,%ebx
	int    $0x80
	movl   0xffffffec(%ebp),%ebx
	movl   %ebp,%esp
	popl   %ebp
	ret    

	.globl	__OS_RECV
	.align	4
__OS_RECV:
	pushl  %ebp
	movl   %esp,%ebp
	subl   $0x10,%esp
	pushl  %ebx
	movl   0xc(%ebp),%edx
	movl   0x10(%ebp),%ecx
	movl   0x14(%ebp),%ebx
	movl   %ebx,0xfffffffc(%ebp)
	movl   0x8(%ebp),%eax
	movl   %eax,0xfffffff0(%ebp)
	movl   %edx,0xfffffff4(%ebp)
	movl   %ecx,0xfffffff8(%ebp)
	movl   $(SYS_RECV),%edx
	leal   0xfffffff0(%ebp),%ecx
	movl   $(SYS_socketcall),%eax
	movl   %edx,%ebx
	int    $0x80
	movl   0xffffffec(%ebp),%ebx
	movl   %ebp,%esp
	popl   %ebp
	ret    

	.globl	__OS_SELECT
	.align	4
__OS_SELECT:
	pushl  %ebp
	movl   %esp,%ebp
	pushl  %ebx
	movl   $(SYS_select),%eax
	leal   0x8(%ebp),%ebx
	int    $0x80
	movl   0xfffffffc(%ebp),%ebx
	movl   %ebp,%esp
	popl   %ebp
	ret    

	.globl	__OS_CONNECT
	.align	4
__OS_CONNECT:
	pushl  %ebp
	movl   %esp,%ebp
	subl   $0xc,%esp
	pushl  %ebx
	movl   0xc(%ebp),%edx
	movl   0x10(%ebp),%ecx
	movl   0x8(%ebp),%ebx
	movl   %ebx,0xfffffff4(%ebp)
	movl   %edx,0xfffffff8(%ebp)
	movl   %ecx,0xfffffffc(%ebp)
	movl   $(SYS_CONNECT),%edx
	leal   0xfffffff4(%ebp),%ecx
	movl   $(SYS_socketcall),%eax
	movl   %edx,%ebx
	int    $0x80
	movl   0xfffffff0(%ebp),%ebx
	movl   %ebp,%esp
	popl   %ebp
	ret    

	.globl	__OS_SOCKET
	.align	4
__OS_SOCKET:
	pushl  %ebp
	movl   %esp,%ebp
	subl   $0xc,%esp
	pushl  %ebx
	movl   0xc(%ebp),%edx
	movl   0x10(%ebp),%ecx
	movl   0x8(%ebp),%ebx
	movl   %ebx,0xfffffff4(%ebp)
	movl   %edx,0xfffffff8(%ebp)
	movl   %ecx,0xfffffffc(%ebp)
	movl   $(SYS_SOCKET),%edx
	leal   0xfffffff4(%ebp),%ecx
	movl   $(SYS_socketcall),%eax
	movl   %edx,%ebx
	int    $0x80
	movl   0xfffffff0(%ebp),%ebx
	movl   %ebp,%esp
	popl   %ebp
	ret