blob: 60fbcf89b9eff6ab62c8257e8f350b3e3d5fe40e [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/* vi: set sw=4 ts=4: */
2/* syscall for arm/uClibc
3 *
4 * Copyright (C) 2002 by Erik Andersen <andersen@uclibc.org>
5 *
6 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
7 */
8
9#include <features.h>
10#include <errno.h>
11#include <sys/types.h>
12#include <sys/syscall.h>
13
14
15long syscall(long sysnum, long a, long b, long c, long d, long e, long f)
16{
17#if !defined(__thumb__)
18 register long _r0 __asm__("r0")=(long)(sysnum);
19 register long _r6 __asm__("r6")=(long)(f);
20 register long _r5 __asm__("r5")=(long)(e);
21 register long _r4 __asm__("r4")=(long)(d);
22 register long _r3 __asm__("r3")=(long)(c);
23 register long _r2 __asm__("r2")=(long)(b);
24 register long _r1 __asm__("r1")=(long)(a);
25 __asm__ __volatile__(
26 "swi %1"
27 : "=r"(_r0)
28 : "i"(__NR_syscall), "r"(_r0), "r"(_r1),
29 "r"(_r2), "r"(_r3), "r"(_r4), "r"(_r5),
30 "r"(_r6)
31 : "memory");
32#else
33 register long _r7 __asm__("r7")=(long)(sysnum);
34 register long _r5 __asm__("r5")=(long)(f);
35 register long _r4 __asm__("r4")=(long)(e);
36 register long _r3 __asm__("r3")=(long)(d);
37 register long _r2 __asm__("r2")=(long)(c);
38 register long _r1 __asm__("r1")=(long)(b);
39 register long _r0 __asm__("r0")=(long)(a);
40 __asm__ __volatile__(
41 "swi 0"
42 : "=r"(_r0)
43 : "r"(_r0), "r"(_r1), "r"(_r2), "r"(_r3),
44 "r"(_r4), "r"(_r5), "r"(_r7)
45 : "memory");
46#endif
47 if(_r0 >=(unsigned long) -4095) {
48 long err = _r0;
49 (*__errno_location())=(-err);
50 _r0=(unsigned long) -1;
51 }
52 return (long) _r0;
53}