blob: 143fc04ca45dc473dbdc5b3fd7aa33c4f6bfe2cb [file] [log] [blame]
#define __SYSCALL_LL_E(x) (x)
#define __SYSCALL_LL_O(x) (x)
#define __scc(X) \
sizeof(1 ? (X) : 0ULL) < 8 ? (unsigned long)(X) : (long long)(X)
typedef long long syscall_arg_t;
struct __timespec {
long long tv_sec;
long tv_nsec;
};
struct __timespec_kernel {
long long tv_sec;
long long tv_nsec;
};
#define __tsc(X) ((struct __timespec*)(unsigned long)(X))
#define __fixup(X) \
do { \
if (X) { \
ts->tv_sec = __tsc(X)->tv_sec; \
ts->tv_nsec = __tsc(X)->tv_nsec; \
(X) = (unsigned long)ts; \
} \
} while (0)
#define __fixup_case_2 \
case SYS_nanosleep: \
__fixup(a1); \
break; \
case SYS_clock_settime: \
__fixup(a2); \
break;
#define __fixup_case_3 \
case SYS_clock_nanosleep: \
case SYS_rt_sigtimedwait: \
case SYS_ppoll: \
__fixup(a3); \
break; \
case SYS_utimensat: \
if (a3) { \
ts[0].tv_sec = __tsc(a3)[0].tv_sec; \
ts[0].tv_nsec = __tsc(a3)[0].tv_nsec; \
ts[1].tv_sec = __tsc(a3)[1].tv_sec; \
ts[1].tv_nsec = __tsc(a3)[1].tv_nsec; \
a3 = (unsigned long)ts; \
} \
break;
#define __fixup_case_4 \
case SYS_futex: \
if ((a2 & (~128 /* FUTEX_PRIVATE_FLAG */)) == 0 /* FUTEX_WAIT */) \
__fixup(a4); \
break;
#define __fixup_case_5 \
case SYS_mq_timedsend: \
case SYS_mq_timedreceive: \
case SYS_pselect6: \
__fixup(a5); \
break;
static __inline long __syscall0(long long n) {
unsigned long ret;
__asm__ __volatile__("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory");
return ret;
}
static __inline long __syscall1(long long n, long long a1) {
unsigned long ret;
__asm__ __volatile__("syscall"
: "=a"(ret)
: "a"(n), "D"(a1)
: "rcx", "r11", "memory");
return ret;
}
static __inline long __syscall2(long long n, long long a1, long long a2) {
unsigned long ret;
struct __timespec_kernel ts[1];
switch (n) { __fixup_case_2; }
__asm__ __volatile__("syscall"
: "=a"(ret)
: "a"(n), "D"(a1), "S"(a2)
: "rcx", "r11", "memory");
return ret;
}
static __inline long __syscall3(long long n,
long long a1,
long long a2,
long long a3) {
unsigned long ret;
struct __timespec_kernel ts[2];
switch (n) {
__fixup_case_2;
__fixup_case_3;
}
__asm__ __volatile__("syscall"
: "=a"(ret)
: "a"(n), "D"(a1), "S"(a2), "d"(a3)
: "rcx", "r11", "memory");
return ret;
}
static __inline long __syscall4(long long n,
long long a1,
long long a2,
long long a3,
long long a4_) {
unsigned long ret;
register long long a4 __asm__("r10") = a4_;
struct __timespec_kernel ts[2];
switch (n) {
__fixup_case_2;
__fixup_case_3;
__fixup_case_4;
}
__asm__ __volatile__("syscall"
: "=a"(ret)
: "a"(n), "D"(a1), "S"(a2), "d"(a3), "r"(a4)
: "rcx", "r11", "memory");
return ret;
}
static __inline long __syscall5(long long n,
long long a1,
long long a2,
long long a3,
long long a4_,
long long a5_) {
unsigned long ret;
register long long a4 __asm__("r10") = a4_;
register long long a5 __asm__("r8") = a5_;
struct __timespec_kernel ts[2];
switch (n) {
__fixup_case_2;
__fixup_case_3;
__fixup_case_4;
__fixup_case_5;
}
__asm__ __volatile__("syscall"
: "=a"(ret)
: "a"(n), "D"(a1), "S"(a2), "d"(a3), "r"(a4), "r"(a5)
: "rcx", "r11", "memory");
return ret;
}
static __inline long __syscall6(long long n,
long long a1,
long long a2,
long long a3,
long long a4_,
long long a5_,
long long a6_) {
unsigned long ret;
register long long a4 __asm__("r10") = a4_;
register long long a5 __asm__("r8") = a5_;
register long long a6 __asm__("r9") = a6_;
struct __timespec_kernel ts[2];
switch (n) {
__fixup_case_2;
__fixup_case_3;
__fixup_case_4;
__fixup_case_5;
}
__asm__ __volatile__("syscall"
: "=a"(ret)
: "a"(n), "D"(a1), "S"(a2), "d"(a3), "r"(a4), "r"(a5),
"r"(a6)
: "rcx", "r11", "memory");
return ret;
}