diff options
| author | rofl0r <retnyg@gmx.net> | 2014-01-07 22:43:34 +0100 | 
|---|---|---|
| committer | rofl0r <retnyg@gmx.net> | 2014-02-23 11:07:18 +0100 | 
| commit | 323272db175204b951f119dae4bd99ef05e20f13 (patch) | |
| tree | 70329156d5189294b1e9e7f9c7c326924ad62e35 | |
| parent | 0f169cbb79c39a5b15f7a27d9283cdeb6e122b8f (diff) | |
| download | musl-323272db175204b951f119dae4bd99ef05e20f13.tar.gz | |
import vanilla x86_64 code as x32
75 files changed, 2677 insertions, 0 deletions
| diff --git a/arch/x32/atomic.h b/arch/x32/atomic.h new file mode 100644 index 00000000..124b37ac --- /dev/null +++ b/arch/x32/atomic.h @@ -0,0 +1,125 @@ +#ifndef _INTERNAL_ATOMIC_H +#define _INTERNAL_ATOMIC_H + +#include <stdint.h> + +static inline int a_ctz_64(uint64_t x) +{ +	__asm__( "bsf %1,%0" : "=r"(x) : "r"(x) ); +	return x; +} + +static inline int a_ctz_l(unsigned long x) +{ +	__asm__( "bsf %1,%0" : "=r"(x) : "r"(x) ); +	return x; +} + +static inline void a_and_64(volatile uint64_t *p, uint64_t v) +{ +	__asm__( "lock ; and %1, %0" +			 : "=m"(*p) : "r"(v) : "memory" ); +} + +static inline void a_or_64(volatile uint64_t *p, uint64_t v) +{ +	__asm__( "lock ; or %1, %0" +			 : "=m"(*p) : "r"(v) : "memory" ); +} + +static inline void a_store_l(volatile void *p, long x) +{ +	__asm__( "mov %1, %0" : "=m"(*(long *)p) : "r"(x) : "memory" ); +} + +static inline void a_or_l(volatile void *p, long v) +{ +	__asm__( "lock ; or %1, %0" +		: "=m"(*(long *)p) : "r"(v) : "memory" ); +} + +static inline void *a_cas_p(volatile void *p, void *t, void *s) +{ +	__asm__( "lock ; cmpxchg %3, %1" +		: "=a"(t), "=m"(*(long *)p) : "a"(t), "r"(s) : "memory" ); +	return t; +} + +static inline long a_cas_l(volatile void *p, long t, long s) +{ +	__asm__( "lock ; cmpxchg %3, %1" +		: "=a"(t), "=m"(*(long *)p) : "a"(t), "r"(s) : "memory" ); +	return t; +} + +static inline int a_cas(volatile int *p, int t, int s) +{ +	__asm__( "lock ; cmpxchg %3, %1" +		: "=a"(t), "=m"(*p) : "a"(t), "r"(s) : "memory" ); +	return t; +} + +static inline void *a_swap_p(void *volatile *x, void *v) +{ +	__asm__( "xchg %0, %1" : "=r"(v), "=m"(*(void **)x) : "0"(v) : "memory" ); +	return v; +} +static inline long a_swap_l(volatile void *x, long v) +{ +	__asm__( "xchg %0, %1" : "=r"(v), "=m"(*(long *)x) : "0"(v) : "memory" ); +	return v; +} + +static inline void a_or(volatile void *p, int v) +{ +	__asm__( "lock ; or %1, %0" +		: "=m"(*(int *)p) : "r"(v) : "memory" ); +} + +static inline void a_and(volatile void *p, int v) +{ +	__asm__( "lock ; and %1, %0" +		: "=m"(*(int *)p) : "r"(v) : "memory" ); +} + +static inline int a_swap(volatile int *x, int v) +{ +	__asm__( "xchg %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory" ); +	return v; +} + +#define a_xchg a_swap + +static inline int a_fetch_add(volatile int *x, int v) +{ +	__asm__( "lock ; xadd %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory" ); +	return v; +} + +static inline void a_inc(volatile int *x) +{ +	__asm__( "lock ; incl %0" : "=m"(*x) : "m"(*x) : "memory" ); +} + +static inline void a_dec(volatile int *x) +{ +	__asm__( "lock ; decl %0" : "=m"(*x) : "m"(*x) : "memory" ); +} + +static inline void a_store(volatile int *p, int x) +{ +	__asm__( "mov %1, %0" : "=m"(*p) : "r"(x) : "memory" ); +} + +static inline void a_spin() +{ +	__asm__ __volatile__( "pause" : : : "memory" ); +} + +static inline void a_crash() +{ +	__asm__ __volatile__( "hlt" : : : "memory" ); +} + + +#endif diff --git a/arch/x32/bits/alltypes.h.in b/arch/x32/bits/alltypes.h.in new file mode 100644 index 00000000..277e9448 --- /dev/null +++ b/arch/x32/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 int wchar_t; +#endif +TYPEDEF unsigned wint_t; + +#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 long time_t; +TYPEDEF long suseconds_t; + +TYPEDEF struct { union { int __i[14]; unsigned long __s[7]; } __u; } pthread_attr_t; +TYPEDEF struct { union { int __i[10]; void *__p[5]; } __u; } pthread_mutex_t; +TYPEDEF struct { union { int __i[12]; void *__p[6]; } __u; } pthread_cond_t; +TYPEDEF struct { union { int __i[14]; void *__p[7]; } __u; } pthread_rwlock_t; +TYPEDEF struct { union { int __i[8]; void *__p[4]; } __u; } pthread_barrier_t; diff --git a/arch/x32/bits/endian.h b/arch/x32/bits/endian.h new file mode 100644 index 00000000..172c338f --- /dev/null +++ b/arch/x32/bits/endian.h @@ -0,0 +1 @@ +#define __BYTE_ORDER __LITTLE_ENDIAN diff --git a/arch/x32/bits/errno.h b/arch/x32/bits/errno.h new file mode 100644 index 00000000..d2e1eeee --- /dev/null +++ b/arch/x32/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/x32/bits/fcntl.h b/arch/x32/bits/fcntl.h new file mode 100644 index 00000000..99777139 --- /dev/null +++ b/arch/x32/bits/fcntl.h @@ -0,0 +1,39 @@ +#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       0 +#define O_NOATIME  01000000 +#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/arch/x32/bits/fenv.h b/arch/x32/bits/fenv.h new file mode 100644 index 00000000..24df0417 --- /dev/null +++ b/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/arch/x32/bits/float.h b/arch/x32/bits/float.h new file mode 100644 index 00000000..9ea29914 --- /dev/null +++ b/arch/x32/bits/float.h @@ -0,0 +1,21 @@ +#define FLT_ROUNDS 1 +#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/arch/x32/bits/io.h b/arch/x32/bits/io.h new file mode 100644 index 00000000..dd5bddc9 --- /dev/null +++ b/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/arch/x32/bits/ioctl.h b/arch/x32/bits/ioctl.h new file mode 100644 index 00000000..77a94551 --- /dev/null +++ b/arch/x32/bits/ioctl.h @@ -0,0 +1,197 @@ +#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 TIOCGPTN	0x80045430 +#define TIOCSPTLCK	0x40045431 +#define TCGETX          0x5432 +#define TCSETX          0x5433 +#define TCSETXF         0x5434 +#define TCSETXW         0x5435 + +#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 TIOCGHAYESESP   0x545E +#define TIOCSHAYESESP   0x545F +#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 FIOSETOWN       0x8901 +#define SIOCSPGRP       0x8902 +#define FIOGETOWN       0x8903 +#define SIOCGPGRP       0x8904 +#define SIOCATMARK      0x8905 +#define SIOCGSTAMP      0x8906 + +#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/x32/bits/ipc.h b/arch/x32/bits/ipc.h new file mode 100644 index 00000000..ac5d0979 --- /dev/null +++ b/arch/x32/bits/ipc.h @@ -0,0 +1,14 @@ +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 __pad1; +	long __pad2; +}; + +#define IPC_64 0 diff --git a/arch/x32/bits/limits.h b/arch/x32/bits/limits.h new file mode 100644 index 00000000..792a30b9 --- /dev/null +++ b/arch/x32/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/x32/bits/mman.h b/arch/x32/bits/mman.h new file mode 100644 index 00000000..dcab47a4 --- /dev/null +++ b/arch/x32/bits/mman.h @@ -0,0 +1,62 @@ +#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_32BIT      0x40 +#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 + +#define MREMAP_MAYMOVE  1 +#define MREMAP_FIXED    2 +#endif diff --git a/arch/x32/bits/msg.h b/arch/x32/bits/msg.h new file mode 100644 index 00000000..badcf168 --- /dev/null +++ b/arch/x32/bits/msg.h @@ -0,0 +1,13 @@ +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 __unused[2]; +}; diff --git a/arch/x32/bits/posix.h b/arch/x32/bits/posix.h new file mode 100644 index 00000000..c37b94c1 --- /dev/null +++ b/arch/x32/bits/posix.h @@ -0,0 +1,2 @@ +#define _POSIX_V6_LP64_OFF64  1 +#define _POSIX_V7_LP64_OFF64  1 diff --git a/arch/x32/bits/reg.h b/arch/x32/bits/reg.h new file mode 100644 index 00000000..a4df04ce --- /dev/null +++ b/arch/x32/bits/reg.h @@ -0,0 +1,29 @@ +#undef __WORDSIZE +#define __WORDSIZE 64 +#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/arch/x32/bits/setjmp.h b/arch/x32/bits/setjmp.h new file mode 100644 index 00000000..63973a80 --- /dev/null +++ b/arch/x32/bits/setjmp.h @@ -0,0 +1 @@ +typedef unsigned long __jmp_buf[8]; diff --git a/arch/x32/bits/shm.h b/arch/x32/bits/shm.h new file mode 100644 index 00000000..4c3c9fb7 --- /dev/null +++ b/arch/x32/bits/shm.h @@ -0,0 +1,25 @@ +#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; +}; + +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; +}; diff --git a/arch/x32/bits/signal.h b/arch/x32/bits/signal.h new file mode 100644 index 00000000..d5f01ced --- /dev/null +++ b/arch/x32/bits/signal.h @@ -0,0 +1,119 @@ +#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) + +#ifdef _GNU_SOURCE +#define REG_R8          0 +#define REG_R9          1 +#define REG_R10         2 +#define REG_R11         3 +#define REG_R12         4 +#define REG_R13         5 +#define REG_R14         6 +#define REG_R15         7 +#define REG_RDI         8 +#define REG_RSI         9 +#define REG_RBP         10 +#define REG_RBX         11 +#define REG_RDX         12 +#define REG_RAX         13 +#define REG_RCX         14 +#define REG_RSP         15 +#define REG_RIP         16 +#define REG_EFL         17 +#define REG_CSGSFS      18 +#define REG_ERR         19 +#define REG_TRAPNO      20 +#define REG_OLDMASK     21 +#define REG_CR2         22 +#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 r8, r9, r10, r11, r12, r13, r14, r15; +	unsigned long rdi, rsi, rbp, rbx, rdx, rax, rcx, rsp, rip, eflags; +	unsigned short cs, gs, fs, __pad0; +	unsigned long err, trapno, oldmask, cr2; +	struct _fpstate *fpstate; +	unsigned long __reserved1[8]; +}; +typedef struct { +	gregset_t gregs; +	fpregset_t fpregs; +	unsigned long long __reserved1[8]; +} mcontext_t; +#else +typedef struct { +	unsigned long __space[32]; +} mcontext_t; +#endif + +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 __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/arch/x32/bits/socket.h b/arch/x32/bits/socket.h new file mode 100644 index 00000000..a90c4cae --- /dev/null +++ b/arch/x32/bits/socket.h @@ -0,0 +1,18 @@ +struct msghdr +{ +	void *msg_name; +	socklen_t msg_namelen; +	struct iovec *msg_iov; +	int msg_iovlen, __pad1; +	void *msg_control; +	socklen_t msg_controllen, __pad2; +	int msg_flags; +}; + +struct cmsghdr +{ +	socklen_t cmsg_len; +	int __pad1; +	int cmsg_level; +	int cmsg_type; +}; diff --git a/arch/x32/bits/stat.h b/arch/x32/bits/stat.h new file mode 100644 index 00000000..081237c3 --- /dev/null +++ b/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 __unused[3]; +}; diff --git a/arch/x32/bits/statfs.h b/arch/x32/bits/statfs.h new file mode 100644 index 00000000..f103f4e4 --- /dev/null +++ b/arch/x32/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/x32/bits/stdarg.h b/arch/x32/bits/stdarg.h new file mode 100644 index 00000000..fde37814 --- /dev/null +++ b/arch/x32/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/x32/bits/stdint.h b/arch/x32/bits/stdint.h new file mode 100644 index 00000000..1bb147f2 --- /dev/null +++ b/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      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/x32/bits/syscall.h b/arch/x32/bits/syscall.h new file mode 100644 index 00000000..5eb9b830 --- /dev/null +++ b/arch/x32/bits/syscall.h @@ -0,0 +1,655 @@ +#define __NR_read				0 +#define __NR_write				1 +#define __NR_open				2 +#define __NR_close				3 +#define __NR_stat				4 +#define __NR_fstat				5 +#define __NR_lstat				6 +#define __NR_poll				7 +#define __NR_lseek				8 +#define __NR_mmap				9 +#define __NR_mprotect			10 +#define __NR_munmap				11 +#define __NR_brk				12 +#define __NR_rt_sigaction		13 +#define __NR_rt_sigprocmask		14 +#define __NR_rt_sigreturn		15 +#define __NR_ioctl				16 +#define __NR_pread64			17 +#define __NR_pwrite64			18 +#define __NR_readv				19 +#define __NR_writev				20 +#define __NR_access				21 +#define __NR_pipe				22 +#define __NR_select				23 +#define __NR_sched_yield		24 +#define __NR_mremap				25 +#define __NR_msync				26 +#define __NR_mincore			27 +#define __NR_madvise			28 +#define __NR_shmget				29 +#define __NR_shmat				30 +#define __NR_shmctl				31 +#define __NR_dup				32 +#define __NR_dup2				33 +#define __NR_pause				34 +#define __NR_nanosleep			35 +#define __NR_getitimer			36 +#define __NR_alarm				37 +#define __NR_setitimer			38 +#define __NR_getpid				39 +#define __NR_sendfile			40 +#define __NR_socket				41 +#define __NR_connect			42 +#define __NR_accept				43 +#define __NR_sendto				44 +#define __NR_recvfrom			45 +#define __NR_sendmsg			46 +#define __NR_recvmsg			47 +#define __NR_shutdown			48 +#define __NR_bind				49 +#define __NR_listen				50 +#define __NR_getsockname		51 +#define __NR_getpeername		52 +#define __NR_socketpair			53 +#define __NR_setsockopt			54 +#define __NR_getsockopt			55 +#define __NR_clone				56 +#define __NR_fork				57 +#define __NR_vfork				58 +#define __NR_execve				59 +#define __NR_exit				60 +#define __NR_wait4				61 +#define __NR_kill				62 +#define __NR_uname				63 +#define __NR_semget				64 +#define __NR_semop				65 +#define __NR_semctl				66 +#define __NR_shmdt				67 +#define __NR_msgget				68 +#define __NR_msgsnd				69 +#define __NR_msgrcv				70 +#define __NR_msgctl				71 +#define __NR_fcntl				72 +#define __NR_flock				73 +#define __NR_fsync				74 +#define __NR_fdatasync			75 +#define __NR_truncate			76 +#define __NR_ftruncate			77 +#define __NR_getdents			78 +#define __NR_getcwd				79 +#define __NR_chdir				80 +#define __NR_fchdir				81 +#define __NR_rename				82 +#define __NR_mkdir				83 +#define __NR_rmdir				84 +#define __NR_creat				85 +#define __NR_link				86 +#define __NR_unlink				87 +#define __NR_symlink			88 +#define __NR_readlink			89 +#define __NR_chmod				90 +#define __NR_fchmod				91 +#define __NR_chown				92 +#define __NR_fchown				93 +#define __NR_lchown				94 +#define __NR_umask				95 +#define __NR_gettimeofday		96 +#define __NR_getrlimit			97 +#define __NR_getrusage			98 +#define __NR_sysinfo			99 +#define __NR_times				100 +#define __NR_ptrace				101 +#define __NR_getuid				102 +#define __NR_syslog				103 +#define __NR_getgid				104 +#define __NR_setuid				105 +#define __NR_setgid				106 +#define __NR_geteuid			107 +#define __NR_getegid			108 +#define __NR_setpgid			109 +#define __NR_getppid			110 +#define __NR_getpgrp			111 +#define __NR_setsid				112 +#define __NR_setreuid			113 +#define __NR_setregid			114 +#define __NR_getgroups			115 +#define __NR_setgroups			116 +#define __NR_setresuid			117 +#define __NR_getresuid			118 +#define __NR_setresgid			119 +#define __NR_getresgid			120 +#define __NR_getpgid			121 +#define __NR_setfsuid			122 +#define __NR_setfsgid			123 +#define __NR_getsid				124 +#define __NR_capget				125 +#define __NR_capset				126 +#define __NR_rt_sigpending		127 +#define __NR_rt_sigtimedwait	128 +#define __NR_rt_sigqueueinfo	129 +#define __NR_rt_sigsuspend		130 +#define __NR_sigaltstack		131 +#define __NR_utime				132 +#define __NR_mknod				133 +#define __NR_uselib				134 +#define __NR_personality		135 +#define __NR_ustat				136 +#define __NR_statfs				137 +#define __NR_fstatfs			138 +#define __NR_sysfs				139 +#define __NR_getpriority			140 +#define __NR_setpriority			141 +#define __NR_sched_setparam			142 +#define __NR_sched_getparam			143 +#define __NR_sched_setscheduler		144 +#define __NR_sched_getscheduler		145 +#define __NR_sched_get_priority_max	146 +#define __NR_sched_get_priority_min	147 +#define __NR_sched_rr_get_interval	148 +#define __NR_mlock					149 +#define __NR_munlock				150 +#define __NR_mlockall				151 +#define __NR_munlockall				152 +#define __NR_vhangup				153 +#define __NR_modify_ldt				154 +#define __NR_pivot_root				155 +#define __NR__sysctl				156 +#define __NR_prctl					157 +#define __NR_arch_prctl				158 +#define __NR_adjtimex				159 +#define __NR_setrlimit				160 +#define __NR_chroot					161 +#define __NR_sync					162 +#define __NR_acct					163 +#define __NR_settimeofday			164 +#define __NR_mount					165 +#define __NR_umount2				166 +#define __NR_swapon					167 +#define __NR_swapoff				168 +#define __NR_reboot					169 +#define __NR_sethostname			170 +#define __NR_setdomainname			171 +#define __NR_iopl					172 +#define __NR_ioperm					173 +#define __NR_create_module			174 +#define __NR_init_module			175 +#define __NR_delete_module			176 +#define __NR_get_kernel_syms		177 +#define __NR_query_module			178 +#define __NR_quotactl				179 +#define __NR_nfsservctl				180 +#define __NR_getpmsg				181 +#define __NR_putpmsg				182 +#define __NR_afs_syscall			183 +#define __NR_tuxcall				184 +#define __NR_security				185 +#define __NR_gettid					186 +#define __NR_readahead				187 +#define __NR_setxattr				188 +#define __NR_lsetxattr				189 +#define __NR_fsetxattr				190 +#define __NR_getxattr				191 +#define __NR_lgetxattr				192 +#define __NR_fgetxattr				193 +#define __NR_listxattr				194 +#define __NR_llistxattr				195 +#define __NR_flistxattr				196 +#define __NR_removexattr			197 +#define __NR_lremovexattr			198 +#define __NR_fremovexattr			199 +#define __NR_tkill					200 +#define __NR_time					201 +#define __NR_futex					202 +#define __NR_sched_setaffinity		203 +#define __NR_sched_getaffinity		204 +#define __NR_set_thread_area		205 +#define __NR_io_setup				206 +#define __NR_io_destroy				207 +#define __NR_io_getevents			208 +#define __NR_io_submit				209 +#define __NR_io_cancel				210 +#define __NR_get_thread_area		211 +#define __NR_lookup_dcookie			212 +#define __NR_epoll_create			213 +#define __NR_epoll_ctl_old			214 +#define __NR_epoll_wait_old			215 +#define __NR_remap_file_pages		216 +#define __NR_getdents64				217 +#define __NR_set_tid_address		218 +#define __NR_restart_syscall		219 +#define __NR_semtimedop				220 +#define __NR_fadvise64				221 +#define __NR_timer_create			222 +#define __NR_timer_settime			223 +#define __NR_timer_gettime			224 +#define __NR_timer_getoverrun		225 +#define __NR_timer_delete			226 +#define __NR_clock_settime			227 +#define __NR_clock_gettime			228 +#define __NR_clock_getres			229 +#define __NR_clock_nanosleep		230 +#define __NR_exit_group				231 +#define __NR_epoll_wait				232 +#define __NR_epoll_ctl				233 +#define __NR_tgkill					234 +#define __NR_utimes					235 +#define __NR_vserver				236 +#define __NR_mbind					237 +#define __NR_set_mempolicy			238 +#define __NR_get_mempolicy			239 +#define __NR_mq_open				240 +#define __NR_mq_unlink				241 +#define __NR_mq_timedsend			242 +#define __NR_mq_timedreceive		243 +#define __NR_mq_notify				244 +#define __NR_mq_getsetattr			245 +#define __NR_kexec_load				246 +#define __NR_waitid					247 +#define __NR_add_key				248 +#define __NR_request_key			249 +#define __NR_keyctl					250 +#define __NR_ioprio_set				251 +#define __NR_ioprio_get				252 +#define __NR_inotify_init			253 +#define __NR_inotify_add_watch		254 +#define __NR_inotify_rm_watch		255 +#define __NR_migrate_pages			256 +#define __NR_openat					257 +#define __NR_mkdirat				258 +#define __NR_mknodat				259 +#define __NR_fchownat				260 +#define __NR_futimesat				261 +#define __NR_newfstatat				262 +#define __NR_unlinkat				263 +#define __NR_renameat				264 +#define __NR_linkat					265 +#define __NR_symlinkat				266 +#define __NR_readlinkat				267 +#define __NR_fchmodat				268 +#define __NR_faccessat				269 +#define __NR_pselect6				270 +#define __NR_ppoll					271 +#define __NR_unshare				272 +#define __NR_set_robust_list		273 +#define __NR_get_robust_list		274 +#define __NR_splice					275 +#define __NR_tee					276 +#define __NR_sync_file_range		277 +#define __NR_vmsplice				278 +#define __NR_move_pages				279 +#define __NR_utimensat				280 +#define __NR_epoll_pwait			281 +#define __NR_signalfd				282 +#define __NR_timerfd_create			283 +#define __NR_eventfd				284 +#define __NR_fallocate				285 +#define __NR_timerfd_settime		286 +#define __NR_timerfd_gettime		287 +#define __NR_accept4				288 +#define __NR_signalfd4				289 +#define __NR_eventfd2				290 +#define __NR_epoll_create1			291 +#define __NR_dup3					292 +#define __NR_pipe2					293 +#define __NR_inotify_init1			294 +#define __NR_preadv					295 +#define __NR_pwritev				296 +#define __NR_rt_tgsigqueueinfo		297 +#define __NR_perf_event_open		298 +#define __NR_recvmmsg				299 +#define __NR_fanotify_init			300 +#define __NR_fanotify_mark			301 +#define __NR_prlimit64				302 +#define __NR_name_to_handle_at			303 +#define __NR_open_by_handle_at			304 +#define __NR_clock_adjtime			305 +#define __NR_syncfs				306 +#define __NR_sendmmsg				307 +#define __NR_setns				308 +#define __NR_getcpu				309 +#define __NR_process_vm_readv			310 +#define __NR_process_vm_writev			311 +#define __NR_kcmp				312 +#define __NR_finit_module			313 + +#undef __NR_fstatat +#undef __NR_pread +#undef __NR_pwrite +#undef __NR_getdents +#define __NR_fstatat __NR_newfstatat +#define __NR_pread __NR_pread64 +#define __NR_pwrite __NR_pwrite64 +#define __NR_getdents __NR_getdents64 +#define __NR_fadvise __NR_fadvise64 + + + +/* Repeat with SYS_ prefix */ + +#define SYS_read				0 +#define SYS_write				1 +#define SYS_open				2 +#define SYS_close				3 +#define SYS_stat				4 +#define SYS_fstat				5 +#define SYS_lstat				6 +#define SYS_poll				7 +#define SYS_lseek				8 +#define SYS_mmap				9 +#define SYS_mprotect			10 +#define SYS_munmap				11 +#define SYS_brk				12 +#define SYS_rt_sigaction		13 +#define SYS_rt_sigprocmask		14 +#define SYS_rt_sigreturn		15 +#define SYS_ioctl				16 +#define SYS_pread64			17 +#define SYS_pwrite64			18 +#define SYS_readv				19 +#define SYS_writev				20 +#define SYS_access				21 +#define SYS_pipe				22 +#define SYS_select				23 +#define SYS_sched_yield		24 +#define SYS_mremap				25 +#define SYS_msync				26 +#define SYS_mincore			27 +#define SYS_madvise			28 +#define SYS_shmget				29 +#define SYS_shmat				30 +#define SYS_shmctl				31 +#define SYS_dup				32 +#define SYS_dup2				33 +#define SYS_pause				34 +#define SYS_nanosleep			35 +#define SYS_getitimer			36 +#define SYS_alarm				37 +#define SYS_setitimer			38 +#define SYS_getpid				39 +#define SYS_sendfile			40 +#define SYS_socket				41 +#define SYS_connect			42 +#define SYS_accept				43 +#define SYS_sendto				44 +#define SYS_recvfrom			45 +#define SYS_sendmsg			46 +#define SYS_recvmsg			47 +#define SYS_shutdown			48 +#define SYS_bind				49 +#define SYS_listen				50 +#define SYS_getsockname		51 +#define SYS_getpeername		52 +#define SYS_socketpair			53 +#define SYS_setsockopt			54 +#define SYS_getsockopt			55 +#define SYS_clone				56 +#define SYS_fork				57 +#define SYS_vfork				58 +#define SYS_execve				59 +#define SYS_exit				60 +#define SYS_wait4				61 +#define SYS_kill				62 +#define SYS_uname				63 +#define SYS_semget				64 +#define SYS_semop				65 +#define SYS_semctl				66 +#define SYS_shmdt				67 +#define SYS_msgget				68 +#define SYS_msgsnd				69 +#define SYS_msgrcv				70 +#define SYS_msgctl				71 +#define SYS_fcntl				72 +#define SYS_flock				73 +#define SYS_fsync				74 +#define SYS_fdatasync			75 +#define SYS_truncate			76 +#define SYS_ftruncate			77 +#define SYS_getdents			78 +#define SYS_getcwd				79 +#define SYS_chdir				80 +#define SYS_fchdir				81 +#define SYS_rename				82 +#define SYS_mkdir				83 +#define SYS_rmdir				84 +#define SYS_creat				85 +#define SYS_link				86 +#define SYS_unlink				87 +#define SYS_symlink			88 +#define SYS_readlink			89 +#define SYS_chmod				90 +#define SYS_fchmod				91 +#define SYS_chown				92 +#define SYS_fchown				93 +#define SYS_lchown				94 +#define SYS_umask				95 +#define SYS_gettimeofday		96 +#define SYS_getrlimit			97 +#define SYS_getrusage			98 +#define SYS_sysinfo			99 +#define SYS_times				100 +#define SYS_ptrace				101 +#define SYS_getuid				102 +#define SYS_syslog				103 +#define SYS_getgid				104 +#define SYS_setuid				105 +#define SYS_setgid				106 +#define SYS_geteuid			107 +#define SYS_getegid			108 +#define SYS_setpgid			109 +#define SYS_getppid			110 +#define SYS_getpgrp			111 +#define SYS_setsid				112 +#define SYS_setreuid			113 +#define SYS_setregid			114 +#define SYS_getgroups			115 +#define SYS_setgroups			116 +#define SYS_setresuid			117 +#define SYS_getresuid			118 +#define SYS_setresgid			119 +#define SYS_getresgid			120 +#define SYS_getpgid			121 +#define SYS_setfsuid			122 +#define SYS_setfsgid			123 +#define SYS_getsid				124 +#define SYS_capget				125 +#define SYS_capset				126 +#define SYS_rt_sigpending		127 +#define SYS_rt_sigtimedwait	128 +#define SYS_rt_sigqueueinfo	129 +#define SYS_rt_sigsuspend		130 +#define SYS_sigaltstack		131 +#define SYS_utime				132 +#define SYS_mknod				133 +#define SYS_uselib				134 +#define SYS_personality		135 +#define SYS_ustat				136 +#define SYS_statfs				137 +#define SYS_fstatfs			138 +#define SYS_sysfs				139 +#define SYS_getpriority			140 +#define SYS_setpriority			141 +#define SYS_sched_setparam			142 +#define SYS_sched_getparam			143 +#define SYS_sched_setscheduler		144 +#define SYS_sched_getscheduler		145 +#define SYS_sched_get_priority_max	146 +#define SYS_sched_get_priority_min	147 +#define SYS_sched_rr_get_interval	148 +#define SYS_mlock					149 +#define SYS_munlock				150 +#define SYS_mlockall				151 +#define SYS_munlockall				152 +#define SYS_vhangup				153 +#define SYS_modify_ldt				154 +#define SYS_pivot_root				155 +#define SYS__sysctl				156 +#define SYS_prctl					157 +#define SYS_arch_prctl				158 +#define SYS_adjtimex				159 +#define SYS_setrlimit				160 +#define SYS_chroot					161 +#define SYS_sync					162 +#define SYS_acct					163 +#define SYS_settimeofday			164 +#define SYS_mount					165 +#define SYS_umount2				166 +#define SYS_swapon					167 +#define SYS_swapoff				168 +#define SYS_reboot					169 +#define SYS_sethostname			170 +#define SYS_setdomainname			171 +#define SYS_iopl					172 +#define SYS_ioperm					173 +#define SYS_create_module			174 +#define SYS_init_module			175 +#define SYS_delete_module			176 +#define SYS_get_kernel_syms		177 +#define SYS_query_module			178 +#define SYS_quotactl				179 +#define SYS_nfsservctl				180 +#define SYS_getpmsg				181 +#define SYS_putpmsg				182 +#define SYS_afs_syscall			183 +#define SYS_tuxcall				184 +#define SYS_security				185 +#define SYS_gettid					186 +#define SYS_readahead				187 +#define SYS_setxattr				188 +#define SYS_lsetxattr				189 +#define SYS_fsetxattr				190 +#define SYS_getxattr				191 +#define SYS_lgetxattr				192 +#define SYS_fgetxattr				193 +#define SYS_listxattr				194 +#define SYS_llistxattr				195 +#define SYS_flistxattr				196 +#define SYS_removexattr			197 +#define SYS_lremovexattr			198 +#define SYS_fremovexattr			199 +#define SYS_tkill					200 +#define SYS_time					201 +#define SYS_futex					202 +#define SYS_sched_setaffinity		203 +#define SYS_sched_getaffinity		204 +#define SYS_set_thread_area		205 +#define SYS_io_setup				206 +#define SYS_io_destroy				207 +#define SYS_io_getevents			208 +#define SYS_io_submit				209 +#define SYS_io_cancel				210 +#define SYS_get_thread_area		211 +#define SYS_lookup_dcookie			212 +#define SYS_epoll_create			213 +#define SYS_epoll_ctl_old			214 +#define SYS_epoll_wait_old			215 +#define SYS_remap_file_pages		216 +#define SYS_getdents64				217 +#define SYS_set_tid_address		218 +#define SYS_restart_syscall		219 +#define SYS_semtimedop				220 +#define SYS_fadvise64				221 +#define SYS_timer_create			222 +#define SYS_timer_settime			223 +#define SYS_timer_gettime			224 +#define SYS_timer_getoverrun		225 +#define SYS_timer_delete			226 +#define SYS_clock_settime			227 +#define SYS_clock_gettime			228 +#define SYS_clock_getres			229 +#define SYS_clock_nanosleep		230 +#define SYS_exit_group				231 +#define SYS_epoll_wait				232 +#define SYS_epoll_ctl				233 +#define SYS_tgkill					234 +#define SYS_utimes					235 +#define SYS_vserver				236 +#define SYS_mbind					237 +#define SYS_set_mempolicy			238 +#define SYS_get_mempolicy			239 +#define SYS_mq_open				240 +#define SYS_mq_unlink				241 +#define SYS_mq_timedsend			242 +#define SYS_mq_timedreceive		243 +#define SYS_mq_notify				244 +#define SYS_mq_getsetattr			245 +#define SYS_kexec_load				246 +#define SYS_waitid					247 +#define SYS_add_key				248 +#define SYS_request_key			249 +#define SYS_keyctl					250 +#define SYS_ioprio_set				251 +#define SYS_ioprio_get				252 +#define SYS_inotify_init			253 +#define SYS_inotify_add_watch		254 +#define SYS_inotify_rm_watch		255 +#define SYS_migrate_pages			256 +#define SYS_openat					257 +#define SYS_mkdirat				258 +#define SYS_mknodat				259 +#define SYS_fchownat				260 +#define SYS_futimesat				261 +#define SYS_newfstatat				262 +#define SYS_unlinkat				263 +#define SYS_renameat				264 +#define SYS_linkat					265 +#define SYS_symlinkat				266 +#define SYS_readlinkat				267 +#define SYS_fchmodat				268 +#define SYS_faccessat				269 +#define SYS_pselect6				270 +#define SYS_ppoll					271 +#define SYS_unshare				272 +#define SYS_set_robust_list		273 +#define SYS_get_robust_list		274 +#define SYS_splice					275 +#define SYS_tee					276 +#define SYS_sync_file_range		277 +#define SYS_vmsplice				278 +#define SYS_move_pages				279 +#define SYS_utimensat				280 +#define SYS_epoll_pwait			281 +#define SYS_signalfd				282 +#define SYS_timerfd_create			283 +#define SYS_eventfd				284 +#define SYS_fallocate				285 +#define SYS_timerfd_settime		286 +#define SYS_timerfd_gettime		287 +#define SYS_accept4				288 +#define SYS_signalfd4				289 +#define SYS_eventfd2				290 +#define SYS_epoll_create1			291 +#define SYS_dup3					292 +#define SYS_pipe2					293 +#define SYS_inotify_init1			294 +#define SYS_preadv					295 +#define SYS_pwritev				296 +#define SYS_rt_tgsigqueueinfo		297 +#define SYS_perf_event_open		298 +#define SYS_recvmmsg				299 +#define SYS_fanotify_init			300 +#define SYS_fanotify_mark			301 +#define SYS_prlimit64				302 +#define SYS_name_to_handle_at			303 +#define SYS_open_by_handle_at			304 +#define SYS_clock_adjtime			305 +#define SYS_syncfs				306 +#define SYS_sendmmsg				307 +#define SYS_setns				308 +#define SYS_getcpu				309 +#define SYS_process_vm_readv			310 +#define SYS_process_vm_writev			311 +#define SYS_kcmp				312 +#define SYS_finit_module			313 + +#undef SYS_fstatat +#undef SYS_pread +#undef SYS_pwrite +#undef SYS_getdents +#define SYS_fstatat SYS_newfstatat +#define SYS_pread SYS_pread64 +#define SYS_pwrite SYS_pwrite64 +#define SYS_getdents SYS_getdents64 +#define SYS_fadvise SYS_fadvise64 + + diff --git a/arch/x32/bits/termios.h b/arch/x32/bits/termios.h new file mode 100644 index 00000000..f0d81b13 --- /dev/null +++ b/arch/x32/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 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 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 + +#define ECHOCTL 0001000 +#define ECHOPRT 0002000 +#define ECHOKE 0004000 +#define FLUSHO 0010000 +#define PENDIN 0040000 + +#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 + +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +#define CBAUDEX 0010000 +#define CRTSCTS  020000000000 +#define EXTPROC 0200000 +#define XTABS  0014000 +#endif diff --git a/arch/x32/bits/user.h b/arch/x32/bits/user.h new file mode 100644 index 00000000..8b42632f --- /dev/null +++ b/arch/x32/bits/user.h @@ -0,0 +1,44 @@ +#undef __WORDSIZE +#define __WORDSIZE 64 + +typedef struct user_fpregs_struct +{ +	uint16_t cwd, swd, ftw, fop; +	uint64_t rip, rdp; +	uint32_t mxcsr, mxcs_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		(~(PAGE_SIZE-1)) +#define NBPG			PAGE_SIZE +#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/arch/x32/crt_arch.h b/arch/x32/crt_arch.h new file mode 100644 index 00000000..db692950 --- /dev/null +++ b/arch/x32/crt_arch.h @@ -0,0 +1,9 @@ +__asm__("\ +.text \n\ +.global _start \n\ +_start: \n\ +	xor %rbp,%rbp \n\ +	mov %rsp,%rdi \n\ +	andq $-16,%rsp \n\ +	call __cstart \n\ +"); diff --git a/arch/x32/pthread_arch.h b/arch/x32/pthread_arch.h new file mode 100644 index 00000000..29e4590c --- /dev/null +++ b/arch/x32/pthread_arch.h @@ -0,0 +1,10 @@ +static inline struct pthread *__pthread_self() +{ +	struct pthread *self; +	__asm__ __volatile__ ("mov %%fs:0,%0" : "=r" (self) ); +	return self; +} + +#define TP_ADJ(p) (p) + +#define CANCEL_REG_IP 16 diff --git a/arch/x32/reloc.h b/arch/x32/reloc.h new file mode 100644 index 00000000..28cf7cc1 --- /dev/null +++ b/arch/x32/reloc.h @@ -0,0 +1,46 @@ +#include <stdint.h> +#include <string.h> +#include <elf.h> + +#define LDSO_ARCH "x86_64" + +#define IS_COPY(x) ((x)==R_X86_64_COPY) +#define IS_PLT(x) ((x)==R_X86_64_JUMP_SLOT) + +static inline void do_single_reloc( +	struct dso *self, unsigned char *base_addr, +	size_t *reloc_addr, int type, size_t addend, +	Sym *sym, size_t sym_size, +	struct symdef def, size_t sym_val) +{ +	switch(type) { +	case R_X86_64_GLOB_DAT: +	case R_X86_64_JUMP_SLOT: +	case R_X86_64_64: +		*reloc_addr = sym_val + addend; +		break; +	case R_X86_64_32: +		*(uint32_t *)reloc_addr = sym_val + addend; +		break; +	case R_X86_64_PC32: +		*reloc_addr = sym_val + addend - (size_t)reloc_addr + (size_t)base_addr; +		break; +	case R_X86_64_RELATIVE: +		*reloc_addr = (size_t)base_addr + addend; +		break; +	case R_X86_64_COPY: +		memcpy(reloc_addr, (void *)sym_val, sym_size); +		break; +	case R_X86_64_DTPMOD64: +		*reloc_addr = def.dso ? def.dso->tls_id : self->tls_id; +		break; +	case R_X86_64_DTPOFF64: +		*reloc_addr = def.sym->st_value + addend; +		break; +	case R_X86_64_TPOFF64: +		*reloc_addr = (def.sym +			? def.sym->st_value - def.dso->tls_offset +			: 0 - self->tls_offset) + addend; +		break; +	} +} diff --git a/arch/x32/syscall_arch.h b/arch/x32/syscall_arch.h new file mode 100644 index 00000000..a85c440c --- /dev/null +++ b/arch/x32/syscall_arch.h @@ -0,0 +1,62 @@ +#define __SYSCALL_LL_E(x) (x) +#define __SYSCALL_LL_O(x) (x) + +static __inline long __syscall0(long n) +{ +	unsigned long ret; +	__asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory"); +	return ret; +} + +static __inline long __syscall1(long n, long a1) +{ +	unsigned long ret; +	__asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory"); +	return ret; +} + +static __inline long __syscall2(long n, long a1, 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 n, long a1, long a2, 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 n, long a1, long a2, long a3, long a4) +{ +	unsigned long ret; +	register long r10 __asm__("r10") = a4; +	__asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), +						  "d"(a3), "r"(r10): "rcx", "r11", "memory"); +	return ret; +} + +static __inline long __syscall5(long n, long a1, long a2, long a3, long a4, long a5) +{ +	unsigned long ret; +	register long r10 __asm__("r10") = a4; +	register long r8 __asm__("r8") = a5; +	__asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), +						  "d"(a3), "r"(r10), "r"(r8) : "rcx", "r11", "memory"); +	return ret; +} + +static __inline long __syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6) +{ +	unsigned long ret; +	register long r10 __asm__("r10") = a4; +	register long r8 __asm__("r8") = a5; +	register long r9 __asm__("r9") = a6; +	__asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2), +						  "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory"); +	return ret; +} diff --git a/crt/x32/crti.s b/crt/x32/crti.s new file mode 100644 index 00000000..4788968b --- /dev/null +++ b/crt/x32/crti.s @@ -0,0 +1,9 @@ +.section .init +.global _init +_init: +	push %rax + +.section .fini +.global _fini +_fini: +	push %rax diff --git a/crt/x32/crtn.s b/crt/x32/crtn.s new file mode 100644 index 00000000..29198b77 --- /dev/null +++ b/crt/x32/crtn.s @@ -0,0 +1,7 @@ +.section .init +	pop %rax +	ret + +.section .fini +	pop %rax +	ret diff --git a/src/fenv/x32/fenv.s b/src/fenv/x32/fenv.s new file mode 100644 index 00000000..b5aeaf4f --- /dev/null +++ b/src/fenv/x32/fenv.s @@ -0,0 +1,97 @@ +.global feclearexcept +.type feclearexcept,@function +feclearexcept: +		# maintain exceptions in the sse mxcsr, clear x87 exceptions +	mov %edi,%ecx +	and $0x3f,%ecx +	fnstsw %ax +	test %eax,%ecx +	jz 1f +	fnclex +1:	stmxcsr -8(%rsp) +	and $0x3f,%eax +	or %eax,-8(%rsp) +	test %ecx,-8(%rsp) +	jz 1f +	not %ecx +	and %ecx,-8(%rsp) +	ldmxcsr -8(%rsp) +1:	xor %eax,%eax +	ret + +.global feraiseexcept +.type feraiseexcept,@function +feraiseexcept: +	and $0x3f,%edi +	stmxcsr -8(%rsp) +	or %edi,-8(%rsp) +	ldmxcsr -8(%rsp) +	xor %eax,%eax +	ret + +.global __fesetround +.type __fesetround,@function +__fesetround: +	push %rax +	xor %eax,%eax +	mov %edi,%ecx +	fnstcw (%rsp) +	andb $0xf3,1(%rsp) +	or %ch,1(%rsp) +	fldcw (%rsp) +	stmxcsr (%rsp) +	shl $3,%ch +	andb $0x9f,1(%rsp) +	or %ch,1(%rsp) +	ldmxcsr (%rsp) +	pop %rcx +	ret + +.global fegetround +.type fegetround,@function +fegetround: +	push %rax +	stmxcsr (%rsp) +	pop %rax +	shr $3,%eax +	and $0xc00,%eax +	ret + +.global fegetenv +.type fegetenv,@function +fegetenv: +	xor %eax,%eax +	fnstenv (%rdi) +	stmxcsr 28(%rdi) +	ret + +.global fesetenv +.type fesetenv,@function +fesetenv: +	xor %eax,%eax +	inc %rdi +	jz 1f +	fldenv -1(%rdi) +	ldmxcsr 27(%rdi) +	ret +1:	push %rax +	push %rax +	pushq $0xffff +	pushq $0x37f +	fldenv (%rsp) +	pushq $0x1f80 +	ldmxcsr (%rsp) +	add $40,%rsp +	ret + +.global fetestexcept +.type fetestexcept,@function +fetestexcept: +	and $0x3f,%edi +	push %rax +	stmxcsr (%rsp) +	pop %rsi +	fnstsw %ax +	or %esi,%eax +	and %edi,%eax +	ret diff --git a/src/internal/x32/syscall.s b/src/internal/x32/syscall.s new file mode 100644 index 00000000..6e0db09c --- /dev/null +++ b/src/internal/x32/syscall.s @@ -0,0 +1,12 @@ +.global __syscall +.type __syscall,@function +__syscall: +	movq %rdi,%rax +	movq %rsi,%rdi +	movq %rdx,%rsi +	movq %rcx,%rdx +	movq %r8,%r10 +	movq %r9,%r8 +	movq 8(%rsp),%r9 +	syscall +	ret diff --git a/src/ldso/x32/dlsym.s b/src/ldso/x32/dlsym.s new file mode 100644 index 00000000..3c16616a --- /dev/null +++ b/src/ldso/x32/dlsym.s @@ -0,0 +1,6 @@ +.text +.global dlsym +.type dlsym,@function +dlsym: +	mov (%rsp),%rdx +	jmp __dlsym diff --git a/src/ldso/x32/start.s b/src/ldso/x32/start.s new file mode 100644 index 00000000..80c1d08d --- /dev/null +++ b/src/ldso/x32/start.s @@ -0,0 +1,16 @@ +.text +.global _start +_start: +	mov (%rsp),%rdi +	lea 8(%rsp),%rsi +	call __dynlink +	pop %rdi +1:	dec %edi +	pop %rsi +	cmp $-1,%rsi +	jz 1b +	inc %edi +	push %rsi +	push %rdi +	xor %edx,%edx +	jmp *%rax diff --git a/src/math/x32/__invtrigl.s b/src/math/x32/__invtrigl.s new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/math/x32/__invtrigl.s diff --git a/src/math/x32/acosl.s b/src/math/x32/acosl.s new file mode 100644 index 00000000..88e01b49 --- /dev/null +++ b/src/math/x32/acosl.s @@ -0,0 +1,16 @@ +# see ../i386/acos.s + +.global acosl +.type acosl,@function +acosl: +	fldt 8(%rsp) +1:	fld %st(0) +	fld1 +	fsub %st(0),%st(1) +	fadd %st(2) +	fmulp +	fsqrt +	fabs +	fxch %st(1) +	fpatan +	ret diff --git a/src/math/x32/asinl.s b/src/math/x32/asinl.s new file mode 100644 index 00000000..ed212d9a --- /dev/null +++ b/src/math/x32/asinl.s @@ -0,0 +1,12 @@ +.global asinl +.type asinl,@function +asinl: +	fldt 8(%rsp) +1:	fld %st(0) +	fld1 +	fsub %st(0),%st(1) +	fadd %st(2) +	fmulp +	fsqrt +	fpatan +	ret diff --git a/src/math/x32/atan2l.s b/src/math/x32/atan2l.s new file mode 100644 index 00000000..e5f0a3de --- /dev/null +++ b/src/math/x32/atan2l.s @@ -0,0 +1,7 @@ +.global atan2l +.type atan2l,@function +atan2l: +	fldt 8(%rsp) +	fldt 24(%rsp) +	fpatan +	ret diff --git a/src/math/x32/atanl.s b/src/math/x32/atanl.s new file mode 100644 index 00000000..df76de5d --- /dev/null +++ b/src/math/x32/atanl.s @@ -0,0 +1,7 @@ +.global atanl +.type atanl,@function +atanl: +	fldt 8(%rsp) +	fld1 +	fpatan +	ret diff --git a/src/math/x32/ceill.s b/src/math/x32/ceill.s new file mode 100644 index 00000000..f5cfa3b3 --- /dev/null +++ b/src/math/x32/ceill.s @@ -0,0 +1 @@ +# see floorl.s diff --git a/src/math/x32/exp2l.s b/src/math/x32/exp2l.s new file mode 100644 index 00000000..0d6cd563 --- /dev/null +++ b/src/math/x32/exp2l.s @@ -0,0 +1,90 @@ +.global expm1l +.type expm1l,@function +expm1l: +	fldt 8(%rsp) +	fldl2e +	fmulp +	movl $0xc2820000,-4(%rsp) +	flds -4(%rsp) +	fucomp %st(1) +	fnstsw %ax +	sahf +	fld1 +	jb 1f +		# x*log2e <= -65, return -1 without underflow +	fstp %st(1) +	fchs +	ret +1:	fld %st(1) +	fabs +	fucom %st(1) +	fnstsw %ax +	fstp %st(0) +	fstp %st(0) +	sahf +	ja 1f +	f2xm1 +	ret +1:	push %rax +	call 1f +	pop %rax +	fld1 +	fsubrp +	ret + +.global exp2l +.type exp2l,@function +exp2l: +	fldt 8(%rsp) +1:	fld %st(0) +	sub $16,%rsp +	fstpt (%rsp) +	mov 8(%rsp),%ax +	and $0x7fff,%ax +	cmp $0x3fff+13,%ax +	jb 4f             # |x| < 8192 +	cmp $0x3fff+15,%ax +	jae 3f            # |x| >= 32768 +	fsts (%rsp) +	cmpl $0xc67ff800,(%rsp) +	jb 2f             # x > -16382 +	movl $0x5f000000,(%rsp) +	flds (%rsp)       # 0x1p63 +	fld %st(1) +	fsub %st(1) +	faddp +	fucomp %st(1) +	fnstsw +	sahf +	je 2f             # x - 0x1p63 + 0x1p63 == x +	movl $1,(%rsp) +	flds (%rsp)       # 0x1p-149 +	fdiv %st(1) +	fstps (%rsp)      # raise underflow +2:	fld1 +	fld %st(1) +	frndint +	fxch %st(2) +	fsub %st(2)       # st(0)=x-rint(x), st(1)=1, st(2)=rint(x) +	f2xm1 +	faddp             # 2^(x-rint(x)) +1:	fscale +	fstp %st(1) +	add $16,%rsp +	ret +3:	xor %eax,%eax +4:	cmp $0x3fff-64,%ax +	fld1 +	jb 1b             # |x| < 0x1p-64 +	fstpt (%rsp) +	fistl 8(%rsp) +	fildl 8(%rsp) +	fsubrp %st(1) +	addl $0x3fff,8(%rsp) +	f2xm1 +	fld1 +	faddp             # 2^(x-rint(x)) +	fldt (%rsp)       # 2^rint(x) +	fmulp +	add $16,%rsp +	ret diff --git a/src/math/x32/expl.s b/src/math/x32/expl.s new file mode 100644 index 00000000..3add810d --- /dev/null +++ b/src/math/x32/expl.s @@ -0,0 +1,101 @@ +# exp(x) = 2^hi + 2^hi (2^lo - 1) +# where hi+lo = log2e*x with 128bit precision +# exact log2e*x calculation depends on nearest rounding mode +# using the exact multiplication method of Dekker and Veltkamp + +.global expl +.type expl,@function +expl: +	fldt 8(%rsp) + +		# interesting case: 0x1p-32 <= |x| < 16384 +		# check if (exponent|0x8000) is in [0xbfff-32, 0xbfff+13] +	mov 16(%rsp), %ax +	or $0x8000, %ax +	sub $0xbfdf, %ax +	cmp $45, %ax +	jbe 2f +	test %ax, %ax +	fld1 +	js 1f +		# if |x|>=0x1p14 or nan return 2^trunc(x) +	fscale +	fstp %st(1) +	ret +		# if |x|<0x1p-32 return 1+x +1:	faddp +	ret + +		# should be 0x1.71547652b82fe178p0L == 0x3fff b8aa3b29 5c17f0bc +		# it will be wrong on non-nearest rounding mode +2:	fldl2e +	subq $48, %rsp +		# hi = log2e_hi*x +		# 2^hi = exp2l(hi) +	fmul %st(1),%st +	fld %st(0) +	fstpt (%rsp) +	fstpt 16(%rsp) +	fstpt 32(%rsp) +	call exp2l +		# if 2^hi == inf return 2^hi +	fld %st(0) +	fstpt (%rsp) +	cmpw $0x7fff, 8(%rsp) +	je 1f +	fldt 32(%rsp) +	fldt 16(%rsp) +		# fpu stack: 2^hi x hi +		# exact mult: x*log2e +	fld %st(1) +		# c = 0x1p32+1 +	movq $0x41f0000000100000,%rax +	pushq %rax +	fldl (%rsp) +		# xh = x - c*x + c*x +		# xl = x - xh +	fmulp +	fld %st(2) +	fsub %st(1), %st +	faddp +	fld %st(2) +	fsub %st(1), %st +		# yh = log2e_hi - c*log2e_hi + c*log2e_hi +	movq $0x3ff7154765200000,%rax +	pushq %rax +	fldl (%rsp) +		# fpu stack: 2^hi x hi xh xl yh +		# lo = hi - xh*yh + xl*yh +	fld %st(2) +	fmul %st(1), %st +	fsubp %st, %st(4) +	fmul %st(1), %st +	faddp %st, %st(3) +		# yl = log2e_hi - yh +	movq $0x3de705fc2f000000,%rax +	pushq %rax +	fldl (%rsp) +		# fpu stack: 2^hi x lo xh xl yl +		# lo += xh*yl + xl*yl +	fmul %st, %st(2) +	fmulp %st, %st(1) +	fxch %st(2) +	faddp +	faddp +		# log2e_lo +	movq $0xbfbe,%rax +	pushq %rax +	movq $0x82f0025f2dc582ee,%rax +	pushq %rax +	fldt (%rsp) +	addq $40,%rsp +		# fpu stack: 2^hi x lo log2e_lo +		# lo += log2e_lo*x +		# return 2^hi + 2^hi (2^lo - 1) +	fmulp %st, %st(2) +	faddp +	f2xm1 +	fmul %st(1), %st +	faddp +1:	addq $48, %rsp +	ret diff --git a/src/math/x32/expm1l.s b/src/math/x32/expm1l.s new file mode 100644 index 00000000..e773f080 --- /dev/null +++ b/src/math/x32/expm1l.s @@ -0,0 +1 @@ +# see exp2l.s diff --git a/src/math/x32/fabs.s b/src/math/x32/fabs.s new file mode 100644 index 00000000..5715005e --- /dev/null +++ b/src/math/x32/fabs.s @@ -0,0 +1,9 @@ +.global fabs +.type fabs,@function +fabs: +	xor %eax,%eax +	dec %rax +	shr %rax +	movq %rax,%xmm1 +	andpd %xmm1,%xmm0 +	ret diff --git a/src/math/x32/fabsf.s b/src/math/x32/fabsf.s new file mode 100644 index 00000000..501a1f17 --- /dev/null +++ b/src/math/x32/fabsf.s @@ -0,0 +1,7 @@ +.global fabsf +.type fabsf,@function +fabsf: +	mov $0x7fffffff,%eax +	movq %rax,%xmm1 +	andps %xmm1,%xmm0 +	ret diff --git a/src/math/x32/fabsl.s b/src/math/x32/fabsl.s new file mode 100644 index 00000000..4e7ab525 --- /dev/null +++ b/src/math/x32/fabsl.s @@ -0,0 +1,6 @@ +.global fabsl +.type fabsl,@function +fabsl: +	fldt 8(%rsp) +	fabs +	ret diff --git a/src/math/x32/floorl.s b/src/math/x32/floorl.s new file mode 100644 index 00000000..80da4660 --- /dev/null +++ b/src/math/x32/floorl.s @@ -0,0 +1,27 @@ +.global floorl +.type floorl,@function +floorl: +	fldt 8(%rsp) +1:	mov $0x7,%al +1:	fstcw 8(%rsp) +	mov 9(%rsp),%ah +	mov %al,9(%rsp) +	fldcw 8(%rsp) +	frndint +	mov %ah,9(%rsp) +	fldcw 8(%rsp) +	ret + +.global ceill +.type ceill,@function +ceill: +	fldt 8(%rsp) +	mov $0xb,%al +	jmp 1b + +.global truncl +.type truncl,@function +truncl: +	fldt 8(%rsp) +	mov $0xf,%al +	jmp 1b diff --git a/src/math/x32/fmodl.s b/src/math/x32/fmodl.s new file mode 100644 index 00000000..ca81e60c --- /dev/null +++ b/src/math/x32/fmodl.s @@ -0,0 +1,11 @@ +.global fmodl +.type fmodl,@function +fmodl: +	fldt 24(%rsp) +	fldt 8(%rsp) +1:	fprem +	fstsw %ax +	sahf +	jp 1b +	fstp %st(1) +	ret diff --git a/src/math/x32/llrint.s b/src/math/x32/llrint.s new file mode 100644 index 00000000..bf476498 --- /dev/null +++ b/src/math/x32/llrint.s @@ -0,0 +1,5 @@ +.global llrint +.type llrint,@function +llrint: +	cvtsd2si %xmm0,%rax +	ret diff --git a/src/math/x32/llrintf.s b/src/math/x32/llrintf.s new file mode 100644 index 00000000..d7204ac0 --- /dev/null +++ b/src/math/x32/llrintf.s @@ -0,0 +1,5 @@ +.global llrintf +.type llrintf,@function +llrintf: +	cvtss2si %xmm0,%rax +	ret diff --git a/src/math/x32/llrintl.s b/src/math/x32/llrintl.s new file mode 100644 index 00000000..1ec0817d --- /dev/null +++ b/src/math/x32/llrintl.s @@ -0,0 +1,7 @@ +.global llrintl +.type llrintl,@function +llrintl: +	fldt 8(%rsp) +	fistpll 8(%rsp) +	mov 8(%rsp),%rax +	ret diff --git a/src/math/x32/log10l.s b/src/math/x32/log10l.s new file mode 100644 index 00000000..48ea4af7 --- /dev/null +++ b/src/math/x32/log10l.s @@ -0,0 +1,7 @@ +.global log10l +.type log10l,@function +log10l: +	fldlg2 +	fldt 8(%rsp) +	fyl2x +	ret diff --git a/src/math/x32/log1pl.s b/src/math/x32/log1pl.s new file mode 100644 index 00000000..955c9dbf --- /dev/null +++ b/src/math/x32/log1pl.s @@ -0,0 +1,15 @@ +.global log1pl +.type log1pl,@function +log1pl: +	mov 14(%rsp),%eax +	fldln2 +	and $0x7fffffff,%eax +	fldt 8(%rsp) +	cmp $0x3ffd9400,%eax +	ja 1f +	fyl2xp1 +	ret +1:	fld1 +	faddp +	fyl2x +	ret diff --git a/src/math/x32/log2l.s b/src/math/x32/log2l.s new file mode 100644 index 00000000..ba08b9fb --- /dev/null +++ b/src/math/x32/log2l.s @@ -0,0 +1,7 @@ +.global log2l +.type log2l,@function +log2l: +	fld1 +	fldt 8(%rsp) +	fyl2x +	ret diff --git a/src/math/x32/logl.s b/src/math/x32/logl.s new file mode 100644 index 00000000..20dd1f81 --- /dev/null +++ b/src/math/x32/logl.s @@ -0,0 +1,7 @@ +.global logl +.type logl,@function +logl: +	fldln2 +	fldt 8(%rsp) +	fyl2x +	ret diff --git a/src/math/x32/lrint.s b/src/math/x32/lrint.s new file mode 100644 index 00000000..15fc2454 --- /dev/null +++ b/src/math/x32/lrint.s @@ -0,0 +1,5 @@ +.global lrint +.type lrint,@function +lrint: +	cvtsd2si %xmm0,%rax +	ret diff --git a/src/math/x32/lrintf.s b/src/math/x32/lrintf.s new file mode 100644 index 00000000..488423d2 --- /dev/null +++ b/src/math/x32/lrintf.s @@ -0,0 +1,5 @@ +.global lrintf +.type lrintf,@function +lrintf: +	cvtss2si %xmm0,%rax +	ret diff --git a/src/math/x32/lrintl.s b/src/math/x32/lrintl.s new file mode 100644 index 00000000..d587b12b --- /dev/null +++ b/src/math/x32/lrintl.s @@ -0,0 +1,7 @@ +.global lrintl +.type lrintl,@function +lrintl: +	fldt 8(%rsp) +	fistpll 8(%rsp) +	mov 8(%rsp),%rax +	ret diff --git a/src/math/x32/remainderl.s b/src/math/x32/remainderl.s new file mode 100644 index 00000000..75c12374 --- /dev/null +++ b/src/math/x32/remainderl.s @@ -0,0 +1,11 @@ +.global remainderl +.type remainderl,@function +remainderl: +	fldt 24(%rsp) +	fldt 8(%rsp) +1:	fprem1 +	fstsw %ax +	sahf +	jp 1b +	fstp %st(1) +	ret diff --git a/src/math/x32/rintl.s b/src/math/x32/rintl.s new file mode 100644 index 00000000..64e663cd --- /dev/null +++ b/src/math/x32/rintl.s @@ -0,0 +1,6 @@ +.global rintl +.type rintl,@function +rintl: +	fldt 8(%rsp) +	frndint +	ret diff --git a/src/math/x32/sqrt.s b/src/math/x32/sqrt.s new file mode 100644 index 00000000..d3c609f9 --- /dev/null +++ b/src/math/x32/sqrt.s @@ -0,0 +1,4 @@ +.global sqrt +.type sqrt,@function +sqrt:	sqrtsd %xmm0, %xmm0 +	ret diff --git a/src/math/x32/sqrtf.s b/src/math/x32/sqrtf.s new file mode 100644 index 00000000..eec48c60 --- /dev/null +++ b/src/math/x32/sqrtf.s @@ -0,0 +1,4 @@ +.global sqrtf +.type sqrtf,@function +sqrtf:  sqrtss %xmm0, %xmm0 +	ret diff --git a/src/math/x32/sqrtl.s b/src/math/x32/sqrtl.s new file mode 100644 index 00000000..23cd687d --- /dev/null +++ b/src/math/x32/sqrtl.s @@ -0,0 +1,5 @@ +.global sqrtl +.type sqrtl,@function +sqrtl:	fldt 8(%rsp) +	fsqrt +	ret diff --git a/src/math/x32/truncl.s b/src/math/x32/truncl.s new file mode 100644 index 00000000..f5cfa3b3 --- /dev/null +++ b/src/math/x32/truncl.s @@ -0,0 +1 @@ +# see floorl.s diff --git a/src/process/x32/vfork.s b/src/process/x32/vfork.s new file mode 100644 index 00000000..27af46f5 --- /dev/null +++ b/src/process/x32/vfork.s @@ -0,0 +1,12 @@ +.global __vfork +.weak vfork +.type __vfork,@function +.type vfork,@function +__vfork: +vfork: +	pop %rdx +	mov $58,%eax +	syscall +	push %rdx +	mov %rax,%rdi +	jmp __syscall_ret diff --git a/src/setjmp/x32/longjmp.s b/src/setjmp/x32/longjmp.s new file mode 100644 index 00000000..e175a4b9 --- /dev/null +++ b/src/setjmp/x32/longjmp.s @@ -0,0 +1,22 @@ +/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */ +.global _longjmp +.global longjmp +.type _longjmp,@function +.type longjmp,@function +_longjmp: +longjmp: +	mov %rsi,%rax           /* val will be longjmp return */ +	test %rax,%rax +	jnz 1f +	inc %rax                /* if val==0, val=1 per longjmp semantics */ +1: +	mov (%rdi),%rbx         /* rdi is the jmp_buf, restore regs from it */ +	mov 8(%rdi),%rbp +	mov 16(%rdi),%r12 +	mov 24(%rdi),%r13 +	mov 32(%rdi),%r14 +	mov 40(%rdi),%r15 +	mov 48(%rdi),%rdx       /* this ends up being the stack pointer */ +	mov %rdx,%rsp +	mov 56(%rdi),%rdx       /* this is the instruction pointer */ +	jmp *%rdx               /* goto saved address without altering rsp */ diff --git a/src/setjmp/x32/setjmp.s b/src/setjmp/x32/setjmp.s new file mode 100644 index 00000000..98f58b8d --- /dev/null +++ b/src/setjmp/x32/setjmp.s @@ -0,0 +1,22 @@ +/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */ +.global __setjmp +.global _setjmp +.global setjmp +.type __setjmp,@function +.type _setjmp,@function +.type setjmp,@function +__setjmp: +_setjmp: +setjmp: +	mov %rbx,(%rdi)         /* rdi is jmp_buf, move registers onto it */ +	mov %rbp,8(%rdi) +	mov %r12,16(%rdi) +	mov %r13,24(%rdi) +	mov %r14,32(%rdi) +	mov %r15,40(%rdi) +	lea 8(%rsp),%rdx        /* this is our rsp WITHOUT current ret addr */ +	mov %rdx,48(%rdi) +	mov (%rsp),%rdx         /* save return addr ptr for new rip */ +	mov %rdx,56(%rdi) +	xor %rax,%rax           /* always return 0 */ +	ret diff --git a/src/signal/x32/restore.s b/src/signal/x32/restore.s new file mode 100644 index 00000000..682af2dd --- /dev/null +++ b/src/signal/x32/restore.s @@ -0,0 +1,8 @@ +.global __restore_rt +.global __restore +.type __restore_rt,@function +.type __restore,@function +__restore_rt: +__restore: +	movl $15, %eax +	syscall diff --git a/src/signal/x32/sigsetjmp.s b/src/signal/x32/sigsetjmp.s new file mode 100644 index 00000000..dc38f032 --- /dev/null +++ b/src/signal/x32/sigsetjmp.s @@ -0,0 +1,14 @@ +/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */ +.global sigsetjmp +.type sigsetjmp,@function +sigsetjmp: +	andl %esi,%esi +	movq %rsi,64(%rdi) +	jz 1f +	pushq %rdi +	leaq 72(%rdi),%rdx +	xorl %esi,%esi +	movl $2,%edi +	call sigprocmask +	popq %rdi +1:	jmp setjmp diff --git a/src/thread/x32/__set_thread_area.s b/src/thread/x32/__set_thread_area.s new file mode 100644 index 00000000..f3ff4f61 --- /dev/null +++ b/src/thread/x32/__set_thread_area.s @@ -0,0 +1,10 @@ +/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */ +.text +.global __set_thread_area +.type __set_thread_area,@function +__set_thread_area: +	mov %rdi,%rsi           /* shift for syscall */ +	movl $0x1002,%edi       /* SET_FS register */ +	movl $158,%eax          /* set fs segment to */ +	syscall                 /* arch_prctl(SET_FS, arg)*/ +	ret diff --git a/src/thread/x32/__unmapself.s b/src/thread/x32/__unmapself.s new file mode 100644 index 00000000..e2689e65 --- /dev/null +++ b/src/thread/x32/__unmapself.s @@ -0,0 +1,10 @@ +/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */ +.text +.global __unmapself +.type   __unmapself,@function +__unmapself: +	movl $11,%eax   /* SYS_munmap */ +	syscall         /* munmap(arg2,arg3) */ +	xor %rdi,%rdi   /* exit() args: always return success */ +	movl $60,%eax   /* SYS_exit */ +	syscall         /* exit(0) */ diff --git a/src/thread/x32/clone.s b/src/thread/x32/clone.s new file mode 100644 index 00000000..ee59903a --- /dev/null +++ b/src/thread/x32/clone.s @@ -0,0 +1,27 @@ +.text +.global __clone +.type   __clone,@function +__clone: +	xor %eax,%eax +	mov $56,%al +	mov %rdi,%r11 +	mov %rdx,%rdi +	mov %r8,%rdx +	mov %r9,%r8 +	mov 8(%rsp),%r10 +	mov %r11,%r9 +	and $-16,%rsi +	sub $8,%rsi +	mov %rcx,(%rsi) +	syscall +	test %eax,%eax +	jnz 1f +	xor %ebp,%ebp +	pop %rdi +	call *%r9 +	mov %eax,%edi +	xor %eax,%eax +	mov $60,%al +	syscall +	hlt +1:	ret diff --git a/src/thread/x32/syscall_cp.s b/src/thread/x32/syscall_cp.s new file mode 100644 index 00000000..788c53cc --- /dev/null +++ b/src/thread/x32/syscall_cp.s @@ -0,0 +1,23 @@ +.text +.global __syscall_cp_asm +.type   __syscall_cp_asm,@function +__syscall_cp_asm: + +.global __cp_begin +__cp_begin: +	mov (%rdi),%eax +	test %eax,%eax +	jnz __cancel +	mov %rdi,%r11 +	mov %rsi,%rax +	mov %rdx,%rdi +	mov %rcx,%rsi +	mov %r8,%rdx +	mov %r9,%r10 +	mov 8(%rsp),%r8 +	mov 16(%rsp),%r9 +	mov %r11,8(%rsp) +	syscall +.global __cp_end +__cp_end: +	ret | 
