File: syscall.c

package info (click to toggle)
libc-sparc 5.3.12-3
  • links: PTS
  • area: main
  • in suites: potato, slink
  • size: 17,608 kB
  • ctags: 44,718
  • sloc: ansic: 163,548; asm: 5,080; makefile: 3,340; lex: 521; sh: 439; yacc: 401; awk: 28
file content (72 lines) | stat: -rw-r--r-- 1,490 bytes parent folder | download | duplicates (7)
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 */