123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- diff --git a/linux_syscall_support.h b/linux_syscall_support.h
- index 8d4e4d2..ce1345a 100644
- --- a/linux_syscall_support.h
- +++ b/linux_syscall_support.h
- @@ -88,7 +88,7 @@
- */
- #if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) || \
- defined(__mips__) || defined(__PPC__) || defined(__ARM_EABI__) || \
- - defined(__aarch64__) || defined(__s390__)) || defined(__e2k__) \
- + defined(__aarch64__) || defined(__s390__) || defined(__riscv)) || defined(__e2k__) \
- && (defined(__linux) || defined(__ANDROID__))
-
- #ifndef SYS_CPLUSPLUS
- @@ -302,7 +302,7 @@ struct kernel_old_sigaction {
- } __attribute__((packed,aligned(4)));
- #elif (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32)
- #define kernel_old_sigaction kernel_sigaction
- -#elif defined(__aarch64__)
- +#elif defined(__aarch64__) || defined(__riscv)
- // No kernel_old_sigaction defined for arm64.
- #endif
-
- @@ -542,7 +542,7 @@ struct kernel_stat {
- int st_blocks;
- int st_pad4[14];
- };
- -#elif defined(__aarch64__)
- +#elif defined(__aarch64__) || defined(__riscv)
- struct kernel_stat {
- unsigned long st_dev;
- unsigned long st_ino;
- @@ -1110,7 +1110,7 @@ struct kernel_statfs {
- #define __NR_getrandom (__NR_SYSCALL_BASE + 384)
- #endif
- /* End of ARM 3/EABI definitions */
- -#elif defined(__aarch64__)
- +#elif defined(__aarch64__) || defined(__riscv)
- #ifndef __NR_setxattr
- #define __NR_setxattr 5
- #endif
- @@ -1925,7 +1925,7 @@ struct kernel_statfs {
-
- #undef LSS_RETURN
- #if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) \
- - || defined(__ARM_EABI__) || defined(__aarch64__) || defined(__s390__)) \
- + || defined(__ARM_EABI__) || defined(__aarch64__) || defined(__s390__) || defined(__riscv)) \
- || defined(__e2k__)
- /* Failing system calls return a negative result in the range of
- * -1..-4095. These are "errno" values with the sign inverted.
- @@ -3419,6 +3419,122 @@ struct kernel_statfs {
- }
- LSS_RETURN(int, __ret);
- }
- + #elif defined(__riscv)
- + #undef LSS_REG
- + #define LSS_REG(r,a) register int64_t __r##r __asm__("a"#r) = (int64_t)a
- + #undef LSS_BODY
- + #define LSS_BODY(type,name,args...) \
- + register int64_t __res_a0 __asm__("a0"); \
- + register int64_t __a7 __asm__("a7") = __NR_##name; \
- + int64_t __res; \
- + __asm__ __volatile__ ("scall\n" \
- + : "=r"(__res_a0) \
- + : "r"(__a7) , ## args \
- + : "memory"); \
- + __res = __res_a0; \
- + LSS_RETURN(type, __res)
- + #undef _syscall0
- + #define _syscall0(type, name) \
- + type LSS_NAME(name)(void) { \
- + LSS_BODY(type, name); \
- + }
- + #undef _syscall1
- + #define _syscall1(type, name, type1, arg1) \
- + type LSS_NAME(name)(type1 arg1) { \
- + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \
- + }
- + #undef _syscall2
- + #define _syscall2(type, name, type1, arg1, type2, arg2) \
- + type LSS_NAME(name)(type1 arg1, type2 arg2) { \
- + LSS_REG(0, arg1); LSS_REG(1, arg2); \
- + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \
- + }
- + #undef _syscall3
- + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \
- + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \
- + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \
- + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \
- + }
- + #undef _syscall4
- + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
- + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \
- + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \
- + LSS_REG(3, arg4); \
- + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \
- + }
- + #undef _syscall5
- + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
- + type5,arg5) \
- + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
- + type5 arg5) { \
- + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \
- + LSS_REG(3, arg4); LSS_REG(4, arg5); \
- + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \
- + "r"(__r4)); \
- + }
- + #undef _syscall6
- + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
- + type5,arg5,type6,arg6) \
- + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
- + type5 arg5, type6 arg6) { \
- + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \
- + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \
- + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \
- + "r"(__r4), "r"(__r5)); \
- + }
- +
- + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
- + int flags, void *arg, int *parent_tidptr,
- + void *newtls, int *child_tidptr) {
- + int64_t __res;
- + {
- + register int64_t __res_a0 __asm__("a0");
- + register uint64_t __flags __asm__("a0") = flags;
- + register void *__stack __asm__("a1") = child_stack;
- + register void *__ptid __asm__("a2") = parent_tidptr;
- + register void *__tls __asm__("a3") = newtls;
- + register int *__ctid __asm__("a4") = child_tidptr;
- + __asm__ __volatile__(/* Push "arg" and "fn" onto the stack that will be
- + * used by the child.
- + */
- + "addi %2,%2,-16\n"
- + "sd %1, 0(%2)\n"
- + "sd %4, 8(%2)\n"
- +
- + /* %a0 = syscall(%a0 = flags,
- + * %a1 = child_stack,
- + * %a2 = parent_tidptr,
- + * %a3 = newtls,
- + * %a4 = child_tidptr)
- + */
- + "li a7, %8\n"
- + "scall\n"
- +
- + /* if (%a0 != 0)
- + * return %a0;
- + */
- + "bnez %0, 1f\n"
- +
- + /* In the child, now. Call "fn(arg)".
- + */
- + "ld a1, 0(sp)\n"
- + "ld a0, 8(sp)\n"
- + "jalr a1\n"
- +
- + /* Call _exit(%a0).
- + */
- + "li a7, %9\n"
- + "scall\n"
- + "1:\n"
- + : "=r" (__res_a0)
- + : "r"(fn), "r"(__stack), "r"(__flags), "r"(arg),
- + "r"(__ptid), "r"(__tls), "r"(__ctid),
- + "i"(__NR_clone), "i"(__NR_exit)
- + : "cc", "memory");
- + __res = __res_a0;
- + }
- + LSS_RETURN(int, __res);
- + }
- #elif defined(__e2k__)
-
- #undef _LSS_BODY
- @@ -4484,7 +4600,7 @@ struct kernel_statfs {
- LSS_SC_BODY(4, int, 8, d, type, protocol, sv);
- }
- #endif
- - #if defined(__ARM_EABI__) || defined (__aarch64__)
- + #if defined(__ARM_EABI__) || defined (__aarch64__) || defined(__riscv)
- LSS_INLINE _syscall3(ssize_t, recvmsg, int, s, struct kernel_msghdr*, msg,
- int, flags)
- LSS_INLINE _syscall3(ssize_t, sendmsg, int, s, const struct kernel_msghdr*,
- @@ -4812,7 +4928,7 @@ struct kernel_statfs {
- // TODO: define this in an arch-independant way instead of inlining the clone
- // syscall body.
-
- -# if defined(__aarch64__)
- +# if defined(__aarch64__) || defined(__riscv)
- LSS_INLINE pid_t LSS_NAME(fork)(void) {
- // No fork syscall on aarch64 - implement by means of the clone syscall.
- // Note that this does not reset glibc's cached view of the PID/TID, so
|