summaryrefslogtreecommitdiff
path: root/klibc/klibc/arch/alpha/include/klibc/archsys.h
blob: 16ed658987fde2308f4dfce9e2fe62d9323f63c5 (plain)
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
/*
 * arch/alpha/include/klibc/archsys.h
 *
 * Architecture-specific syscall definitions
 */

#ifndef _KLIBC_ARCHSYS_H
#define _KLIBC_ARCHSYS_H

/* Alpha has some bizarre Tru64-derived system calls which return two
   different values in $0 and $20(!), respectively.  The standard
   macros can't deal with these; even the ones that give the right
   return value have the wrong clobbers. */

#define _syscall0_dual0(type, name)                                     \
type name(void)                                                         \
{                                                                       \
        long _sc_ret, _sc_err;                                          \
        {                                                               \
                register long _sc_0 __asm__("$0");                      \
                register long _sc_19 __asm__("$19");                    \
                register long _sc_20 __asm__("$20");                    \
                                                                        \
                _sc_0 = __NR_##name;                                    \
                __asm__("callsys"                                       \
                        : "=r"(_sc_0), "=r"(_sc_19), "=r" (_sc_20)      \
                        : "0"(_sc_0)                                    \
                        : _syscall_clobbers);                           \
                _sc_ret = _sc_0, _sc_err = _sc_19; (void)(_sc_20);      \
        }                                                               \
        _syscall_return(type);                                          \
}

#define _syscall0_dual1(type, name)                                     \
type name(void)                                                         \
{                                                                       \
        long _sc_ret, _sc_err;                                          \
        {                                                               \
                register long _sc_0 __asm__("$0");                      \
                register long _sc_19 __asm__("$19");                    \
                register long _sc_20 __asm__("$20");                    \
                                                                        \
                _sc_0 = __NR_##name;                                    \
                __asm__("callsys"                                       \
                        : "=r"(_sc_0), "=r"(_sc_19), "=r" (_sc_20)      \
                        : "0"(_sc_0)                                    \
                        : _syscall_clobbers);                           \
                _sc_ret = _sc_20, _sc_err = _sc_19; (void)(_sc_0);      \
        }                                                               \
        _syscall_return(type);                                          \
}

#endif /* _KLIBC_ARCHSYS_H */