#ifndef SVC_H
#define SVC_H
#include <asm/unistd.h>
#include <sys/syscall.h>

static inline long
svc0(int num)
{
  register int _num asm("1") = num;
  register long ret asm("2");

  asm volatile(	"svc 0\n"
		:"=d"(ret)
		: "d" (_num)
		: "cc", "memory");
  return ret;
}

static inline long
svc1(int num, unsigned long arg1)
{
  register int _num asm("1") = num;
  register long ret asm("2");
  register unsigned long _arg1 asm("2") = arg1;

  asm volatile(	"svc 0\n"
		:"=d"(ret)
		: "d" (_num), "d" (_arg1)
		: "cc", "memory");
  return ret;
}

static inline long
svc2(int num, unsigned long arg1, unsigned long arg2)
{
  register int _num asm("1") = num;
  register long ret asm("2");
  register unsigned long _arg1 asm("2") = arg1;
  register unsigned long _arg2 asm("3") = arg2;

  asm volatile(	"svc 0\n"
		:"=d"(ret)
		: "d" (_num), "d" (_arg1), "d" (_arg2)
		: "cc", "memory");
  return ret;
}


static inline long
svc3(int num, unsigned long arg1, unsigned long arg2, unsigned long arg3)
{
  register int _num asm("1") = num;
  register long ret asm("2");
  register unsigned long _arg1 asm("2") = arg1;
  register unsigned long _arg2 asm("3") = arg2;
  register unsigned long _arg3 asm("4") = arg3;

  asm volatile(	"svc 0\n"
		:"=d"(ret)
		: "d" (_num), "d" (_arg1), "d" (_arg2), "d" (_arg3)
		: "cc", "memory");
  return ret;
}



static inline long
svc4(int num, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4)
{
  register int _num asm("1") = num;
  register long ret asm("2");
  register unsigned long _arg1 asm("2") = arg1;
  register unsigned long _arg2 asm("3") = arg2;
  register unsigned long _arg3 asm("4") = arg3;
  register unsigned long _arg4 asm("5") = arg4;

  asm volatile(	"svc 0\n"
		:"=d"(ret)
		: "d" (_num), "d" (_arg1), "d" (_arg2), "d" (_arg3), "d" (_arg4)
		: "cc", "memory");
  return ret;
}



static inline long
svc5(int num, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4,
	unsigned long arg5)
{
  register int _num asm("1") = num;
  register long ret asm("2");
  register unsigned long _arg1 asm("2") = arg1;
  register unsigned long _arg2 asm("3") = arg2;
  register unsigned long _arg3 asm("4") = arg3;
  register unsigned long _arg4 asm("5") = arg4;
  register unsigned long _arg5 asm("6") = arg5;

  asm volatile(	"svc 0\n"
		:"=d"(ret)
		: "d" (_num), "d" (_arg1), "d" (_arg2), "d" (_arg3), "d" (_arg4), "d" (_arg5)
		: "cc", "memory");
  return ret;
}

#endif /* SVC_H */