>From f5c8eff0c7c7f8cf67e78d446325e477467d5091 Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Mon, 9 Mar 2015 17:15:43 +0000 Subject: [PATCH] add aarch64 port With this patch aarch64 port should be usable including the big endian subarch (which is named aarch64eb), but should be considered experimental. The only outstanding issue is the 128 bit long double math functions which will be added or fixed incrementally once we have ld128 tests. --- arch/aarch64/atomic.h | 206 +++++++++++ arch/aarch64/bits/alltypes.h.in | 28 ++ arch/aarch64/bits/endian.h | 5 + arch/aarch64/bits/errno.h | 134 ++++++++ arch/aarch64/bits/fcntl.h | 41 +++ arch/aarch64/bits/fenv.h | 19 ++ arch/aarch64/bits/float.h | 16 + arch/aarch64/bits/ioctl.h | 213 ++++++++++++ arch/aarch64/bits/ipc.h | 15 + arch/aarch64/bits/limits.h | 8 + arch/aarch64/bits/mman.h | 57 ++++ arch/aarch64/bits/msg.h | 14 + arch/aarch64/bits/posix.h | 2 + arch/aarch64/bits/reg.h | 2 + arch/aarch64/bits/sem.h | 8 + arch/aarch64/bits/setjmp.h | 1 + arch/aarch64/bits/shm.h | 27 ++ arch/aarch64/bits/signal.h | 86 +++++ arch/aarch64/bits/socket.h | 35 ++ arch/aarch64/bits/stat.h | 18 + arch/aarch64/bits/statfs.h | 7 + arch/aarch64/bits/stdarg.h | 4 + arch/aarch64/bits/stdint.h | 20 ++ arch/aarch64/bits/syscall.h | 588 ++++++++++++++++++++++++++++++++ arch/aarch64/bits/termios.h | 160 +++++++++ arch/aarch64/bits/user.h | 16 + arch/aarch64/crt_arch.h | 9 + arch/aarch64/pthread_arch.h | 11 + arch/aarch64/reloc.h | 40 +++ arch/aarch64/syscall_arch.h | 76 +++++ configure | 5 + src/fenv/aarch64/fenv.s | 67 ++++ src/internal/aarch64/syscall.s | 13 + src/internal/libm.h | 14 + src/ldso/aarch64/dlsym.s | 5 + src/ldso/aarch64/start.s | 18 + src/ldso/aarch64/tlsdesc.s | 92 +++++ src/math/aarch64/fabs.s | 6 + src/math/aarch64/fabsf.s | 6 + src/math/aarch64/sqrt.s | 6 + src/math/aarch64/sqrtf.s | 6 + src/math/logl.c | 6 + src/math/powl.c | 7 +- src/setjmp/aarch64/longjmp.s | 24 ++ src/setjmp/aarch64/setjmp.s | 24 ++ src/signal/aarch64/restore.s | 8 + src/signal/aarch64/sigsetjmp.s | 19 ++ src/thread/aarch64/__set_thread_area.s | 6 + src/thread/aarch64/__unmapself.s | 7 + src/thread/aarch64/clone.s | 29 ++ src/thread/aarch64/syscall_cp.s | 24 ++ 51 files changed, 2257 insertions(+), 1 deletion(-) create mode 100644 arch/aarch64/atomic.h create mode 100644 arch/aarch64/bits/alltypes.h.in create mode 100644 arch/aarch64/bits/endian.h create mode 100644 arch/aarch64/bits/errno.h create mode 100644 arch/aarch64/bits/fcntl.h create mode 100644 arch/aarch64/bits/fenv.h create mode 100644 arch/aarch64/bits/float.h create mode 100644 arch/aarch64/bits/io.h create mode 100644 arch/aarch64/bits/ioctl.h create mode 100644 arch/aarch64/bits/ipc.h create mode 100644 arch/aarch64/bits/limits.h create mode 100644 arch/aarch64/bits/mman.h create mode 100644 arch/aarch64/bits/msg.h create mode 100644 arch/aarch64/bits/poll.h create mode 100644 arch/aarch64/bits/posix.h create mode 100644 arch/aarch64/bits/reg.h create mode 100644 arch/aarch64/bits/resource.h create mode 100644 arch/aarch64/bits/sem.h create mode 100644 arch/aarch64/bits/setjmp.h create mode 100644 arch/aarch64/bits/shm.h create mode 100644 arch/aarch64/bits/signal.h create mode 100644 arch/aarch64/bits/socket.h create mode 100644 arch/aarch64/bits/stat.h create mode 100644 arch/aarch64/bits/statfs.h create mode 100644 arch/aarch64/bits/stdarg.h create mode 100644 arch/aarch64/bits/stdint.h create mode 100644 arch/aarch64/bits/syscall.h create mode 100644 arch/aarch64/bits/termios.h create mode 100644 arch/aarch64/bits/user.h create mode 100644 arch/aarch64/crt_arch.h create mode 100644 arch/aarch64/pthread_arch.h create mode 100644 arch/aarch64/reloc.h create mode 100644 arch/aarch64/syscall_arch.h create mode 100644 src/fenv/aarch64/fenv.s create mode 100644 src/internal/aarch64/syscall.s create mode 100644 src/ldso/aarch64/dlsym.s create mode 100644 src/ldso/aarch64/start.s create mode 100644 src/ldso/aarch64/tlsdesc.s create mode 100644 src/math/aarch64/fabs.s create mode 100644 src/math/aarch64/fabsf.s create mode 100644 src/math/aarch64/sqrt.s create mode 100644 src/math/aarch64/sqrtf.s create mode 100644 src/setjmp/aarch64/longjmp.s create mode 100644 src/setjmp/aarch64/setjmp.s create mode 100644 src/signal/aarch64/restore.s create mode 100644 src/signal/aarch64/sigsetjmp.s create mode 100644 src/thread/aarch64/__set_thread_area.s create mode 100644 src/thread/aarch64/__unmapself.s create mode 100644 src/thread/aarch64/clone.s create mode 100644 src/thread/aarch64/syscall_cp.s diff --git a/arch/aarch64/atomic.h b/arch/aarch64/atomic.h new file mode 100644 index 0000000..e7c82c2 --- /dev/null +++ b/arch/aarch64/atomic.h @@ -0,0 +1,206 @@ +#ifndef _INTERNAL_ATOMIC_H +#define _INTERNAL_ATOMIC_H + +#include + +static inline int a_ctz_64(uint64_t x) +{ + __asm__( + " rbit %0, %1\n" + " clz %0, %0\n" + : "=r"(x) : "r"(x)); + return x; +} + +static inline int a_ctz_l(unsigned long x) +{ + return a_ctz_64(x); +} + +static inline void a_barrier() +{ + __asm__ __volatile__("dmb ish"); +} + +static inline void *a_cas_p(volatile void *p, void *t, void *s) +{ + void *old; + __asm__ __volatile__( + " dmb ish\n" + "1: ldxr %0,%3\n" + " cmp %0,%1\n" + " b.ne 1f\n" + " stxr %w0,%2,%3\n" + " cbnz %w0,1b\n" + " mov %0,%1\n" + "1: dmb ish\n" + : "=&r"(old) + : "r"(t), "r"(s), "Q"(*(long*)p) + : "memory", "cc"); + return old; +} + +static inline int a_cas(volatile int *p, int t, int s) +{ + int old; + __asm__ __volatile__( + " dmb ish\n" + "1: ldxr %w0,%3\n" + " cmp %w0,%w1\n" + " b.ne 1f\n" + " stxr %w0,%w2,%3\n" + " cbnz %w0,1b\n" + " mov %w0,%w1\n" + "1: dmb ish\n" + : "=&r"(old) + : "r"(t), "r"(s), "Q"(*p) + : "memory", "cc"); + return old; +} + +static inline int a_swap(volatile int *x, int v) +{ + int old, tmp; + __asm__ __volatile__( + " dmb ish\n" + "1: ldxr %w0,%3\n" + " stxr %w1,%w2,%3\n" + " cbnz %w1,1b\n" + " dmb ish\n" + : "=&r"(old), "=&r"(tmp) + : "r"(v), "Q"(*x) + : "memory", "cc" ); + return old; +} + +static inline int a_fetch_add(volatile int *x, int v) +{ + int old, tmp; + __asm__ __volatile__( + " dmb ish\n" + "1: ldxr %w0,%3\n" + " add %w0,%w0,%w2\n" + " stxr %w1,%w0,%3\n" + " cbnz %w1,1b\n" + " dmb ish\n" + : "=&r"(old), "=&r"(tmp) + : "r"(v), "Q"(*x) + : "memory", "cc" ); + return old-v; +} + +static inline void a_inc(volatile int *x) +{ + int tmp, tmp2; + __asm__ __volatile__( + " dmb ish\n" + "1: ldxr %w0,%2\n" + " add %w0,%w0,#1\n" + " stxr %w1,%w0,%2\n" + " cbnz %w1,1b\n" + " dmb ish\n" + : "=&r"(tmp), "=&r"(tmp2) + : "Q"(*x) + : "memory", "cc" ); +} + +static inline void a_dec(volatile int *x) +{ + int tmp, tmp2; + __asm__ __volatile__( + " dmb ish\n" + "1: ldxr %w0,%2\n" + " sub %w0,%w0,#1\n" + " stxr %w1,%w0,%2\n" + " cbnz %w1,1b\n" + " dmb ish\n" + : "=&r"(tmp), "=&r"(tmp2) + : "Q"(*x) + : "memory", "cc" ); +} + +static inline void a_and_64(volatile uint64_t *p, uint64_t v) +{ + int tmp, tmp2; + __asm__ __volatile__( + " dmb ish\n" + "1: ldxr %0,%3\n" + " and %0,%0,%2\n" + " stxr %w1,%0,%3\n" + " cbnz %w1,1b\n" + " dmb ish\n" + : "=&r"(tmp), "=&r"(tmp2) + : "r"(v), "Q"(*p) + : "memory", "cc" ); +} + +static inline void a_and(volatile int *p, int v) +{ + int tmp, tmp2; + __asm__ __volatile__( + " dmb ish\n" + "1: ldxr %w0,%3\n" + " and %w0,%w0,%w2\n" + " stxr %w1,%w0,%3\n" + " cbnz %w1,1b\n" + " dmb ish\n" + : "=&r"(tmp), "=&r"(tmp2) + : "r"(v), "Q"(*p) + : "memory", "cc" ); +} + +static inline void a_or_64(volatile uint64_t *p, uint64_t v) +{ + int tmp, tmp2; + __asm__ __volatile__( + " dmb ish\n" + "1: ldxr %0,%3\n" + " orr %0,%0,%2\n" + " stxr %w1,%0,%3\n" + " cbnz %w1,1b\n" + " dmb ish\n" + : "=&r"(tmp), "=&r"(tmp2) + : "r"(v), "Q"(*p) + : "memory", "cc" ); +} + +static inline void a_or_l(volatile void *p, long v) +{ + return a_or_64(p, v); +} + +static inline void a_or(volatile int *p, int v) +{ + int tmp, tmp2; + __asm__ __volatile__( + " dmb ish\n" + "1: ldxr %w0,%3\n" + " orr %w0,%w0,%w2\n" + " stxr %w1,%w0,%3\n" + " cbnz %w1,1b\n" + " dmb ish\n" + : "=&r"(tmp), "=&r"(tmp2) + : "r"(v), "Q"(*p) + : "memory", "cc" ); +} + +static inline void a_store(volatile int *p, int x) +{ + __asm__ __volatile__( + " dmb ish\n" + " str %w1,%0\n" + " dmb ish\n" + : "=m"(*p) + : "r"(x) + : "memory", "cc" ); +} + +#define a_spin a_barrier + +static inline void a_crash() +{ + *(volatile char *)0=0; +} + + +#endif diff --git a/arch/aarch64/bits/alltypes.h.in b/arch/aarch64/bits/alltypes.h.in new file mode 100644 index 0000000..ac235b7 --- /dev/null +++ b/arch/aarch64/bits/alltypes.h.in @@ -0,0 +1,28 @@ +#define _Addr long +#define _Int64 long +#define _Reg long + +TYPEDEF __builtin_va_list va_list; +TYPEDEF __builtin_va_list __isoc_va_list; + +#ifndef __cplusplus +TYPEDEF unsigned wchar_t; +#endif +TYPEDEF unsigned wint_t; + +TYPEDEF int blksize_t; +TYPEDEF unsigned int nlink_t; + +TYPEDEF float float_t; +TYPEDEF double double_t; + +TYPEDEF long time_t; +TYPEDEF long suseconds_t; + +TYPEDEF struct { union { int __i[16]; volatile int __vi[16]; unsigned long __s[8]; } __u; } pthread_attr_t; +TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; volatile void *volatile __p[6]; } __u; } pthread_mutex_t; +TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; volatile void *volatile __p[6]; } __u; } mtx_t; +TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[6]; } __u; } pthread_cond_t; +TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[6]; } __u; } cnd_t; +TYPEDEF struct { union { int __i[14]; volatile int __vi[14]; void *__p[7]; } __u; } pthread_rwlock_t; +TYPEDEF struct { union { int __i[8]; volatile int __vi[8]; void *__p[4]; } __u; } pthread_barrier_t; diff --git a/arch/aarch64/bits/endian.h b/arch/aarch64/bits/endian.h new file mode 100644 index 0000000..7a74d2f --- /dev/null +++ b/arch/aarch64/bits/endian.h @@ -0,0 +1,5 @@ +#if __AARCH64EB__ +#define __BYTE_ORDER __BIG_ENDIAN +#else +#define __BYTE_ORDER __LITTLE_ENDIAN +#endif diff --git a/arch/aarch64/bits/errno.h b/arch/aarch64/bits/errno.h new file mode 100644 index 0000000..d2e1eee --- /dev/null +++ b/arch/aarch64/bits/errno.h @@ -0,0 +1,134 @@ +#define EPERM 1 +#define ENOENT 2 +#define ESRCH 3 +#define EINTR 4 +#define EIO 5 +#define ENXIO 6 +#define E2BIG 7 +#define ENOEXEC 8 +#define EBADF 9 +#define ECHILD 10 +#define EAGAIN 11 +#define ENOMEM 12 +#define EACCES 13 +#define EFAULT 14 +#define ENOTBLK 15 +#define EBUSY 16 +#define EEXIST 17 +#define EXDEV 18 +#define ENODEV 19 +#define ENOTDIR 20 +#define EISDIR 21 +#define EINVAL 22 +#define ENFILE 23 +#define EMFILE 24 +#define ENOTTY 25 +#define ETXTBSY 26 +#define EFBIG 27 +#define ENOSPC 28 +#define ESPIPE 29 +#define EROFS 30 +#define EMLINK 31 +#define EPIPE 32 +#define EDOM 33 +#define ERANGE 34 +#define EDEADLK 35 +#define ENAMETOOLONG 36 +#define ENOLCK 37 +#define ENOSYS 38 +#define ENOTEMPTY 39 +#define ELOOP 40 +#define EWOULDBLOCK EAGAIN +#define ENOMSG 42 +#define EIDRM 43 +#define ECHRNG 44 +#define EL2NSYNC 45 +#define EL3HLT 46 +#define EL3RST 47 +#define ELNRNG 48 +#define EUNATCH 49 +#define ENOCSI 50 +#define EL2HLT 51 +#define EBADE 52 +#define EBADR 53 +#define EXFULL 54 +#define ENOANO 55 +#define EBADRQC 56 +#define EBADSLT 57 +#define EDEADLOCK EDEADLK +#define EBFONT 59 +#define ENOSTR 60 +#define ENODATA 61 +#define ETIME 62 +#define ENOSR 63 +#define ENONET 64 +#define ENOPKG 65 +#define EREMOTE 66 +#define ENOLINK 67 +#define EADV 68 +#define ESRMNT 69 +#define ECOMM 70 +#define EPROTO 71 +#define EMULTIHOP 72 +#define EDOTDOT 73 +#define EBADMSG 74 +#define EOVERFLOW 75 +#define ENOTUNIQ 76 +#define EBADFD 77 +#define EREMCHG 78 +#define ELIBACC 79 +#define ELIBBAD 80 +#define ELIBSCN 81 +#define ELIBMAX 82 +#define ELIBEXEC 83 +#define EILSEQ 84 +#define ERESTART 85 +#define ESTRPIPE 86 +#define EUSERS 87 +#define ENOTSOCK 88 +#define EDESTADDRREQ 89 +#define EMSGSIZE 90 +#define EPROTOTYPE 91 +#define ENOPROTOOPT 92 +#define EPROTONOSUPPORT 93 +#define ESOCKTNOSUPPORT 94 +#define EOPNOTSUPP 95 +#define ENOTSUP EOPNOTSUPP +#define EPFNOSUPPORT 96 +#define EAFNOSUPPORT 97 +#define EADDRINUSE 98 +#define EADDRNOTAVAIL 99 +#define ENETDOWN 100 +#define ENETUNREACH 101 +#define ENETRESET 102 +#define ECONNABORTED 103 +#define ECONNRESET 104 +#define ENOBUFS 105 +#define EISCONN 106 +#define ENOTCONN 107 +#define ESHUTDOWN 108 +#define ETOOMANYREFS 109 +#define ETIMEDOUT 110 +#define ECONNREFUSED 111 +#define EHOSTDOWN 112 +#define EHOSTUNREACH 113 +#define EALREADY 114 +#define EINPROGRESS 115 +#define ESTALE 116 +#define EUCLEAN 117 +#define ENOTNAM 118 +#define ENAVAIL 119 +#define EISNAM 120 +#define EREMOTEIO 121 +#define EDQUOT 122 +#define ENOMEDIUM 123 +#define EMEDIUMTYPE 124 +#define ECANCELED 125 +#define ENOKEY 126 +#define EKEYEXPIRED 127 +#define EKEYREVOKED 128 +#define EKEYREJECTED 129 +#define EOWNERDEAD 130 +#define ENOTRECOVERABLE 131 +#define ERFKILL 132 +#define EHWPOISON 133 diff --git a/arch/aarch64/bits/fcntl.h b/arch/aarch64/bits/fcntl.h new file mode 100644 index 0000000..4b46a5a --- /dev/null +++ b/arch/aarch64/bits/fcntl.h @@ -0,0 +1,41 @@ +#define O_CREAT 0100 +#define O_EXCL 0200 +#define O_NOCTTY 0400 +#define O_TRUNC 01000 +#define O_APPEND 02000 +#define O_NONBLOCK 04000 +#define O_DSYNC 010000 +#define O_SYNC 04010000 +#define O_RSYNC 04010000 +#define O_DIRECTORY 040000 +#define O_NOFOLLOW 0100000 +#define O_CLOEXEC 02000000 + +#define O_ASYNC 020000 +#define O_DIRECT 0200000 +#define O_LARGEFILE 0400000 +#define O_DIRECTORY 040000 +#define O_NOFOLLOW 0100000 +#define O_NOATIME 01000000 +#define O_CLOEXEC 02000000 +#define O_PATH 010000000 +#define O_TMPFILE 020040000 +#define O_NDELAY O_NONBLOCK + +#define F_DUPFD 0 +#define F_GETFD 1 +#define F_SETFD 2 +#define F_GETFL 3 +#define F_SETFL 4 +#define F_GETLK 5 +#define F_SETLK 6 +#define F_SETLKW 7 +#define F_SETOWN 8 +#define F_GETOWN 9 +#define F_SETSIG 10 +#define F_GETSIG 11 + +#define F_SETOWN_EX 15 +#define F_GETOWN_EX 16 + +#define F_GETOWNER_UIDS 17 diff --git a/arch/aarch64/bits/fenv.h b/arch/aarch64/bits/fenv.h new file mode 100644 index 0000000..2f3279a --- /dev/null +++ b/arch/aarch64/bits/fenv.h @@ -0,0 +1,19 @@ +#define FE_INVALID 1 +#define FE_DIVBYZERO 2 +#define FE_OVERFLOW 4 +#define FE_UNDERFLOW 8 +#define FE_INEXACT 16 +#define FE_ALL_EXCEPT 31 +#define FE_TONEAREST 0 +#define FE_DOWNWARD 0x800000 +#define FE_UPWARD 0x400000 +#define FE_TOWARDZERO 0xc00000 + +typedef unsigned int fexcept_t; + +typedef struct { + unsigned int __fpcr; + unsigned int __fpsr; +} fenv_t; + +#define FE_DFL_ENV ((const fenv_t *) -1) diff --git a/arch/aarch64/bits/float.h b/arch/aarch64/bits/float.h new file mode 100644 index 0000000..719c790 --- /dev/null +++ b/arch/aarch64/bits/float.h @@ -0,0 +1,16 @@ +#define FLT_EVAL_METHOD 0 + +#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L +#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L +#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L +#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L + +#define LDBL_MANT_DIG 113 +#define LDBL_MIN_EXP (-16381) +#define LDBL_MAX_EXP 16384 + +#define LDBL_DIG 33 +#define LDBL_MIN_10_EXP (-4931) +#define LDBL_MAX_10_EXP 4932 + +#define DECIMAL_DIG 36 diff --git a/arch/aarch64/bits/io.h b/arch/aarch64/bits/io.h new file mode 100644 index 0000000..e69de29 diff --git a/arch/aarch64/bits/ioctl.h b/arch/aarch64/bits/ioctl.h new file mode 100644 index 0000000..98bc699 --- /dev/null +++ b/arch/aarch64/bits/ioctl.h @@ -0,0 +1,213 @@ +#define _IOC(a,b,c,d) ( ((a)<<30) | ((b)<<8) | (c) | ((d)<<16) ) +#define _IOC_NONE 0U +#define _IOC_WRITE 1U +#define _IOC_READ 2U + +#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0) +#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c)) +#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c)) +#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c)) + +#define TCGETS 0x5401 +#define TCSETS 0x5402 +#define TCSETSW 0x5403 +#define TCSETSF 0x5404 +#define TCGETA 0x5405 +#define TCSETA 0x5406 +#define TCSETAW 0x5407 +#define TCSETAF 0x5408 +#define TCSBRK 0x5409 +#define TCXONC 0x540A +#define TCFLSH 0x540B +#define TIOCEXCL 0x540C +#define TIOCNXCL 0x540D +#define TIOCSCTTY 0x540E +#define TIOCGPGRP 0x540F +#define TIOCSPGRP 0x5410 +#define TIOCOUTQ 0x5411 +#define TIOCSTI 0x5412 +#define TIOCGWINSZ 0x5413 +#define TIOCSWINSZ 0x5414 +#define TIOCMGET 0x5415 +#define TIOCMBIS 0x5416 +#define TIOCMBIC 0x5417 +#define TIOCMSET 0x5418 +#define TIOCGSOFTCAR 0x5419 +#define TIOCSSOFTCAR 0x541A +#define FIONREAD 0x541B +#define TIOCINQ FIONREAD +#define TIOCLINUX 0x541C +#define TIOCCONS 0x541D +#define TIOCGSERIAL 0x541E +#define TIOCSSERIAL 0x541F +#define TIOCPKT 0x5420 +#define FIONBIO 0x5421 +#define TIOCNOTTY 0x5422 +#define TIOCSETD 0x5423 +#define TIOCGETD 0x5424 +#define TCSBRKP 0x5425 +#define TIOCTTYGSTRUCT 0x5426 +#define TIOCSBRK 0x5427 +#define TIOCCBRK 0x5428 +#define TIOCGSID 0x5429 +#define TIOCGRS485 0x542E +#define TIOCSRS485 0x542F +#define TIOCGPTN _IOR('T', 0x30, unsigned int) +#define TIOCSPTLCK _IOW('T', 0x31, int) +#define TIOCGDEV _IOR('T', 0x32, unsigned int) */ +#define TCGETX 0x5432 +#define TCSETX 0x5433 +#define TCSETXF 0x5434 +#define TCSETXW 0x5435 +#define TIOCSIG 0x40045436 +#define TIOCVHANGUP 0x5437 +#define TIOCGPKT 0x80045438 +#define TIOCGPTLCK 0x80045439 +#define TIOCGEXCL 0x80045440 + +#define FIONCLEX 0x5450 +#define FIOCLEX 0x5451 +#define FIOASYNC 0x5452 +#define TIOCSERCONFIG 0x5453 +#define TIOCSERGWILD 0x5454 +#define TIOCSERSWILD 0x5455 +#define TIOCGLCKTRMIOS 0x5456 +#define TIOCSLCKTRMIOS 0x5457 +#define TIOCSERGSTRUCT 0x5458 +#define TIOCSERGETLSR 0x5459 +#define TIOCSERGETMULTI 0x545A +#define TIOCSERSETMULTI 0x545B + +#define TIOCMIWAIT 0x545C +#define TIOCGICOUNT 0x545D +#define FIOQSIZE 0x5460 + +#define TIOCPKT_DATA 0 +#define TIOCPKT_FLUSHREAD 1 +#define TIOCPKT_FLUSHWRITE 2 +#define TIOCPKT_STOP 4 +#define TIOCPKT_START 8 +#define TIOCPKT_NOSTOP 16 +#define TIOCPKT_DOSTOP 32 +#define TIOCPKT_IOCTL 64 + +#define TIOCSER_TEMT 0x01 + +struct winsize { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; + unsigned short ws_ypixel; +}; + +#define TIOCM_LE 0x001 +#define TIOCM_DTR 0x002 +#define TIOCM_RTS 0x004 +#define TIOCM_ST 0x008 +#define TIOCM_SR 0x010 +#define TIOCM_CTS 0x020 +#define TIOCM_CAR 0x040 +#define TIOCM_RNG 0x080 +#define TIOCM_DSR 0x100 +#define TIOCM_CD TIOCM_CAR +#define TIOCM_RI TIOCM_RNG +#define TIOCM_OUT1 0x2000 +#define TIOCM_OUT2 0x4000 +#define TIOCM_LOOP 0x8000 +#define TIOCM_MODEM_BITS TIOCM_OUT2 + +#define N_TTY 0 +#define N_SLIP 1 +#define N_MOUSE 2 +#define N_PPP 3 +#define N_STRIP 4 +#define N_AX25 5 +#define N_X25 6 +#define N_6PACK 7 +#define N_MASC 8 +#define N_R3964 9 +#define N_PROFIBUS_FDL 10 +#define N_IRDA 11 +#define N_SMSBLOCK 12 +#define N_HDLC 13 +#define N_SYNC_PPP 14 +#define N_HCI 15 +#define N_GIGASET_M101 16 +#define N_SLCAN 17 +#define N_PPS 18 +#define N_V253 19 +#define N_CAIF 20 +#define N_GSM0710 21 +#define N_TI_WL 22 +#define N_TRACESINK 23 +#define N_TRACEROUTER 24 + +#define FIOSETOWN 0x8901 +#define SIOCSPGRP 0x8902 +#define FIOGETOWN 0x8903 +#define SIOCGPGRP 0x8904 +#define SIOCATMARK 0x8905 +#define SIOCGSTAMP 0x8906 +#define SIOCGSTAMPNS 0x8907 + +#define SIOCADDRT 0x890B +#define SIOCDELRT 0x890C +#define SIOCRTMSG 0x890D + +#define SIOCGIFNAME 0x8910 +#define SIOCSIFLINK 0x8911 +#define SIOCGIFCONF 0x8912 +#define SIOCGIFFLAGS 0x8913 +#define SIOCSIFFLAGS 0x8914 +#define SIOCGIFADDR 0x8915 +#define SIOCSIFADDR 0x8916 +#define SIOCGIFDSTADDR 0x8917 +#define SIOCSIFDSTADDR 0x8918 +#define SIOCGIFBRDADDR 0x8919 +#define SIOCSIFBRDADDR 0x891a +#define SIOCGIFNETMASK 0x891b +#define SIOCSIFNETMASK 0x891c +#define SIOCGIFMETRIC 0x891d +#define SIOCSIFMETRIC 0x891e +#define SIOCGIFMEM 0x891f +#define SIOCSIFMEM 0x8920 +#define SIOCGIFMTU 0x8921 +#define SIOCSIFMTU 0x8922 +#define SIOCSIFHWADDR 0x8924 +#define SIOCGIFENCAP 0x8925 +#define SIOCSIFENCAP 0x8926 +#define SIOCGIFHWADDR 0x8927 +#define SIOCGIFSLAVE 0x8929 +#define SIOCSIFSLAVE 0x8930 +#define SIOCADDMULTI 0x8931 +#define SIOCDELMULTI 0x8932 +#define SIOCGIFINDEX 0x8933 +#define SIOGIFINDEX SIOCGIFINDEX +#define SIOCSIFPFLAGS 0x8934 +#define SIOCGIFPFLAGS 0x8935 +#define SIOCDIFADDR 0x8936 +#define SIOCSIFHWBROADCAST 0x8937 +#define SIOCGIFCOUNT 0x8938 + +#define SIOCGIFBR 0x8940 +#define SIOCSIFBR 0x8941 + +#define SIOCGIFTXQLEN 0x8942 +#define SIOCSIFTXQLEN 0x8943 + +#define SIOCDARP 0x8953 +#define SIOCGARP 0x8954 +#define SIOCSARP 0x8955 + +#define SIOCDRARP 0x8960 +#define SIOCGRARP 0x8961 +#define SIOCSRARP 0x8962 + +#define SIOCGIFMAP 0x8970 +#define SIOCSIFMAP 0x8971 + +#define SIOCADDDLCI 0x8980 +#define SIOCDELDLCI 0x8981 + +#define SIOCDEVPRIVATE 0x89F0 +#define SIOCPROTOPRIVATE 0x89E0 diff --git a/arch/aarch64/bits/ipc.h b/arch/aarch64/bits/ipc.h new file mode 100644 index 0000000..9a47bc7 --- /dev/null +++ b/arch/aarch64/bits/ipc.h @@ -0,0 +1,15 @@ +struct ipc_perm +{ + key_t __ipc_perm_key; + uid_t uid; + gid_t gid; + uid_t cuid; + gid_t cgid; + mode_t mode; + unsigned short __ipc_perm_seq; + + unsigned long __pad1; + unsigned long __pad2; +}; + +#define IPC_64 0 diff --git a/arch/aarch64/bits/limits.h b/arch/aarch64/bits/limits.h new file mode 100644 index 0000000..792a30b --- /dev/null +++ b/arch/aarch64/bits/limits.h @@ -0,0 +1,8 @@ +#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +#define PAGE_SIZE 4096 +#define LONG_BIT 64 +#endif + +#define LONG_MAX 0x7fffffffffffffffL +#define LLONG_MAX 0x7fffffffffffffffLL diff --git a/arch/aarch64/bits/mman.h b/arch/aarch64/bits/mman.h new file mode 100644 index 0000000..ce5519f --- /dev/null +++ b/arch/aarch64/bits/mman.h @@ -0,0 +1,57 @@ +#define MAP_FAILED ((void *) -1) + +#define PROT_NONE 0 +#define PROT_READ 1 +#define PROT_WRITE 2 +#define PROT_EXEC 4 +#define PROT_GROWSDOWN 0x01000000 +#define PROT_GROWSUP 0x02000000 + +#define MAP_SHARED 0x01 +#define MAP_PRIVATE 0x02 +#define MAP_FIXED 0x10 +#define MAP_TYPE 0x0f +#define MAP_FILE 0x00 +#define MAP_ANON 0x20 +#define MAP_ANONYMOUS MAP_ANON +#define MAP_NORESERVE 0x4000 +#define MAP_GROWSDOWN 0x0100 +#define MAP_DENYWRITE 0x0800 +#define MAP_EXECUTABLE 0x1000 +#define MAP_LOCKED 0x2000 +#define MAP_POPULATE 0x8000 +#define MAP_NONBLOCK 0x10000 +#define MAP_STACK 0x20000 +#define MAP_HUGETLB 0x40000 + +#define POSIX_MADV_NORMAL 0 +#define POSIX_MADV_RANDOM 1 +#define POSIX_MADV_SEQUENTIAL 2 +#define POSIX_MADV_WILLNEED 3 +#define POSIX_MADV_DONTNEED 0 + +#define MS_ASYNC 1 +#define MS_INVALIDATE 2 +#define MS_SYNC 4 + +#define MCL_CURRENT 1 +#define MCL_FUTURE 2 + +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +#define MADV_NORMAL 0 +#define MADV_RANDOM 1 +#define MADV_SEQUENTIAL 2 +#define MADV_WILLNEED 3 +#define MADV_DONTNEED 4 +#define MADV_REMOVE 9 +#define MADV_DONTFORK 10 +#define MADV_DOFORK 11 +#define MADV_MERGEABLE 12 +#define MADV_UNMERGEABLE 13 +#define MADV_HUGEPAGE 14 +#define MADV_NOHUGEPAGE 15 +#define MADV_DONTDUMP 16 +#define MADV_DODUMP 17 +#define MADV_HWPOISON 100 +#define MADV_SOFT_OFFLINE 101 +#endif diff --git a/arch/aarch64/bits/msg.h b/arch/aarch64/bits/msg.h new file mode 100644 index 0000000..0135a08 --- /dev/null +++ b/arch/aarch64/bits/msg.h @@ -0,0 +1,14 @@ +struct msqid_ds +{ + struct ipc_perm msg_perm; + time_t msg_stime; + time_t msg_rtime; + time_t msg_ctime; + unsigned long msg_cbytes; + msgqnum_t msg_qnum; + msglen_t msg_qbytes; + pid_t msg_lspid; + pid_t msg_lrpid; + unsigned long __pad1; + unsigned long __pad2; +}; diff --git a/arch/aarch64/bits/poll.h b/arch/aarch64/bits/poll.h new file mode 100644 index 0000000..e69de29 diff --git a/arch/aarch64/bits/posix.h b/arch/aarch64/bits/posix.h new file mode 100644 index 0000000..c37b94c --- /dev/null +++ b/arch/aarch64/bits/posix.h @@ -0,0 +1,2 @@ +#define _POSIX_V6_LP64_OFF64 1 +#define _POSIX_V7_LP64_OFF64 1 diff --git a/arch/aarch64/bits/reg.h b/arch/aarch64/bits/reg.h new file mode 100644 index 0000000..2633f39 --- /dev/null +++ b/arch/aarch64/bits/reg.h @@ -0,0 +1,2 @@ +#undef __WORDSIZE +#define __WORDSIZE 64 diff --git a/arch/aarch64/bits/resource.h b/arch/aarch64/bits/resource.h new file mode 100644 index 0000000..e69de29 diff --git a/arch/aarch64/bits/sem.h b/arch/aarch64/bits/sem.h new file mode 100644 index 0000000..6ac9336 --- /dev/null +++ b/arch/aarch64/bits/sem.h @@ -0,0 +1,8 @@ +struct semid_ds { + struct ipc_perm sem_perm; + time_t sem_otime; + time_t sem_ctime; + time_t sem_nsems; + time_t __unused3; + time_t __unused4; +}; diff --git a/arch/aarch64/bits/setjmp.h b/arch/aarch64/bits/setjmp.h new file mode 100644 index 0000000..54bc261 --- /dev/null +++ b/arch/aarch64/bits/setjmp.h @@ -0,0 +1 @@ +typedef unsigned long __jmp_buf[22]; diff --git a/arch/aarch64/bits/shm.h b/arch/aarch64/bits/shm.h new file mode 100644 index 0000000..aed0cfb --- /dev/null +++ b/arch/aarch64/bits/shm.h @@ -0,0 +1,27 @@ +#define SHMLBA 4096 + +struct shmid_ds +{ + struct ipc_perm shm_perm; + size_t shm_segsz; + time_t shm_atime; + time_t shm_dtime; + time_t shm_ctime; + pid_t shm_cpid; + pid_t shm_lpid; + unsigned long shm_nattch; + unsigned long __pad1; + unsigned long __pad2; +}; + +#ifdef _GNU_SOURCE +struct shminfo { + unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4]; +}; + +struct shm_info { + int used_ids; + unsigned long shm_tot, shm_rss, shm_swp; + unsigned long swap_attempts, swap_successes; +}; +#endif diff --git a/arch/aarch64/bits/signal.h b/arch/aarch64/bits/signal.h new file mode 100644 index 0000000..a179626 --- /dev/null +++ b/arch/aarch64/bits/signal.h @@ -0,0 +1,86 @@ +#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) + +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +typedef unsigned long greg_t; +typedef unsigned long gregset_t[34]; + +typedef struct { + __uint128_t vregs[32]; + unsigned int fpsr; + unsigned int fpcr; +} fpregset_t; +typedef struct sigcontext +{ + unsigned long fault_address; + unsigned long regs[31]; + unsigned long sp, pc, pstate; + unsigned long __reserved[512] __attribute((__aligned__(16))); +} mcontext_t; +#else +typedef struct { + unsigned long __regs[36+512] __attribute((__aligned__(16))); +} mcontext_t; +#endif + +struct sigaltstack { + void *ss_sp; + int ss_flags; + size_t ss_size; +}; + +typedef struct __ucontext { + unsigned long uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + sigset_t uc_sigmask; + mcontext_t uc_mcontext; +} ucontext_t; + +#define SA_NOCLDSTOP 1 +#define SA_NOCLDWAIT 2 +#define SA_SIGINFO 4 +#define SA_ONSTACK 0x08000000 +#define SA_RESTART 0x10000000 +#define SA_NODEFER 0x40000000 +#define SA_RESETHAND 0x80000000 +#define SA_RESTORER 0x04000000 + +#endif + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT SIGABRT +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL 29 +#define SIGPWR 30 +#define SIGSYS 31 +#define SIGUNUSED SIGSYS + +#define _NSIG 65 diff --git a/arch/aarch64/bits/socket.h b/arch/aarch64/bits/socket.h new file mode 100644 index 0000000..b3fe643 --- /dev/null +++ b/arch/aarch64/bits/socket.h @@ -0,0 +1,35 @@ +#include + +struct msghdr +{ + void *msg_name; + socklen_t msg_namelen; + struct iovec *msg_iov; +#if __BYTE_ORDER == __BIG_ENDIAN + int __pad1, msg_iovlen; +#else + int msg_iovlen, __pad1; +#endif + void *msg_control; +#if __BYTE_ORDER == __BIG_ENDIAN + int __pad2; + socklen_t msg_controllen; +#else + socklen_t msg_controllen; + int __pad2; +#endif + int msg_flags; +}; + +struct cmsghdr +{ +#if __BYTE_ORDER == __BIG_ENDIAN + int __pad1; + socklen_t cmsg_len; +#else + socklen_t cmsg_len; + int __pad1; +#endif + int cmsg_level; + int cmsg_type; +}; diff --git a/arch/aarch64/bits/stat.h b/arch/aarch64/bits/stat.h new file mode 100644 index 0000000..b7f4221 --- /dev/null +++ b/arch/aarch64/bits/stat.h @@ -0,0 +1,18 @@ +struct stat { + dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + unsigned long __pad; + off_t st_size; + blksize_t st_blksize; + int __pad2; + blkcnt_t st_blocks; + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; + unsigned __unused[2]; +}; diff --git a/arch/aarch64/bits/statfs.h b/arch/aarch64/bits/statfs.h new file mode 100644 index 0000000..f103f4e --- /dev/null +++ b/arch/aarch64/bits/statfs.h @@ -0,0 +1,7 @@ +struct statfs { + unsigned long f_type, f_bsize; + fsblkcnt_t f_blocks, f_bfree, f_bavail; + fsfilcnt_t f_files, f_ffree; + fsid_t f_fsid; + unsigned long f_namelen, f_frsize, f_flags, f_spare[4]; +}; diff --git a/arch/aarch64/bits/stdarg.h b/arch/aarch64/bits/stdarg.h new file mode 100644 index 0000000..fde3781 --- /dev/null +++ b/arch/aarch64/bits/stdarg.h @@ -0,0 +1,4 @@ +#define va_start(v,l) __builtin_va_start(v,l) +#define va_end(v) __builtin_va_end(v) +#define va_arg(v,l) __builtin_va_arg(v,l) +#define va_copy(d,s) __builtin_va_copy(d,s) diff --git a/arch/aarch64/bits/stdint.h b/arch/aarch64/bits/stdint.h new file mode 100644 index 0000000..1bb147f --- /dev/null +++ b/arch/aarch64/bits/stdint.h @@ -0,0 +1,20 @@ +typedef int32_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef uint32_t uint_fast16_t; +typedef uint32_t uint_fast32_t; + +#define INT_FAST16_MIN INT32_MIN +#define INT_FAST32_MIN INT32_MIN + +#define INT_FAST16_MAX INT32_MAX +#define INT_FAST32_MAX INT32_MAX + +#define UINT_FAST16_MAX UINT32_MAX +#define UINT_FAST32_MAX UINT32_MAX + +#define INTPTR_MIN INT64_MIN +#define INTPTR_MAX INT64_MAX +#define UINTPTR_MAX UINT64_MAX +#define PTRDIFF_MIN INT64_MIN +#define PTRDIFF_MAX INT64_MAX +#define SIZE_MAX UINT64_MAX diff --git a/arch/aarch64/bits/syscall.h b/arch/aarch64/bits/syscall.h new file mode 100644 index 0000000..dc16ee1 --- /dev/null +++ b/arch/aarch64/bits/syscall.h @@ -0,0 +1,588 @@ +// TODO: generic syscall numbers for 32 vs 64bit systems +#if 1 +#define __NR_fcntl 25 +#define __NR_statfs 43 +#define __NR_fstatfs 44 +#define __NR_truncate 45 +#define __NR_ftruncate 46 +#define __NR_lseek 62 +#define __NR_sendfile 71 +#define __NR_newfstatat 79 +#define __NR_fstat 80 +#define __NR_mmap 222 +#define __NR_fadvise64 223 + +#define SYS_fcntl 25 +#define SYS_statfs 43 +#define SYS_fstatfs 44 +#define SYS_truncate 45 +#define SYS_ftruncate 46 +#define SYS_lseek 62 +#define SYS_sendfile 71 +#define SYS_newfstatat 79 +#define SYS_fstat 80 +#define SYS_mmap 222 +#define SYS_fadvise64 223 +#else +#define __NR_fcntl64 25 +#define __NR_statfs64 34 +#define __NR_fstatfs64 44 +#define __NR_truncate64 45 +#define __NR_ftruncate64 46 +#define __NR_llseek 62 +#define __NR__llseek 62 +#define __NR_sendfile64 71 +#define __NR_fstatat64 79 +#define __NR_fstat64 80 +#define __NR_mmap2 222 +#define __NR_fadvise64_64 223 + +#define SYS_fcntl64 25 +#define SYS_statfs64 34 +#define SYS_fstatfs64 44 +#define SYS_truncate64 45 +#define SYS_ftruncate64 46 +#define SYS_llseek 62 +#define SYS__llseek 62 +#define SYS_sendfile64 71 +#define SYS_fstatat64 79 +#define SYS_fstat64 80 +#define SYS_mmap2 222 +#define SYS_fadvise64_64 223 +#endif + +#define __NR_io_setup 0 +#define __NR_io_destroy 1 +#define __NR_io_submit 2 +#define __NR_io_cancel 3 +#define __NR_io_getevents 4 +#define __NR_setxattr 5 +#define __NR_lsetxattr 6 +#define __NR_fsetxattr 7 +#define __NR_getxattr 8 +#define __NR_lgetxattr 9 +#define __NR_fgetxattr 10 +#define __NR_listxattr 11 +#define __NR_llistxattr 12 +#define __NR_flistxattr 13 +#define __NR_removexattr 14 +#define __NR_lremovexattr 15 +#define __NR_fremovexattr 16 +#define __NR_getcwd 17 +#define __NR_lookup_dcookie 18 +#define __NR_eventfd2 19 +#define __NR_epoll_create1 20 +#define __NR_epoll_ctl 21 +#define __NR_epoll_pwait 22 +#define __NR_dup 23 +#define __NR_dup3 24 +//#define __NR_fcntl64 25 +#define __NR_inotify_init1 26 +#define __NR_inotify_add_watch 27 +#define __NR_inotify_rm_watch 28 +#define __NR_ioctl 29 +#define __NR_ioprio_set 30 +#define __NR_ioprio_get 31 +#define __NR_flock 32 +#define __NR_mknodat 33 +#define __NR_mkdirat 34 +#define __NR_unlinkat 35 +#define __NR_symlinkat 36 +#define __NR_linkat 37 +#define __NR_renameat 38 +#define __NR_umount2 39 +#define __NR_mount 40 +#define __NR_pivot_root 41 +#define __NR_nfsservctl 42 +//#define __NR_statfs64 43 +//#define __NR_fstatfs64 44 +//#define __NR_truncate64 45 +//#define __NR_ftruncate64 46 +#define __NR_fallocate 47 +#define __NR_faccessat 48 +#define __NR_chdir 49 +#define __NR_fchdir 50 +#define __NR_chroot 51 +#define __NR_fchmod 52 +#define __NR_fchmodat 53 +#define __NR_fchownat 54 +#define __NR_fchown 55 +#define __NR_openat 56 +#define __NR_close 57 +#define __NR_vhangup 58 +#define __NR_pipe2 59 +#define __NR_quotactl 60 +#define __NR_getdents64 61 +//#define __NR__llseek 62 +#define __NR_read 63 +#define __NR_write 64 +#define __NR_readv 65 +#define __NR_writev 66 +#define __NR_pread64 67 +#define __NR_pwrite64 68 +#define __NR_preadv 69 +#define __NR_pwritev 70 +//#define __NR_sendfile64 71 +#define __NR_pselect6 72 +#define __NR_ppoll 73 +#define __NR_signalfd4 74 +#define __NR_vmsplice 75 +#define __NR_splice 76 +#define __NR_tee 77 +#define __NR_readlinkat 78 +//#define __NR_fstatat64 79 +//#define __NR_fstat64 80 +#define __NR_sync 81 +#define __NR_fsync 82 +#define __NR_fdatasync 83 +#define __NR_sync_file_range 84 +#define __NR_timerfd_create 85 +#define __NR_timerfd_settime 86 +#define __NR_timerfd_gettime 87 +#define __NR_utimensat 88 +#define __NR_acct 89 +#define __NR_capget 90 +#define __NR_capset 91 +#define __NR_personality 92 +#define __NR_exit 93 +#define __NR_exit_group 94 +#define __NR_waitid 95 +#define __NR_set_tid_address 96 +#define __NR_unshare 97 +#define __NR_futex 98 +#define __NR_set_robust_list 99 +#define __NR_get_robust_list 100 +#define __NR_nanosleep 101 +#define __NR_getitimer 102 +#define __NR_setitimer 103 +#define __NR_kexec_load 104 +#define __NR_init_module 105 +#define __NR_delete_module 106 +#define __NR_timer_create 107 +#define __NR_timer_gettime 108 +#define __NR_timer_getoverrun 109 +#define __NR_timer_settime 110 +#define __NR_timer_delete 111 +#define __NR_clock_settime 112 +#define __NR_clock_gettime 113 +#define __NR_clock_getres 114 +#define __NR_clock_nanosleep 115 +#define __NR_syslog 116 +#define __NR_ptrace 117 +#define __NR_sched_setparam 118 +#define __NR_sched_setscheduler 119 +#define __NR_sched_getscheduler 120 +#define __NR_sched_getparam 121 +#define __NR_sched_setaffinity 122 +#define __NR_sched_getaffinity 123 +#define __NR_sched_yield 124 +#define __NR_sched_get_priority_max 125 +#define __NR_sched_get_priority_min 126 +#define __NR_sched_rr_get_interval 127 +#define __NR_restart_syscall 128 +#define __NR_kill 129 +#define __NR_tkill 130 +#define __NR_tgkill 131 +#define __NR_sigaltstack 132 +#define __NR_rt_sigsuspend 133 +#define __NR_rt_sigaction 134 +#define __NR_rt_sigprocmask 135 +#define __NR_rt_sigpending 136 +#define __NR_rt_sigtimedwait 137 +#define __NR_rt_sigqueueinfo 138 +#define __NR_rt_sigreturn 139 +#define __NR_setpriority 140 +#define __NR_getpriority 141 +#define __NR_reboot 142 +#define __NR_setregid 143 +#define __NR_setgid 144 +#define __NR_setreuid 145 +#define __NR_setuid 146 +#define __NR_setresuid 147 +#define __NR_getresuid 148 +#define __NR_setresgid 149 +#define __NR_getresgid 150 +#define __NR_setfsuid 151 +#define __NR_setfsgid 152 +#define __NR_times 153 +#define __NR_setpgid 154 +#define __NR_getpgid 155 +#define __NR_getsid 156 +#define __NR_setsid 157 +#define __NR_getgroups 158 +#define __NR_setgroups 159 +#define __NR_uname 160 +#define __NR_sethostname 161 +#define __NR_setdomainname 162 +#define __NR_getrlimit 163 +#define __NR_setrlimit 164 +#define __NR_getrusage 165 +#define __NR_umask 166 +#define __NR_prctl 167 +#define __NR_getcpu 168 +#define __NR_gettimeofday 169 +#define __NR_settimeofday 170 +#define __NR_adjtimex 171 +#define __NR_getpid 172 +#define __NR_getppid 173 +#define __NR_getuid 174 +#define __NR_geteuid 175 +#define __NR_getgid 176 +#define __NR_getegid 177 +#define __NR_gettid 178 +#define __NR_sysinfo 179 +#define __NR_mq_open 180 +#define __NR_mq_unlink 181 +#define __NR_mq_timedsend 182 +#define __NR_mq_timedreceive 183 +#define __NR_mq_notify 184 +#define __NR_mq_getsetattr 185 +#define __NR_msgget 186 +#define __NR_msgctl 187 +#define __NR_msgrcv 188 +#define __NR_msgsnd 189 +#define __NR_semget 190 +#define __NR_semctl 191 +#define __NR_semtimedop 192 +#define __NR_semop 193 +#define __NR_shmget 194 +#define __NR_shmctl 195 +#define __NR_shmat 196 +#define __NR_shmdt 197 +#define __NR_socket 198 +#define __NR_socketpair 199 +#define __NR_bind 200 +#define __NR_listen 201 +#define __NR_accept 202 +#define __NR_connect 203 +#define __NR_getsockname 204 +#define __NR_getpeername 205 +#define __NR_sendto 206 +#define __NR_recvfrom 207 +#define __NR_setsockopt 208 +#define __NR_getsockopt 209 +#define __NR_shutdown 210 +#define __NR_sendmsg 211 +#define __NR_recvmsg 212 +#define __NR_readahead 213 +#define __NR_brk 214 +#define __NR_munmap 215 +#define __NR_mremap 216 +#define __NR_add_key 217 +#define __NR_request_key 218 +#define __NR_keyctl 219 +#define __NR_clone 220 +#define __NR_execve 221 +//#define __NR_mmap2 222 +//#define __NR_fadvise64_64 223 +#define __NR_swapon 224 +#define __NR_swapoff 225 +#define __NR_mprotect 226 +#define __NR_msync 227 +#define __NR_mlock 228 +#define __NR_munlock 229 +#define __NR_mlockall 230 +#define __NR_munlockall 231 +#define __NR_mincore 232 +#define __NR_madvise 233 +#define __NR_remap_file_pages 234 +#define __NR_mbind 235 +#define __NR_get_mempolicy 236 +#define __NR_set_mempolicy 237 +#define __NR_migrate_pages 238 +#define __NR_move_pages 239 +#define __NR_rt_tgsigqueueinfo 240 +#define __NR_perf_event_open 241 +#define __NR_accept4 242 +#define __NR_recvmmsg 243 +#define __NR_or1k_atomic 244 +#define __NR_wait4 260 +#define __NR_prlimit64 261 +#define __NR_fanotify_init 262 +#define __NR_fanotify_mark 263 +#define __NR_name_to_handle_at 264 +#define __NR_open_by_handle_at 265 +#define __NR_clock_adjtime 266 +#define __NR_syncfs 267 +#define __NR_setns 268 +#define __NR_sendmmsg 269 +#define __NR_process_vm_readv 270 +#define __NR_process_vm_writev 271 +#define __NR_kcmp 272 +#define __NR_finit_module 273 +#define __NR_sched_setattr 274 +#define __NR_sched_getattr 275 +#define __NR_renameat2 276 +#define __NR_seccomp 277 +#define __NR_getrandom 278 +#define __NR_memfd_create 279 +#define __NR_bpf 280 +#define __NR_execveat 281 + +#define SYS_io_setup __NR_io_setup +#define SYS_io_destroy __NR_io_destroy +#define SYS_io_submit __NR_io_submit +#define SYS_io_cancel __NR_io_cancel +#define SYS_io_getevents __NR_io_getevents +#define SYS_setxattr __NR_setxattr +#define SYS_lsetxattr __NR_lsetxattr +#define SYS_fsetxattr __NR_fsetxattr +#define SYS_getxattr __NR_getxattr +#define SYS_lgetxattr __NR_lgetxattr +#define SYS_fgetxattr __NR_fgetxattr +#define SYS_listxattr __NR_listxattr +#define SYS_llistxattr __NR_llistxattr +#define SYS_flistxattr __NR_flistxattr +#define SYS_removexattr __NR_removexattr +#define SYS_lremovexattr __NR_lremovexattr +#define SYS_fremovexattr __NR_fremovexattr +#define SYS_getcwd __NR_getcwd +#define SYS_lookup_dcookie __NR_lookup_dcookie +#define SYS_eventfd2 __NR_eventfd2 +#define SYS_epoll_create1 __NR_epoll_create1 +#define SYS_epoll_ctl __NR_epoll_ctl +#define SYS_epoll_pwait __NR_epoll_pwait +#define SYS_dup __NR_dup +#define SYS_dup3 __NR_dup3 +//#define SYS_fcntl64 __NR_fcntl64 +#define SYS_inotify_init1 __NR_inotify_init1 +#define SYS_inotify_add_watch __NR_inotify_add_watch +#define SYS_inotify_rm_watch __NR_inotify_rm_watch +#define SYS_ioctl __NR_ioctl +#define SYS_ioprio_set __NR_ioprio_set +#define SYS_ioprio_get __NR_ioprio_get +#define SYS_flock __NR_flock +#define SYS_mknodat __NR_mknodat +#define SYS_mkdirat __NR_mkdirat +#define SYS_unlinkat __NR_unlinkat +#define SYS_symlinkat __NR_symlinkat +#define SYS_linkat __NR_linkat +#define SYS_renameat __NR_renameat +#define SYS_umount2 __NR_umount2 +#define SYS_mount __NR_mount +#define SYS_pivot_root __NR_pivot_root +#define SYS_nfsservctl __NR_nfsservctl +//#define SYS_statfs64 __NR_statfs64 +//#define SYS_fstatfs64 __NR_fstatfs64 +//#define SYS_truncate64 __NR_truncate64 +//#define SYS_ftruncate64 __NR_ftruncate64 +#define SYS_fallocate __NR_fallocate +#define SYS_faccessat __NR_faccessat +#define SYS_chdir __NR_chdir +#define SYS_fchdir __NR_fchdir +#define SYS_chroot __NR_chroot +#define SYS_fchmod __NR_fchmod +#define SYS_fchmodat __NR_fchmodat +#define SYS_fchownat __NR_fchownat +#define SYS_fchown __NR_fchown +#define SYS_openat __NR_openat +#define SYS_close __NR_close +#define SYS_vhangup __NR_vhangup +#define SYS_pipe2 __NR_pipe2 +#define SYS_quotactl __NR_quotactl +#define SYS_getdents64 __NR_getdents64 +//#define SYS__llseek __NR__llseek +#define SYS_read __NR_read +#define SYS_write __NR_write +#define SYS_readv __NR_readv +#define SYS_writev __NR_writev +#define SYS_pread64 __NR_pread64 +#define SYS_pwrite64 __NR_pwrite64 +#define SYS_preadv __NR_preadv +#define SYS_pwritev __NR_pwritev +//#define SYS_sendfile64 __NR_sendfile64 +#define SYS_pselect6 __NR_pselect6 +#define SYS_ppoll __NR_ppoll +#define SYS_signalfd4 __NR_signalfd4 +#define SYS_vmsplice __NR_vmsplice +#define SYS_splice __NR_splice +#define SYS_tee __NR_tee +#define SYS_readlinkat __NR_readlinkat +//#define SYS_fstatat64 __NR_fstatat64 +//#define SYS_fstat64 __NR_fstat64 +#define SYS_sync __NR_sync +#define SYS_fsync __NR_fsync +#define SYS_fdatasync __NR_fdatasync +#define SYS_sync_file_range __NR_sync_file_range +#define SYS_timerfd_create __NR_timerfd_create +#define SYS_timerfd_settime __NR_timerfd_settime +#define SYS_timerfd_gettime __NR_timerfd_gettime +#define SYS_utimensat __NR_utimensat +#define SYS_acct __NR_acct +#define SYS_capget __NR_capget +#define SYS_capset __NR_capset +#define SYS_personality __NR_personality +#define SYS_exit __NR_exit +#define SYS_exit_group __NR_exit_group +#define SYS_waitid __NR_waitid +#define SYS_set_tid_address __NR_set_tid_address +#define SYS_unshare __NR_unshare +#define SYS_futex __NR_futex +#define SYS_set_robust_list __NR_set_robust_list +#define SYS_get_robust_list __NR_get_robust_list +#define SYS_nanosleep __NR_nanosleep +#define SYS_getitimer __NR_getitimer +#define SYS_setitimer __NR_setitimer +#define SYS_kexec_load __NR_kexec_load +#define SYS_init_module __NR_init_module +#define SYS_delete_module __NR_delete_module +#define SYS_timer_create __NR_timer_create +#define SYS_timer_gettime __NR_timer_gettime +#define SYS_timer_getoverrun __NR_timer_getoverrun +#define SYS_timer_settime __NR_timer_settime +#define SYS_timer_delete __NR_timer_delete +#define SYS_clock_settime __NR_clock_settime +#define SYS_clock_gettime __NR_clock_gettime +#define SYS_clock_getres __NR_clock_getres +#define SYS_clock_nanosleep __NR_clock_nanosleep +#define SYS_syslog __NR_syslog +#define SYS_ptrace __NR_ptrace +#define SYS_sched_setparam __NR_sched_setparam +#define SYS_sched_setscheduler __NR_sched_setscheduler +#define SYS_sched_getscheduler __NR_sched_getscheduler +#define SYS_sched_getparam __NR_sched_getparam +#define SYS_sched_setaffinity __NR_sched_setaffinity +#define SYS_sched_getaffinity __NR_sched_getaffinity +#define SYS_sched_yield __NR_sched_yield +#define SYS_sched_get_priority_max __NR_sched_get_priority_max +#define SYS_sched_get_priority_min __NR_sched_get_priority_min +#define SYS_sched_rr_get_interval __NR_sched_rr_get_interval +#define SYS_restart_syscall __NR_restart_syscall +#define SYS_kill __NR_kill +#define SYS_tkill __NR_tkill +#define SYS_tgkill __NR_tgkill +#define SYS_sigaltstack __NR_sigaltstack +#define SYS_rt_sigsuspend __NR_rt_sigsuspend +#define SYS_rt_sigaction __NR_rt_sigaction +#define SYS_rt_sigprocmask __NR_rt_sigprocmask +#define SYS_rt_sigpending __NR_rt_sigpending +#define SYS_rt_sigtimedwait __NR_rt_sigtimedwait +#define SYS_rt_sigqueueinfo __NR_rt_sigqueueinfo +#define SYS_rt_sigreturn __NR_rt_sigreturn +#define SYS_setpriority __NR_setpriority +#define SYS_getpriority __NR_getpriority +#define SYS_reboot __NR_reboot +#define SYS_setregid __NR_setregid +#define SYS_setgid __NR_setgid +#define SYS_setreuid __NR_setreuid +#define SYS_setuid __NR_setuid +#define SYS_setresuid __NR_setresuid +#define SYS_getresuid __NR_getresuid +#define SYS_setresgid __NR_setresgid +#define SYS_getresgid __NR_getresgid +#define SYS_setfsuid __NR_setfsuid +#define SYS_setfsgid __NR_setfsgid +#define SYS_times __NR_times +#define SYS_setpgid __NR_setpgid +#define SYS_getpgid __NR_getpgid +#define SYS_getsid __NR_getsid +#define SYS_setsid __NR_setsid +#define SYS_getgroups __NR_getgroups +#define SYS_setgroups __NR_setgroups +#define SYS_uname __NR_uname +#define SYS_sethostname __NR_sethostname +#define SYS_setdomainname __NR_setdomainname +#define SYS_getrlimit __NR_getrlimit +#define SYS_setrlimit __NR_setrlimit +#define SYS_getrusage __NR_getrusage +#define SYS_umask __NR_umask +#define SYS_prctl __NR_prctl +#define SYS_getcpu __NR_getcpu +#define SYS_gettimeofday __NR_gettimeofday +#define SYS_settimeofday __NR_settimeofday +#define SYS_adjtimex __NR_adjtimex +#define SYS_getpid __NR_getpid +#define SYS_getppid __NR_getppid +#define SYS_getuid __NR_getuid +#define SYS_geteuid __NR_geteuid +#define SYS_getgid __NR_getgid +#define SYS_getegid __NR_getegid +#define SYS_gettid __NR_gettid +#define SYS_sysinfo __NR_sysinfo +#define SYS_mq_open __NR_mq_open +#define SYS_mq_unlink __NR_mq_unlink +#define SYS_mq_timedsend __NR_mq_timedsend +#define SYS_mq_timedreceive __NR_mq_timedreceive +#define SYS_mq_notify __NR_mq_notify +#define SYS_mq_getsetattr __NR_mq_getsetattr +#define SYS_msgget __NR_msgget +#define SYS_msgctl __NR_msgctl +#define SYS_msgrcv __NR_msgrcv +#define SYS_msgsnd __NR_msgsnd +#define SYS_semget __NR_semget +#define SYS_semctl __NR_semctl +#define SYS_semtimedop __NR_semtimedop +#define SYS_semop __NR_semop +#define SYS_shmget __NR_shmget +#define SYS_shmctl __NR_shmctl +#define SYS_shmat __NR_shmat +#define SYS_shmdt __NR_shmdt +#define SYS_socket __NR_socket +#define SYS_socketpair __NR_socketpair +#define SYS_bind __NR_bind +#define SYS_listen __NR_listen +#define SYS_accept __NR_accept +#define SYS_connect __NR_connect +#define SYS_getsockname __NR_getsockname +#define SYS_getpeername __NR_getpeername +#define SYS_sendto __NR_sendto +#define SYS_recvfrom __NR_recvfrom +#define SYS_setsockopt __NR_setsockopt +#define SYS_getsockopt __NR_getsockopt +#define SYS_shutdown __NR_shutdown +#define SYS_sendmsg __NR_sendmsg +#define SYS_recvmsg __NR_recvmsg +#define SYS_readahead __NR_readahead +#define SYS_brk __NR_brk +#define SYS_munmap __NR_munmap +#define SYS_mremap __NR_mremap +#define SYS_add_key __NR_add_key +#define SYS_request_key __NR_request_key +#define SYS_keyctl __NR_keyctl +#define SYS_clone __NR_clone +#define SYS_execve __NR_execve +//#define SYS_mmap2 __NR_mmap2 +//#define SYS_fadvise64_64 __NR_fadvise64_64 +#define SYS_swapon __NR_swapon +#define SYS_swapoff __NR_swapoff +#define SYS_mprotect __NR_mprotect +#define SYS_msync __NR_msync +#define SYS_mlock __NR_mlock +#define SYS_munlock __NR_munlock +#define SYS_mlockall __NR_mlockall +#define SYS_munlockall __NR_munlockall +#define SYS_mincore __NR_mincore +#define SYS_madvise __NR_madvise +#define SYS_remap_file_pages __NR_remap_file_pages +#define SYS_mbind __NR_mbind +#define SYS_get_mempolicy __NR_get_mempolicy +#define SYS_set_mempolicy __NR_set_mempolicy +#define SYS_migrate_pages __NR_migrate_pages +#define SYS_move_pages __NR_move_pages +#define SYS_rt_tgsigqueueinfo __NR_rt_tgsigqueueinfo +#define SYS_perf_event_open __NR_perf_event_open +#define SYS_accept4 __NR_accept4 +#define SYS_recvmmsg __NR_recvmmsg +#define SYS_or1k_atomic __NR_or1k_atomic +#define SYS_wait4 __NR_wait4 +#define SYS_prlimit64 __NR_prlimit64 +#define SYS_fanotify_init __NR_fanotify_init +#define SYS_fanotify_mark __NR_fanotify_mark +#define SYS_name_to_handle_at __NR_name_to_handle_at +#define SYS_open_by_handle_at __NR_open_by_handle_at +#define SYS_clock_adjtime __NR_clock_adjtime +#define SYS_syncfs __NR_syncfs +#define SYS_setns __NR_setns +#define SYS_sendmmsg __NR_sendmmsg +#define SYS_process_vm_readv __NR_process_vm_readv +#define SYS_process_vm_writev __NR_process_vm_writev +#define SYS_kcmp __NR_kcmp +#define SYS_finit_module __NR_finit_module +#define SYS_sched_setattr __NR_sched_setattr +#define SYS_sched_getattr __NR_sched_getattr +#define SYS_renameat2 __NR_renameat2 +#define SYS_seccomp __NR_seccomp +#define SYS_getrandom __NR_getrandom +#define SYS_memfd_create __NR_memfd_create +#define SYS_bpf __NR_bpf +#define SYS_execveat __NR_execveat diff --git a/arch/aarch64/bits/termios.h b/arch/aarch64/bits/termios.h new file mode 100644 index 0000000..9265d6f --- /dev/null +++ b/arch/aarch64/bits/termios.h @@ -0,0 +1,160 @@ +struct termios +{ + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[NCCS]; + speed_t __c_ispeed; + speed_t __c_ospeed; +}; + +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VTIME 5 +#define VMIN 6 +#define VSWTC 7 +#define VSTART 8 +#define VSTOP 9 +#define VSUSP 10 +#define VEOL 11 +#define VREPRINT 12 +#define VDISCARD 13 +#define VWERASE 14 +#define VLNEXT 15 +#define VEOL2 16 + +#define IGNBRK 0000001 +#define BRKINT 0000002 +#define IGNPAR 0000004 +#define PARMRK 0000010 +#define INPCK 0000020 +#define ISTRIP 0000040 +#define INLCR 0000100 +#define IGNCR 0000200 +#define ICRNL 0000400 +#define IUCLC 0001000 +#define IXON 0002000 +#define IXANY 0004000 +#define IXOFF 0010000 +#define IMAXBEL 0020000 +#define IUTF8 0040000 + +#define OPOST 0000001 +#define OLCUC 0000002 +#define ONLCR 0000004 +#define OCRNL 0000010 +#define ONOCR 0000020 +#define ONLRET 0000040 +#define OFILL 0000100 +#define OFDEL 0000200 +#define NLDLY 0000400 +#define NL0 0000000 +#define NL1 0000400 +#define CRDLY 0003000 +#define CR0 0000000 +#define CR1 0001000 +#define CR2 0002000 +#define CR3 0003000 +#define TABDLY 0014000 +#define TAB0 0000000 +#define TAB1 0004000 +#define TAB2 0010000 +#define TAB3 0014000 +#define BSDLY 0020000 +#define BS0 0000000 +#define BS1 0020000 +#define FFDLY 0100000 +#define FF0 0000000 +#define FF1 0100000 + +#define VTDLY 0040000 +#define VT0 0000000 +#define VT1 0040000 + +#define XTABS 0014000 + +#define B0 0000000 +#define B50 0000001 +#define B75 0000002 +#define B110 0000003 +#define B134 0000004 +#define B150 0000005 +#define B200 0000006 +#define B300 0000007 +#define B600 0000010 +#define B1200 0000011 +#define B1800 0000012 +#define B2400 0000013 +#define B4800 0000014 +#define B9600 0000015 +#define B19200 0000016 +#define B38400 0000017 + +#define B57600 0010001 +#define B115200 0010002 +#define B230400 0010003 +#define B460800 0010004 +#define B500000 0010005 +#define B576000 0010006 +#define B921600 0010007 +#define B1000000 0010010 +#define B1152000 0010011 +#define B1500000 0010012 +#define B2000000 0010013 +#define B2500000 0010014 +#define B3000000 0010015 +#define B3500000 0010016 +#define B4000000 0010017 + +#define CBAUD 0010017 + +#define CSIZE 0000060 +#define CS5 0000000 +#define CS6 0000020 +#define CS7 0000040 +#define CS8 0000060 +#define CSTOPB 0000100 +#define CREAD 0000200 +#define PARENB 0000400 +#define PARODD 0001000 +#define HUPCL 0002000 +#define CLOCAL 0004000 + +#define CRTSCTS 020000000000 + +#define ISIG 0000001 +#define ICANON 0000002 +#define ECHO 0000010 +#define ECHOE 0000020 +#define ECHOK 0000040 +#define ECHONL 0000100 +#define NOFLSH 0000200 +#define TOSTOP 0000400 +#define IEXTEN 0100000 + +/* Extensions? */ +#define CBAUDEX 0010000 +#define ECHOCTL 0001000 +#define ECHOPRT 0002000 +#define ECHOKE 0004000 +#define FLUSHO 0010000 +#define PENDIN 0040000 +#define EXTPROC 0200000 + +#define TCOOFF 0 +#define TCOON 1 +#define TCIOFF 2 +#define TCION 3 + +#define TCIFLUSH 0 +#define TCOFLUSH 1 +#define TCIOFLUSH 2 + +#define TCSANOW 0 +#define TCSADRAIN 1 +#define TCSAFLUSH 2 diff --git a/arch/aarch64/bits/user.h b/arch/aarch64/bits/user.h new file mode 100644 index 0000000..a7376b2 --- /dev/null +++ b/arch/aarch64/bits/user.h @@ -0,0 +1,16 @@ +struct user_regs_struct { + unsigned long long regs[31]; + unsigned long long sp; + unsigned long long pc; + unsigned long long pstate; +}; + +struct user_fpsimd_struct { + __uint128_t vregs[32]; + unsigned int fpsr; + unsigned int fpcr; +}; + +#define ELF_NREG 34 +typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NREG]; +typedef struct user_fpsimd_struct elf_fpregset_t; diff --git a/arch/aarch64/crt_arch.h b/arch/aarch64/crt_arch.h new file mode 100644 index 0000000..0835f75 --- /dev/null +++ b/arch/aarch64/crt_arch.h @@ -0,0 +1,9 @@ +__asm__( +".global _start\n" +".type _start,%function\n" +"_start:\n" +" mov x29, #0\n" +" mov x30, #0\n" +" mov x0, sp\n" +" and sp, x0, #-16\n" +" bl __cstart\n"); diff --git a/arch/aarch64/pthread_arch.h b/arch/aarch64/pthread_arch.h new file mode 100644 index 0000000..74276f4 --- /dev/null +++ b/arch/aarch64/pthread_arch.h @@ -0,0 +1,11 @@ +static inline struct pthread *__pthread_self() +{ + char *self; + __asm__ __volatile__ ("mrs %0,tpidr_el0" : "=r"(self)); + return (void*)(self + 16 - sizeof(struct pthread)); +} + +#define TLS_ABOVE_TP +#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) - 16) + +#define CANCEL_REG_IP 33 diff --git a/arch/aarch64/reloc.h b/arch/aarch64/reloc.h new file mode 100644 index 0000000..5bba91a --- /dev/null +++ b/arch/aarch64/reloc.h @@ -0,0 +1,40 @@ +#include +#include +#include + +#if __BYTE_ORDER == __BIG_ENDIAN +#define ENDIAN_SUFFIX "eb" +#else +#define ENDIAN_SUFFIX "" +#endif + +#define LDSO_ARCH "aarch64" ENDIAN_SUFFIX + +#define NO_LEGACY_INITFINI + +#define TPOFF_K 16 + +static int remap_rel(int type) +{ + switch(type) { + case R_AARCH64_ABS64: + return REL_SYMBOLIC; + case R_AARCH64_GLOB_DAT: + return REL_GOT; + case R_AARCH64_JUMP_SLOT: + return REL_PLT; + case R_AARCH64_RELATIVE: + return REL_RELATIVE; + case R_AARCH64_COPY: + return REL_COPY; + case R_AARCH64_TLS_DTPMOD64: + return REL_DTPMOD; + case R_AARCH64_TLS_DTPREL64: + return REL_DTPOFF; + case R_AARCH64_TLS_TPREL64: + return REL_TPOFF; + case R_AARCH64_TLSDESC: + return REL_TLSDESC; + } + return 0; +} diff --git a/arch/aarch64/syscall_arch.h b/arch/aarch64/syscall_arch.h new file mode 100644 index 0000000..623f00e --- /dev/null +++ b/arch/aarch64/syscall_arch.h @@ -0,0 +1,76 @@ +#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) 0, __SYSCALL_LL_E((x)) + +long (__syscall)(long, ...); + +#define __asm_syscall(...) do { \ + __asm__ __volatile__ ( "svc 0" \ + : "=r"(x0) : __VA_ARGS__ : "memory", "cc"); \ + return x0; \ + } while (0) + +static inline long __syscall0(long n) +{ + register long x8 __asm__("x8") = n; + register long x0 __asm__("x0"); + __asm_syscall("r"(x8)); +} + +static inline long __syscall1(long n, long a) +{ + register long x8 __asm__("x8") = n; + register long x0 __asm__("x0") = a; + __asm_syscall("r"(x8), "0"(x0)); +} + +static inline long __syscall2(long n, long a, long b) +{ + register long x8 __asm__("x8") = n; + register long x0 __asm__("x0") = a; + register long x1 __asm__("x1") = b; + __asm_syscall("r"(x8), "0"(x0), "r"(x1)); +} + +static inline long __syscall3(long n, long a, long b, long c) +{ + register long x8 __asm__("r8") = n; + register long x0 __asm__("r0") = a; + register long x1 __asm__("r1") = b; + register long x2 __asm__("r2") = c; + __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2)); +} + +static inline long __syscall4(long n, long a, long b, long c, long d) +{ + register long x8 __asm__("x8") = n; + register long x0 __asm__("x0") = a; + register long x1 __asm__("x1") = b; + register long x2 __asm__("x2") = c; + register long x3 __asm__("x3") = d; + __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3)); +} + +static inline long __syscall5(long n, long a, long b, long c, long d, long e) +{ + register long x8 __asm__("x8") = n; + register long x0 __asm__("x0") = a; + register long x1 __asm__("x1") = b; + register long x2 __asm__("x2") = c; + register long x3 __asm__("x3") = d; + register long x4 __asm__("x4") = e; + __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4)); +} + +static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f) +{ + register long x8 __asm__("x8") = n; + register long x0 __asm__("x0") = a; + register long x1 __asm__("x1") = b; + register long x2 __asm__("x2") = c; + register long x3 __asm__("x3") = d; + register long x4 __asm__("x4") = e; + register long x5 __asm__("x5") = f; + __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4), "r"(x5)); +} diff --git a/configure b/configure index e80fdfb..79d9914 100755 --- a/configure +++ b/configure @@ -245,6 +245,7 @@ case "$target" in # Catch these early to simplify matching for 32-bit archs mips64*|powerpc64*) fail "$0: unsupported target \"$target\"" ;; arm*) ARCH=arm ;; +aarch64*) ARCH=aarch64 ;; i?86*) ARCH=i386 ;; x86_64-x32*|x32*|x86_64*x32) ARCH=x32 ;; x86_64*) ARCH=x86_64 ;; @@ -440,6 +441,10 @@ trycppif __ARMEB__ "$t" && SUBARCH=${SUBARCH}eb trycppif __ARM_PCS_VFP "$t" && SUBARCH=${SUBARCH}hf fi +if test "$ARCH" = "aarch64" ; then +trycppif __AARCH64EB__ "$t" && SUBARCH=${SUBARCH}eb +fi + if test "$ARCH" = "mips" ; then trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" && SUBARCH=${SUBARCH}el trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf diff --git a/src/fenv/aarch64/fenv.s b/src/fenv/aarch64/fenv.s new file mode 100644 index 0000000..f0db5d9 --- /dev/null +++ b/src/fenv/aarch64/fenv.s @@ -0,0 +1,67 @@ +.global fegetround +.type fegetround,%function +fegetround: + mrs x0, fpcr + and w0, w0, #0xc00000 + ret + +.global __fesetround +.type __fesetround,%function +__fesetround: + mrs x1, fpcr + bic w1, w1, #0xc00000 + orr w1, w1, w0 + msr fpcr, x1 + mov w0, #0 + ret + +.global fetestexcept +.type fetestexcept,%function +fetestexcept: + and w0, w0, #0x1f + mrs x1, fpsr + and w0, w0, w1 + ret + +.global feclearexcept +.type feclearexcept,%function +feclearexcept: + and w0, w0, #0x1f + mrs x1, fpsr + bic w1, w1, w0 + msr fpsr, x1 + mov w0, #0 + ret + +.global feraiseexcept +.type feraiseexcept,%function +feraiseexcept: + and w0, w0, #0x1f + mrs x1, fpsr + orr w1, w1, w0 + msr fpsr, x1 + mov w0, #0 + ret + +.global fegetenv +.type fegetenv,%function +fegetenv: + mrs x1, fpcr + mrs x2, fpsr + stp w1, w2, [x0] + mov w0, #0 + ret + +// TODO preserve some bits +.global fesetenv +.type fesetenv,%function +fesetenv: + mov x1, #0 + mov x2, #0 + cmn x0, #1 + b.eq 1f + ldp w1, w2, [x0] +1: msr fpcr, x1 + msr fpsr, x2 + mov w0, #0 + ret diff --git a/src/internal/aarch64/syscall.s b/src/internal/aarch64/syscall.s new file mode 100644 index 0000000..48fac92 --- /dev/null +++ b/src/internal/aarch64/syscall.s @@ -0,0 +1,13 @@ +.global __syscall +.type __syscall,%function +__syscall: + uxtw x8,w0 + mov x0,x1 + mov x1,x2 + mov x2,x3 + mov x3,x4 + mov x4,x5 + mov x5,x6 + mov x6,x7 + svc 0 + ret diff --git a/src/internal/libm.h b/src/internal/libm.h index 88a7eb4..df86411 100644 --- a/src/internal/libm.h +++ b/src/internal/libm.h @@ -42,6 +42,20 @@ union ldshape { uint64_t hi; } i2; }; +#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __BIG_ENDIAN +union ldshape { + long double f; + struct { + uint16_t se; + uint16_t top; + uint32_t mid; + uint64_t lo; + } i; + struct { + uint64_t hi; + uint64_t lo; + } i2; +}; #else #error Unsupported long double representation #endif diff --git a/src/ldso/aarch64/dlsym.s b/src/ldso/aarch64/dlsym.s new file mode 100644 index 0000000..be2dce5 --- /dev/null +++ b/src/ldso/aarch64/dlsym.s @@ -0,0 +1,5 @@ +.global dlsym +.type dlsym,%function +dlsym: + mov x2,x30 + b __dlsym diff --git a/src/ldso/aarch64/start.s b/src/ldso/aarch64/start.s new file mode 100644 index 0000000..41d1d1e --- /dev/null +++ b/src/ldso/aarch64/start.s @@ -0,0 +1,18 @@ +.global _dlstart +_dlstart: + ldr x0,[sp] + add x1,sp,#8 + bl __dynlink + mov x1,sp + ldr x2,[x1],#8 +1: sub x2,x2,1 + ldr x3,[x1],#8 + cmn x3,#1 + b.eq 1b + add x2,x2,1 + str x3,[x1,#-8]! + str x2,[x1,#-8]! + mov sp,x1 + mov x1,x0 + mov x0,#0 + blr x1 diff --git a/src/ldso/aarch64/tlsdesc.s b/src/ldso/aarch64/tlsdesc.s new file mode 100644 index 0000000..578948f --- /dev/null +++ b/src/ldso/aarch64/tlsdesc.s @@ -0,0 +1,92 @@ +// long __tlsdesc_static(long *a) +// { +// return a[1]; +// } +.global __tlsdesc_static +.type __tlsdesc_static,@function +__tlsdesc_static: + ldr x0,[x0,#8] + ret + +// long __tlsdesc_dynamic(long *a) +// { +// struct {size_t modidx,off;} *p = (void*)a[1]; +// size_t *dtv = *(size_t**)(tp + 16 - sizeof pthread); +// if (p->modidx <= dtv[0]) +// return dtv[p->modidx] + p->off - tp; +// return __tls_get_addr(p) - tp; +// } +.global __tlsdesc_dynamic +.type __tlsdesc_dynamic,@function +__tlsdesc_dynamic: + stp x1,x2,[sp,#-32]! + stp x3,x4,[sp,#16] + mrs x1,tpidr_el0 // tp + ldr x0,[x0,#8] // p + ldr x2,[x0] // p->modidx + sub x3,x1,#288 + ldr x3,[x3] // dtv + ldr x4,[x3] // dtv[0] + cmp x2,x4 + b.hi 1f + ldr x2,[x3,x2,lsl #3] // dtv[p->modidx] + ldr x0,[x0,#8] // p->off + add x0,x0,x2 +2: sub x0,x0,x1 + ldp x3,x4,[sp,#16] + ldp x1,x2,[sp],#32 + ret + + // save all registers __tls_get_addr may clobber + // ugly because addr offset must be in [-512,509] +1: stp x29,x30,[sp,#-160]! + stp x5,x6,[sp,#16] + stp x7,x8,[sp,#32] + stp x9,x10,[sp,#48] + stp x11,x12,[sp,#64] + stp x13,x14,[sp,#80] + stp x15,x16,[sp,#96] + stp x17,x18,[sp,#112] + stp q0,q1,[sp,#128] + stp q2,q3,[sp,#-480]! + stp q4,q5,[sp,#32] + stp q6,q7,[sp,#64] + stp q8,q9,[sp,#96] + stp q10,q11,[sp,#128] + stp q12,q13,[sp,#160] + stp q14,q15,[sp,#192] + stp q16,q17,[sp,#224] + stp q18,q19,[sp,#256] + stp q20,q21,[sp,#288] + stp q22,q23,[sp,#320] + stp q24,q25,[sp,#352] + stp q26,q27,[sp,#384] + stp q28,q29,[sp,#416] + stp q30,q31,[sp,#448] + bl __tls_get_addr + mrs x1,tpidr_el0 + ldp q4,q5,[sp,#32] + ldp q6,q7,[sp,#64] + ldp q8,q9,[sp,#96] + ldp q10,q11,[sp,#128] + ldp q12,q13,[sp,#160] + ldp q14,q15,[sp,#192] + ldp q16,q17,[sp,#224] + ldp q18,q19,[sp,#256] + ldp q20,q21,[sp,#288] + ldp q22,q23,[sp,#320] + ldp q24,q25,[sp,#352] + ldp q26,q27,[sp,#384] + ldp q28,q29,[sp,#416] + ldp q30,q31,[sp,#448] + ldp q2,q3,[sp],#480 + ldp x5,x6,[sp,#16] + ldp x7,x8,[sp,#32] + ldp x9,x10,[sp,#48] + ldp x11,x12,[sp,#64] + ldp x13,x14,[sp,#80] + ldp x15,x16,[sp,#96] + ldp x17,x18,[sp,#112] + ldp q0,q1,[sp,#128] + ldp x29,x30,[sp],#160 + b 2b diff --git a/src/math/aarch64/fabs.s b/src/math/aarch64/fabs.s new file mode 100644 index 0000000..8c04d09 --- /dev/null +++ b/src/math/aarch64/fabs.s @@ -0,0 +1,6 @@ +.text +.global fabs +.type fabs,%function +fabs: + fabs d0, d0 + ret diff --git a/src/math/aarch64/fabsf.s b/src/math/aarch64/fabsf.s new file mode 100644 index 0000000..6e96dd4 --- /dev/null +++ b/src/math/aarch64/fabsf.s @@ -0,0 +1,6 @@ +.text +.global fabsf +.type fabsf,%function +fabsf: + fabs s0, s0 + ret diff --git a/src/math/aarch64/sqrt.s b/src/math/aarch64/sqrt.s new file mode 100644 index 0000000..1917e18 --- /dev/null +++ b/src/math/aarch64/sqrt.s @@ -0,0 +1,6 @@ +.text +.global sqrt +.type sqrt,%function +sqrt: + fsqrt d0, d0 + ret diff --git a/src/math/aarch64/sqrtf.s b/src/math/aarch64/sqrtf.s new file mode 100644 index 0000000..1639497 --- /dev/null +++ b/src/math/aarch64/sqrtf.s @@ -0,0 +1,6 @@ +.text +.global sqrtf +.type sqrtf,%function +sqrtf: + fsqrt s0, s0 + ret diff --git a/src/math/logl.c b/src/math/logl.c index 03c5188..5d53659 100644 --- a/src/math/logl.c +++ b/src/math/logl.c @@ -166,4 +166,10 @@ long double logl(long double x) z = z + e * C1; /* This sum has an error of 1/2 lsb. */ return z; } +#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 +// TODO: broken implementation to make things compile +long double logl(long double x) +{ + return log(x); +} #endif diff --git a/src/math/powl.c b/src/math/powl.c index ce6274c..a765706 100644 --- a/src/math/powl.c +++ b/src/math/powl.c @@ -513,5 +513,10 @@ static long double powil(long double x, int nn) y = 1.0/y; return y; } - +#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 +// TODO: broken implementation to make things compile +long double powl(long double x, long double y) +{ + return pow(x, y); +} #endif diff --git a/src/setjmp/aarch64/longjmp.s b/src/setjmp/aarch64/longjmp.s new file mode 100644 index 0000000..7c4655f --- /dev/null +++ b/src/setjmp/aarch64/longjmp.s @@ -0,0 +1,24 @@ +.global _longjmp +.global longjmp +.type _longjmp,%function +.type longjmp,%function +_longjmp: +longjmp: + // IHI0055B_aapcs64.pdf 5.1.1, 5.1.2 callee saved registers + ldp x19, x20, [x0,#0] + ldp x21, x22, [x0,#16] + ldp x23, x24, [x0,#32] + ldp x25, x26, [x0,#48] + ldp x27, x28, [x0,#64] + ldp x29, x30, [x0,#80] + ldr x2, [x0,#104] + mov sp, x2 + ldp d8 , d9, [x0,#112] + ldp d10, d11, [x0,#128] + ldp d12, d13, [x0,#144] + ldp d14, d15, [x0,#160] + + mov x0, x1 + cbnz x1, 1f + mov x0, #1 +1: br x30 diff --git a/src/setjmp/aarch64/setjmp.s b/src/setjmp/aarch64/setjmp.s new file mode 100644 index 0000000..f49288a --- /dev/null +++ b/src/setjmp/aarch64/setjmp.s @@ -0,0 +1,24 @@ +.global __setjmp +.global _setjmp +.global setjmp +.type __setjmp,@function +.type _setjmp,@function +.type setjmp,@function +__setjmp: +_setjmp: +setjmp: + // IHI0055B_aapcs64.pdf 5.1.1, 5.1.2 callee saved registers + stp x19, x20, [x0,#0] + stp x21, x22, [x0,#16] + stp x23, x24, [x0,#32] + stp x25, x26, [x0,#48] + stp x27, x28, [x0,#64] + stp x29, x30, [x0,#80] + mov x2, sp + str x2, [x0,#104] + stp d8, d9, [x0,#112] + stp d10, d11, [x0,#128] + stp d12, d13, [x0,#144] + stp d14, d15, [x0,#160] + mov x0, #0 + ret diff --git a/src/signal/aarch64/restore.s b/src/signal/aarch64/restore.s new file mode 100644 index 0000000..d3d0243 --- /dev/null +++ b/src/signal/aarch64/restore.s @@ -0,0 +1,8 @@ +.global __restore +.type __restore,%function +__restore: +.global __restore_rt +.type __restore_rt,%function +__restore_rt: + mov x8,#139 // SYS_rt_sigreturn + svc 0 diff --git a/src/signal/aarch64/sigsetjmp.s b/src/signal/aarch64/sigsetjmp.s new file mode 100644 index 0000000..e0f83f0 --- /dev/null +++ b/src/signal/aarch64/sigsetjmp.s @@ -0,0 +1,19 @@ +.global sigsetjmp +.global __sigsetjmp +.type sigsetjmp,%function +.type __sigsetjmp,%function +sigsetjmp: +__sigsetjmp: + str x1,[x0,#176] + cbz x1,setjmp + + // TODO errno? + // sigprocmask(SIG_SETMASK, 0, (sigset_t*)buf->__ss); + stp x0,x30,[sp,#-16]! + add x2,x0,#184 + mov x1,#0 + mov x0,#2 + bl sigprocmask + ldp x0,x30,[sp],#16 + + b setjmp diff --git a/src/thread/aarch64/__set_thread_area.s b/src/thread/aarch64/__set_thread_area.s new file mode 100644 index 0000000..97a80ac --- /dev/null +++ b/src/thread/aarch64/__set_thread_area.s @@ -0,0 +1,6 @@ +.global __set_thread_area +.type __set_thread_area,@function +__set_thread_area: + msr tpidr_el0,x0 + mov w0,#0 + ret diff --git a/src/thread/aarch64/__unmapself.s b/src/thread/aarch64/__unmapself.s new file mode 100644 index 0000000..2c5d254 --- /dev/null +++ b/src/thread/aarch64/__unmapself.s @@ -0,0 +1,7 @@ +.global __unmapself +.type __unmapself,%function +__unmapself: + mov x8,#215 // SYS_munmap + svc 0 + mov x8,#93 // SYS_exit + svc 0 diff --git a/src/thread/aarch64/clone.s b/src/thread/aarch64/clone.s new file mode 100644 index 0000000..50af913 --- /dev/null +++ b/src/thread/aarch64/clone.s @@ -0,0 +1,29 @@ +// __clone(func, stack, flags, arg, ptid, tls, ctid) +// x0, x1, w2, x3, x4, x5, x6 + +// syscall(SYS_clone, flags, stack, ptid, tls, ctid) +// x8, x0, x1, x2, x3, x4 + +.global __clone +.type __clone,%function +__clone: + // align stack and save func,arg + and x1,x1,#-16 + stp x0,x3,[x1,#-16]! + + // syscall + uxtw x0,w2 + mov x2,x4 + mov x3,x5 + mov x4,x6 + mov x8,#220 // SYS_clone + svc #0 + + cbz x0,1f + // parent + ret + // child +1: ldp x1,x0,[sp],#16 + blr x1 + mov x8,#93 // SYS_exit + svc #0 diff --git a/src/thread/aarch64/syscall_cp.s b/src/thread/aarch64/syscall_cp.s new file mode 100644 index 0000000..774c266 --- /dev/null +++ b/src/thread/aarch64/syscall_cp.s @@ -0,0 +1,24 @@ +// __syscall_cp_asm(&self->cancel, nr, u, v, w, x, y, z) +// x0 x1 x2 x3 x4 x5 x6 x7 + +// syscall(nr, u, v, w, x, y, z) +// x8 x0 x1 x2 x3 x4 x5 + +.global __syscall_cp_asm +.type __syscall_cp_asm,%function +__syscall_cp_asm: +.global __cp_begin +__cp_begin: + ldr w0,[x0] + cbnz w0,__cancel + mov x8,x1 + mov x0,x2 + mov x1,x3 + mov x2,x4 + mov x3,x5 + mov x4,x6 + mov x5,x7 + svc 0 +.global __cp_end +__cp_end: + ret -- 1.7.9.5