diff options
Diffstat (limited to '')
30 files changed, 1216 insertions, 0 deletions
diff --git a/libc-top-half/musl/arch/x32/atomic_arch.h b/libc-top-half/musl/arch/x32/atomic_arch.h new file mode 100644 index 0000000..918c2d4 --- /dev/null +++ b/libc-top-half/musl/arch/x32/atomic_arch.h @@ -0,0 +1,121 @@ +#define a_cas a_cas +static inline int a_cas(volatile int *p, int t, int s) +{ + __asm__ __volatile__ ( + "lock ; cmpxchg %3, %1" + : "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" ); + return t; +} + +#define a_swap a_swap +static inline int a_swap(volatile int *p, int v) +{ + __asm__ __volatile__( + "xchg %0, %1" + : "=r"(v), "=m"(*p) : "0"(v) : "memory" ); + return v; +} + +#define a_fetch_add a_fetch_add +static inline int a_fetch_add(volatile int *p, int v) +{ + __asm__ __volatile__( + "lock ; xadd %0, %1" + : "=r"(v), "=m"(*p) : "0"(v) : "memory" ); + return v; +} + +#define a_and a_and +static inline void a_and(volatile int *p, int v) +{ + __asm__ __volatile__( + "lock ; and %1, %0" + : "=m"(*p) : "r"(v) : "memory" ); +} + +#define a_or a_or +static inline void a_or(volatile int *p, int v) +{ + __asm__ __volatile__( + "lock ; or %1, %0" + : "=m"(*p) : "r"(v) : "memory" ); +} + +#define a_and_64 a_and_64 +static inline void a_and_64(volatile uint64_t *p, uint64_t v) +{ + __asm__ __volatile( + "lock ; and %1, %0" + : "=m"(*p) : "r"(v) : "memory" ); +} + +#define a_or_64 a_or_64 +static inline void a_or_64(volatile uint64_t *p, uint64_t v) +{ + __asm__ __volatile__( + "lock ; or %1, %0" + : "=m"(*p) : "r"(v) : "memory" ); +} + +#define a_inc a_inc +static inline void a_inc(volatile int *p) +{ + __asm__ __volatile__( + "lock ; incl %0" + : "=m"(*p) : "m"(*p) : "memory" ); +} + +#define a_dec a_dec +static inline void a_dec(volatile int *p) +{ + __asm__ __volatile__( + "lock ; decl %0" + : "=m"(*p) : "m"(*p) : "memory" ); +} + +#define a_store a_store +static inline void a_store(volatile int *p, int x) +{ + __asm__ __volatile__( + "mov %1, %0 ; lock ; orl $0,(%%rsp)" + : "=m"(*p) : "r"(x) : "memory" ); +} + +#define a_barrier a_barrier +static inline void a_barrier() +{ + __asm__ __volatile__( "" : : : "memory" ); +} + +#define a_spin a_spin +static inline void a_spin() +{ + __asm__ __volatile__( "pause" : : : "memory" ); +} + +#define a_crash a_crash +static inline void a_crash() +{ + __asm__ __volatile__( "hlt" : : : "memory" ); +} + +#define a_ctz_64 a_ctz_64 +static inline int a_ctz_64(uint64_t x) +{ + __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) ); + return x; +} + +#define a_ctz_32 a_ctz_32 +static inline int a_ctz_32(uint32_t x) +{ + __asm__( "bsf %1,%0" : "=r"(x) : "r"(x) ); + return x; +} + +#define a_clz_64 a_clz_64 +static inline int a_clz_64(uint64_t x) +{ + __asm__( "bsr %1,%0 ; xor $63,%0" : "=r"(x) : "r"(x) ); + return x; +} diff --git a/libc-top-half/musl/arch/x32/bits/alltypes.h.in b/libc-top-half/musl/arch/x32/bits/alltypes.h.in new file mode 100644 index 0000000..9f9d241 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/alltypes.h.in @@ -0,0 +1,24 @@ +#define _Addr int +#define _Int64 long long +#define _Reg long long + +#define __BYTE_ORDER 1234 +#define __LONG_MAX 0x7fffffffL + +#ifndef __cplusplus +#ifdef __WCHAR_TYPE__ +TYPEDEF __WCHAR_TYPE__ wchar_t; +#else +TYPEDEF long wchar_t; +#endif +#endif + +#if defined(__FLT_EVAL_METHOD__) && __FLT_EVAL_METHOD__ == 2 +TYPEDEF long double float_t; +TYPEDEF long double double_t; +#else +TYPEDEF float float_t; +TYPEDEF double double_t; +#endif + +TYPEDEF struct { long long __ll; long double __ld; } max_align_t; diff --git a/libc-top-half/musl/arch/x32/bits/fcntl.h b/libc-top-half/musl/arch/x32/bits/fcntl.h new file mode 100644 index 0000000..08627f8 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/fcntl.h @@ -0,0 +1,40 @@ +#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 0200000 +#define O_NOFOLLOW 0400000 +#define O_CLOEXEC 02000000 + +#define O_ASYNC 020000 +#define O_DIRECT 040000 +#define O_LARGEFILE 0100000 +#define O_NOATIME 01000000 +#define O_PATH 010000000 +#define O_TMPFILE 020200000 +#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_SETOWN 8 +#define F_GETOWN 9 +#define F_SETSIG 10 +#define F_GETSIG 11 + +#define F_GETLK 5 +#define F_SETLK 6 +#define F_SETLKW 7 + +#define F_SETOWN_EX 15 +#define F_GETOWN_EX 16 + +#define F_GETOWNER_UIDS 17 diff --git a/libc-top-half/musl/arch/x32/bits/fenv.h b/libc-top-half/musl/arch/x32/bits/fenv.h new file mode 100644 index 0000000..24df041 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/fenv.h @@ -0,0 +1,34 @@ +#define FE_INVALID 1 +#define __FE_DENORM 2 +#define FE_DIVBYZERO 4 +#define FE_OVERFLOW 8 +#define FE_UNDERFLOW 16 +#define FE_INEXACT 32 + +#define FE_ALL_EXCEPT 63 + +#define FE_TONEAREST 0 +#define FE_DOWNWARD 0x400 +#define FE_UPWARD 0x800 +#define FE_TOWARDZERO 0xc00 + +typedef unsigned short fexcept_t; + +typedef struct { + unsigned short __control_word; + unsigned short __unused1; + unsigned short __status_word; + unsigned short __unused2; + unsigned short __tags; + unsigned short __unused3; + unsigned int __eip; + unsigned short __cs_selector; + unsigned int __opcode:11; + unsigned int __unused4:5; + unsigned int __data_offset; + unsigned short __data_selector; + unsigned short __unused5; + unsigned int __mxcsr; +} fenv_t; + +#define FE_DFL_ENV ((const fenv_t *) -1) diff --git a/libc-top-half/musl/arch/x32/bits/float.h b/libc-top-half/musl/arch/x32/bits/float.h new file mode 100644 index 0000000..4d8e786 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/float.h @@ -0,0 +1,20 @@ +#ifdef __FLT_EVAL_METHOD__ +#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ +#else +#define FLT_EVAL_METHOD 0 +#endif + +#define LDBL_TRUE_MIN 3.6451995318824746025e-4951L +#define LDBL_MIN 3.3621031431120935063e-4932L +#define LDBL_MAX 1.1897314953572317650e+4932L +#define LDBL_EPSILON 1.0842021724855044340e-19L + +#define LDBL_MANT_DIG 64 +#define LDBL_MIN_EXP (-16381) +#define LDBL_MAX_EXP 16384 + +#define LDBL_DIG 18 +#define LDBL_MIN_10_EXP (-4931) +#define LDBL_MAX_10_EXP 4932 + +#define DECIMAL_DIG 21 diff --git a/libc-top-half/musl/arch/x32/bits/io.h b/libc-top-half/musl/arch/x32/bits/io.h new file mode 100644 index 0000000..dd5bddc --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/io.h @@ -0,0 +1,77 @@ +static __inline void outb(unsigned char __val, unsigned short __port) +{ + __asm__ volatile ("outb %0,%1" : : "a" (__val), "dN" (__port)); +} + +static __inline void outw(unsigned short __val, unsigned short __port) +{ + __asm__ volatile ("outw %0,%1" : : "a" (__val), "dN" (__port)); +} + +static __inline void outl(unsigned int __val, unsigned short __port) +{ + __asm__ volatile ("outl %0,%1" : : "a" (__val), "dN" (__port)); +} + +static __inline unsigned char inb(unsigned short __port) +{ + unsigned char __val; + __asm__ volatile ("inb %1,%0" : "=a" (__val) : "dN" (__port)); + return __val; +} + +static __inline unsigned short inw(unsigned short __port) +{ + unsigned short __val; + __asm__ volatile ("inw %1,%0" : "=a" (__val) : "dN" (__port)); + return __val; +} + +static __inline unsigned int inl(unsigned short __port) +{ + unsigned int __val; + __asm__ volatile ("inl %1,%0" : "=a" (__val) : "dN" (__port)); + return __val; +} + +static __inline void outsb(unsigned short __port, const void *__buf, unsigned long __n) +{ + __asm__ volatile ("cld; rep; outsb" + : "+S" (__buf), "+c" (__n) + : "d" (__port)); +} + +static __inline void outsw(unsigned short __port, const void *__buf, unsigned long __n) +{ + __asm__ volatile ("cld; rep; outsw" + : "+S" (__buf), "+c" (__n) + : "d" (__port)); +} + +static __inline void outsl(unsigned short __port, const void *__buf, unsigned long __n) +{ + __asm__ volatile ("cld; rep; outsl" + : "+S" (__buf), "+c"(__n) + : "d" (__port)); +} + +static __inline void insb(unsigned short __port, void *__buf, unsigned long __n) +{ + __asm__ volatile ("cld; rep; insb" + : "+D" (__buf), "+c" (__n) + : "d" (__port)); +} + +static __inline void insw(unsigned short __port, void *__buf, unsigned long __n) +{ + __asm__ volatile ("cld; rep; insw" + : "+D" (__buf), "+c" (__n) + : "d" (__port)); +} + +static __inline void insl(unsigned short __port, void *__buf, unsigned long __n) +{ + __asm__ volatile ("cld; rep; insl" + : "+D" (__buf), "+c" (__n) + : "d" (__port)); +} diff --git a/libc-top-half/musl/arch/x32/bits/ioctl_fix.h b/libc-top-half/musl/arch/x32/bits/ioctl_fix.h new file mode 100644 index 0000000..83b957b --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/ioctl_fix.h @@ -0,0 +1,4 @@ +#undef SIOCGSTAMP +#undef SIOCGSTAMPNS +#define SIOCGSTAMP 0x8906 +#define SIOCGSTAMPNS 0x8907 diff --git a/libc-top-half/musl/arch/x32/bits/ipc.h b/libc-top-half/musl/arch/x32/bits/ipc.h new file mode 100644 index 0000000..a12380f --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/ipc.h @@ -0,0 +1,11 @@ +struct ipc_perm { + key_t __ipc_perm_key; + uid_t uid; + gid_t gid; + uid_t cuid; + gid_t cgid; + mode_t mode; + int __ipc_perm_seq; + long long __pad1; + long long __pad2; +}; diff --git a/libc-top-half/musl/arch/x32/bits/limits.h b/libc-top-half/musl/arch/x32/bits/limits.h new file mode 100644 index 0000000..07743b6 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/limits.h @@ -0,0 +1 @@ +#define PAGESIZE 4096 diff --git a/libc-top-half/musl/arch/x32/bits/mman.h b/libc-top-half/musl/arch/x32/bits/mman.h new file mode 100644 index 0000000..ba2d6f7 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/mman.h @@ -0,0 +1 @@ +#define MAP_32BIT 0x40 diff --git a/libc-top-half/musl/arch/x32/bits/msg.h b/libc-top-half/musl/arch/x32/bits/msg.h new file mode 100644 index 0000000..63ae987 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/msg.h @@ -0,0 +1,15 @@ +struct msqid_ds { + struct ipc_perm msg_perm; + time_t msg_stime; + time_t msg_rtime; + time_t msg_ctime; + unsigned long msg_cbytes; + long __unused1; + msgqnum_t msg_qnum; + long __unused2; + msglen_t msg_qbytes; + long __unused3; + pid_t msg_lspid; + pid_t msg_lrpid; + unsigned long long __unused[2]; +}; diff --git a/libc-top-half/musl/arch/x32/bits/posix.h b/libc-top-half/musl/arch/x32/bits/posix.h new file mode 100644 index 0000000..30a3871 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/posix.h @@ -0,0 +1,2 @@ +#define _POSIX_V6_ILP32_OFFBIG 1 +#define _POSIX_V7_ILP32_OFFBIG 1 diff --git a/libc-top-half/musl/arch/x32/bits/ptrace.h b/libc-top-half/musl/arch/x32/bits/ptrace.h new file mode 100644 index 0000000..7f8a09b --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/ptrace.h @@ -0,0 +1,13 @@ +#define PTRACE_GET_THREAD_AREA 25 +#define PTRACE_SET_THREAD_AREA 26 +#define PTRACE_ARCH_PRCTL 30 +#define PTRACE_SYSEMU 31 +#define PTRACE_SYSEMU_SINGLESTEP 32 +#define PTRACE_SINGLEBLOCK 33 + +#define PT_GET_THREAD_AREA PTRACE_GET_THREAD_AREA +#define PT_SET_THREAD_AREA PTRACE_SET_THREAD_AREA +#define PT_ARCH_PRCTL PTRACE_ARCH_PRCTL +#define PT_SYSEMU PTRACE_SYSEMU +#define PT_SYSEMU_SINGLESTEP PTRACE_SYSEMU_SINGLESTEP +#define PT_STEPBLOCK PTRACE_SINGLEBLOCK diff --git a/libc-top-half/musl/arch/x32/bits/reg.h b/libc-top-half/musl/arch/x32/bits/reg.h new file mode 100644 index 0000000..5faaef1 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/reg.h @@ -0,0 +1,29 @@ +#undef __WORDSIZE +#define __WORDSIZE 32 +#define R15 0 +#define R14 1 +#define R13 2 +#define R12 3 +#define RBP 4 +#define RBX 5 +#define R11 6 +#define R10 7 +#define R9 8 +#define R8 9 +#define RAX 10 +#define RCX 11 +#define RDX 12 +#define RSI 13 +#define RDI 14 +#define ORIG_RAX 15 +#define RIP 16 +#define CS 17 +#define EFLAGS 18 +#define RSP 19 +#define SS 20 +#define FS_BASE 21 +#define GS_BASE 22 +#define DS 23 +#define ES 24 +#define FS 25 +#define GS 26 diff --git a/libc-top-half/musl/arch/x32/bits/sem.h b/libc-top-half/musl/arch/x32/bits/sem.h new file mode 100644 index 0000000..18745f4 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/sem.h @@ -0,0 +1,11 @@ +struct semid_ds { + struct ipc_perm sem_perm; + time_t sem_otime; + long long __unused1; + time_t sem_ctime; + long long __unused2; + unsigned short sem_nsems; + char __sem_nsems_pad[sizeof(long long)-sizeof(short)]; + long long __unused3; + long long __unused4; +}; diff --git a/libc-top-half/musl/arch/x32/bits/setjmp.h b/libc-top-half/musl/arch/x32/bits/setjmp.h new file mode 100644 index 0000000..a9262a6 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/setjmp.h @@ -0,0 +1 @@ +typedef unsigned long long __jmp_buf[8]; diff --git a/libc-top-half/musl/arch/x32/bits/shm.h b/libc-top-half/musl/arch/x32/bits/shm.h new file mode 100644 index 0000000..fa88c1e --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/shm.h @@ -0,0 +1,32 @@ +#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 __pad0; + unsigned long long __pad1; + unsigned long long __pad2; +}; + +struct shminfo { + unsigned long shmmax, __pad0, shmmin, __pad1, shmmni, __pad2, + shmseg, __pad3, shmall, __pad4; + unsigned long long __unused[4]; +}; + +struct shm_info { + int __used_ids; + int __pad_ids; + unsigned long shm_tot, __pad0, shm_rss, __pad1, shm_swp, __pad2; + unsigned long __swap_attempts, __pad3, __swap_successes, __pad4; +} +#ifdef __GNUC__ +__attribute__((__aligned__(8))) +#endif +; diff --git a/libc-top-half/musl/arch/x32/bits/signal.h b/libc-top-half/musl/arch/x32/bits/signal.h new file mode 100644 index 0000000..097be6f --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/signal.h @@ -0,0 +1,153 @@ +#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) + +#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 +#endif + +#ifdef _GNU_SOURCE +enum { REG_R8 = 0 }; +#define REG_R8 REG_R8 +enum { REG_R9 = 1 }; +#define REG_R9 REG_R9 +enum { REG_R10 = 2 }; +#define REG_R10 REG_R10 +enum { REG_R11 = 3 }; +#define REG_R11 REG_R11 +enum { REG_R12 = 4 }; +#define REG_R12 REG_R12 +enum { REG_R13 = 5 }; +#define REG_R13 REG_R13 +enum { REG_R14 = 6 }; +#define REG_R14 REG_R14 +enum { REG_R15 = 7 }; +#define REG_R15 REG_R15 +enum { REG_RDI = 8 }; +#define REG_RDI REG_RDI +enum { REG_RSI = 9 }; +#define REG_RSI REG_RSI +enum { REG_RBP = 10 }; +#define REG_RBP REG_RBP +enum { REG_RBX = 11 }; +#define REG_RBX REG_RBX +enum { REG_RDX = 12 }; +#define REG_RDX REG_RDX +enum { REG_RAX = 13 }; +#define REG_RAX REG_RAX +enum { REG_RCX = 14 }; +#define REG_RCX REG_RCX +enum { REG_RSP = 15 }; +#define REG_RSP REG_RSP +enum { REG_RIP = 16 }; +#define REG_RIP REG_RIP +enum { REG_EFL = 17 }; +#define REG_EFL REG_EFL +enum { REG_CSGSFS = 18 }; +#define REG_CSGSFS REG_CSGSFS +enum { REG_ERR = 19 }; +#define REG_ERR REG_ERR +enum { REG_TRAPNO = 20 }; +#define REG_TRAPNO REG_TRAPNO +enum { REG_OLDMASK = 21 }; +#define REG_OLDMASK REG_OLDMASK +enum { REG_CR2 = 22 }; +#define REG_CR2 REG_CR2 +#endif + +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +typedef long long greg_t, gregset_t[23]; +typedef struct _fpstate { + unsigned short cwd, swd, ftw, fop; + unsigned long long rip, rdp; + unsigned mxcsr, mxcr_mask; + struct { + unsigned short significand[4], exponent, padding[3]; + } _st[8]; + struct { + unsigned element[4]; + } _xmm[16]; + unsigned padding[24]; +} *fpregset_t; +struct sigcontext { + unsigned long long r8, r9, r10, r11, r12, r13, r14, r15; + unsigned long long rdi, rsi, rbp, rbx, rdx, rax, rcx, rsp, rip, eflags; + unsigned short cs, gs, fs, __pad0; + unsigned long long err, trapno, oldmask, cr2; + struct _fpstate *fpstate; + unsigned long long __reserved1[8]; +}; +typedef struct { + gregset_t gregs; + fpregset_t fpregs; + unsigned long long __reserved1[8]; +} mcontext_t; +#else +typedef struct { + unsigned long long __space[32]; +} 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; + mcontext_t uc_mcontext; + sigset_t uc_sigmask; + unsigned long long __fpregs_mem[64]; +} 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/libc-top-half/musl/arch/x32/bits/socket.h b/libc-top-half/musl/arch/x32/bits/socket.h new file mode 100644 index 0000000..8d83001 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/socket.h @@ -0,0 +1,5 @@ +#define SO_RCVTIMEO 20 +#define SO_SNDTIMEO 21 +#define SO_TIMESTAMP 29 +#define SO_TIMESTAMPNS 35 +#define SO_TIMESTAMPING 37 diff --git a/libc-top-half/musl/arch/x32/bits/stat.h b/libc-top-half/musl/arch/x32/bits/stat.h new file mode 100644 index 0000000..1f3aa1e --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/stat.h @@ -0,0 +1,22 @@ +/* copied from kernel definition, but with padding replaced + * by the corresponding correctly-sized userspace types. */ + +struct stat { + dev_t st_dev; + ino_t st_ino; + nlink_t st_nlink; + + mode_t st_mode; + uid_t st_uid; + gid_t st_gid; + unsigned int __pad0; + dev_t st_rdev; + off_t st_size; + blksize_t st_blksize; + blkcnt_t st_blocks; + + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; + long long __unused[3]; +}; diff --git a/libc-top-half/musl/arch/x32/bits/statfs.h b/libc-top-half/musl/arch/x32/bits/statfs.h new file mode 100644 index 0000000..79aec35 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/statfs.h @@ -0,0 +1,9 @@ +struct statfs { + unsigned long f_type, __pad0, f_bsize, __pad1; + fsblkcnt_t f_blocks, f_bfree, f_bavail; + fsfilcnt_t f_files, f_ffree; + fsid_t f_fsid; + unsigned long f_namelen, __pad2, f_frsize, __pad3; + unsigned long f_flags, __pad4; + unsigned long long f_spare[4]; +}; diff --git a/libc-top-half/musl/arch/x32/bits/stdint.h b/libc-top-half/musl/arch/x32/bits/stdint.h new file mode 100644 index 0000000..d1b2712 --- /dev/null +++ b/libc-top-half/musl/arch/x32/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 INT32_MIN +#define INTPTR_MAX INT32_MAX +#define UINTPTR_MAX UINT32_MAX +#define PTRDIFF_MIN INT32_MIN +#define PTRDIFF_MAX INT32_MAX +#define SIZE_MAX UINT32_MAX diff --git a/libc-top-half/musl/arch/x32/bits/syscall.h.in b/libc-top-half/musl/arch/x32/bits/syscall.h.in new file mode 100644 index 0000000..5d22fa1 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/syscall.h.in @@ -0,0 +1,349 @@ +#define __NR_read (0x40000000 + 0) +#define __NR_write (0x40000000 + 1) +#define __NR_open (0x40000000 + 2) +#define __NR_close (0x40000000 + 3) +#define __NR_stat (0x40000000 + 4) +#define __NR_fstat (0x40000000 + 5) +#define __NR_lstat (0x40000000 + 6) +#define __NR_poll (0x40000000 + 7) +#define __NR_lseek (0x40000000 + 8) +#define __NR_mmap (0x40000000 + 9) +#define __NR_mprotect (0x40000000 + 10) +#define __NR_munmap (0x40000000 + 11) +#define __NR_brk (0x40000000 + 12) +#define __NR_rt_sigprocmask (0x40000000 + 14) +#define __NR_pread64 (0x40000000 + 17) +#define __NR_pwrite64 (0x40000000 + 18) +#define __NR_access (0x40000000 + 21) +#define __NR_pipe (0x40000000 + 22) +#define __NR_select (0x40000000 + 23) +#define __NR_sched_yield (0x40000000 + 24) +#define __NR_mremap (0x40000000 + 25) +#define __NR_msync (0x40000000 + 26) +#define __NR_mincore (0x40000000 + 27) +#define __NR_madvise (0x40000000 + 28) +#define __NR_shmget (0x40000000 + 29) +#define __NR_shmat (0x40000000 + 30) +#define __NR_shmctl (0x40000000 + 31) +#define __NR_dup (0x40000000 + 32) +#define __NR_dup2 (0x40000000 + 33) +#define __NR_pause (0x40000000 + 34) +#define __NR_nanosleep (0x40000000 + 35) +#define __NR_getitimer (0x40000000 + 36) +#define __NR_alarm (0x40000000 + 37) +#define __NR_setitimer (0x40000000 + 38) +#define __NR_getpid (0x40000000 + 39) +#define __NR_sendfile (0x40000000 + 40) +#define __NR_socket (0x40000000 + 41) +#define __NR_connect (0x40000000 + 42) +#define __NR_accept (0x40000000 + 43) +#define __NR_sendto (0x40000000 + 44) +#define __NR_shutdown (0x40000000 + 48) +#define __NR_bind (0x40000000 + 49) +#define __NR_listen (0x40000000 + 50) +#define __NR_getsockname (0x40000000 + 51) +#define __NR_getpeername (0x40000000 + 52) +#define __NR_socketpair (0x40000000 + 53) +#define __NR_clone (0x40000000 + 56) +#define __NR_fork (0x40000000 + 57) +#define __NR_vfork (0x40000000 + 58) +#define __NR_exit (0x40000000 + 60) +#define __NR_wait4 (0x40000000 + 61) +#define __NR_kill (0x40000000 + 62) +#define __NR_uname (0x40000000 + 63) +#define __NR_semget (0x40000000 + 64) +#define __NR_semop (0x40000000 + 65) +#define __NR_semctl (0x40000000 + 66) +#define __NR_shmdt (0x40000000 + 67) +#define __NR_msgget (0x40000000 + 68) +#define __NR_msgsnd (0x40000000 + 69) +#define __NR_msgrcv (0x40000000 + 70) +#define __NR_msgctl (0x40000000 + 71) +#define __NR_fcntl (0x40000000 + 72) +#define __NR_flock (0x40000000 + 73) +#define __NR_fsync (0x40000000 + 74) +#define __NR_fdatasync (0x40000000 + 75) +#define __NR_truncate (0x40000000 + 76) +#define __NR_ftruncate (0x40000000 + 77) +#define __NR_getdents (0x40000000 + 78) +#define __NR_getcwd (0x40000000 + 79) +#define __NR_chdir (0x40000000 + 80) +#define __NR_fchdir (0x40000000 + 81) +#define __NR_rename (0x40000000 + 82) +#define __NR_mkdir (0x40000000 + 83) +#define __NR_rmdir (0x40000000 + 84) +#define __NR_creat (0x40000000 + 85) +#define __NR_link (0x40000000 + 86) +#define __NR_unlink (0x40000000 + 87) +#define __NR_symlink (0x40000000 + 88) +#define __NR_readlink (0x40000000 + 89) +#define __NR_chmod (0x40000000 + 90) +#define __NR_fchmod (0x40000000 + 91) +#define __NR_chown (0x40000000 + 92) +#define __NR_fchown (0x40000000 + 93) +#define __NR_lchown (0x40000000 + 94) +#define __NR_umask (0x40000000 + 95) +#define __NR_gettimeofday (0x40000000 + 96) +#define __NR_getrlimit (0x40000000 + 97) +#define __NR_getrusage (0x40000000 + 98) +#define __NR_sysinfo (0x40000000 + 99) +#define __NR_times (0x40000000 + 100) +#define __NR_getuid (0x40000000 + 102) +#define __NR_syslog (0x40000000 + 103) +#define __NR_getgid (0x40000000 + 104) +#define __NR_setuid (0x40000000 + 105) +#define __NR_setgid (0x40000000 + 106) +#define __NR_geteuid (0x40000000 + 107) +#define __NR_getegid (0x40000000 + 108) +#define __NR_setpgid (0x40000000 + 109) +#define __NR_getppid (0x40000000 + 110) +#define __NR_getpgrp (0x40000000 + 111) +#define __NR_setsid (0x40000000 + 112) +#define __NR_setreuid (0x40000000 + 113) +#define __NR_setregid (0x40000000 + 114) +#define __NR_getgroups (0x40000000 + 115) +#define __NR_setgroups (0x40000000 + 116) +#define __NR_setresuid (0x40000000 + 117) +#define __NR_getresuid (0x40000000 + 118) +#define __NR_setresgid (0x40000000 + 119) +#define __NR_getresgid (0x40000000 + 120) +#define __NR_getpgid (0x40000000 + 121) +#define __NR_setfsuid (0x40000000 + 122) +#define __NR_setfsgid (0x40000000 + 123) +#define __NR_getsid (0x40000000 + 124) +#define __NR_capget (0x40000000 + 125) +#define __NR_capset (0x40000000 + 126) +#define __NR_rt_sigsuspend (0x40000000 + 130) +#define __NR_utime (0x40000000 + 132) +#define __NR_mknod (0x40000000 + 133) +#define __NR_personality (0x40000000 + 135) +#define __NR_ustat (0x40000000 + 136) +#define __NR_statfs (0x40000000 + 137) +#define __NR_fstatfs (0x40000000 + 138) +#define __NR_sysfs (0x40000000 + 139) +#define __NR_getpriority (0x40000000 + 140) +#define __NR_setpriority (0x40000000 + 141) +#define __NR_sched_setparam (0x40000000 + 142) +#define __NR_sched_getparam (0x40000000 + 143) +#define __NR_sched_setscheduler (0x40000000 + 144) +#define __NR_sched_getscheduler (0x40000000 + 145) +#define __NR_sched_get_priority_max (0x40000000 + 146) +#define __NR_sched_get_priority_min (0x40000000 + 147) +#define __NR_sched_rr_get_interval (0x40000000 + 148) +#define __NR_mlock (0x40000000 + 149) +#define __NR_munlock (0x40000000 + 150) +#define __NR_mlockall (0x40000000 + 151) +#define __NR_munlockall (0x40000000 + 152) +#define __NR_vhangup (0x40000000 + 153) +#define __NR_modify_ldt (0x40000000 + 154) +#define __NR_pivot_root (0x40000000 + 155) +#define __NR_prctl (0x40000000 + 157) +#define __NR_arch_prctl (0x40000000 + 158) +#define __NR_adjtimex (0x40000000 + 159) +#define __NR_setrlimit (0x40000000 + 160) +#define __NR_chroot (0x40000000 + 161) +#define __NR_sync (0x40000000 + 162) +#define __NR_acct (0x40000000 + 163) +#define __NR_settimeofday (0x40000000 + 164) +#define __NR_mount (0x40000000 + 165) +#define __NR_umount2 (0x40000000 + 166) +#define __NR_swapon (0x40000000 + 167) +#define __NR_swapoff (0x40000000 + 168) +#define __NR_reboot (0x40000000 + 169) +#define __NR_sethostname (0x40000000 + 170) +#define __NR_setdomainname (0x40000000 + 171) +#define __NR_iopl (0x40000000 + 172) +#define __NR_ioperm (0x40000000 + 173) +#define __NR_init_module (0x40000000 + 175) +#define __NR_delete_module (0x40000000 + 176) +#define __NR_quotactl (0x40000000 + 179) +#define __NR_getpmsg (0x40000000 + 181) +#define __NR_putpmsg (0x40000000 + 182) +#define __NR_afs_syscall (0x40000000 + 183) +#define __NR_tuxcall (0x40000000 + 184) +#define __NR_security (0x40000000 + 185) +#define __NR_gettid (0x40000000 + 186) +#define __NR_readahead (0x40000000 + 187) +#define __NR_setxattr (0x40000000 + 188) +#define __NR_lsetxattr (0x40000000 + 189) +#define __NR_fsetxattr (0x40000000 + 190) +#define __NR_getxattr (0x40000000 + 191) +#define __NR_lgetxattr (0x40000000 + 192) +#define __NR_fgetxattr (0x40000000 + 193) +#define __NR_listxattr (0x40000000 + 194) +#define __NR_llistxattr (0x40000000 + 195) +#define __NR_flistxattr (0x40000000 + 196) +#define __NR_removexattr (0x40000000 + 197) +#define __NR_lremovexattr (0x40000000 + 198) +#define __NR_fremovexattr (0x40000000 + 199) +#define __NR_tkill (0x40000000 + 200) +#define __NR_time (0x40000000 + 201) +#define __NR_futex (0x40000000 + 202) +#define __NR_sched_setaffinity (0x40000000 + 203) +#define __NR_sched_getaffinity (0x40000000 + 204) +#define __NR_io_destroy (0x40000000 + 207) +#define __NR_io_getevents (0x40000000 + 208) +#define __NR_io_cancel (0x40000000 + 210) +#define __NR_lookup_dcookie (0x40000000 + 212) +#define __NR_epoll_create (0x40000000 + 213) +#define __NR_remap_file_pages (0x40000000 + 216) +#define __NR_getdents64 (0x40000000 + 217) +#define __NR_set_tid_address (0x40000000 + 218) +#define __NR_restart_syscall (0x40000000 + 219) +#define __NR_semtimedop (0x40000000 + 220) +#define __NR_fadvise64 (0x40000000 + 221) +#define __NR_timer_settime (0x40000000 + 223) +#define __NR_timer_gettime (0x40000000 + 224) +#define __NR_timer_getoverrun (0x40000000 + 225) +#define __NR_timer_delete (0x40000000 + 226) +#define __NR_clock_settime (0x40000000 + 227) +#define __NR_clock_gettime (0x40000000 + 228) +#define __NR_clock_getres (0x40000000 + 229) +#define __NR_clock_nanosleep (0x40000000 + 230) +#define __NR_exit_group (0x40000000 + 231) +#define __NR_epoll_wait (0x40000000 + 232) +#define __NR_epoll_ctl (0x40000000 + 233) +#define __NR_tgkill (0x40000000 + 234) +#define __NR_utimes (0x40000000 + 235) +#define __NR_mbind (0x40000000 + 237) +#define __NR_set_mempolicy (0x40000000 + 238) +#define __NR_get_mempolicy (0x40000000 + 239) +#define __NR_mq_open (0x40000000 + 240) +#define __NR_mq_unlink (0x40000000 + 241) +#define __NR_mq_timedsend (0x40000000 + 242) +#define __NR_mq_timedreceive (0x40000000 + 243) +#define __NR_mq_getsetattr (0x40000000 + 245) +#define __NR_add_key (0x40000000 + 248) +#define __NR_request_key (0x40000000 + 249) +#define __NR_keyctl (0x40000000 + 250) +#define __NR_ioprio_set (0x40000000 + 251) +#define __NR_ioprio_get (0x40000000 + 252) +#define __NR_inotify_init (0x40000000 + 253) +#define __NR_inotify_add_watch (0x40000000 + 254) +#define __NR_inotify_rm_watch (0x40000000 + 255) +#define __NR_migrate_pages (0x40000000 + 256) +#define __NR_openat (0x40000000 + 257) +#define __NR_mkdirat (0x40000000 + 258) +#define __NR_mknodat (0x40000000 + 259) +#define __NR_fchownat (0x40000000 + 260) +#define __NR_futimesat (0x40000000 + 261) +#define __NR_newfstatat (0x40000000 + 262) +#define __NR_unlinkat (0x40000000 + 263) +#define __NR_renameat (0x40000000 + 264) +#define __NR_linkat (0x40000000 + 265) +#define __NR_symlinkat (0x40000000 + 266) +#define __NR_readlinkat (0x40000000 + 267) +#define __NR_fchmodat (0x40000000 + 268) +#define __NR_faccessat (0x40000000 + 269) +#define __NR_pselect6 (0x40000000 + 270) +#define __NR_ppoll (0x40000000 + 271) +#define __NR_unshare (0x40000000 + 272) +#define __NR_splice (0x40000000 + 275) +#define __NR_tee (0x40000000 + 276) +#define __NR_sync_file_range (0x40000000 + 277) +#define __NR_utimensat (0x40000000 + 280) +#define __NR_epoll_pwait (0x40000000 + 281) +#define __NR_signalfd (0x40000000 + 282) +#define __NR_timerfd_create (0x40000000 + 283) +#define __NR_eventfd (0x40000000 + 284) +#define __NR_fallocate (0x40000000 + 285) +#define __NR_timerfd_settime (0x40000000 + 286) +#define __NR_timerfd_gettime (0x40000000 + 287) +#define __NR_accept4 (0x40000000 + 288) +#define __NR_signalfd4 (0x40000000 + 289) +#define __NR_eventfd2 (0x40000000 + 290) +#define __NR_epoll_create1 (0x40000000 + 291) +#define __NR_dup3 (0x40000000 + 292) +#define __NR_pipe2 (0x40000000 + 293) +#define __NR_inotify_init1 (0x40000000 + 294) +#define __NR_perf_event_open (0x40000000 + 298) +#define __NR_fanotify_init (0x40000000 + 300) +#define __NR_fanotify_mark (0x40000000 + 301) +#define __NR_prlimit64 (0x40000000 + 302) +#define __NR_name_to_handle_at (0x40000000 + 303) +#define __NR_open_by_handle_at (0x40000000 + 304) +#define __NR_clock_adjtime (0x40000000 + 305) +#define __NR_syncfs (0x40000000 + 306) +#define __NR_setns (0x40000000 + 308) +#define __NR_getcpu (0x40000000 + 309) +#define __NR_kcmp (0x40000000 + 312) +#define __NR_finit_module (0x40000000 + 313) +#define __NR_sched_setattr (0x40000000 + 314) +#define __NR_sched_getattr (0x40000000 + 315) +#define __NR_renameat2 (0x40000000 + 316) +#define __NR_seccomp (0x40000000 + 317) +#define __NR_getrandom (0x40000000 + 318) +#define __NR_memfd_create (0x40000000 + 319) +#define __NR_kexec_file_load (0x40000000 + 320) +#define __NR_bpf (0x40000000 + 321) +#define __NR_userfaultfd (0x40000000 + 323) +#define __NR_membarrier (0x40000000 + 324) +#define __NR_mlock2 (0x40000000 + 325) +#define __NR_copy_file_range (0x40000000 + 326) +#define __NR_pkey_mprotect (0x40000000 + 329) +#define __NR_pkey_alloc (0x40000000 + 330) +#define __NR_pkey_free (0x40000000 + 331) +#define __NR_statx (0x40000000 + 332) +#define __NR_io_pgetevents (0x40000000 + 333) +#define __NR_rseq (0x40000000 + 334) +#define __NR_pidfd_send_signal (0x40000000 + 424) +#define __NR_io_uring_setup (0x40000000 + 425) +#define __NR_io_uring_enter (0x40000000 + 426) +#define __NR_io_uring_register (0x40000000 + 427) +#define __NR_open_tree (0x40000000 + 428) +#define __NR_move_mount (0x40000000 + 429) +#define __NR_fsopen (0x40000000 + 430) +#define __NR_fsconfig (0x40000000 + 431) +#define __NR_fsmount (0x40000000 + 432) +#define __NR_fspick (0x40000000 + 433) +#define __NR_pidfd_open (0x40000000 + 434) +#define __NR_clone3 (0x40000000 + 435) +#define __NR_close_range (0x40000000 + 436) +#define __NR_openat2 (0x40000000 + 437) +#define __NR_pidfd_getfd (0x40000000 + 438) +#define __NR_faccessat2 (0x40000000 + 439) +#define __NR_process_madvise (0x40000000 + 440) +#define __NR_epoll_pwait2 (0x40000000 + 441) +#define __NR_mount_setattr (0x40000000 + 442) +#define __NR_landlock_create_ruleset (0x40000000 + 444) +#define __NR_landlock_add_rule (0x40000000 + 445) +#define __NR_landlock_restrict_self (0x40000000 + 446) + + +#define __NR_rt_sigaction (0x40000000 + 512) +#define __NR_rt_sigreturn (0x40000000 + 513) +#define __NR_ioctl (0x40000000 + 514) +#define __NR_readv (0x40000000 + 515) +#define __NR_writev (0x40000000 + 516) +#define __NR_recvfrom (0x40000000 + 517) +#define __NR_sendmsg (0x40000000 + 518) +#define __NR_recvmsg (0x40000000 + 519) +#define __NR_execve (0x40000000 + 520) +#define __NR_ptrace (0x40000000 + 521) +#define __NR_rt_sigpending (0x40000000 + 522) +#define __NR_rt_sigtimedwait (0x40000000 + 523) +#define __NR_rt_sigqueueinfo (0x40000000 + 524) +#define __NR_sigaltstack (0x40000000 + 525) +#define __NR_timer_create (0x40000000 + 526) +#define __NR_mq_notify (0x40000000 + 527) +#define __NR_kexec_load (0x40000000 + 528) +#define __NR_waitid (0x40000000 + 529) +#define __NR_set_robust_list (0x40000000 + 530) +#define __NR_get_robust_list (0x40000000 + 531) +#define __NR_vmsplice (0x40000000 + 532) +#define __NR_move_pages (0x40000000 + 533) +#define __NR_preadv (0x40000000 + 534) +#define __NR_pwritev (0x40000000 + 535) +#define __NR_rt_tgsigqueueinfo (0x40000000 + 536) +#define __NR_recvmmsg (0x40000000 + 537) +#define __NR_sendmmsg (0x40000000 + 538) +#define __NR_process_vm_readv (0x40000000 + 539) +#define __NR_process_vm_writev (0x40000000 + 540) +#define __NR_setsockopt (0x40000000 + 541) +#define __NR_getsockopt (0x40000000 + 542) +#define __NR_io_setup (0x40000000 + 543) +#define __NR_io_submit (0x40000000 + 544) +#define __NR_execveat (0x40000000 + 545) +#define __NR_preadv2 (0x40000000 + 546) +#define __NR_pwritev2 (0x40000000 + 547) + diff --git a/libc-top-half/musl/arch/x32/bits/user.h b/libc-top-half/musl/arch/x32/bits/user.h new file mode 100644 index 0000000..eac82a1 --- /dev/null +++ b/libc-top-half/musl/arch/x32/bits/user.h @@ -0,0 +1,41 @@ +#undef __WORDSIZE +#define __WORDSIZE 32 + +typedef struct user_fpregs_struct { + uint16_t cwd, swd, ftw, fop; + uint64_t rip, rdp; + uint32_t mxcsr, mxcr_mask; + uint32_t st_space[32], xmm_space[64], padding[24]; +} elf_fpregset_t; + +struct user_regs_struct { + unsigned long r15, r14, r13, r12, rbp, rbx, r11, r10, r9, r8; + unsigned long rax, rcx, rdx, rsi, rdi, orig_rax, rip; + unsigned long cs, eflags, rsp, ss, fs_base, gs_base, ds, es, fs, gs; +}; +#define ELF_NGREG 27 +typedef unsigned long long elf_greg_t, elf_gregset_t[ELF_NGREG]; + +struct user { + struct user_regs_struct regs; + int u_fpvalid; + struct user_fpregs_struct i387; + unsigned long u_tsize; + unsigned long u_dsize; + unsigned long u_ssize; + unsigned long start_code; + unsigned long start_stack; + long signal; + int reserved; + struct user_regs_struct *u_ar0; + struct user_fpregs_struct *u_fpstate; + unsigned long magic; + char u_comm[32]; + unsigned long u_debugreg[8]; +}; + +#define PAGE_MASK (~(PAGESIZE-1)) +#define NBPG PAGESIZE +#define UPAGES 1 +#define HOST_TEXT_START_ADDR (u.start_code) +#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) diff --git a/libc-top-half/musl/arch/x32/crt_arch.h b/libc-top-half/musl/arch/x32/crt_arch.h new file mode 100644 index 0000000..3eec61b --- /dev/null +++ b/libc-top-half/musl/arch/x32/crt_arch.h @@ -0,0 +1,12 @@ +__asm__( +".text \n" +".global " START " \n" +START ": \n" +" xor %rbp,%rbp \n" +" mov %rsp,%rdi \n" +".weak _DYNAMIC \n" +".hidden _DYNAMIC \n" +" lea _DYNAMIC(%rip),%rsi \n" +" andq $-16,%rsp \n" +" call " START "_c \n" +); diff --git a/libc-top-half/musl/arch/x32/ksigaction.h b/libc-top-half/musl/arch/x32/ksigaction.h new file mode 100644 index 0000000..c40e356 --- /dev/null +++ b/libc-top-half/musl/arch/x32/ksigaction.h @@ -0,0 +1,11 @@ +#include <features.h> + +struct k_sigaction { + void (*handler)(int); + unsigned long flags; + void (*restorer)(void); + unsigned mask[2]; +}; + +hidden void __restore_rt(); +#define __restore __restore_rt diff --git a/libc-top-half/musl/arch/x32/kstat.h b/libc-top-half/musl/arch/x32/kstat.h new file mode 100644 index 0000000..ce25fce --- /dev/null +++ b/libc-top-half/musl/arch/x32/kstat.h @@ -0,0 +1,22 @@ +struct kstat { + dev_t st_dev; + ino_t st_ino; + nlink_t st_nlink; + + mode_t st_mode; + uid_t st_uid; + gid_t st_gid; + unsigned int __pad0; + dev_t st_rdev; + off_t st_size; + blksize_t st_blksize; + blkcnt_t st_blocks; + + long long st_atime_sec; + long st_atime_nsec; + long long st_mtime_sec; + long st_mtime_nsec; + long long st_ctime_sec; + long st_ctime_nsec; + long long __unused[3]; +}; diff --git a/libc-top-half/musl/arch/x32/pthread_arch.h b/libc-top-half/musl/arch/x32/pthread_arch.h new file mode 100644 index 0000000..c1e7716 --- /dev/null +++ b/libc-top-half/musl/arch/x32/pthread_arch.h @@ -0,0 +1,12 @@ +static inline uintptr_t __get_tp() +{ + uintptr_t tp; + __asm__ ("mov %%fs:0,%0" : "=r" (tp) ); + return tp; +} + +#define MC_PC gregs[REG_RIP] + +#define CANARY_PAD + +#define tls_mod_off_t unsigned long long diff --git a/libc-top-half/musl/arch/x32/reloc.h b/libc-top-half/musl/arch/x32/reloc.h new file mode 100644 index 0000000..dc039ad --- /dev/null +++ b/libc-top-half/musl/arch/x32/reloc.h @@ -0,0 +1,31 @@ +#define LDSO_ARCH "x32" + +/* FIXME: x32 is very strange in its use of 64-bit relocation types in + * a 32-bit environment. As long as the memory at reloc_addr is + * zero-filled prior to relocations, just treating 64-bit relocations + * as operating on 32-bit slots should be fine, but this should be + * checked. In particular, R_X86_64_64, R_X86_64_DTPOFF64, and + * R_X86_64_TPOFF64 may need checking. */ + +/* The R_X86_64_64, R_X86_64_DTPOFF32, and R_X86_64_TPOFF32 reloc types + * were previously mapped in the switch table form of this file; however, + * they do not seem to be used/usable for anything. If needed, new + * mappings will have to be added. */ + +#define REL_SYMBOLIC R_X86_64_32 +#define REL_OFFSET R_X86_64_PC32 +#define REL_GOT R_X86_64_GLOB_DAT +#define REL_PLT R_X86_64_JUMP_SLOT +#define REL_RELATIVE R_X86_64_RELATIVE +#define REL_COPY R_X86_64_COPY +#define REL_DTPMOD R_X86_64_DTPMOD64 +#define REL_DTPOFF R_X86_64_DTPOFF64 +#define REL_TPOFF R_X86_64_TPOFF64 + +#define CRTJMP(pc,sp) __asm__ __volatile__( \ + "mov %1,%%esp ; jmp *%0" : : "r"((uint64_t)(uintptr_t)pc), "r"(sp) : "memory" ) + +#define GETFUNCSYM(fp, sym, got) __asm__ ( \ + ".hidden " #sym "\n" \ + " lea " #sym "(%%rip),%0\n" \ + : "=r"(*fp) : : "memory" ) diff --git a/libc-top-half/musl/arch/x32/syscall_arch.h b/libc-top-half/musl/arch/x32/syscall_arch.h new file mode 100644 index 0000000..e0111cc --- /dev/null +++ b/libc-top-half/musl/arch/x32/syscall_arch.h @@ -0,0 +1,93 @@ +#define __SYSCALL_LL_E(x) (x) +#define __SYSCALL_LL_O(x) (x) + +#define __scc(X) sizeof(1?(X):0ULL) < 8 ? (unsigned long) (X) : (long long) (X) +typedef long long syscall_arg_t; + +static __inline long __syscall0(long long n) +{ + unsigned long ret; + __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory"); + return ret; +} + +static __inline long __syscall1(long long n, long long a1) +{ + unsigned long ret; + __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory"); + return ret; +} + +static __inline long __syscall2(long long n, long long a1, long long a2) +{ + unsigned long ret; + __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2) + : "rcx", "r11", "memory"); + return ret; +} + +static __inline long __syscall3(long long n, long long a1, long long a2, long long a3) +{ + unsigned long ret; + __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), + "d"(a3) : "rcx", "r11", "memory"); + return ret; +} + +static __inline long __syscall4(long long n, long long a1, long long a2, long long a3, + long long a4_) +{ + unsigned long ret; + register long long a4 __asm__("r10") = a4_; + __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), + "d"(a3), "r"(a4): "rcx", "r11", "memory"); + return ret; +} + +static __inline long __syscall5(long long n, long long a1, long long a2, long long a3, + long long a4_, long long a5_) +{ + unsigned long ret; + register long long a4 __asm__("r10") = a4_; + register long long a5 __asm__("r8") = a5_; + __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), + "d"(a3), "r"(a4), "r"(a5) : "rcx", "r11", "memory"); + return ret; +} + +static __inline long __syscall6(long long n, long long a1, long long a2, long long a3, + long long a4_, long long a5_, long long a6_) +{ + unsigned long ret; + register long long a4 __asm__("r10") = a4_; + register long long a5 __asm__("r8") = a5_; + register long long a6 __asm__("r9") = a6_; + __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), + "d"(a3), "r"(a4), "r"(a5), "r"(a6) : "rcx", "r11", "memory"); + return ret; +} + +#undef SYS_futimesat + +#define SYS_clock_gettime64 SYS_clock_gettime +#define SYS_clock_settime64 SYS_clock_settime +#define SYS_clock_adjtime64 SYS_clock_adjtime +#define SYS_clock_nanosleep_time64 SYS_clock_nanosleep +#define SYS_timer_gettime64 SYS_timer_gettime +#define SYS_timer_settime64 SYS_timer_settime +#define SYS_timerfd_gettime64 SYS_timerfd_gettime +#define SYS_timerfd_settime64 SYS_timerfd_settime +#define SYS_utimensat_time64 SYS_utimensat +#define SYS_pselect6_time64 SYS_pselect6 +#define SYS_ppoll_time64 SYS_ppoll +#define SYS_recvmmsg_time64 SYS_recvmmsg +#define SYS_mq_timedsend_time64 SYS_mq_timedsend +#define SYS_mq_timedreceive_time64 SYS_mq_timedreceive +#define SYS_semtimedop_time64 SYS_semtimedop +#define SYS_rt_sigtimedwait_time64 SYS_rt_sigtimedwait +#define SYS_futex_time64 SYS_futex +#define SYS_sched_rr_get_interval_time64 SYS_sched_rr_get_interval +#define SYS_getrusage_time64 SYS_getrusage +#define SYS_wait4_time64 SYS_wait4 + +#define IPC_64 0 |