mirror of
git://git.musl-libc.org/musl
synced 2025-01-09 16:19:50 +00:00
f56d57f8a7
the definition of the IPC_64 macro controls the interface between libc and the kernel through syscalls; it's not a public API. the meaning is rather obscure. long ago, Linux's sysvipc *id_ds structures used 16-bit uids/gids and wrong types for a few other fields. this was in the libc5 era, before glibc. the IPC_64 flag (64 is a misnomer; it's more like 32) tells the kernel to use the modern[-ish] versions of the structures. the definition of IPC_64 has nothing to do with whether the arch is 32- or 64-bit. rather, due to either historical accident or intentional obnoxiousness, the kernel only accepts and masks off the 0x100 IPC_64 flag conditional on CONFIG_ARCH_WANT_IPC_PARSE_VERSION, i.e. for archs that want to provide, or that accidentally provided, both. for archs which don't define this option, no masking is performed and commands with the 0x100 bit set will fail as invalid. so ultimately, the definition is just a matter of matching an arbitrary switch defined per-arch in the kernel.
116 lines
3.6 KiB
C
116 lines
3.6 KiB
C
#define __SYSCALL_LL_E(x) \
|
|
((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
|
|
((union { long long ll; long l[2]; }){ .ll = x }).l[1]
|
|
#define __SYSCALL_LL_O(x) __SYSCALL_LL_E((x))
|
|
|
|
#define SYSCALL_MMAP2_UNIT 8192ULL
|
|
|
|
static __inline long __syscall0(long n)
|
|
{
|
|
register unsigned long r11 __asm__("r11") = n;
|
|
__asm__ __volatile__ ("l.sys 1"
|
|
: "=r"(r11)
|
|
: "r"(r11)
|
|
: "memory", "r3", "r4", "r5", "r6", "r7", "r8",
|
|
"r12", "r13", "r15", "r17", "r19", "r21",
|
|
"r23", "r25", "r27", "r29", "r31");
|
|
return r11;
|
|
}
|
|
|
|
static inline long __syscall1(long n, long a)
|
|
{
|
|
register unsigned long r11 __asm__("r11") = n;
|
|
register unsigned long r3 __asm__("r3") = a;
|
|
__asm__ __volatile__ ("l.sys 1"
|
|
: "=r"(r11)
|
|
: "r"(r11), "r"(r3)
|
|
: "memory", "r4", "r5", "r6", "r7", "r8",
|
|
"r12", "r13", "r15", "r17", "r19", "r21",
|
|
"r23", "r25", "r27", "r29", "r31");
|
|
return r11;
|
|
}
|
|
|
|
static inline long __syscall2(long n, long a, long b)
|
|
{
|
|
register unsigned long r11 __asm__("r11") = n;
|
|
register unsigned long r3 __asm__("r3") = a;
|
|
register unsigned long r4 __asm__("r4") = b;
|
|
__asm__ __volatile__ ("l.sys 1"
|
|
: "=r"(r11)
|
|
: "r"(r11), "r"(r3), "r"(r4)
|
|
: "memory", "r5", "r6", "r7", "r8",
|
|
"r12", "r13", "r15", "r17", "r19", "r21",
|
|
"r23", "r25", "r27", "r29", "r31");
|
|
return r11;
|
|
}
|
|
|
|
static inline long __syscall3(long n, long a, long b, long c)
|
|
{
|
|
register unsigned long r11 __asm__("r11") = n;
|
|
register unsigned long r3 __asm__("r3") = a;
|
|
register unsigned long r4 __asm__("r4") = b;
|
|
register unsigned long r5 __asm__("r5") = c;
|
|
__asm__ __volatile__ ("l.sys 1"
|
|
: "=r"(r11)
|
|
: "r"(r11), "r"(r3), "r"(r4), "r"(r5)
|
|
: "memory", "r6", "r7", "r8",
|
|
"r12", "r13", "r15", "r17", "r19", "r21",
|
|
"r23", "r25", "r27", "r29", "r31");
|
|
return r11;
|
|
}
|
|
|
|
static inline long __syscall4(long n, long a, long b, long c, long d)
|
|
{
|
|
register unsigned long r11 __asm__("r11") = n;
|
|
register unsigned long r3 __asm__("r3") = a;
|
|
register unsigned long r4 __asm__("r4") = b;
|
|
register unsigned long r5 __asm__("r5") = c;
|
|
register unsigned long r6 __asm__("r6") = d;
|
|
__asm__ __volatile__ ("l.sys 1"
|
|
: "=r"(r11)
|
|
: "r"(r11), "r"(r3), "r"(r4), "r"(r5), "r"(r6)
|
|
: "memory", "r7", "r8",
|
|
"r12", "r13", "r15", "r17", "r19", "r21",
|
|
"r23", "r25", "r27", "r29", "r31");
|
|
return r11;
|
|
}
|
|
|
|
static inline long __syscall5(long n, long a, long b, long c, long d, long e)
|
|
{
|
|
register unsigned long r11 __asm__("r11") = n;
|
|
register unsigned long r3 __asm__("r3") = a;
|
|
register unsigned long r4 __asm__("r4") = b;
|
|
register unsigned long r5 __asm__("r5") = c;
|
|
register unsigned long r6 __asm__("r6") = d;
|
|
register unsigned long r7 __asm__("r7") = e;
|
|
__asm__ __volatile__ ("l.sys 1"
|
|
: "=r"(r11)
|
|
: "r"(r11), "r"(r3), "r"(r4), "r"(r5), "r"(r6),
|
|
"r"(r7)
|
|
: "memory", "r8",
|
|
"r12", "r13", "r15", "r17", "r19", "r21",
|
|
"r23", "r25", "r27", "r29", "r31");
|
|
return r11;
|
|
}
|
|
|
|
static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
|
|
{
|
|
register unsigned long r11 __asm__("r11") = n;
|
|
register unsigned long r3 __asm__("r3") = a;
|
|
register unsigned long r4 __asm__("r4") = b;
|
|
register unsigned long r5 __asm__("r5") = c;
|
|
register unsigned long r6 __asm__("r6") = d;
|
|
register unsigned long r7 __asm__("r7") = e;
|
|
register unsigned long r8 __asm__("r8") = f;
|
|
__asm__ __volatile__ ("l.sys 1"
|
|
: "=r"(r11)
|
|
: "r"(r11), "r"(r3), "r"(r4), "r"(r5), "r"(r6),
|
|
"r"(r7), "r"(r8)
|
|
: "memory",
|
|
"r12", "r13", "r15", "r17", "r19", "r21",
|
|
"r23", "r25", "r27", "r29", "r31");
|
|
return r11;
|
|
}
|
|
|
|
#define IPC_64 0
|