syscall-cris.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /* syscall.c - generalized linux system call interface */
  2. #include <stdarg.h>
  3. #include <syscall.h>
  4. #include <errno.h>
  5. /* perform a Linux/CRIS system call with variable number of arguments
  6. * put them and the syscall number in the right registers and call
  7. * break 13.
  8. */
  9. int
  10. syscall(int number, ...)
  11. {
  12. register long __a __asm__ ("r10");
  13. register long __b __asm__ ("r11");
  14. register long __c __asm__ ("r12");
  15. register long __d __asm__ ("r13");
  16. register long __e __asm__ ("r0");
  17. va_list args;
  18. va_start(args, number);
  19. __a = va_arg(args, int);
  20. __b = va_arg(args, int);
  21. __c = va_arg(args, int);
  22. __d = va_arg(args, int);
  23. __e = va_arg(args, int);
  24. va_end(args);
  25. __asm__ volatile ("movu.w %1,$r9\n\tbreak 13\n\t"
  26. : "=r" (__a)
  27. : "g" (number), "0" (__a), "r" (__b), "r" (__c), "r" (__d),
  28. "r" (__e)
  29. : "r10", "r9");
  30. if (__a >= 0)
  31. return __a;
  32. errno = -__a;
  33. return -1;
  34. }