about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--arch/x32/atomic.h125
-rw-r--r--arch/x32/bits/alltypes.h.in28
-rw-r--r--arch/x32/bits/endian.h1
-rw-r--r--arch/x32/bits/errno.h134
-rw-r--r--arch/x32/bits/fcntl.h39
-rw-r--r--arch/x32/bits/fenv.h34
-rw-r--r--arch/x32/bits/float.h21
-rw-r--r--arch/x32/bits/io.h77
-rw-r--r--arch/x32/bits/ioctl.h197
-rw-r--r--arch/x32/bits/ipc.h14
-rw-r--r--arch/x32/bits/limits.h8
-rw-r--r--arch/x32/bits/mman.h62
-rw-r--r--arch/x32/bits/msg.h13
-rw-r--r--arch/x32/bits/posix.h2
-rw-r--r--arch/x32/bits/reg.h29
-rw-r--r--arch/x32/bits/setjmp.h1
-rw-r--r--arch/x32/bits/shm.h25
-rw-r--r--arch/x32/bits/signal.h119
-rw-r--r--arch/x32/bits/socket.h18
-rw-r--r--arch/x32/bits/stat.h22
-rw-r--r--arch/x32/bits/statfs.h7
-rw-r--r--arch/x32/bits/stdarg.h4
-rw-r--r--arch/x32/bits/stdint.h20
-rw-r--r--arch/x32/bits/syscall.h655
-rw-r--r--arch/x32/bits/termios.h160
-rw-r--r--arch/x32/bits/user.h44
-rw-r--r--arch/x32/crt_arch.h9
-rw-r--r--arch/x32/pthread_arch.h10
-rw-r--r--arch/x32/reloc.h46
-rw-r--r--arch/x32/syscall_arch.h62
-rw-r--r--crt/x32/crti.s9
-rw-r--r--crt/x32/crtn.s7
-rw-r--r--src/fenv/x32/fenv.s97
-rw-r--r--src/internal/x32/syscall.s12
-rw-r--r--src/ldso/x32/dlsym.s6
-rw-r--r--src/ldso/x32/start.s16
-rw-r--r--src/math/x32/__invtrigl.s0
-rw-r--r--src/math/x32/acosl.s16
-rw-r--r--src/math/x32/asinl.s12
-rw-r--r--src/math/x32/atan2l.s7
-rw-r--r--src/math/x32/atanl.s7
-rw-r--r--src/math/x32/ceill.s1
-rw-r--r--src/math/x32/exp2l.s90
-rw-r--r--src/math/x32/expl.s101
-rw-r--r--src/math/x32/expm1l.s1
-rw-r--r--src/math/x32/fabs.s9
-rw-r--r--src/math/x32/fabsf.s7
-rw-r--r--src/math/x32/fabsl.s6
-rw-r--r--src/math/x32/floorl.s27
-rw-r--r--src/math/x32/fmodl.s11
-rw-r--r--src/math/x32/llrint.s5
-rw-r--r--src/math/x32/llrintf.s5
-rw-r--r--src/math/x32/llrintl.s7
-rw-r--r--src/math/x32/log10l.s7
-rw-r--r--src/math/x32/log1pl.s15
-rw-r--r--src/math/x32/log2l.s7
-rw-r--r--src/math/x32/logl.s7
-rw-r--r--src/math/x32/lrint.s5
-rw-r--r--src/math/x32/lrintf.s5
-rw-r--r--src/math/x32/lrintl.s7
-rw-r--r--src/math/x32/remainderl.s11
-rw-r--r--src/math/x32/rintl.s6
-rw-r--r--src/math/x32/sqrt.s4
-rw-r--r--src/math/x32/sqrtf.s4
-rw-r--r--src/math/x32/sqrtl.s5
-rw-r--r--src/math/x32/truncl.s1
-rw-r--r--src/process/x32/vfork.s12
-rw-r--r--src/setjmp/x32/longjmp.s22
-rw-r--r--src/setjmp/x32/setjmp.s22
-rw-r--r--src/signal/x32/restore.s8
-rw-r--r--src/signal/x32/sigsetjmp.s14
-rw-r--r--src/thread/x32/__set_thread_area.s10
-rw-r--r--src/thread/x32/__unmapself.s10
-rw-r--r--src/thread/x32/clone.s27
-rw-r--r--src/thread/x32/syscall_cp.s23
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