2016-04-18 05:19:13 +00:00
|
|
|
#define __SYSCALL_LL_E(x) (x)
|
|
|
|
#define __SYSCALL_LL_O(x) (x)
|
|
|
|
|
|
|
|
#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
|
|
|
|
|
2019-07-17 00:31:38 +00:00
|
|
|
#define SYSCALL_CLOBBERLIST \
|
|
|
|
"$1", "$3", "$10", "$11", "$12", "$13", \
|
|
|
|
"$14", "$15", "$24", "$25", "hi", "lo", "memory"
|
|
|
|
|
2016-04-18 05:19:13 +00:00
|
|
|
static inline long __syscall0(long n)
|
|
|
|
{
|
|
|
|
register long r7 __asm__("$7");
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
register long r2 __asm__("$2") = n;
|
2016-04-18 05:19:13 +00:00
|
|
|
__asm__ __volatile__ (
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
"syscall"
|
|
|
|
: "+&r"(r2), "=r"(r7)
|
|
|
|
:
|
2019-07-17 00:31:38 +00:00
|
|
|
: SYSCALL_CLOBBERLIST);
|
2016-04-18 05:19:13 +00:00
|
|
|
return r7 ? -r2 : r2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline long __syscall1(long n, long a)
|
|
|
|
{
|
|
|
|
register long r4 __asm__("$4") = a;
|
|
|
|
register long r7 __asm__("$7");
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
register long r2 __asm__("$2") = n;
|
2016-04-18 05:19:13 +00:00
|
|
|
__asm__ __volatile__ (
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
"syscall"
|
|
|
|
: "+&r"(r2), "=r"(r7)
|
|
|
|
: "r"(r4)
|
2019-07-17 00:31:38 +00:00
|
|
|
: SYSCALL_CLOBBERLIST);
|
2016-04-18 05:19:13 +00:00
|
|
|
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");
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
register long r2 __asm__("$2") = n;
|
2016-04-18 05:19:13 +00:00
|
|
|
__asm__ __volatile__ (
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
"syscall"
|
|
|
|
: "+&r"(r2), "=r"(r7)
|
|
|
|
: "r"(r4), "r"(r5)
|
2019-07-17 00:31:38 +00:00
|
|
|
: SYSCALL_CLOBBERLIST);
|
2016-04-18 05:19:13 +00:00
|
|
|
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");
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
register long r2 __asm__("$2") = n;
|
2016-04-18 05:19:13 +00:00
|
|
|
__asm__ __volatile__ (
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
"syscall"
|
|
|
|
: "+&r"(r2), "=r"(r7)
|
|
|
|
: "r"(r4), "r"(r5), "r"(r6)
|
2019-07-17 00:31:38 +00:00
|
|
|
: SYSCALL_CLOBBERLIST);
|
2016-04-18 05:19:13 +00:00
|
|
|
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;
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
register long r2 __asm__("$2") = n;
|
2016-04-18 05:19:13 +00:00
|
|
|
__asm__ __volatile__ (
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
"syscall"
|
|
|
|
: "+&r"(r2), "+r"(r7)
|
|
|
|
: "r"(r4), "r"(r5), "r"(r6)
|
2019-07-17 00:31:38 +00:00
|
|
|
: SYSCALL_CLOBBERLIST);
|
2016-04-18 05:19:13 +00:00
|
|
|
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)
|
|
|
|
{
|
2019-04-10 23:51:47 +00:00
|
|
|
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 r8 __asm__("$8") = e;
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
register long r2 __asm__("$2") = n;
|
2019-04-10 23:51:47 +00:00
|
|
|
__asm__ __volatile__ (
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
"syscall"
|
|
|
|
: "+&r"(r2), "+r"(r7)
|
|
|
|
: "r"(r4), "r"(r5), "r"(r6), "r"(r8)
|
2019-07-17 00:31:38 +00:00
|
|
|
: SYSCALL_CLOBBERLIST);
|
2016-04-18 05:19:13 +00:00
|
|
|
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)
|
|
|
|
{
|
2019-04-10 23:51:47 +00:00
|
|
|
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 r8 __asm__("$8") = e;
|
2019-05-05 15:10:42 +00:00
|
|
|
register long r9 __asm__("$9") = f;
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
register long r2 __asm__("$2") = n;
|
2019-04-10 23:51:47 +00:00
|
|
|
__asm__ __volatile__ (
|
clean up mips64/n32 syscall asm constraints
ever since inline syscalls were added for (o32) mips in commit
328810d32524e4928fec50b57e37e1bf330b2e40, the asm has nonsensically
loaded the syscall number, rather than taking $2 as an input
constraint to let the compiler load it. commit
cfc09b1ecf0c6981494fd73dffe234416f66af10 improved on this somewhat by
allowing a constant syscall number to propagate into an immediate, but
missed that the whole operation made no sense.
now, only $4, $5, $6, $8, and $9 are potential input-only registers.
$2 is always input and output, and $7 is both when it's an argument,
otherwise output-only. previously, $7 was treated as an input (with a
"1" constraint matching its output position) even when it was not an
input, which was arguably undefined behavior (asm input from
indeterminate value). this is corrected.
2019-07-17 00:49:02 +00:00
|
|
|
"syscall"
|
|
|
|
: "+&r"(r2), "+r"(r7)
|
|
|
|
: "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9)
|
2019-07-17 00:31:38 +00:00
|
|
|
: SYSCALL_CLOBBERLIST);
|
2016-04-18 05:19:13 +00:00
|
|
|
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"
|