/******************************************************************************
 * Copyright (c) 2004, 2008 IBM Corporation
 * All rights reserved.
 * This program and the accompanying materials
 * are made available under the terms of the BSD License
 * which accompanies this distribution, and is available at
 * http://www.opensource.org/licenses/bsd-license.php
 *
 * Contributors:
 *     IBM Corporation - initial implementation
 *****************************************************************************/


#ifndef SYSTEMCALL_H
#define SYSTEMCALL_H

static inline int
syscall (int nr)
{
    register unsigned long r0 asm("r0") = nr;
    register unsigned long r3 asm("r3");
    asm volatile ("sc" : "=r" (r3) 
                       : "r" (r0));
    return r3;
} 

static inline long
syscall_1 (int nr, long arg0)
{
    register unsigned long r0 asm("r0") = nr;
    register unsigned long r3 asm("r3") = arg0;
    asm volatile ("sc" : "=r" (r3) 
                       : "0" (r3), "r" (r0));
    return r3;
} 

static inline long
syscall_2 (int nr, long arg0, long arg1)
{
    register unsigned long r0 asm("r0") = nr;
    register unsigned long r3 asm("r3") = arg0;
    register unsigned long r4 asm("r4") = arg1;
    asm volatile ("sc" : "=r" (r3) 
		       : "0" (r3), "r" (r4), "r" (r0)); 
    return r3;
} 

static inline long
syscall_3 (int nr, long arg0, long arg1, long arg2)
{
    register unsigned long r0 asm("r0") = nr;
    register unsigned long r3 asm("r3") = arg0;
    register unsigned long r4 asm("r4") = arg1;
    register unsigned long r5 asm("r5") = arg2;
    asm volatile ("sc" : "=r" (r3) 
		       : "0" (r3), "r" (r4), "r" (r5), "r" (r0)); 
    return r3;
} 

static inline long
syscall_4 (int nr, long arg0, long arg1, long arg2, long arg3)
{
    register unsigned long r0 asm("r0") = nr;
    register unsigned long r3 asm("r3") = arg0;
    register unsigned long r4 asm("r4") = arg1;
    register unsigned long r5 asm("r5") = arg2;
    register unsigned long r6 asm("r6") = arg3;
    asm volatile ("sc" : "=r" (r3) 
		       : "0" (r3), "r" (r4), "r" (r5), "r" (r6), "r" (r0)); 
    return r3;
} 

static inline long
syscall_5 (int nr, long arg0, long arg1, long arg2, long arg3, 
	   long arg4)
{
    register unsigned long r0 asm("r0") = nr;
    register unsigned long r3 asm("r3") = arg0;
    register unsigned long r4 asm("r4") = arg1;
    register unsigned long r5 asm("r5") = arg2;
    register unsigned long r6 asm("r6") = arg3;
    register unsigned long r7 asm("r7") = arg4;
    asm volatile ("sc" : "=r" (r3) 
		       : "0" (r3), "r" (r4), "r" (r5), 
		         "r" (r6), "r" (r7), "r" (r0)); 
    return r3;
} 

static inline long
syscall_6 (int nr, long arg0, long arg1, long arg2, long arg3, 
	   long arg4, long arg5)
{
    register unsigned long r0 asm("r0") = nr;
    register unsigned long r3 asm("r3") = arg0;
    register unsigned long r4 asm("r4") = arg1;
    register unsigned long r5 asm("r5") = arg2;
    register unsigned long r6 asm("r6") = arg3;
    register unsigned long r7 asm("r7") = arg4;
    register unsigned long r8 asm("r8") = arg5;
    asm volatile ("sc" : "=r" (r3) 
		       : "0" (r3), "r" (r4), "r" (r5), 
		         "r" (r6), "r" (r7), "r" (r8), "r" (r0)); 
    return r3;
} 

static inline long
syscall_7 (int nr, long arg0, long arg1, long arg2, long arg3, 
	   long arg4, long arg5, long arg6)
{
    register unsigned long r0 asm("r0") = nr;
    register unsigned long r3 asm("r3") = arg0;
    register unsigned long r4 asm("r4") = arg1;
    register unsigned long r5 asm("r5") = arg2;
    register unsigned long r6 asm("r6") = arg3;
    register unsigned long r7 asm("r7") = arg4;
    register unsigned long r8 asm("r8") = arg5;
    register unsigned long r9 asm("r9") = arg6;
    asm volatile ("sc" : "=r" (r3) 
		       : "0" (r3), "r" (r4), "r" (r5), 
		         "r" (r6), "r" (r7), "r" (r8), 
		         "r" (r9), "r" (r0)); 
    return r3;
} 


#define _exit_sc_nr 1
#define _read_sc_nr 2
#define _write_sc_nr 3
#define _open_sc_nr 4
#define _close_sc_nr 5
#define _getpid_sc_nr 6
#define _brk_sc_nr 7
#define _ioctl_sc_nr 8
#define _socket_sc_nr 9
#define _wait4_sc_nr 10
#define _sigreturn_sc_nr 11
#define _rt_sigaction_sc_nr 12
#define _lseek_sc_nr 13

#define _sock_sc_nr 1
#define _sendto_sc_nr 2
#define _send_sc_nr 3
#define _recv_sc_nr 4


//typedef unsigned long size_t; 

#endif
