1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
/* syscall.c - generalized linux system call interface - rick sladkey */
#include <stdarg.h>
#include <syscall.h>
#include <errno.h>
#ifdef PTHREAD_KERNEL
#pragma weak machdep_syscall = __machdep_syscall
int
__machdep_syscall (int number, ...)
{
register long res asm ("%d0");
register long d1 asm ("%d1"), d2 asm ("%d2"), d3 asm ("%d3");
register long d4 asm ("%d4"), d5 asm ("%d5");
va_list args;
va_start (args, number);
d1 = va_arg (args, int);
d2 = va_arg (args, int);
d3 = va_arg (args, int);
d4 = va_arg (args, int);
d5 = va_arg (args, int);
va_end (args);
__asm__ volatile ("trap #0\n\t"
: "=g" (res)
: "0" (number), "g" (d1), "g" (d2), "g" (d3), "g" (d4),
"g" (d5)
: "%d0");
return res;
}
#else /* PTHREAD_KERNEL */
/* No weak syscall?. */
#undef _POSIX_THREADS
#ifdef _POSIX_THREADS
#pragma weak syscall
#endif
int
syscall(int number, ...)
{
long res;
register long d0 asm("%d0");
register long d1 asm("%d1"), d2 asm("%d2"), d3 asm("%d3"),
d4 asm("%d4"), d5 asm("%d5");
va_list args;
va_start(args, number);
d1 = va_arg(args, int);
d2 = va_arg(args, int);
d3 = va_arg(args, int);
d4 = va_arg(args, int);
d5 = va_arg(args, int);
va_end(args);
__asm__ volatile ("trap #0\n\t"
: "=g" (d0)
: "0" (number), "g" (d1), "g" (d2), "g" (d3), "g" (d4),
"g" (d5)
: "%d0");
res = d0;
if (res < 0) {
errno = -res;
res = -1;
}
return res;
}
#endif /* PTHREAD_KERNEL */
|