2016-04-18 05:19:13 +00:00
|
|
|
#define __SYSCALL_LL_E(x) (x)
|
|
|
|
#define __SYSCALL_LL_O(x) (x)
|
|
|
|
|
2018-09-05 16:43:34 +00:00
|
|
|
hidden long (__syscall)(long, ...);
|
2016-04-18 05:19:13 +00:00
|
|
|
|
|
|
|
#define SYSCALL_RLIM_INFINITY (-1UL/2)
|
|
|
|
|
|
|
|
#if _MIPSEL || __MIPSEL || __MIPSEL__
|
|
|
|
#define __stat_fix(st) ((st),(void)0)
|
|
|
|
#else
|
|
|
|
#include <sys/stat.h>
|
|
|
|
static inline void __stat_fix(long p)
|
|
|
|
{
|
|
|
|
struct stat *st = (struct stat *)p;
|
|
|
|
st->st_dev >>= 32;
|
|
|
|
st->st_rdev >>= 32;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static inline long __syscall0(long n)
|
|
|
|
{
|
|
|
|
register long r7 __asm__("$7");
|
|
|
|
register long r2 __asm__("$2");
|
|
|
|
__asm__ __volatile__ (
|
|
|
|
"addu $2,$0,%2 ; syscall"
|
|
|
|
: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7)
|
|
|
|
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
|
|
|
|
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
|
|
|
|
return r7 ? -r2 : r2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline long __syscall1(long n, long a)
|
|
|
|
{
|
|
|
|
register long r4 __asm__("$4") = a;
|
|
|
|
register long r7 __asm__("$7");
|
|
|
|
register long r2 __asm__("$2");
|
|
|
|
__asm__ __volatile__ (
|
|
|
|
"addu $2,$0,%2 ; syscall"
|
|
|
|
: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
|
|
|
|
"r"(r4)
|
|
|
|
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
|
|
|
|
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
|
|
|
|
return r7 ? -r2 : r2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline long __syscall2(long n, long a, long b)
|
|
|
|
{
|
|
|
|
register long r4 __asm__("$4") = a;
|
|
|
|
register long r5 __asm__("$5") = b;
|
|
|
|
register long r7 __asm__("$7");
|
|
|
|
register long r2 __asm__("$2");
|
|
|
|
__asm__ __volatile__ (
|
|
|
|
"addu $2,$0,%2 ; syscall"
|
|
|
|
: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
|
|
|
|
"r"(r4), "r"(r5)
|
|
|
|
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
|
|
|
|
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
|
|
|
|
if (r7) return -r2;
|
|
|
|
long ret = r2;
|
|
|
|
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline long __syscall3(long n, long a, long b, long c)
|
|
|
|
{
|
|
|
|
register long r4 __asm__("$4") = a;
|
|
|
|
register long r5 __asm__("$5") = b;
|
|
|
|
register long r6 __asm__("$6") = c;
|
|
|
|
register long r7 __asm__("$7");
|
|
|
|
register long r2 __asm__("$2");
|
|
|
|
__asm__ __volatile__ (
|
|
|
|
"addu $2,$0,%2 ; syscall"
|
|
|
|
: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
|
|
|
|
"r"(r4), "r"(r5), "r"(r6)
|
|
|
|
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
|
|
|
|
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
|
|
|
|
if (r7) return -r2;
|
|
|
|
long ret = r2;
|
|
|
|
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline long __syscall4(long n, long a, long b, long c, long d)
|
|
|
|
{
|
|
|
|
register long r4 __asm__("$4") = a;
|
|
|
|
register long r5 __asm__("$5") = b;
|
|
|
|
register long r6 __asm__("$6") = c;
|
|
|
|
register long r7 __asm__("$7") = d;
|
|
|
|
register long r2 __asm__("$2");
|
|
|
|
__asm__ __volatile__ (
|
|
|
|
"addu $2,$0,%2 ; syscall"
|
|
|
|
: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
|
|
|
|
"r"(r4), "r"(r5), "r"(r6)
|
|
|
|
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
|
|
|
|
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
|
|
|
|
if (r7) return -r2;
|
|
|
|
long ret = r2;
|
|
|
|
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
|
make syscall.h consistent with linux
most of the found naming differences don't matter to musl, because
internally it unifies the syscall names that vary across targets,
but for external code the names should match the kernel uapi.
aarch64:
__NR_fstatat is called __NR_newfstatat in linux.
__NR_or1k_atomic got mistakenly copied from or1k.
arm:
__NR_arm_sync_file_range is an alias for __NR_sync_file_range2
__NR_fadvise64_64 is called __NR_arm_fadvise64_64 in linux,
the old non-arm name is kept too, it should not cause issues.
(powerpc has similar nonstandard fadvise and it uses the
normal name.)
i386:
__NR_madvise1 was removed from linux in commit
303395ac3bf3e2cb488435537d416bc840438fcb 2011-11-11
microblaze:
__NR_fadvise, __NR_fstatat, __NR_pread, __NR_pwrite
had different name in linux.
mips:
__NR_fadvise, __NR_fstatat, __NR_pread, __NR_pwrite, __NR_select
had different name in linux.
mipsn32:
__NR_fstatat is called __NR_newfstatat in linux.
or1k:
__NR__llseek is called __NR_llseek in linux.
the old name is kept too because that's the name musl uses
internally.
powerpc:
__NR_{get,set}res{gid,uid}32 was never present in powerpc linux.
__NR_timerfd was briefly defined in linux but then got renamed.
2017-02-18 00:50:09 +00:00
|
|
|
if (n == SYS_newfstatat) __stat_fix(c);
|
2016-04-18 05:19:13 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline long __syscall5(long n, long a, long b, long c, long d, long e)
|
|
|
|
{
|
|
|
|
long r2 = (__syscall)(n, a, b, c, d, e);
|
|
|
|
if (r2 > -4096UL) return r2;
|
|
|
|
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
|
make syscall.h consistent with linux
most of the found naming differences don't matter to musl, because
internally it unifies the syscall names that vary across targets,
but for external code the names should match the kernel uapi.
aarch64:
__NR_fstatat is called __NR_newfstatat in linux.
__NR_or1k_atomic got mistakenly copied from or1k.
arm:
__NR_arm_sync_file_range is an alias for __NR_sync_file_range2
__NR_fadvise64_64 is called __NR_arm_fadvise64_64 in linux,
the old non-arm name is kept too, it should not cause issues.
(powerpc has similar nonstandard fadvise and it uses the
normal name.)
i386:
__NR_madvise1 was removed from linux in commit
303395ac3bf3e2cb488435537d416bc840438fcb 2011-11-11
microblaze:
__NR_fadvise, __NR_fstatat, __NR_pread, __NR_pwrite
had different name in linux.
mips:
__NR_fadvise, __NR_fstatat, __NR_pread, __NR_pwrite, __NR_select
had different name in linux.
mipsn32:
__NR_fstatat is called __NR_newfstatat in linux.
or1k:
__NR__llseek is called __NR_llseek in linux.
the old name is kept too because that's the name musl uses
internally.
powerpc:
__NR_{get,set}res{gid,uid}32 was never present in powerpc linux.
__NR_timerfd was briefly defined in linux but then got renamed.
2017-02-18 00:50:09 +00:00
|
|
|
if (n == SYS_newfstatat) __stat_fix(c);
|
2016-04-18 05:19:13 +00:00
|
|
|
return r2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
|
|
|
|
{
|
|
|
|
long r2 = (__syscall)(n, a, b, c, d, e, f);
|
|
|
|
if (r2 > -4096UL) return r2;
|
|
|
|
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
|
make syscall.h consistent with linux
most of the found naming differences don't matter to musl, because
internally it unifies the syscall names that vary across targets,
but for external code the names should match the kernel uapi.
aarch64:
__NR_fstatat is called __NR_newfstatat in linux.
__NR_or1k_atomic got mistakenly copied from or1k.
arm:
__NR_arm_sync_file_range is an alias for __NR_sync_file_range2
__NR_fadvise64_64 is called __NR_arm_fadvise64_64 in linux,
the old non-arm name is kept too, it should not cause issues.
(powerpc has similar nonstandard fadvise and it uses the
normal name.)
i386:
__NR_madvise1 was removed from linux in commit
303395ac3bf3e2cb488435537d416bc840438fcb 2011-11-11
microblaze:
__NR_fadvise, __NR_fstatat, __NR_pread, __NR_pwrite
had different name in linux.
mips:
__NR_fadvise, __NR_fstatat, __NR_pread, __NR_pwrite, __NR_select
had different name in linux.
mipsn32:
__NR_fstatat is called __NR_newfstatat in linux.
or1k:
__NR__llseek is called __NR_llseek in linux.
the old name is kept too because that's the name musl uses
internally.
powerpc:
__NR_{get,set}res{gid,uid}32 was never present in powerpc linux.
__NR_timerfd was briefly defined in linux but then got renamed.
2017-02-18 00:50:09 +00:00
|
|
|
if (n == SYS_newfstatat) __stat_fix(c);
|
2016-04-18 05:19:13 +00:00
|
|
|
return r2;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define VDSO_USEFUL
|
|
|
|
#define VDSO_CGT_SYM "__vdso_clock_gettime"
|
|
|
|
#define VDSO_CGT_VER "LINUX_2.6"
|