From c0ede9e4046a0882d83ae4b45c7dfac86fb7c15d Mon Sep 17 00:00:00 2001 From: Bobby Bingham Date: Sat, 30 Apr 2016 19:18:17 -0500 Subject: add powerpc64 port --- arch/powerpc64/atomic_arch.h | 63 +++ arch/powerpc64/bits/alltypes.h.in | 26 ++ arch/powerpc64/bits/endian.h | 5 + arch/powerpc64/bits/errno.h | 134 ++++++ arch/powerpc64/bits/fcntl.h | 40 ++ arch/powerpc64/bits/fenv.h | 31 ++ arch/powerpc64/bits/float.h | 16 + arch/powerpc64/bits/ioctl.h | 229 ++++++++++ arch/powerpc64/bits/ipc.h | 16 + arch/powerpc64/bits/limits.h | 7 + arch/powerpc64/bits/mman.h | 8 + arch/powerpc64/bits/msg.h | 13 + arch/powerpc64/bits/posix.h | 2 + arch/powerpc64/bits/reg.h | 3 + arch/powerpc64/bits/sem.h | 13 + arch/powerpc64/bits/setjmp.h | 1 + arch/powerpc64/bits/shm.h | 25 ++ arch/powerpc64/bits/signal.h | 108 +++++ arch/powerpc64/bits/socket.h | 62 +++ arch/powerpc64/bits/stat.h | 17 + arch/powerpc64/bits/stdint.h | 20 + arch/powerpc64/bits/syscall.h | 718 +++++++++++++++++++++++++++++++ arch/powerpc64/bits/termios.h | 170 ++++++++ arch/powerpc64/bits/user.h | 25 ++ arch/powerpc64/crt_arch.h | 19 + arch/powerpc64/pthread_arch.h | 17 + arch/powerpc64/reloc.h | 32 ++ arch/powerpc64/syscall_arch.h | 87 ++++ configure | 8 +- crt/powerpc64/crti.s | 21 + crt/powerpc64/crtn.s | 13 + src/fenv/powerpc64/fenv.c | 68 +++ src/internal/powerpc64/syscall.s | 17 + src/ldso/powerpc64/dlsym.s | 12 + src/setjmp/powerpc64/longjmp.s | 77 ++++ src/setjmp/powerpc64/setjmp.s | 78 ++++ src/signal/powerpc64/restore.s | 11 + src/signal/powerpc64/sigsetjmp.s | 30 ++ src/thread/powerpc64/__set_thread_area.s | 8 + src/thread/powerpc64/__unmapself.s | 9 + src/thread/powerpc64/clone.s | 47 ++ src/thread/powerpc64/syscall_cp.s | 37 ++ 42 files changed, 2342 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc64/atomic_arch.h create mode 100644 arch/powerpc64/bits/alltypes.h.in create mode 100644 arch/powerpc64/bits/endian.h create mode 100644 arch/powerpc64/bits/errno.h create mode 100644 arch/powerpc64/bits/fcntl.h create mode 100644 arch/powerpc64/bits/fenv.h create mode 100644 arch/powerpc64/bits/float.h create mode 100644 arch/powerpc64/bits/ioctl.h create mode 100644 arch/powerpc64/bits/ipc.h create mode 100644 arch/powerpc64/bits/limits.h create mode 100644 arch/powerpc64/bits/mman.h create mode 100644 arch/powerpc64/bits/msg.h create mode 100644 arch/powerpc64/bits/posix.h create mode 100644 arch/powerpc64/bits/reg.h create mode 100644 arch/powerpc64/bits/sem.h create mode 100644 arch/powerpc64/bits/setjmp.h create mode 100644 arch/powerpc64/bits/shm.h create mode 100644 arch/powerpc64/bits/signal.h create mode 100644 arch/powerpc64/bits/socket.h create mode 100644 arch/powerpc64/bits/stat.h create mode 100644 arch/powerpc64/bits/stdint.h create mode 100644 arch/powerpc64/bits/syscall.h create mode 100644 arch/powerpc64/bits/termios.h create mode 100644 arch/powerpc64/bits/user.h create mode 100644 arch/powerpc64/crt_arch.h create mode 100644 arch/powerpc64/pthread_arch.h create mode 100644 arch/powerpc64/reloc.h create mode 100644 arch/powerpc64/syscall_arch.h create mode 100644 crt/powerpc64/crti.s create mode 100644 crt/powerpc64/crtn.s create mode 100644 src/fenv/powerpc64/fenv.c create mode 100644 src/internal/powerpc64/syscall.s create mode 100644 src/ldso/powerpc64/dlsym.s create mode 100644 src/setjmp/powerpc64/longjmp.s create mode 100644 src/setjmp/powerpc64/setjmp.s create mode 100644 src/signal/powerpc64/restore.s create mode 100644 src/signal/powerpc64/sigsetjmp.s create mode 100644 src/thread/powerpc64/__set_thread_area.s create mode 100644 src/thread/powerpc64/__unmapself.s create mode 100644 src/thread/powerpc64/clone.s create mode 100644 src/thread/powerpc64/syscall_cp.s diff --git a/arch/powerpc64/atomic_arch.h b/arch/powerpc64/atomic_arch.h new file mode 100644 index 00000000..269d79c6 --- /dev/null +++ b/arch/powerpc64/atomic_arch.h @@ -0,0 +1,63 @@ +#define a_ll a_ll +static inline int a_ll(volatile int *p) +{ + int v; + __asm__ __volatile__ ("lwarx %0, 0, %2" : "=r"(v) : "m"(*p), "r"(p)); + return v; +} + +#define a_sc a_sc +static inline int a_sc(volatile int *p, int v) +{ + int r; + __asm__ __volatile__ ( + "stwcx. %2, 0, %3 ; mfcr %0" + : "=r"(r), "=m"(*p) : "r"(v), "r"(p) : "memory", "cc"); + return r & 0x20000000; /* "bit 2" of "cr0" (backwards bit order) */ +} + +#define a_ll_p a_ll_p +static inline void *a_ll_p(volatile void *p) +{ + void *v; + __asm__ __volatile__ ("ldarx %0, 0, %2" : "=r"(v) : "m"(*(void *volatile *)p), "r"(p)); + return v; +} + +#define a_sc_p a_sc_p +static inline int a_sc_p(volatile void *p, void *v) +{ + int r; + __asm__ __volatile__ ( + "stdcx. %2, 0, %3 ; mfcr %0" + : "=r"(r), "=m"(*(void *volatile *)p) : "r"(v), "r"(p) : "memory", "cc"); + return r & 0x20000000; /* "bit 2" of "cr0" (backwards bit order) */ +} + +#define a_barrier a_barrier +static inline void a_barrier() +{ + __asm__ __volatile__ ("sync" : : : "memory"); +} + +#define a_pre_llsc a_barrier + +#define a_post_llsc a_post_llsc +static inline void a_post_llsc() +{ + __asm__ __volatile__ ("isync" : : : "memory"); +} + +#define a_store a_store +static inline void a_store(volatile int *p, int v) +{ + a_pre_llsc(); + *p = v; + a_post_llsc(); +} + +#define a_crash a_crash +static inline void a_crash() +{ + __asm__ __volatile__ (".long 0"); +} diff --git a/arch/powerpc64/bits/alltypes.h.in b/arch/powerpc64/bits/alltypes.h.in new file mode 100644 index 00000000..5b205851 --- /dev/null +++ b/arch/powerpc64/bits/alltypes.h.in @@ -0,0 +1,26 @@ +#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 float float_t; +TYPEDEF double double_t; + +TYPEDEF struct { long long __ll; long double __ld; } max_align_t; + +TYPEDEF long time_t; +TYPEDEF long suseconds_t; + +TYPEDEF struct { union { int __i[14]; volatile int __vi[14]; unsigned long __s[7]; } __u; } pthread_attr_t; +TYPEDEF struct { union { int __i[10]; volatile int __vi[10]; volatile void *volatile __p[5]; } __u; } pthread_mutex_t; +TYPEDEF struct { union { int __i[10]; volatile int __vi[10]; volatile void *volatile __p[5]; } __u; } mtx_t; +TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[6]; } __u; } pthread_cond_t; +TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[6]; } __u; } cnd_t; +TYPEDEF struct { union { int __i[14]; volatile int __vi[14]; void *__p[7]; } __u; } pthread_rwlock_t; +TYPEDEF struct { union { int __i[8]; volatile int __vi[8]; void *__p[4]; } __u; } pthread_barrier_t; diff --git a/arch/powerpc64/bits/endian.h b/arch/powerpc64/bits/endian.h new file mode 100644 index 00000000..2016cb20 --- /dev/null +++ b/arch/powerpc64/bits/endian.h @@ -0,0 +1,5 @@ +#if __BIG_ENDIAN__ +#define __BYTE_ORDER __BIG_ENDIAN +#else +#define __BYTE_ORDER __LITTLE_ENDIAN +#endif diff --git a/arch/powerpc64/bits/errno.h b/arch/powerpc64/bits/errno.h new file mode 100644 index 00000000..36ad2f90 --- /dev/null +++ b/arch/powerpc64/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 58 +#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/powerpc64/bits/fcntl.h b/arch/powerpc64/bits/fcntl.h new file mode 100644 index 00000000..6f20bac5 --- /dev/null +++ b/arch/powerpc64/bits/fcntl.h @@ -0,0 +1,40 @@ +#define O_CREAT 0100 +#define O_EXCL 0200 +#define O_NOCTTY 0400 +#define O_TRUNC 01000 +#define O_APPEND 02000 +#define O_NONBLOCK 04000 +#define O_DSYNC 010000 +#define O_SYNC 04010000 +#define O_RSYNC 04010000 +#define O_DIRECTORY 040000 +#define O_NOFOLLOW 0100000 +#define O_CLOEXEC 02000000 + +#define O_ASYNC 020000 +#define O_DIRECT 0400000 +#define O_LARGEFILE 0200000 +#define O_NOATIME 01000000 +#define O_PATH 010000000 +#define O_TMPFILE 020040000 +#define O_NDELAY O_NONBLOCK + +#define F_DUPFD 0 +#define F_GETFD 1 +#define F_SETFD 2 +#define F_GETFL 3 +#define F_SETFL 4 + +#define F_GETLK 5 +#define F_SETLK 6 +#define F_SETLKW 7 + +#define F_SETOWN 8 +#define F_GETOWN 9 +#define F_SETSIG 10 +#define F_GETSIG 11 + +#define F_SETOWN_EX 15 +#define F_GETOWN_EX 16 + +#define F_GETOWNER_UIDS 17 diff --git a/arch/powerpc64/bits/fenv.h b/arch/powerpc64/bits/fenv.h new file mode 100644 index 00000000..2f722e6b --- /dev/null +++ b/arch/powerpc64/bits/fenv.h @@ -0,0 +1,31 @@ +#define FE_TONEAREST 0 +#define FE_TOWARDZERO 1 +#define FE_UPWARD 2 +#define FE_DOWNWARD 3 + +#define FE_INEXACT 0x02000000 +#define FE_DIVBYZERO 0x04000000 +#define FE_UNDERFLOW 0x08000000 +#define FE_OVERFLOW 0x10000000 +#define FE_INVALID 0x20000000 + +#define FE_ALL_EXCEPT 0x3e000000 + +#ifdef _GNU_SOURCE +#define FE_INVALID_SNAN 0x01000000 +#define FE_INVALID_ISI 0x00800000 +#define FE_INVALID_IDI 0x00400000 +#define FE_INVALID_ZDZ 0x00200000 +#define FE_INVALID_IMZ 0x00100000 +#define FE_INVALID_COMPARE 0x00080000 +#define FE_INVALID_SOFTWARE 0x00000400 +#define FE_INVALID_SQRT 0x00000200 +#define FE_INVALID_INTEGER_CONVERSION 0x00000100 + +#define FE_ALL_INVALID 0x01f80700 +#endif + +typedef unsigned fexcept_t; +typedef double fenv_t; + +#define FE_DFL_ENV ((const fenv_t *)-1) diff --git a/arch/powerpc64/bits/float.h b/arch/powerpc64/bits/float.h new file mode 100644 index 00000000..c4a655e7 --- /dev/null +++ b/arch/powerpc64/bits/float.h @@ -0,0 +1,16 @@ +#define FLT_EVAL_METHOD 0 + +#define LDBL_TRUE_MIN 4.94065645841246544177e-324L +#define LDBL_MIN 2.22507385850720138309e-308L +#define LDBL_MAX 1.79769313486231570815e+308L +#define LDBL_EPSILON 2.22044604925031308085e-16L + +#define LDBL_MANT_DIG 53 +#define LDBL_MIN_EXP (-1021) +#define LDBL_MAX_EXP 1024 + +#define LDBL_DIG 15 +#define LDBL_MIN_10_EXP (-307) +#define LDBL_MAX_10_EXP 308 + +#define DECIMAL_DIG 17 diff --git a/arch/powerpc64/bits/ioctl.h b/arch/powerpc64/bits/ioctl.h new file mode 100644 index 00000000..44a6cb65 --- /dev/null +++ b/arch/powerpc64/bits/ioctl.h @@ -0,0 +1,229 @@ +#define _IOC(a,b,c,d) ( ((a)<<29) | ((b)<<8) | (c) | ((d)<<16) ) +#define _IOC_NONE 1U +#define _IOC_WRITE 4U +#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 FIONCLEX _IO('f', 2) +#define FIOCLEX _IO('f', 1) +#define FIOASYNC _IOW('f', 125, int) +#define FIONBIO _IOW('f', 126, int) +#define FIONREAD _IOR('f', 127, int) +#define TIOCINQ FIONREAD +#define FIOQSIZE _IOR('f', 128, char[8]) +#define TIOCGETP _IOR('t', 8, char[6]) +#define TIOCSETP _IOW('t', 9, char[6]) +#define TIOCSETN _IOW('t', 10, char[6]) + +#define TIOCSETC _IOW('t', 17, char[6]) +#define TIOCGETC _IOR('t', 18, char[6]) +#define TCGETS _IOR('t', 19, char[44]) +#define TCSETS _IOW('t', 20, char[44]) +#define TCSETSW _IOW('t', 21, char[44]) +#define TCSETSF _IOW('t', 22, char[44]) + +#define TCGETA _IOR('t', 23, char[20]) +#define TCSETA _IOW('t', 24, char[20]) +#define TCSETAW _IOW('t', 25, char[20]) +#define TCSETAF _IOW('t', 28, char[20]) + +#define TCSBRK _IO('t', 29) +#define TCXONC _IO('t', 30) +#define TCFLSH _IO('t', 31) + +#define TIOCSWINSZ _IOW('t', 103, char[8]) +#define TIOCGWINSZ _IOR('t', 104, char[8]) +#define TIOCSTART _IO('t', 110) +#define TIOCSTOP _IO('t', 111) + +#define TIOCOUTQ _IOR('t', 115, int) + +#define TIOCGLTC _IOR('t', 116, char[6]) +#define TIOCSLTC _IOW('t', 117, char[6]) +#define TIOCSPGRP _IOW('t', 118, int) +#define TIOCGPGRP _IOR('t', 119, int) + +#define TIOCEXCL 0x540C +#define TIOCNXCL 0x540D +#define TIOCSCTTY 0x540E + +#define TIOCSTI 0x5412 +#define TIOCMGET 0x5415 +#define TIOCMBIS 0x5416 +#define TIOCMBIC 0x5417 +#define TIOCMSET 0x5418 +#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 TIOCGSOFTCAR 0x5419 +#define TIOCSSOFTCAR 0x541A +#define TIOCLINUX 0x541C +#define TIOCCONS 0x541D +#define TIOCGSERIAL 0x541E +#define TIOCSSERIAL 0x541F +#define TIOCPKT 0x5420 +#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 TIOCNOTTY 0x5422 +#define TIOCSETD 0x5423 +#define TIOCGETD 0x5424 +#define TCSBRKP 0x5425 +#define TIOCSBRK 0x5427 +#define TIOCCBRK 0x5428 +#define TIOCGSID 0x5429 +#define TIOCGRS485 0x542e +#define TIOCSRS485 0x542f +#define TIOCGPTN _IOR('T',0x30, unsigned int) +#define TIOCSPTLCK _IOW('T',0x31, int) +#define TIOCGDEV _IOR('T',0x32, unsigned int) +#define TIOCSIG _IOW('T',0x36, int) +#define TIOCVHANGUP 0x5437 +#define TIOCGPKT _IOR('T',0x38, int) +#define TIOCGPTLCK _IOR('T',0x39, int) +#define TIOCGEXCL _IOR('T',0x40, int) + +#define TIOCSERCONFIG 0x5453 +#define TIOCSERGWILD 0x5454 +#define TIOCSERSWILD 0x5455 +#define TIOCGLCKTRMIOS 0x5456 +#define TIOCSLCKTRMIOS 0x5457 +#define TIOCSERGSTRUCT 0x5458 +#define TIOCSERGETLSR 0x5459 +#define TIOCSER_TEMT 0x01 +#define TIOCSERGETMULTI 0x545A +#define TIOCSERSETMULTI 0x545B + +#define TIOCMIWAIT 0x545C +#define TIOCGICOUNT 0x545D + + +/* end kernel header ioctls.h */ + + +#define TIOCTTYGSTRUCT 0x5426 + +#define TCGETX 0x5432 +#define TCSETX 0x5433 +#define TCSETXF 0x5434 +#define TCSETXW 0x5435 + +#define TIOCGHAYESESP 0x545E +#define TIOCSHAYESESP 0x545F + +struct winsize { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; + unsigned short ws_ypixel; +}; + +#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/powerpc64/bits/ipc.h b/arch/powerpc64/bits/ipc.h new file mode 100644 index 00000000..e1bfe2f5 --- /dev/null +++ b/arch/powerpc64/bits/ipc.h @@ -0,0 +1,16 @@ +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; + int __pad1; + long long __pad2; + long long __pad3; +}; + +#define IPC_64 0x100 + diff --git a/arch/powerpc64/bits/limits.h b/arch/powerpc64/bits/limits.h new file mode 100644 index 00000000..0226588c --- /dev/null +++ b/arch/powerpc64/bits/limits.h @@ -0,0 +1,7 @@ +#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +#define LONG_BIT 64 +#endif + +#define LONG_MAX 0x7fffffffffffffffL +#define LLONG_MAX 0x7fffffffffffffffLL diff --git a/arch/powerpc64/bits/mman.h b/arch/powerpc64/bits/mman.h new file mode 100644 index 00000000..f5974f82 --- /dev/null +++ b/arch/powerpc64/bits/mman.h @@ -0,0 +1,8 @@ +#define PROT_SAO 0x10 + +#undef MCL_CURRENT +#define MCL_CURRENT 0x2000 +#undef MCL_FUTURE +#define MCL_FUTURE 0x4000 +#undef MCL_ONFAULT +#define MCL_ONFAULT 0x8000 diff --git a/arch/powerpc64/bits/msg.h b/arch/powerpc64/bits/msg.h new file mode 100644 index 00000000..badcf168 --- /dev/null +++ b/arch/powerpc64/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/powerpc64/bits/posix.h b/arch/powerpc64/bits/posix.h new file mode 100644 index 00000000..c37b94c1 --- /dev/null +++ b/arch/powerpc64/bits/posix.h @@ -0,0 +1,2 @@ +#define _POSIX_V6_LP64_OFF64 1 +#define _POSIX_V7_LP64_OFF64 1 diff --git a/arch/powerpc64/bits/reg.h b/arch/powerpc64/bits/reg.h new file mode 100644 index 00000000..49382c8f --- /dev/null +++ b/arch/powerpc64/bits/reg.h @@ -0,0 +1,3 @@ +#undef __WORDSIZE +#define __WORDSIZE 64 +/* FIXME */ diff --git a/arch/powerpc64/bits/sem.h b/arch/powerpc64/bits/sem.h new file mode 100644 index 00000000..558184db --- /dev/null +++ b/arch/powerpc64/bits/sem.h @@ -0,0 +1,13 @@ +#include + +struct semid_ds { + struct ipc_perm sem_perm; + time_t sem_otime; + time_t sem_ctime; +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned short __pad[3], sem_nsems; +#else + unsigned short sem_nsems, __pad[3]; +#endif + unsigned long __unused[2]; +}; diff --git a/arch/powerpc64/bits/setjmp.h b/arch/powerpc64/bits/setjmp.h new file mode 100644 index 00000000..f7370e3e --- /dev/null +++ b/arch/powerpc64/bits/setjmp.h @@ -0,0 +1 @@ +typedef unsigned __int128 __jmp_buf[32]; diff --git a/arch/powerpc64/bits/shm.h b/arch/powerpc64/bits/shm.h new file mode 100644 index 00000000..91268516 --- /dev/null +++ b/arch/powerpc64/bits/shm.h @@ -0,0 +1,25 @@ +#define SHMLBA 4096 + +struct shmid_ds +{ + struct ipc_perm shm_perm; + time_t shm_atime; + time_t shm_dtime; + time_t shm_ctime; + size_t shm_segsz; + pid_t shm_cpid; + pid_t shm_lpid; + unsigned long shm_nattch; + unsigned long __unused[2]; +}; + +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/powerpc64/bits/signal.h b/arch/powerpc64/bits/signal.h new file mode 100644 index 00000000..45aeea0d --- /dev/null +++ b/arch/powerpc64/bits/signal.h @@ -0,0 +1,108 @@ +#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) + +#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +#define MINSIGSTKSZ 4096 +#define SIGSTKSZ 10240 +#endif + +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) + +typedef unsigned long greg_t, gregset_t[48]; + +typedef struct { + double fpregs[32]; + double fpscr; +} fpregset_t; + +typedef struct { + unsigned __int128 vrregs[32]; + unsigned _pad[3]; + unsigned vrsave; + unsigned vscr; + unsigned _pad2[3]; +} vrregset_t; + +typedef struct sigcontext +{ + unsigned long _unused[4]; + int signal; + int _pad0; + unsigned long handler; + unsigned long oldmask; + void *regs; + gregset_t gp_regs; + fpregset_t fp_regs; + vrregset_t *v_regs; + long vmx_reserve[34+34+32+1]; +} mcontext_t; + +#else + +typedef struct { + long __regs[4+4+48+33+1+34+34+32+1]; +} mcontext_t; + +#endif + +struct sigaltstack { + void *ss_sp; + int ss_flags; + size_t ss_size; +}; + +typedef struct __ucontext { + unsigned long uc_flags; + struct __ucontext *uc_link; + stack_t uc_stack; + sigset_t uc_sigmask; + mcontext_t uc_mcontext; +} ucontext_t; + +#define SA_NOCLDSTOP 1U +#define SA_NOCLDWAIT 2U +#define SA_SIGINFO 4U +#define SA_ONSTACK 0x08000000U +#define SA_RESTART 0x10000000U +#define SA_NODEFER 0x40000000U +#define SA_RESETHAND 0x80000000U +#define SA_RESTORER 0x04000000U + +#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 SIGIO +#define SIGPWR 30 +#define SIGSYS 31 +#define SIGUNUSED SIGSYS + +#define _NSIG 65 diff --git a/arch/powerpc64/bits/socket.h b/arch/powerpc64/bits/socket.h new file mode 100644 index 00000000..ec3590c6 --- /dev/null +++ b/arch/powerpc64/bits/socket.h @@ -0,0 +1,62 @@ +#include + +struct msghdr +{ + void *msg_name; + socklen_t msg_namelen; + struct iovec *msg_iov; +#if __BYTE_ORDER == __BIG_ENDIAN + int __pad1, msg_iovlen; +#else + int msg_iovlen, __pad1; +#endif + void *msg_control; +#if __BYTE_ORDER == __BIG_ENDIAN + int __pad2; + socklen_t msg_controllen; +#else + socklen_t msg_controllen; + int __pad2; +#endif + int msg_flags; +}; + +struct cmsghdr +{ +#if __BYTE_ORDER == __BIG_ENDIAN + int __pad1; + socklen_t cmsg_len; +#else + socklen_t cmsg_len; + int __pad1; +#endif + int cmsg_level; + int cmsg_type; +}; + +#define SO_DEBUG 1 +#define SO_REUSEADDR 2 +#define SO_TYPE 3 +#define SO_ERROR 4 +#define SO_DONTROUTE 5 +#define SO_BROADCAST 6 +#define SO_SNDBUF 7 +#define SO_RCVBUF 8 +#define SO_KEEPALIVE 9 +#define SO_OOBINLINE 10 +#define SO_NO_CHECK 11 +#define SO_PRIORITY 12 +#define SO_LINGER 13 +#define SO_BSDCOMPAT 14 +#define SO_REUSEPORT 15 +#define SO_RCVLOWAT 16 +#define SO_SNDLOWAT 17 +#define SO_RCVTIMEO 18 +#define SO_SNDTIMEO 19 +#define SO_PASSCRED 20 +#define SO_PEERCRED 21 +#define SO_ACCEPTCONN 30 +#define SO_SNDBUFFORCE 32 +#define SO_RCVBUFFORCE 33 +#define SO_PROTOCOL 38 +#define SO_DOMAIN 39 diff --git a/arch/powerpc64/bits/stat.h b/arch/powerpc64/bits/stat.h new file mode 100644 index 00000000..8172cff7 --- /dev/null +++ b/arch/powerpc64/bits/stat.h @@ -0,0 +1,17 @@ +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; + 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; + unsigned long __unused[3]; +}; diff --git a/arch/powerpc64/bits/stdint.h b/arch/powerpc64/bits/stdint.h new file mode 100644 index 00000000..1bb147f2 --- /dev/null +++ b/arch/powerpc64/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/powerpc64/bits/syscall.h b/arch/powerpc64/bits/syscall.h new file mode 100644 index 00000000..1c5c2ea8 --- /dev/null +++ b/arch/powerpc64/bits/syscall.h @@ -0,0 +1,718 @@ +#define __NR_restart_syscall 0 +#define __NR_exit 1 +#define __NR_fork 2 +#define __NR_read 3 +#define __NR_write 4 +#define __NR_open 5 +#define __NR_close 6 +#define __NR_waitpid 7 +#define __NR_creat 8 +#define __NR_link 9 +#define __NR_unlink 10 +#define __NR_execve 11 +#define __NR_chdir 12 +#define __NR_time 13 +#define __NR_mknod 14 +#define __NR_chmod 15 +#define __NR_lchown 16 +#define __NR_break 17 +#define __NR_oldstat 18 +#define __NR_lseek 19 +#define __NR_getpid 20 +#define __NR_mount 21 +#define __NR_umount 22 +#define __NR_setuid 23 +#define __NR_getuid 24 +#define __NR_stime 25 +#define __NR_ptrace 26 +#define __NR_alarm 27 +#define __NR_oldfstat 28 +#define __NR_pause 29 +#define __NR_utime 30 +#define __NR_stty 31 +#define __NR_gtty 32 +#define __NR_access 33 +#define __NR_nice 34 +#define __NR_ftime 35 +#define __NR_sync 36 +#define __NR_kill 37 +#define __NR_rename 38 +#define __NR_mkdir 39 +#define __NR_rmdir 40 +#define __NR_dup 41 +#define __NR_pipe 42 +#define __NR_times 43 +#define __NR_prof 44 +#define __NR_brk 45 +#define __NR_setgid 46 +#define __NR_getgid 47 +#define __NR_signal 48 +#define __NR_geteuid 49 +#define __NR_getegid 50 +#define __NR_acct 51 +#define __NR_umount2 52 +#define __NR_lock 53 +#define __NR_ioctl 54 +#define __NR_fcntl 55 +#define __NR_mpx 56 +#define __NR_setpgid 57 +#define __NR_ulimit 58 +#define __NR_oldolduname 59 +#define __NR_umask 60 +#define __NR_chroot 61 +#define __NR_ustat 62 +#define __NR_dup2 63 +#define __NR_getppid 64 +#define __NR_getpgrp 65 +#define __NR_setsid 66 +#define __NR_sigaction 67 +#define __NR_sgetmask 68 +#define __NR_ssetmask 69 +#define __NR_setreuid 70 +#define __NR_setregid 71 +#define __NR_sigsuspend 72 +#define __NR_sigpending 73 +#define __NR_sethostname 74 +#define __NR_setrlimit 75 +#define __NR_getrlimit 76 +#define __NR_getrusage 77 +#define __NR_gettimeofday 78 +#define __NR_settimeofday 79 +#define __NR_getgroups 80 +#define __NR_setgroups 81 +#define __NR_select 82 +#define __NR_symlink 83 +#define __NR_oldlstat 84 +#define __NR_readlink 85 +#define __NR_uselib 86 +#define __NR_swapon 87 +#define __NR_reboot 88 +#define __NR_readdir 89 +#define __NR_mmap 90 +#define __NR_munmap 91 +#define __NR_truncate 92 +#define __NR_ftruncate 93 +#define __NR_fchmod 94 +#define __NR_fchown 95 +#define __NR_getpriority 96 +#define __NR_setpriority 97 +#define __NR_profil 98 +#define __NR_statfs 99 +#define __NR_fstatfs 100 +#define __NR_ioperm 101 +#define __NR_socketcall 102 +#define __NR_syslog 103 +#define __NR_setitimer 104 +#define __NR_getitimer 105 +#define __NR_stat 106 +#define __NR_lstat 107 +#define __NR_fstat 108 +#define __NR_olduname 109 +#define __NR_iopl 110 +#define __NR_vhangup 111 +#define __NR_idle 112 +#define __NR_vm86 113 +#define __NR_wait4 114 +#define __NR_swapoff 115 +#define __NR_sysinfo 116 +#define __NR_ipc 117 +#define __NR_fsync 118 +#define __NR_sigreturn 119 +#define __NR_clone 120 +#define __NR_setdomainname 121 +#define __NR_uname 122 +#define __NR_modify_ldt 123 +#define __NR_adjtimex 124 +#define __NR_mprotect 125 +#define __NR_sigprocmask 126 +#define __NR_create_module 127 +#define __NR_init_module 128 +#define __NR_delete_module 129 +#define __NR_get_kernel_syms 130 +#define __NR_quotactl 131 +#define __NR_getpgid 132 +#define __NR_fchdir 133 +#define __NR_bdflush 134 +#define __NR_sysfs 135 +#define __NR_personality 136 +#define __NR_afs_syscall 137 +#define __NR_setfsuid 138 +#define __NR_setfsgid 139 +#define __NR__llseek 140 +#define __NR_getdents 141 +#define __NR__newselect 142 +#define __NR_flock 143 +#define __NR_msync 144 +#define __NR_readv 145 +#define __NR_writev 146 +#define __NR_getsid 147 +#define __NR_fdatasync 148 +#define __NR__sysctl 149 +#define __NR_mlock 150 +#define __NR_munlock 151 +#define __NR_mlockall 152 +#define __NR_munlockall 153 +#define __NR_sched_setparam 154 +#define __NR_sched_getparam 155 +#define __NR_sched_setscheduler 156 +#define __NR_sched_getscheduler 157 +#define __NR_sched_yield 158 +#define __NR_sched_get_priority_max 159 +#define __NR_sched_get_priority_min 160 +#define __NR_sched_rr_get_interval 161 +#define __NR_nanosleep 162 +#define __NR_mremap 163 +#define __NR_setresuid 164 +#define __NR_getresuid 165 +#define __NR_query_module 166 +#define __NR_poll 167 +#define __NR_nfsservctl 168 +#define __NR_setresgid 169 +#define __NR_getresgid 170 +#define __NR_prctl 171 +#define __NR_rt_sigreturn 172 +#define __NR_rt_sigaction 173 +#define __NR_rt_sigprocmask 174 +#define __NR_rt_sigpending 175 +#define __NR_rt_sigtimedwait 176 +#define __NR_rt_sigqueueinfo 177 +#define __NR_rt_sigsuspend 178 +#define __NR_pread64 179 +#define __NR_pwrite64 180 +#define __NR_chown 181 +#define __NR_getcwd 182 +#define __NR_capget 183 +#define __NR_capset 184 +#define __NR_sigaltstack 185 +#define __NR_sendfile 186 +#define __NR_getpmsg 187 +#define __NR_putpmsg 188 +#define __NR_vfork 189 +#define __NR_ugetrlimit 190 +#define __NR_readahead 191 +#define __NR_pciconfig_read 198 +#define __NR_pciconfig_write 199 +#define __NR_pciconfig_iobase 200 +#define __NR_multiplexer 201 +#define __NR_getdents64 202 +#define __NR_pivot_root 203 +#define __NR_madvise 205 +#define __NR_mincore 206 +#define __NR_gettid 207 +#define __NR_tkill 208 +#define __NR_setxattr 209 +#define __NR_lsetxattr 210 +#define __NR_fsetxattr 211 +#define __NR_getxattr 212 +#define __NR_lgetxattr 213 +#define __NR_fgetxattr 214 +#define __NR_listxattr 215 +#define __NR_llistxattr 216 +#define __NR_flistxattr 217 +#define __NR_removexattr 218 +#define __NR_lremovexattr 219 +#define __NR_fremovexattr 220 +#define __NR_futex 221 +#define __NR_sched_setaffinity 222 +#define __NR_sched_getaffinity 223 +#define __NR_tuxcall 225 +#define __NR_io_setup 227 +#define __NR_io_destroy 228 +#define __NR_io_getevents 229 +#define __NR_io_submit 230 +#define __NR_io_cancel 231 +#define __NR_set_tid_address 232 +#define __NR_fadvise64 233 +#define __NR_exit_group 234 +#define __NR_lookup_dcookie 235 +#define __NR_epoll_create 236 +#define __NR_epoll_ctl 237 +#define __NR_epoll_wait 238 +#define __NR_remap_file_pages 239 +#define __NR_timer_create 240 +#define __NR_timer_settime 241 +#define __NR_timer_gettime 242 +#define __NR_timer_getoverrun 243 +#define __NR_timer_delete 244 +#define __NR_clock_settime 245 +#define __NR_clock_gettime 246 +#define __NR_clock_getres 247 +#define __NR_clock_nanosleep 248 +#define __NR_swapcontext 249 +#define __NR_tgkill 250 +#define __NR_utimes 251 +#define __NR_statfs64 252 +#define __NR_fstatfs64 253 +#define __NR_rtas 255 +#define __NR_sys_debug_setcontext 256 +#define __NR_migrate_pages 258 +#define __NR_mbind 259 +#define __NR_get_mempolicy 260 +#define __NR_set_mempolicy 261 +#define __NR_mq_open 262 +#define __NR_mq_unlink 263 +#define __NR_mq_timedsend 264 +#define __NR_mq_timedreceive 265 +#define __NR_mq_notify 266 +#define __NR_mq_getsetattr 267 +#define __NR_kexec_load 268 +#define __NR_add_key 269 +#define __NR_request_key 270 +#define __NR_keyctl 271 +#define __NR_waitid 272 +#define __NR_ioprio_set 273 +#define __NR_ioprio_get 274 +#define __NR_inotify_init 275 +#define __NR_inotify_add_watch 276 +#define __NR_inotify_rm_watch 277 +#define __NR_spu_run 278 +#define __NR_spu_create 279 +#define __NR_pselect6 280 +#define __NR_ppoll 281 +#define __NR_unshare 282 +#define __NR_splice 283 +#define __NR_tee 284 +#define __NR_vmsplice 285 +#define __NR_openat 286 +#define __NR_mkdirat 287 +#define __NR_mknodat 288 +#define __NR_fchownat 289 +#define __NR_futimesat 290 +#define __NR_newfstatat 291 +#define __NR_unlinkat 292 +#define __NR_renameat 293 +#define __NR_linkat 294 +#define __NR_symlinkat 295 +#define __NR_readlinkat 296 +#define __NR_fchmodat 297 +#define __NR_faccessat 298 +#define __NR_get_robust_list 299 +#define __NR_set_robust_list 300 +#define __NR_move_pages 301 +#define __NR_getcpu 302 +#define __NR_epoll_pwait 303 +#define __NR_utimensat 304 +#define __NR_signalfd 305 +#define __NR_timerfd_create 306 +#define __NR_eventfd 307 +#define __NR_sync_file_range2 308 +#define __NR_fallocate 309 +#define __NR_subpage_prot 310 +#define __NR_timerfd_settime 311 +#define __NR_timerfd_gettime 312 +#define __NR_signalfd4 313 +#define __NR_eventfd2 314 +#define __NR_epoll_create1 315 +#define __NR_dup3 316 +#define __NR_pipe2 317 +#define __NR_inotify_init1 318 +#define __NR_perf_event_open 319 +#define __NR_preadv 320 +#define __NR_pwritev 321 +#define __NR_rt_tgsigqueueinfo 322 +#define __NR_fanotify_init 323 +#define __NR_fanotify_mark 324 +#define __NR_prlimit64 325 +#define __NR_socket 326 +#define __NR_bind 327 +#define __NR_connect 328 +#define __NR_listen 329 +#define __NR_accept 330 +#define __NR_getsockname 331 +#define __NR_getpeername 332 +#define __NR_socketpair 333 +#define __NR_send 334 +#define __NR_sendto 335 +#define __NR_recv 336 +#define __NR_recvfrom 337 +#define __NR_shutdown 338 +#define __NR_setsockopt 339 +#define __NR_getsockopt 340 +#define __NR_sendmsg 341 +#define __NR_recvmsg 342 +#define __NR_recvmmsg 343 +#define __NR_accept4 344 +#define __NR_name_to_handle_at 345 +#define __NR_open_by_handle_at 346 +#define __NR_clock_adjtime 347 +#define __NR_syncfs 348 +#define __NR_sendmmsg 349 +#define __NR_setns 350 +#define __NR_process_vm_readv 351 +#define __NR_process_vm_writev 352 +#define __NR_finit_module 353 +#define __NR_kcmp 354 +#define __NR_sched_setattr 355 +#define __NR_sched_getattr 356 +#define __NR_renameat2 357 +#define __NR_seccomp 358 +#define __NR_getrandom 359 +#define __NR_memfd_create 360 +#define __NR_bpf 361 +#define __NR_execveat 362 +#define __NR_switch_endian 363 +#define __NR_userfaultfd 364 +#define __NR_membarrier 365 +#define __NR_mlock2 378 +#define __NR_copy_file_range 379 + +/* + * repeated with SYS prefix + */ +#define SYS_restart_syscall 0 +#define SYS_exit 1 +#define SYS_fork 2 +#define SYS_read 3 +#define SYS_write 4 +#define SYS_open 5 +#define SYS_close 6 +#define SYS_waitpid 7 +#define SYS_creat 8 +#define SYS_link 9 +#define SYS_unlink 10 +#define SYS_execve 11 +#define SYS_chdir 12 +#define SYS_time 13 +#define SYS_mknod 14 +#define SYS_chmod 15 +#define SYS_lchown 16 +#define SYS_break 17 +#define SYS_oldstat 18 +#define SYS_lseek 19 +#define SYS_getpid 20 +#define SYS_mount 21 +#define SYS_umount 22 +#define SYS_setuid 23 +#define SYS_getuid 24 +#define SYS_stime 25 +#define SYS_ptrace 26 +#define SYS_alarm 27 +#define SYS_oldfstat 28 +#define SYS_pause 29 +#define SYS_utime 30 +#define SYS_stty 31 +#define SYS_gtty 32 +#define SYS_access 33 +#define SYS_nice 34 +#define SYS_ftime 35 +#define SYS_sync 36 +#define SYS_kill 37 +#define SYS_rename 38 +#define SYS_mkdir 39 +#define SYS_rmdir 40 +#define SYS_dup 41 +#define SYS_pipe 42 +#define SYS_times 43 +#define SYS_prof 44 +#define SYS_brk 45 +#define SYS_setgid 46 +#define SYS_getgid 47 +#define SYS_signal 48 +#define SYS_geteuid 49 +#define SYS_getegid 50 +#define SYS_acct 51 +#define SYS_umount2 52 +#define SYS_lock 53 +#define SYS_ioctl 54 +#define SYS_fcntl 55 +#define SYS_mpx 56 +#define SYS_setpgid 57 +#define SYS_ulimit 58 +#define SYS_oldolduname 59 +#define SYS_umask 60 +#define SYS_chroot 61 +#define SYS_ustat 62 +#define SYS_dup2 63 +#define SYS_getppid 64 +#define SYS_getpgrp 65 +#define SYS_setsid 66 +#define SYS_sigaction 67 +#define SYS_sgetmask 68 +#define SYS_ssetmask 69 +#define SYS_setreuid 70 +#define SYS_setregid 71 +#define SYS_sigsuspend 72 +#define SYS_sigpending 73 +#define SYS_sethostname 74 +#define SYS_setrlimit 75 +#define SYS_getrlimit 76 +#define SYS_getrusage 77 +#define SYS_gettimeofday 78 +#define SYS_settimeofday 79 +#define SYS_getgroups 80 +#define SYS_setgroups 81 +#define SYS_select 82 +#define SYS_symlink 83 +#define SYS_oldlstat 84 +#define SYS_readlink 85 +#define SYS_uselib 86 +#define SYS_swapon 87 +#define SYS_reboot 88 +#define SYS_readdir 89 +#define SYS_mmap 90 +#define SYS_munmap 91 +#define SYS_truncate 92 +#define SYS_ftruncate 93 +#define SYS_fchmod 94 +#define SYS_fchown 95 +#define SYS_getpriority 96 +#define SYS_setpriority 97 +#define SYS_profil 98 +#define SYS_statfs 99 +#define SYS_fstatfs 100 +#define SYS_ioperm 101 +#define SYS_socketcall 102 +#define SYS_syslog 103 +#define SYS_setitimer 104 +#define SYS_getitimer 105 +#define SYS_stat 106 +#define SYS_lstat 107 +#define SYS_fstat 108 +#define SYS_olduname 109 +#define SYS_iopl 110 +#define SYS_vhangup 111 +#define SYS_idle 112 +#define SYS_vm86 113 +#define SYS_wait4 114 +#define SYS_swapoff 115 +#define SYS_sysinfo 116 +#define SYS_ipc 117 +#define SYS_fsync 118 +#define SYS_sigreturn 119 +#define SYS_clone 120 +#define SYS_setdomainname 121 +#define SYS_uname 122 +#define SYS_modify_ldt 123 +#define SYS_adjtimex 124 +#define SYS_mprotect 125 +#define SYS_sigprocmask 126 +#define SYS_create_module 127 +#define SYS_init_module 128 +#define SYS_delete_module 129 +#define SYS_get_kernel_syms 130 +#define SYS_quotactl 131 +#define SYS_getpgid 132 +#define SYS_fchdir 133 +#define SYS_bdflush 134 +#define SYS_sysfs 135 +#define SYS_personality 136 +#define SYS_afs_syscall 137 +#define SYS_setfsuid 138 +#define SYS_setfsgid 139 +#define SYS__llseek 140 +#define SYS_getdents 141 +#define SYS__newselect 142 +#define SYS_flock 143 +#define SYS_msync 144 +#define SYS_readv 145 +#define SYS_writev 146 +#define SYS_getsid 147 +#define SYS_fdatasync 148 +#define SYS__sysctl 149 +#define SYS_mlock 150 +#define SYS_munlock 151 +#define SYS_mlockall 152 +#define SYS_munlockall 153 +#define SYS_sched_setparam 154 +#define SYS_sched_getparam 155 +#define SYS_sched_setscheduler 156 +#define SYS_sched_getscheduler 157 +#define SYS_sched_yield 158 +#define SYS_sched_get_priority_max 159 +#define SYS_sched_get_priority_min 160 +#define SYS_sched_rr_get_interval 161 +#define SYS_nanosleep 162 +#define SYS_mremap 163 +#define SYS_setresuid 164 +#define SYS_getresuid 165 +#define SYS_query_module 166 +#define SYS_poll 167 +#define SYS_nfsservctl 168 +#define SYS_setresgid 169 +#define SYS_getresgid 170 +#define SYS_prctl 171 +#define SYS_rt_sigreturn 172 +#define SYS_rt_sigaction 173 +#define SYS_rt_sigprocmask 174 +#define SYS_rt_sigpending 175 +#define SYS_rt_sigtimedwait 176 +#define SYS_rt_sigqueueinfo 177 +#define SYS_rt_sigsuspend 178 +#define SYS_pread64 179 +#define SYS_pwrite64 180 +#define SYS_chown 181 +#define SYS_getcwd 182 +#define SYS_capget 183 +#define SYS_capset 184 +#define SYS_sigaltstack 185 +#define SYS_sendfile 186 +#define SYS_getpmsg 187 +#define SYS_putpmsg 188 +#define SYS_vfork 189 +#define SYS_ugetrlimit 190 +#define SYS_readahead 191 +#define SYS_pciconfig_read 198 +#define SYS_pciconfig_write 199 +#define SYS_pciconfig_iobase 200 +#define SYS_multiplexer 201 +#define SYS_getdents64 202 +#define SYS_pivot_root 203 +#define SYS_madvise 205 +#define SYS_mincore 206 +#define SYS_gettid 207 +#define SYS_tkill 208 +#define SYS_setxattr 209 +#define SYS_lsetxattr 210 +#define SYS_fsetxattr 211 +#define SYS_getxattr 212 +#define SYS_lgetxattr 213 +#define SYS_fgetxattr 214 +#define SYS_listxattr 215 +#define SYS_llistxattr 216 +#define SYS_flistxattr 217 +#define SYS_removexattr 218 +#define SYS_lremovexattr 219 +#define SYS_fremovexattr 220 +#define SYS_futex 221 +#define SYS_sched_setaffinity 222 +#define SYS_sched_getaffinity 223 +#define SYS_tuxcall 225 +#define SYS_io_setup 227 +#define SYS_io_destroy 228 +#define SYS_io_getevents 229 +#define SYS_io_submit 230 +#define SYS_io_cancel 231 +#define SYS_set_tid_address 232 +#define SYS_fadvise64 233 +#define SYS_exit_group 234 +#define SYS_lookup_dcookie 235 +#define SYS_epoll_create 236 +#define SYS_epoll_ctl 237 +#define SYS_epoll_wait 238 +#define SYS_remap_file_pages 239 +#define SYS_timer_create 240 +#define SYS_timer_settime 241 +#define SYS_timer_gettime 242 +#define SYS_timer_getoverrun 243 +#define SYS_timer_delete 244 +#define SYS_clock_settime 245 +#define SYS_clock_gettime 246 +#define SYS_clock_getres 247 +#define SYS_clock_nanosleep 248 +#define SYS_swapcontext 249 +#define SYS_tgkill 250 +#define SYS_utimes 251 +#define SYS_statfs64 252 +#define SYS_fstatfs64 253 +#define SYS_rtas 255 +#define SYS_sys_debug_setcontext 256 +#define SYS_migrate_pages 258 +#define SYS_mbind 259 +#define SYS_get_mempolicy 260 +#define SYS_set_mempolicy 261 +#define SYS_mq_open 262 +#define SYS_mq_unlink 263 +#define SYS_mq_timedsend 264 +#define SYS_mq_timedreceive 265 +#define SYS_mq_notify 266 +#define SYS_mq_getsetattr 267 +#define SYS_kexec_load 268 +#define SYS_add_key 269 +#define SYS_request_key 270 +#define SYS_keyctl 271 +#define SYS_waitid 272 +#define SYS_ioprio_set 273 +#define SYS_ioprio_get 274 +#define SYS_inotify_init 275 +#define SYS_inotify_add_watch 276 +#define SYS_inotify_rm_watch 277 +#define SYS_spu_run 278 +#define SYS_spu_create 279 +#define SYS_pselect6 280 +#define SYS_ppoll 281 +#define SYS_unshare 282 +#define SYS_splice 283 +#define SYS_tee 284 +#define SYS_vmsplice 285 +#define SYS_openat 286 +#define SYS_mkdirat 287 +#define SYS_mknodat 288 +#define SYS_fchownat 289 +#define SYS_futimesat 290 +#define SYS_newfstatat 291 +#define SYS_unlinkat 292 +#define SYS_renameat 293 +#define SYS_linkat 294 +#define SYS_symlinkat 295 +#define SYS_readlinkat 296 +#define SYS_fchmodat 297 +#define SYS_faccessat 298 +#define SYS_get_robust_list 299 +#define SYS_set_robust_list 300 +#define SYS_move_pages 301 +#define SYS_getcpu 302 +#define SYS_epoll_pwait 303 +#define SYS_utimensat 304 +#define SYS_signalfd 305 +#define SYS_timerfd_create 306 +#define SYS_eventfd 307 +#define SYS_sync_file_range2 308 +#define SYS_fallocate 309 +#define SYS_subpage_prot 310 +#define SYS_timerfd_settime 311 +#define SYS_timerfd_gettime 312 +#define SYS_signalfd4 313 +#define SYS_eventfd2 314 +#define SYS_epoll_create1 315 +#define SYS_dup3 316 +#define SYS_pipe2 317 +#define SYS_inotify_init1 318 +#define SYS_perf_event_open 319 +#define SYS_preadv 320 +#define SYS_pwritev 321 +#define SYS_rt_tgsigqueueinfo 322 +#define SYS_fanotify_init 323 +#define SYS_fanotify_mark 324 +#define SYS_prlimit64 325 +#define SYS_socket 326 +#define SYS_bind 327 +#define SYS_connect 328 +#define SYS_listen 329 +#define SYS_accept 330 +#define SYS_getsockname 331 +#define SYS_getpeername 332 +#define SYS_socketpair 333 +#define SYS_send 334 +#define SYS_sendto 335 +#define SYS_recv 336 +#define SYS_recvfrom 337 +#define SYS_shutdown 338 +#define SYS_setsockopt 339 +#define SYS_getsockopt 340 +#define SYS_sendmsg 341 +#define SYS_recvmsg 342 +#define SYS_recvmmsg 343 +#define SYS_accept4 344 +#define SYS_name_to_handle_at 345 +#define SYS_open_by_handle_at 346 +#define SYS_clock_adjtime 347 +#define SYS_syncfs 348 +#define SYS_sendmmsg 349 +#define SYS_setns 350 +#define SYS_process_vm_readv 351 +#define SYS_process_vm_writev 352 +#define SYS_finit_module 353 +#define SYS_kcmp 354 +#define SYS_sched_setattr 355 +#define SYS_sched_getattr 356 +#define SYS_renameat2 357 +#define SYS_seccomp 358 +#define SYS_getrandom 359 +#define SYS_memfd_create 360 +#define SYS_bpf 361 +#define SYS_execveat 362 +#define SYS_switch_endian 363 +#define SYS_userfaultfd 364 +#define SYS_membarrier 365 +#define SYS_mlock2 378 +#define SYS_copy_file_range 379 diff --git a/arch/powerpc64/bits/termios.h b/arch/powerpc64/bits/termios.h new file mode 100644 index 00000000..7feaf493 --- /dev/null +++ b/arch/powerpc64/bits/termios.h @@ -0,0 +1,170 @@ +#undef NCCS +#define NCCS 19 +struct termios +{ + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_cc[NCCS]; + cc_t c_line; + speed_t __c_ispeed; + speed_t __c_ospeed; +}; + +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VMIN 5 +#define VEOL 6 +#define VTIME 7 +#define VEOL2 8 +#define VSWTC 9 +#define VWERASE 10 +#define VREPRINT 11 +#define VSUSP 12 +#define VSTART 13 +#define VSTOP 14 +#define VLNEXT 15 +#define VDISCARD 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 IXON 0001000 +#define IXOFF 0002000 +#define IXANY 0004000 +#define IUCLC 0010000 +#define IMAXBEL 0020000 +#define IUTF8 0040000 + +#define OPOST 0000001 +#define ONLCR 0000002 +#define OLCUC 0000004 +#define OCRNL 0000010 +#define ONOCR 0000020 +#define ONLRET 0000040 +#define OFILL 0000100 +#define OFDEL 0000200 +#define NLDLY 0001400 +#define NL0 0000000 +#define NL1 0000400 +#define NL2 0001000 +#define NL3 0001400 +#define TABDLY 0006000 +#define TAB0 0000000 +#define TAB1 0002000 +#define TAB2 0004000 +#define TAB3 0006000 +#define CRDLY 0030000 +#define CR0 0000000 +#define CR1 0010000 +#define CR2 0020000 +#define CR3 0030000 +#define FFDLY 0040000 +#define FF0 0000000 +#define FF1 0040000 +#define BSDLY 0100000 +#define BS0 0000000 +#define BS1 0100000 + +#define VTDLY 0200000 +#define VT0 0000000 +#define VT1 0200000 + +#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 EXTA 0000016 +#define EXTB 0000017 + +#define B57600 00020 +#define B115200 00021 +#define B230400 00022 +#define B460800 00023 +#define B500000 00024 +#define B576000 00025 +#define B921600 00026 +#define B1000000 00027 +#define B1152000 00030 +#define B1500000 00031 +#define B2000000 00032 +#define B2500000 00033 +#define B3000000 00034 +#define B3500000 00035 +#define B4000000 00036 +#define BOTHER 00037 + +#define CBAUD 00377 + +#define CSIZE 00001400 +#define CS5 00000000 +#define CS6 00000400 +#define CS7 00001000 +#define CS8 00001400 +#define CSTOPB 00002000 +#define CREAD 00004000 +#define PARENB 00010000 +#define PARODD 00020000 +#define HUPCL 00040000 +#define CLOCAL 00100000 + +#define ECHOKE 0x00000001 +#define ECHOE 0x00000002 +#define ECHOK 0x00000004 +#define ECHO 0x00000008 +#define ECHONL 0x00000010 +#define ECHOPRT 0x00000020 +#define ECHOCTL 0x00000040 +#define ISIG 0x00000080 +#define ICANON 0x00000100 +#define IEXTEN 0x00000400 +#define XCASE 0x00004000 +#define TOSTOP 0x00400000 +#define FLUSHO 0x00800000 +#define PENDIN 0x20000000 +#define NOFLSH 0x80000000 + +#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 0000000 +#define CIBAUD 077600000 +#define IBSHIFT 16 +#define CMSPAR 010000000000 +#define CRTSCTS 020000000000 +#define EXTPROC 0x10000000 +#define XTABS 00006000 +#endif diff --git a/arch/powerpc64/bits/user.h b/arch/powerpc64/bits/user.h new file mode 100644 index 00000000..7ca459b3 --- /dev/null +++ b/arch/powerpc64/bits/user.h @@ -0,0 +1,25 @@ +struct pt_regs { + unsigned long gpr[32], nip, msr, orig_gpr3, ctr, link, xer, ccr, softe; + unsigned long trap, dar, dsisr, result; +}; + +struct user { + struct pt_regs regs; + unsigned long u_tsize, u_dsize, u_ssize; + unsigned long start_code, start_data, start_stack; + long signal; + void *u_ar0; + unsigned long magic; + char u_comm[32]; +}; + +#define ELF_NGREG 48 +#define ELF_NFPREG 33 +#define ELF_NVRREG 34 +typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG]; +typedef double elf_fpreg_t, elf_fpregset_t[ELF_NFPREG]; +typedef struct { unsigned u[4]; } +#ifdef __GNUC__ +__attribute__((__aligned__(16))) +#endif + elf_vrreg_t, elf_vrregset_t[ELF_NVRREG]; diff --git a/arch/powerpc64/crt_arch.h b/arch/powerpc64/crt_arch.h new file mode 100644 index 00000000..168669a9 --- /dev/null +++ b/arch/powerpc64/crt_arch.h @@ -0,0 +1,19 @@ +__asm__( +".text \n" +".global " START " \n" +".type " START ", %function \n" +START ": \n" +" addis 2, 12, .TOC.-" START "@ha \n" +" addi 2, 2, .TOC.-" START "@l \n" +" lwz 4, 1f-" START "(12)\n" +" add 4, 4, 12 \n" +" mr 3, 1 \n" +" clrrdi 1, 1, 4 \n" +" li 0, 0 \n" +" stdu 0, -32(1) \n" +" mtlr 0 \n" +" bl " START "_c \n" +".weak _DYNAMIC \n" +".hidden _DYNAMIC \n" +"1: .long _DYNAMIC-" START "\n" +); diff --git a/arch/powerpc64/pthread_arch.h b/arch/powerpc64/pthread_arch.h new file mode 100644 index 00000000..2f976fe2 --- /dev/null +++ b/arch/powerpc64/pthread_arch.h @@ -0,0 +1,17 @@ +static inline struct pthread *__pthread_self() +{ + register char *tp __asm__("r13"); + __asm__ __volatile__ ("" : "=r" (tp) ); + return (pthread_t)(tp - 0x7000 - sizeof(struct pthread)); +} + +#define TLS_ABOVE_TP +#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000) + +#define DTP_OFFSET 0x8000 + +// the kernel calls the ip "nip", it's the first saved value after the 32 +// GPRs. +#define MC_PC gp_regs[32] + +#define CANARY canary_at_end diff --git a/arch/powerpc64/reloc.h b/arch/powerpc64/reloc.h new file mode 100644 index 00000000..e1bad009 --- /dev/null +++ b/arch/powerpc64/reloc.h @@ -0,0 +1,32 @@ +#include + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define ENDIAN_SUFFIX "le" +#else +#define ENDIAN_SUFFIX "" +#endif + +#define LDSO_ARCH "powerpc64" ENDIAN_SUFFIX + +#define TPOFF_K (-0x7000) + +#define REL_SYMBOLIC R_PPC64_ADDR64 +#define REL_GOT R_PPC64_GLOB_DAT +#define REL_PLT R_PPC64_JMP_SLOT +#define REL_RELATIVE R_PPC64_RELATIVE +#define REL_COPY R_PPC64_COPY +#define REL_DTPMOD R_PPC64_DTPMOD64 +#define REL_DTPOFF R_PPC64_DTPREL64 +#define REL_TPOFF R_PPC64_TPREL64 + +#define CRTJMP(pc,sp) __asm__ __volatile__( \ + "mr 1,%1; mr 12,%0; mtctr 12; bctrl" : : "r"(pc), "r"(sp) : "memory" ) + +#define GETFUNCSYM(fp, sym, got) __asm__ ( \ + ".hidden " #sym " \n" \ + " bl 1f \n" \ + " .long " #sym "-. \n" \ + "1: mflr %1 \n" \ + " lwz %0, 0(%1) \n" \ + " add %0, %0, %1 \n" \ + : "=r"(*(fp)), "=r"((long){0}) : : "memory", "lr" ) diff --git a/arch/powerpc64/syscall_arch.h b/arch/powerpc64/syscall_arch.h new file mode 100644 index 00000000..1e730625 --- /dev/null +++ b/arch/powerpc64/syscall_arch.h @@ -0,0 +1,87 @@ +#define __SYSCALL_LL_E(x) (x) +#define __SYSCALL_LL_O(x) (x) + +static inline long __syscall0(long n) +{ + register long r0 __asm__("r0") = n; + register long r3 __asm__("r3"); + __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:" + : "+r"(r0), "=r"(r3) + :: "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"); + return r3; +} + +static inline long __syscall1(long n, long a) +{ + register long r0 __asm__("r0") = n; + register long r3 __asm__("r3") = a; + __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:" + : "+r"(r0), "+r"(r3) + :: "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"); + return r3; +} + +static inline long __syscall2(long n, long a, long b) +{ + register long r0 __asm__("r0") = n; + register long r3 __asm__("r3") = a; + register long r4 __asm__("r4") = b; + __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:" + : "+r"(r0), "+r"(r3), "+r"(r4) + :: "memory", "cr0", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"); + return r3; +} + +static inline long __syscall3(long n, long a, long b, long c) +{ + register long r0 __asm__("r0") = n; + register long r3 __asm__("r3") = a; + register long r4 __asm__("r4") = b; + register long r5 __asm__("r5") = c; + __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:" + : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5) + :: "memory", "cr0", "r6", "r7", "r8", "r9", "r10", "r11", "r12"); + return r3; +} + +static inline long __syscall4(long n, long a, long b, long c, long d) +{ + register long r0 __asm__("r0") = n; + register long r3 __asm__("r3") = a; + register long r4 __asm__("r4") = b; + register long r5 __asm__("r5") = c; + register long r6 __asm__("r6") = d; + __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:" + : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5), "+r"(r6) + :: "memory", "cr0", "r7", "r8", "r9", "r10", "r11", "r12"); + return r3; +} + +static inline long __syscall5(long n, long a, long b, long c, long d, long e) +{ + register long r0 __asm__("r0") = n; + register long r3 __asm__("r3") = a; + register long r4 __asm__("r4") = b; + register long r5 __asm__("r5") = c; + register long r6 __asm__("r6") = d; + register long r7 __asm__("r7") = e; + __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:" + : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5), "+r"(r6), "+r"(r7) + :: "memory", "cr0", "r8", "r9", "r10", "r11", "r12"); + return r3; +} + +static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f) +{ + register long r0 __asm__("r0") = n; + register long r3 __asm__("r3") = a; + register long r4 __asm__("r4") = b; + register long r5 __asm__("r5") = c; + register long r6 __asm__("r6") = d; + register long r7 __asm__("r7") = e; + register long r8 __asm__("r8") = f; + __asm__ __volatile__("sc ; bns+ 1f ; neg %1, %1 ; 1:" + : "+r"(r0), "+r"(r3), "+r"(r4), "+r"(r5), "+r"(r6), "+r"(r7), "+r"(r8) + :: "memory", "cr0", "r9", "r10", "r11", "r12"); + return r3; +} diff --git a/configure b/configure index 3432b58d..af8b45f0 100755 --- a/configure +++ b/configure @@ -311,7 +311,6 @@ printf "%s\n" "$target" # case "$target" in # Catch these early to simplify matching for 32-bit archs -powerpc64*) fail "$0: unsupported target \"$target\"" ;; arm*) ARCH=arm ;; aarch64*) ARCH=aarch64 ;; i?86-nt32*) ARCH=nt32 ;; @@ -323,6 +322,7 @@ mips64*) ARCH=mips64 ;; mips*) ARCH=mips ;; microblaze*) ARCH=microblaze ;; or1k*) ARCH=or1k ;; +powerpc64*) ARCH=powerpc64 ;; powerpc*) ARCH=powerpc ;; sh[1-9bel-]*|sh|superh*) ARCH=sh ;; unknown) fail "$0: unable to detect target arch; try $0 --target=..." ;; @@ -645,6 +645,12 @@ fi test "$ARCH" = "microblaze" && trycppif __MICROBLAZEEL__ "$t" \ && SUBARCH=${SUBARCH}el +if test "$ARCH" = "powerpc64" ; then +trycppif "_CALL_ELF == 2" "$t" || fail "$0: error: unsupported powerpc64 ABI" +trycppif __LITTLE_ENDIAN__ "$t" && SUBARCH=${SUBARCH}le +trycppif _SOFT_FLOAT "$t" && fail "$0: error: soft-float not supported on powerpc64" +fi + if test "$ARCH" = "sh" ; then tryflag CFLAGS_AUTO -Wa,--isa=any trycppif __BIG_ENDIAN__ "$t" && SUBARCH=${SUBARCH}eb diff --git a/crt/powerpc64/crti.s b/crt/powerpc64/crti.s new file mode 100644 index 00000000..9f712f0e --- /dev/null +++ b/crt/powerpc64/crti.s @@ -0,0 +1,21 @@ +.section .init +.align 2 +.global _init +_init: + addis 2, 12, .TOC.-_init@ha + addi 2, 2, .TOC.-_init@l + .localentry _init,.-_init + mflr 0 + std 0, 16(1) + stdu 1,-32(1) + +.section .fini +.align 2 +.global _fini +_fini: + addis 2, 12, .TOC.-_fini@ha + addi 2, 2, .TOC.-_fini@l + .localentry _fini,.-_fini + mflr 0 + std 0, 16(1) + stdu 1,-32(1) diff --git a/crt/powerpc64/crtn.s b/crt/powerpc64/crtn.s new file mode 100644 index 00000000..a7a9f4a0 --- /dev/null +++ b/crt/powerpc64/crtn.s @@ -0,0 +1,13 @@ +.section .init +.align 2 + addi 1, 1, 32 + ld 0, 16(1) + mtlr 0 + blr + +.section .fini +.align 2 + addi 1, 1, 32 + ld 0, 16(1) + mtlr 0 + blr diff --git a/src/fenv/powerpc64/fenv.c b/src/fenv/powerpc64/fenv.c new file mode 100644 index 00000000..739420b7 --- /dev/null +++ b/src/fenv/powerpc64/fenv.c @@ -0,0 +1,68 @@ +#define _GNU_SOURCE +#include + +static inline double get_fpscr_f(void) +{ + double d; + __asm__ __volatile__("mffs %0" : "=d"(d)); + return d; +} + +static inline long get_fpscr(void) +{ + return (union {double f; long i;}) {get_fpscr_f()}.i; +} + +static inline void set_fpscr_f(double fpscr) +{ + __asm__ __volatile__("mtfsf 255, %0" : : "d"(fpscr)); +} + +static void set_fpscr(long fpscr) +{ + set_fpscr_f((union {long i; double f;}) {fpscr}.f); +} + +int feclearexcept(int mask) +{ + mask &= FE_ALL_EXCEPT; + if (mask & FE_INVALID) mask |= FE_ALL_INVALID; + set_fpscr(get_fpscr() & ~mask); + return 0; +} + +int feraiseexcept(int mask) +{ + mask &= FE_ALL_EXCEPT; + if (mask & FE_INVALID) mask |= FE_INVALID_SOFTWARE; + set_fpscr(get_fpscr() | mask); + return 0; +} + +int fetestexcept(int mask) +{ + return get_fpscr() & mask & FE_ALL_EXCEPT; +} + +int fegetround(void) +{ + return get_fpscr() & 3; +} + +int __fesetround(int r) +{ + set_fpscr(get_fpscr() & ~3L | r); + return 0; +} + +int fegetenv(fenv_t *envp) +{ + *envp = get_fpscr_f(); + return 0; +} + +int fesetenv(const fenv_t *envp) +{ + set_fpscr_f(envp != FE_DFL_ENV ? *envp : 0); + return 0; +} diff --git a/src/internal/powerpc64/syscall.s b/src/internal/powerpc64/syscall.s new file mode 100644 index 00000000..fe21f9e1 --- /dev/null +++ b/src/internal/powerpc64/syscall.s @@ -0,0 +1,17 @@ + .global __syscall + .hidden __syscall + .type __syscall,@function +__syscall: + mr 0, 3 # Save the system call number + mr 3, 4 # Shift the arguments: arg1 + mr 4, 5 # arg2 + mr 5, 6 # arg3 + mr 6, 7 # arg4 + mr 7, 8 # arg5 + mr 8, 9 # arg6 + sc + bnslr+ # return if not summary overflow + neg 3, 3 # otherwise error: return negated value. + blr + .end __syscall + .size __syscall, .-__syscall diff --git a/src/ldso/powerpc64/dlsym.s b/src/ldso/powerpc64/dlsym.s new file mode 100644 index 00000000..7eb691d9 --- /dev/null +++ b/src/ldso/powerpc64/dlsym.s @@ -0,0 +1,12 @@ + .text + .global dlsym + .hidden __dlsym + .type dlsym,@function +dlsym: + addis 2, 12, .TOC.-dlsym@ha + addi 2, 2, .TOC.-dlsym@l + .localentry dlsym,.-dlsym + mflr 5 # The return address is arg3. + b __dlsym + .end dlsym + .size dlsym, .-dlsym diff --git a/src/setjmp/powerpc64/longjmp.s b/src/setjmp/powerpc64/longjmp.s new file mode 100644 index 00000000..7f241c2d --- /dev/null +++ b/src/setjmp/powerpc64/longjmp.s @@ -0,0 +1,77 @@ + .global _longjmp + .global longjmp + .type _longjmp,@function + .type longjmp,@function +_longjmp: +longjmp: + # 0) move old return address into the link register + ld 0, 0*8(3) + mtlr 0 + # 1) restore cr + ld 0, 1*8(3) + mtcr 0 + # 2) restore r1-r2 (SP and TOC) + ld 1, 2*8(3) + ld 2, 3*8(3) + # 3) restore r14-r31 + ld 14, 4*8(3) + ld 15, 5*8(3) + ld 16, 6*8(3) + ld 17, 7*8(3) + ld 18, 8*8(3) + ld 19, 9*8(3) + ld 20, 10*8(3) + ld 21, 11*8(3) + ld 22, 12*8(3) + ld 23, 13*8(3) + ld 24, 14*8(3) + ld 25, 15*8(3) + ld 26, 16*8(3) + ld 27, 17*8(3) + ld 28, 18*8(3) + ld 29, 19*8(3) + ld 30, 20*8(3) + ld 31, 21*8(3) + # 4) restore floating point registers f14-f31 + lfd 14, 22*8(3) + lfd 15, 23*8(3) + lfd 16, 24*8(3) + lfd 17, 25*8(3) + lfd 18, 26*8(3) + lfd 19, 27*8(3) + lfd 20, 28*8(3) + lfd 21, 29*8(3) + lfd 22, 30*8(3) + lfd 23, 31*8(3) + lfd 24, 32*8(3) + lfd 25, 33*8(3) + lfd 26, 34*8(3) + lfd 27, 35*8(3) + lfd 28, 36*8(3) + lfd 29, 37*8(3) + lfd 30, 38*8(3) + lfd 31, 39*8(3) + + # 5) restore vector registers v20-v31 + addi 3, 3, 40*8 + lvx 20, 0, 3 ; addi 3, 3, 16 + lvx 21, 0, 3 ; addi 3, 3, 16 + lvx 22, 0, 3 ; addi 3, 3, 16 + lvx 23, 0, 3 ; addi 3, 3, 16 + lvx 24, 0, 3 ; addi 3, 3, 16 + lvx 25, 0, 3 ; addi 3, 3, 16 + lvx 26, 0, 3 ; addi 3, 3, 16 + lvx 27, 0, 3 ; addi 3, 3, 16 + lvx 28, 0, 3 ; addi 3, 3, 16 + lvx 29, 0, 3 ; addi 3, 3, 16 + lvx 30, 0, 3 ; addi 3, 3, 16 + lvx 31, 0, 3 + + # 6) return r4 ? r4 : 1 + mr 3, 4 + cmpwi cr7, 4, 0 + bne cr7, 1f + li 3, 1 +1: + blr + diff --git a/src/setjmp/powerpc64/setjmp.s b/src/setjmp/powerpc64/setjmp.s new file mode 100644 index 00000000..d16d4bae --- /dev/null +++ b/src/setjmp/powerpc64/setjmp.s @@ -0,0 +1,78 @@ + .global ___setjmp + .hidden ___setjmp + .global __setjmp + .global _setjmp + .global setjmp + .type __setjmp,@function + .type _setjmp,@function + .type setjmp,@function +___setjmp: +__setjmp: +_setjmp: +setjmp: + # 0) store IP into 0, then into the jmpbuf pointed to by r3 (first arg) + mflr 0 + std 0, 0*8(3) + # 1) store cr + mfcr 0 + std 0, 1*8(3) + # 2) store r1-r2 (SP and TOC) + std 1, 2*8(3) + std 2, 3*8(3) + # 3) store r14-31 + std 14, 4*8(3) + std 15, 5*8(3) + std 16, 6*8(3) + std 17, 7*8(3) + std 18, 8*8(3) + std 19, 9*8(3) + std 20, 10*8(3) + std 21, 11*8(3) + std 22, 12*8(3) + std 23, 13*8(3) + std 24, 14*8(3) + std 25, 15*8(3) + std 26, 16*8(3) + std 27, 17*8(3) + std 28, 18*8(3) + std 29, 19*8(3) + std 30, 20*8(3) + std 31, 21*8(3) + # 4) store floating point registers f14-f31 + stfd 14, 22*8(3) + stfd 15, 23*8(3) + stfd 16, 24*8(3) + stfd 17, 25*8(3) + stfd 18, 26*8(3) + stfd 19, 27*8(3) + stfd 20, 28*8(3) + stfd 21, 29*8(3) + stfd 22, 30*8(3) + stfd 23, 31*8(3) + stfd 24, 32*8(3) + stfd 25, 33*8(3) + stfd 26, 34*8(3) + stfd 27, 35*8(3) + stfd 28, 36*8(3) + stfd 29, 37*8(3) + stfd 30, 38*8(3) + stfd 31, 39*8(3) + + # 5) store vector registers v20-v31 + addi 3, 3, 40*8 + stvx 20, 0, 3 ; addi 3, 3, 16 + stvx 21, 0, 3 ; addi 3, 3, 16 + stvx 22, 0, 3 ; addi 3, 3, 16 + stvx 23, 0, 3 ; addi 3, 3, 16 + stvx 24, 0, 3 ; addi 3, 3, 16 + stvx 25, 0, 3 ; addi 3, 3, 16 + stvx 26, 0, 3 ; addi 3, 3, 16 + stvx 27, 0, 3 ; addi 3, 3, 16 + stvx 28, 0, 3 ; addi 3, 3, 16 + stvx 29, 0, 3 ; addi 3, 3, 16 + stvx 30, 0, 3 ; addi 3, 3, 16 + stvx 31, 0, 3 + + # 6) return 0 + li 3, 0 + blr diff --git a/src/signal/powerpc64/restore.s b/src/signal/powerpc64/restore.s new file mode 100644 index 00000000..4d41c27a --- /dev/null +++ b/src/signal/powerpc64/restore.s @@ -0,0 +1,11 @@ + .global __restore + .type __restore,%function +__restore: + li 0, 119 #__NR_sigreturn + sc + + .global __restore_rt + .type __restore_rt,%function +__restore_rt: + li 0, 172 # __NR_rt_sigreturn + sc diff --git a/src/signal/powerpc64/sigsetjmp.s b/src/signal/powerpc64/sigsetjmp.s new file mode 100644 index 00000000..52ac1d03 --- /dev/null +++ b/src/signal/powerpc64/sigsetjmp.s @@ -0,0 +1,30 @@ + .global sigsetjmp + .global __sigsetjmp + .type sigsetjmp,%function + .type __sigsetjmp,%function + .hidden ___setjmp +sigsetjmp: +__sigsetjmp: + addis 2, 12, .TOC.-__sigsetjmp@ha + addi 2, 2, .TOC.-__sigsetjmp@l + .localentry sigsetjmp,.-sigsetjmp + .localentry __sigsetjmp,.-__sigsetjmp + + cmpwi cr7, 4, 0 + beq- cr7, ___setjmp + + mflr 5 + std 5, 512(3) + std 16, 512+8+8(3) + mr 16, 3 + + bl ___setjmp + + mr 4, 3 + mr 3, 16 + ld 5, 512(3) + mtlr 5 + ld 16, 512+8+8(3) + +.hidden __sigsetjmp_tail + b __sigsetjmp_tail diff --git a/src/thread/powerpc64/__set_thread_area.s b/src/thread/powerpc64/__set_thread_area.s new file mode 100644 index 00000000..9622826d --- /dev/null +++ b/src/thread/powerpc64/__set_thread_area.s @@ -0,0 +1,8 @@ +.text +.global __set_thread_area +.type __set_thread_area, %function +__set_thread_area: + mr 13, 3 + li 3, 0 + blr + diff --git a/src/thread/powerpc64/__unmapself.s b/src/thread/powerpc64/__unmapself.s new file mode 100644 index 00000000..c9360b47 --- /dev/null +++ b/src/thread/powerpc64/__unmapself.s @@ -0,0 +1,9 @@ + .text + .global __unmapself + .type __unmapself,%function +__unmapself: + li 0, 91 # __NR_munmap + sc + li 0, 1 #__NR_exit + sc + blr diff --git a/src/thread/powerpc64/clone.s b/src/thread/powerpc64/clone.s new file mode 100644 index 00000000..03aa4468 --- /dev/null +++ b/src/thread/powerpc64/clone.s @@ -0,0 +1,47 @@ +.text +.global __clone +.type __clone, %function +__clone: + # int clone(fn, stack, flags, arg, ptid, tls, ctid) + # a b c d e f g + # 3 4 5 6 7 8 9 + # pseudo C code: + # tid = syscall(SYS_clone,c,b,e,f,g); + # if (!tid) syscall(SYS_exit, a(d)); + # return tid; + + # create initial stack frame for new thread + clrrdi 4, 4, 4 + li 0, 0 + stdu 0,-32(4) + + # save fn and arg to child stack + std 3, 8(4) + std 6, 16(4) + + # shuffle args into correct registers and call SYS_clone + mr 3, 5 + #mr 4, 4 + mr 5, 7 + mr 6, 8 + mr 7, 9 + li 0, 120 # SYS_clone = 120 + sc + + # if error, negate return (errno) + bns+ 1f + neg 3, 3 + +1: # if we're the parent, return + cmpwi cr7, 3, 0 + bnelr cr7 + + # we're the child. call fn(arg) + ld 3, 16(1) + ld 12, 8(1) + mtctr 12 + bctrl + + # call SYS_exit. exit code is already in r3 from fn return value + li 0, 1 # SYS_exit = 1 + sc diff --git a/src/thread/powerpc64/syscall_cp.s b/src/thread/powerpc64/syscall_cp.s new file mode 100644 index 00000000..d420dbde --- /dev/null +++ b/src/thread/powerpc64/syscall_cp.s @@ -0,0 +1,37 @@ + .global __cp_begin + .hidden __cp_begin + .global __cp_end + .hidden __cp_end + .global __cp_cancel + .hidden __cp_cancel + .hidden __cancel + .global __syscall_cp_asm + .hidden __syscall_cp_asm + .text + .type __syscall_cp_asm,%function +__syscall_cp_asm: + # at enter: r3 = pointer to self->cancel, r4: syscall no, r5: first arg, r6: 2nd, r7: 3rd, r8: 4th, r9: 5th, r10: 6th +__cp_begin: + # if (self->cancel) goto __cp_cancel + lwz 0, 0(3) + cmpwi cr7, 0, 0 + bne- cr7, __cp_cancel + + # make syscall + mr 0, 4 + mr 3, 5 + mr 4, 6 + mr 5, 7 + mr 6, 8 + mr 7, 9 + mr 8, 10 + sc + +__cp_end: + # return error ? -r3 : r3 + bnslr+ + neg 3, 3 + blr + +__cp_cancel: + b __cancel -- cgit v1.2.1