diff --git a/abis/pinceros/access.h b/abis/pinceros/access.h new file mode 100644 index 0000000000..f76ca620b0 --- /dev/null +++ b/abis/pinceros/access.h @@ -0,0 +1,9 @@ +#ifndef _ABIBITS_ACCESS_H +#define _ABIBITS_ACCESS_H + +#define F_OK 0 +#define X_OK 1 +#define W_OK 2 +#define R_OK 4 + +#endif // _ABIBITS_ACCESS_H diff --git a/abis/pinceros/auxv.h b/abis/pinceros/auxv.h new file mode 100644 index 0000000000..8eb80491fe --- /dev/null +++ b/abis/pinceros/auxv.h @@ -0,0 +1,13 @@ +#ifndef _ABIBITS_AUXV_H +#define _ABIBITS_AUXV_H + +#define AT_PLATFORM 15 +#define AT_HWCAP 16 +#define AT_CLKTCK 17 +#define AT_FPUCW 18 +#define AT_SECURE 23 +#define AT_RANDOM 25 +#define AT_EXECFN 31 +#define AT_SYSINFO_EHDR 33 + +#endif // _ABIBITS_AUXV_H diff --git a/abis/pinceros/blkcnt_t.h b/abis/pinceros/blkcnt_t.h new file mode 100644 index 0000000000..c4b45051e8 --- /dev/null +++ b/abis/pinceros/blkcnt_t.h @@ -0,0 +1,8 @@ +#ifndef _ABIBITS_BLKCNT_T_H +#define _ABIBITS_BLKCNT_T_H + +#include + +typedef __mlibc_int64 blkcnt_t; + +#endif // _ABIBITS_BLKCNT_T_H diff --git a/abis/pinceros/blksize_t.h b/abis/pinceros/blksize_t.h new file mode 100644 index 0000000000..afabadb813 --- /dev/null +++ b/abis/pinceros/blksize_t.h @@ -0,0 +1,8 @@ + +#ifndef _ABIBITS_BLKSIZE_T_H +#define _ABIBITS_BLKSIZE_T_H + +typedef long blksize_t; + +#endif // _ABIBITS_BLKSIZE_T_H + diff --git a/abis/pinceros/clockid_t.h b/abis/pinceros/clockid_t.h new file mode 100644 index 0000000000..8d928268c8 --- /dev/null +++ b/abis/pinceros/clockid_t.h @@ -0,0 +1,7 @@ +#ifndef _ABIBITS_CLOCKID_T_H +#define _ABIBITS_CLOCKID_T_H + +typedef int clockid_t; + +#endif /* _ABIBITS_CLOCKID_T_H */ + diff --git a/abis/pinceros/dev_t.h b/abis/pinceros/dev_t.h new file mode 100644 index 0000000000..839a44578c --- /dev/null +++ b/abis/pinceros/dev_t.h @@ -0,0 +1,10 @@ + +#ifndef _ABIBITS_DEV_T_H +#define _ABIBITS_DEV_T_H + +#include + +typedef __mlibc_uint64 dev_t; + +#endif // _ABIBITS_DEV_T_H + diff --git a/abis/pinceros/epoll.h b/abis/pinceros/epoll.h new file mode 100644 index 0000000000..0b984b6463 --- /dev/null +++ b/abis/pinceros/epoll.h @@ -0,0 +1,6 @@ +#ifndef _ABIBITS_EPOLL_H +#define _ABIBITS_EPOLL_H + +#define EPOLL_CLOEXEC 02000000 // Same as __MLIBC_O_CLOEXEC + +#endif // _ABIBITS_EPOLL_H diff --git a/abis/pinceros/errno.h b/abis/pinceros/errno.h new file mode 100644 index 0000000000..b2680e39b2 --- /dev/null +++ b/abis/pinceros/errno.h @@ -0,0 +1,143 @@ +#ifndef _ABIBITS_ERRNO_H +#define _ABIBITS_ERRNO_H + +#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 + + +// This is mlibc-specific. +#define EIEIO 4095 + +#endif // _ABIBITS_ERRNO_H diff --git a/abis/pinceros/fcntl.h b/abis/pinceros/fcntl.h new file mode 100644 index 0000000000..35be9790a5 --- /dev/null +++ b/abis/pinceros/fcntl.h @@ -0,0 +1,89 @@ +#ifndef _ABIBITS_FCNTL_H +#define _ABIBITS_FCNTL_H + +#include + +#define O_PATH 010000000 + +#define O_ACCMODE (03 | O_PATH) +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 + +#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_ASYNC 020000 +#define O_DIRECT 040000 +#define O_DIRECTORY 0200000 +#define O_NOFOLLOW 0400000 +#define O_CLOEXEC 02000000 +#define O_SYNC 04010000 +#define O_RSYNC 04010000 +#define O_LARGEFILE 0100000 +#define O_NOATIME 01000000 +#define O_TMPFILE 020000000 + +#define O_EXEC O_PATH +#define O_SEARCH O_PATH + +#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 + +#define F_DUPFD_CLOEXEC 1030 +#define F_ADD_SEALS 1033 +#define F_GET_SEALS 1034 + +#define F_SEAL_SEAL 0x0001 +#define F_SEAL_SHRINK 0x0002 +#define F_SEAL_GROW 0x0004 +#define F_SEAL_WRITE 0x0008 + +#define F_RDLCK 0 +#define F_WRLCK 1 +#define F_UNLCK 2 + +#define FD_CLOEXEC 1 + +#define AT_FDCWD -100 +#define AT_SYMLINK_NOFOLLOW 0x100 +#define AT_REMOVEDIR 0x200 +#define AT_SYMLINK_FOLLOW 0x400 +#define AT_EACCESS 0x200 +#define AT_EMPTY_PATH 0x1000 + + +struct f_owner_ex { + int type; + pid_t pid; +}; + +#define POSIX_FADV_NORMAL 0 +#define POSIX_FADV_RANDOM 1 +#define POSIX_FADV_SEQUENTIAL 2 +#define POSIX_FADV_WILLNEED 3 +#define POSIX_FADV_DONTNEED 4 +#define POSIX_FADV_NOREUSE 5 + +#endif // _ABIBITS_FCNTL_H diff --git a/abis/pinceros/fsblkcnt_t.h b/abis/pinceros/fsblkcnt_t.h new file mode 100644 index 0000000000..0d7445619e --- /dev/null +++ b/abis/pinceros/fsblkcnt_t.h @@ -0,0 +1,8 @@ +#ifndef _ABIBITS_FSBLKCNT_T_H +#define _ABIBITS_FSBLKCNT_T_H + +#include + +typedef __mlibc_uint64 fsblkcnt_t; + +#endif /* _ABIBITS_FSBLKCNT_T_H */ diff --git a/abis/pinceros/fsfilcnt_t.h b/abis/pinceros/fsfilcnt_t.h new file mode 100644 index 0000000000..1abda9a981 --- /dev/null +++ b/abis/pinceros/fsfilcnt_t.h @@ -0,0 +1,8 @@ +#ifndef _ABIBITS_FSFILCNT_T_H +#define _ABIBITS_FSFILCNT_T_H + +#include + +typedef __mlibc_uint64 fsfilcnt_t; + +#endif /* _ABIBITS_FSFILCNT_T_H */ diff --git a/abis/pinceros/gid_t.h b/abis/pinceros/gid_t.h new file mode 100644 index 0000000000..65afa401fb --- /dev/null +++ b/abis/pinceros/gid_t.h @@ -0,0 +1,8 @@ + +#ifndef _ABIBITS_GID_T_H +#define _ABIBITS_GID_T_H + +typedef unsigned int gid_t; + +#endif // _ABIBITS_GID_T_H + diff --git a/abis/pinceros/in.h b/abis/pinceros/in.h new file mode 100644 index 0000000000..eb7be7b6c9 --- /dev/null +++ b/abis/pinceros/in.h @@ -0,0 +1,217 @@ +#ifndef _ABIBITS_IN_H +#define _ABIBITS_IN_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct in_addr { + in_addr_t s_addr; +}; + +struct sockaddr_in { + sa_family_t sin_family; + in_port_t sin_port; + struct in_addr sin_addr; + uint8_t sin_zero[8]; +}; + +struct in6_addr { + union { + uint8_t __s6_addr[16]; + uint16_t __s6_addr16[8]; + uint32_t __s6_addr32[4]; + } __in6_union; +}; +#define s6_addr __in6_union.__s6_addr +#define s6_addr16 __in6_union.__s6_addr16 +#define s6_addr32 __in6_union.__s6_addr32 + +struct sockaddr_in6 { + sa_family_t sin6_family; + in_port_t sin6_port; + uint32_t sin6_flowinfo; + struct in6_addr sin6_addr; + uint32_t sin6_scope_id; +}; + +#define MCAST_INCLUDE 1 + +struct ip_mreq { + struct in_addr imr_multiaddr; + struct in_addr imr_interface; +}; + +struct ip_mreq_source { + struct in_addr imr_multiaddr; + struct in_addr imr_interface; + struct in_addr imr_sourceaddr; +}; + +struct ip_mreqn { + struct in_addr imr_multiaddr; + struct in_addr imr_address; + int imr_ifindex; +}; + +struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; + unsigned ipv6mr_interface; +}; + +struct in_pktinfo { + unsigned int ipi_ifindex; + struct in_addr ipi_spec_dst; + struct in_addr ipi_addr; +}; + +struct in6_pktinfo { + struct in6_addr ipi6_addr; + uint32_t ipi6_ifindex; +}; + +struct group_req { + uint32_t gr_interface; + struct sockaddr_storage gr_group; +}; + +struct group_source_req { + uint32_t gsr_interface; + struct sockaddr_storage gsr_group; + struct sockaddr_storage gsr_source; +}; + +#ifdef __cplusplus +} +#endif + +#define INADDR_ANY ((in_addr_t) 0x00000000) +#define INADDR_BROADCAST ((in_addr_t) 0xffffffff) +#define INADDR_NONE ((in_addr_t) 0xffffffff) +#define INADDR_LOOPBACK ((in_addr_t) 0x7f000001) + +#define INADDR_UNSPEC_GROUP ((in_addr_t) 0xe0000000) +#define INADDR_ALLHOSTS_GROUP ((in_addr_t) 0xe0000001) +#define INADDR_ALLRTRS_GROUP ((in_addr_t) 0xe0000002) +#define INADDR_ALLSNOOPERS_GROUP ((in_addr_t) 0xe000006a) +#define INADDR_MAX_LOCAL_GROUP ((in_addr_t) 0xe00000ff) + +#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } } +#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } + +#define INET_ADDRSTRLEN 16 +#define INET6_ADDRSTRLEN 46 + +#define IPPORT_RESERVED 1024 + +#define IPPROTO_IP 0 +#define IPPROTO_HOPOPTS 0 +#define IPPROTO_ICMP 1 +#define IPPROTO_IGMP 2 +#define IPPROTO_IPIP 4 +#define IPPROTO_TCP 6 +#define IPPROTO_EGP 8 +#define IPPROTO_PUP 12 +#define IPPROTO_UDP 17 +#define IPPROTO_IDP 22 +#define IPPROTO_TP 29 +#define IPPROTO_DCCP 33 +#define IPPROTO_IPV6 41 +#define IPPROTO_ROUTING 43 +#define IPPROTO_FRAGMENT 44 +#define IPPROTO_RSVP 46 +#define IPPROTO_GRE 47 +#define IPPROTO_ESP 50 +#define IPPROTO_AH 51 +#define IPPROTO_ICMPV6 58 +#define IPPROTO_NONE 59 +#define IPPROTO_DSTOPTS 60 +#define IPPROTO_MTP 92 +#define IPPROTO_BEETPH 94 +#define IPPROTO_ENCAP 98 +#define IPPROTO_PIM 103 +#define IPPROTO_COMP 108 +#define IPPROTO_SCTP 132 +#define IPPROTO_MH 135 +#define IPPROTO_UDPLITE 136 +#define IPPROTO_MPLS 137 +#define IPPROTO_RAW 255 +#define IPPROTO_MAX 256 + +#define IP_TOS 1 +#define IP_TTL 2 +#define IP_HDRINCL 3 +#define IP_OPTIONS 4 +#define IP_RECVOPTS 6 +#define IP_PKTINFO 8 +#define IP_PKTOPTIONS 9 +#define IP_MTU_DISCOVER 10 +#define IP_RECVERR 11 +#define IP_RECVTTL 12 +#define IP_MTU 14 +#define IP_MULTICAST_IF 32 +#define IP_MULTICAST_TTL 33 +#define IP_MULTICAST_LOOP 34 +#define IP_ADD_MEMBERSHIP 35 +#define IP_DROP_MEMBERSHIP 36 +#define IP_UNBLOCK_SOURCE 37 +#define IP_BLOCK_SOURCE 38 +#define IP_ADD_SOURCE_MEMBERSHIP 39 +#define IP_DROP_SOURCE_MEMBERSHIP 40 +#define IP_UNICAST_IF 50 + +#define IPV6_2292PKTOPTIONS 6 +#define IPV6_UNICAST_HOPS 16 +#define IPV6_MULTICAST_IF 17 +#define IPV6_MULTICAST_HOPS 18 +#define IPV6_MULTICAST_LOOP 19 +#define IPV6_JOIN_GROUP 20 +#define IPV6_LEAVE_GROUP 21 +#define IPV6_MTU 24 +#define IPV6_RECVERR 25 +#define IPV6_V6ONLY 26 +#define IPV6_RECVPKTINFO 49 +#define IPV6_PKTINFO 50 +#define IPV6_RECVHOPLIMIT 51 +#define IPV6_HOPLIMIT 52 + +#define IPV6_RECVTCLASS 66 +#define IPV6_TCLASS 67 + +#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP +#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP + +#define IP_PMTUDISC_DONT 0 +#define IP_PMTUDISC_WANT 1 +#define IP_PMTUDISC_DO 2 +#define IP_PMTUDISC_PROBE 3 +#define IP_PMTUDISC_INTERFACE 4 +#define IP_PMTUDISC_OMIT 5 + +#define MCAST_BLOCK_SOURCE 43 +#define MCAST_UNBLOCK_SOURCE 44 +#define MCAST_JOIN_SOURCE_GROUP 46 +#define MCAST_LEAVE_SOURCE_GROUP 47 + +/* These defines are needed for compatibility with Linux kernel headers. */ +#define __UAPI_DEF_IN_ADDR 0 +#define __UAPI_DEF_IN_IPPROTO 0 +#define __UAPI_DEF_IN_PKTINFO 0 +#define __UAPI_DEF_IP_MREQ 0 +#define __UAPI_DEF_SOCKADDR_IN 0 +#define __UAPI_DEF_IN_CLASS 0 +#define __UAPI_DEF_IN6_ADDR 0 +#define __UAPI_DEF_IN6_ADDR_ALT 0 +#define __UAPI_DEF_SOCKADDR_IN6 0 +#define __UAPI_DEF_IPV6_MREQ 0 +#define __UAPI_DEF_IPPROTO_V6 0 +#define __UAPI_DEF_IPV6_OPTIONS 0 +#define __UAPI_DEF_IN6_PKTINFO 0 +#define __UAPI_DEF_IP6_MTUINFO 0 + +#endif // _ABITBITS_IN_H diff --git a/abis/pinceros/ino_t.h b/abis/pinceros/ino_t.h new file mode 100644 index 0000000000..ba076f409e --- /dev/null +++ b/abis/pinceros/ino_t.h @@ -0,0 +1,10 @@ + +#ifndef _ABIBITS_INO_T_H +#define _ABIBITS_INO_T_H + +#include + +typedef __mlibc_uint64 ino_t; + +#endif // _ABIBITS_INO_T_H + diff --git a/abis/pinceros/inotify.h b/abis/pinceros/inotify.h new file mode 100644 index 0000000000..4a0bd4cbb5 --- /dev/null +++ b/abis/pinceros/inotify.h @@ -0,0 +1,9 @@ +#ifndef _ABIBITS_INOTIFY_H +#define _ABIBITS_INOTIFY_H + +#include + +#define IN_CLOEXEC O_CLOEXEC +#define IN_NONBLOCK O_NONBLOCK + +#endif // _ABIBITS_INOTIFY_H diff --git a/abis/pinceros/ioctls.h b/abis/pinceros/ioctls.h new file mode 100644 index 0000000000..3a957bfc97 --- /dev/null +++ b/abis/pinceros/ioctls.h @@ -0,0 +1,15 @@ +#ifndef _ABIBITS_IOCTLS_H +#define _ABIBITS_IOCTLS_H + +#define SIOCPROTOPRIVATE 0x89E0 +#define SIOCGIFNAME 0x8910 +#define SIOCGIFCONF 0x8912 +#define SIOCGIFFLAGS 0x8913 +#define SIOCSIFFLAGS 0x8914 +#define SIOCGIFINDEX 0x8933 +#define SIOCATMARK 0x8905 +#define SIOCGIFHWADDR 0x8927 +#define SIOCGIFBRDADDR 0x8919 +#define SIOCGIFNETMASK 0x891B + +#endif /* _ABIBITS_IOCTLS_H */ diff --git a/abis/pinceros/limits.h b/abis/pinceros/limits.h new file mode 100644 index 0000000000..091b14babd --- /dev/null +++ b/abis/pinceros/limits.h @@ -0,0 +1,9 @@ +#ifndef _ABIBITS_LIMITS_H +#define _ABIBITS_LIMITS_H + +#define IOV_MAX 1024 +#define LOGIN_NAME_MAX 256 +#define NAME_MAX 255 +#define OPEN_MAX 256 + +#endif //_ABIBITS_LIMITS_H diff --git a/abis/pinceros/mode_t.h b/abis/pinceros/mode_t.h new file mode 100644 index 0000000000..8374c12507 --- /dev/null +++ b/abis/pinceros/mode_t.h @@ -0,0 +1,8 @@ + +#ifndef _ABIBITS_MODE_T_H +#define _ABIBITS_MODE_T_H + +typedef unsigned int mode_t; + +#endif // _ABIBITS_MODE_T_H + diff --git a/abis/pinceros/mqueue.h b/abis/pinceros/mqueue.h new file mode 100644 index 0000000000..1e2d3eb83d --- /dev/null +++ b/abis/pinceros/mqueue.h @@ -0,0 +1,21 @@ +#ifndef _ABIBITS_MQUEUE_H +#define _ABIBITS_MQUEUE_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct mq_attr { + long mq_flags; + long mq_maxmsg; + long mq_msgsize; + long mq_curmsgs; + long __pad[4]; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* _ABIBITS_MQUEUE_H */ + diff --git a/abis/pinceros/msg.h b/abis/pinceros/msg.h new file mode 100644 index 0000000000..577456c918 --- /dev/null +++ b/abis/pinceros/msg.h @@ -0,0 +1,45 @@ +#ifndef _ABIBITS_MSG_H +#define _ABIBITS_MSG_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned long msglen_t; +typedef unsigned long msgqnum_t; + +struct msqid64_ds { + struct ipc64_perm msg_perm; +#if (UINTPTR_MAX == UINT64_MAX) /* || x32 ABI */ + time_t msg_stime; + time_t msg_rtime; + time_t msg_ctime; +#else + unsigned long msg_stime; + unsigned long msg_stime_high; + unsigned long msg_rtime; + unsigned long msg_rtime_high; + unsigned long msg_ctime; + unsigned long msg_ctime_high; +#endif + unsigned long msg_cbytes; + msgqnum_t msg_qnum; + msglen_t msg_qbytes; + pid_t msg_lspid; + pid_t msg_lrpid; + unsigned long __unused[2]; +}; + +#define msqid_ds msqid64_ds + +#ifdef __cplusplus +} +#endif + +#endif /* _ABIBITS_MSG_H */ + diff --git a/abis/pinceros/nlink_t.h b/abis/pinceros/nlink_t.h new file mode 100644 index 0000000000..e0d9322d9c --- /dev/null +++ b/abis/pinceros/nlink_t.h @@ -0,0 +1,8 @@ + +#ifndef _ABIBITS_NLINK_T_H +#define _ABIBITS_NLINK_T_H + +typedef unsigned long nlink_t; + +#endif // _ABIBITS_NLINK_T_H + diff --git a/abis/pinceros/packet.h b/abis/pinceros/packet.h new file mode 100644 index 0000000000..ee1a424f34 --- /dev/null +++ b/abis/pinceros/packet.h @@ -0,0 +1,6 @@ +#ifndef _ABIBITS_PACKET_H +#define _ABIBITS_PACKET_H + +#define PACKET_HOST 0 + +#endif // _ABIBITS_PACKET_H diff --git a/abis/pinceros/pid_t.h b/abis/pinceros/pid_t.h new file mode 100644 index 0000000000..323168e600 --- /dev/null +++ b/abis/pinceros/pid_t.h @@ -0,0 +1,8 @@ + +#ifndef _ABIBITS_PID_T_H +#define _ABIBITS_PID_T_H + +typedef int pid_t; + +#endif // _ABIBITS_PID_T_H + diff --git a/abis/pinceros/poll.h b/abis/pinceros/poll.h new file mode 100644 index 0000000000..1585b46f93 --- /dev/null +++ b/abis/pinceros/poll.h @@ -0,0 +1,16 @@ +#ifndef _ABIBITS_POLL_H +#define _ABIBITS_POLL_H + +#define POLLIN 0x0001 +#define POLLPRI 0x0002 +#define POLLOUT 0x0004 +#define POLLERR 0x0008 +#define POLLHUP 0x0010 +#define POLLNVAL 0x0020 +#define POLLRDNORM 0x0040 +#define POLLRDBAND 0x0080 +#define POLLWRNORM 0x0100 +#define POLLWRBAND 0x0200 +#define POLLRDHUP 0x2000 + +#endif // _ABIBITS_POLL_H diff --git a/abis/pinceros/ptrace.h b/abis/pinceros/ptrace.h new file mode 100644 index 0000000000..3d73aa173f --- /dev/null +++ b/abis/pinceros/ptrace.h @@ -0,0 +1,59 @@ +#ifndef _ABIBITS_PTRACE_H +#define _ABIBITS_PTRACE_H + +#define PTRACE_PEEKTEXT 1 +#define PTRACE_PEEKDATA 2 +#define PTRACE_PEEKUSER 3 +#define PTRACE_POKETEXT 4 +#define PTRACE_POKEDATA 5 +#define PTRACE_POKEUSER 6 +#define PTRACE_CONT 7 +#define PTRACE_KILL 8 +#define PTRACE_SINGLESTEP 9 +#define PTRACE_GETREGS 12 +#define PTRACE_SETREGS 13 +#define PTRACE_GETFPREGS 14 +#define PTRACE_SETFPREGS 15 +#define PTRACE_ATTACH 16 +#define PTRACE_DETACH 17 +#define PTRACE_GETFPXREGS 18 +#define PTRACE_SETFPXREGS 19 +#define PTRACE_SYSCALL 24 +#define PTRACE_SETOPTIONS 0x4200 +#define PTRACE_GETEVENTMSG 0x4201 +#define PTRACE_GETSIGINFO 0x4202 +#define PTRACE_SETSIGINFO 0x4203 +#define PTRACE_GETREGSET 0x4204 +#define PTRACE_SETREGSET 0x4205 +#define PTRACE_SEIZE 0x4206 +#define PTRACE_INTERRUPT 0x4207 +#define PTRACE_LISTEN 0x4208 +#define PTRACE_PEEKSIGINFO 0x4209 +#define PTRACE_GETSIGMASK 0x420A +#define PTRACE_SETSIGMASK 0x420B +#define PTRACE_SECCOMP_GET_FILTER 0x420C + +#define PTRACE_O_TRACESYSGOOD 0x00000001 +#define PTRACE_O_TRACEFORK 0x00000002 +#define PTRACE_O_TRACEVFORK 0x00000004 +#define PTRACE_O_TRACECLONE 0x00000008 +#define PTRACE_O_TRACEEXEC 0x00000010 +#define PTRACE_O_TRACEVFORKDONE 0x00000020 +#define PTRACE_O_TRACEEXIT 0x00000040 +#define PTRACE_O_TRACESECCOMP 0x00000080 +#define PTRACE_O_EXITKILL 0x00100000 +#define PTRACE_O_SUSPEND_SECCOMP 0x00200000 +#define PTRACE_O_MASK 0x003000ff + +#define PTRACE_EVENT_FORK 1 +#define PTRACE_EVENT_VFORK 2 +#define PTRACE_EVENT_CLONE 3 +#define PTRACE_EVENT_EXEC 4 +#define PTRACE_EVENT_VFORK_DONE 5 +#define PTRACE_EVENT_EXIT 6 +#define PTRACE_EVENT_SECCOMP 7 +#define PTRACE_EVENT_STOP 128 + +#define PTRACE_PEEKSIGINFO_SHARED 1 + +#endif // _ABIBITS_PTRACE_H diff --git a/abis/pinceros/reboot.h b/abis/pinceros/reboot.h new file mode 100644 index 0000000000..aadc18f2e6 --- /dev/null +++ b/abis/pinceros/reboot.h @@ -0,0 +1,12 @@ +#ifndef _ABIBITS_REBOOT_H +#define _ABIBITS_REBOOT_H + +#define RB_AUTOBOOT 0x01234567 +#define RB_HALT_SYSTEM 0xcdef0123 +#define RB_ENABLE_CAD 0x89abcdef +#define RB_DISABLE_CAD 0 +#define RB_POWER_OFF 0x4321fedc +#define RB_SW_SUSPEND 0xd000fce2 +#define RB_KEXEC 0x45584543 + +#endif // _ABIBITS_REBOOT_H diff --git a/abis/pinceros/resource.h b/abis/pinceros/resource.h new file mode 100644 index 0000000000..75e81207e5 --- /dev/null +++ b/abis/pinceros/resource.h @@ -0,0 +1,53 @@ +#ifndef _ABIBITS_RESOURCE_H +#define _ABIBITS_RESOURCE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define RUSAGE_SELF 0 +#define RUSAGE_CHILDREN -1 + +#define RLIMIT_CPU 0 +#define RLIMIT_FSIZE 1 +#define RLIMIT_DATA 2 +#define RLIMIT_STACK 3 +#define RLIMIT_CORE 4 +#define RLIMIT_RSS 5 +#define RLIMIT_NPROC 6 +#define RLIMIT_NOFILE 7 +#define RLIMIT_MEMLOCK 8 +#define RLIMIT_AS 9 +#define RLIMIT_LOCKS 10 +#define RLIMIT_SIGPENDING 11 +#define RLIMIT_MSGQUEUE 12 +#define RLIMIT_NICE 13 +#define RLIMIT_RTPRIO 14 +#define RLIMIT_NLIMITS 16 + +struct rusage { + struct timeval ru_utime; + struct timeval ru_stime; + long ru_maxrss; + long ru_ixrss; + long ru_idrss; + long ru_isrss; + long ru_minflt; + long ru_majflt; + long ru_nswap; + long ru_inblock; + long ru_oublock; + long ru_msgsnd; + long ru_msgrcv; + long ru_nsignals; + long ru_nvcsw; + long ru_nivcsw; +}; + +#ifdef __cplusplus +} +#endif + +#endif // _ABIBITS_RESOURCE_H diff --git a/abis/pinceros/seek-whence.h b/abis/pinceros/seek-whence.h new file mode 100644 index 0000000000..47a5b0e959 --- /dev/null +++ b/abis/pinceros/seek-whence.h @@ -0,0 +1,10 @@ +#ifndef _ABIBITS_SEEK_WHENCE_H +#define _ABIBITS_SEEK_WHENCE_H + +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#define SEEK_DATA 3 +#define SEEK_HOLE 4 + +#endif // _ABIBITS_SEEK_WHENCE_H diff --git a/abis/pinceros/shm.h b/abis/pinceros/shm.h new file mode 100644 index 0000000000..bf71c8c6e5 --- /dev/null +++ b/abis/pinceros/shm.h @@ -0,0 +1,25 @@ +#ifndef _ABIBITS_SHM_H +#define _ABIBITS_SHM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct shm_info { + int used_ids; + unsigned long shm_tot; + unsigned long shm_rss; + unsigned long shm_swp; + unsigned long swap_attempts; + unsigned long swap_successes; +}; + +#define SHMLBA (getpagesize()) + +#ifdef __cplusplus +} +#endif + +#endif /* _ABIBITS_SHM_H */ diff --git a/abis/pinceros/signal.h b/abis/pinceros/signal.h new file mode 100644 index 0000000000..3d0aa6ccfc --- /dev/null +++ b/abis/pinceros/signal.h @@ -0,0 +1,499 @@ +#ifndef _ABIBITS_SIGNAL_H +#define _ABIBITS_SIGNAL_H + +#include +#include +#include +#include +#include + +#define POLL_IN 1 +#define POLL_OUT 2 +#define POLL_MSG 3 +#define POLL_ERR 4 +#define POLL_PRI 5 +#define POLL_HUP 6 + +union sigval { + int sival_int; + void *sival_ptr; +}; + +// struct taken from musl. + +typedef struct { + int si_signo, si_errno, si_code; + union { + char __pad[128 - 2*sizeof(int) - sizeof(long)]; + struct { + union { + struct { + pid_t si_pid; + uid_t si_uid; + } __piduid; + struct { + int si_timerid; + int si_overrun; + } __timer; + } __first; + union { + union sigval si_value; + struct { + int si_status; + clock_t si_utime, si_stime; + } __sigchld; + } __second; + } __si_common; + struct { + void *si_addr; + short si_addr_lsb; + union { + struct { + void *si_lower; + void *si_upper; + } __addr_bnd; + unsigned si_pkey; + } __first; + } __sigfault; + struct { + long si_band; + int si_fd; + } __sigpoll; + struct { + void *si_call_addr; + int si_syscall; + unsigned si_arch; + } __sigsys; + } __si_fields; +} siginfo_t; +#define si_pid __si_fields.__si_common.__first.__piduid.si_pid +#define si_uid __si_fields.__si_common.__first.__piduid.si_uid +#define si_status __si_fields.__si_common.__second.__sigchld.si_status +#define si_utime __si_fields.__si_common.__second.__sigchld.si_utime +#define si_stime __si_fields.__si_common.__second.__sigchld.si_stime +#define si_value __si_fields.__si_common.__second.si_value +#define si_addr __si_fields.__sigfault.si_addr +#define si_addr_lsb __si_fields.__sigfault.si_addr_lsb +#define si_lower __si_fields.__sigfault.__first.__addr_bnd.si_lower +#define si_upper __si_fields.__sigfault.__first.__addr_bnd.si_upper +#define si_pkey __si_fields.__sigfault.__first.si_pkey +#define si_band __si_fields.__sigpoll.si_band +#define si_fd __si_fields.__sigpoll.si_fd +#define si_timerid __si_fields.__si_common.__first.__timer.si_timerid +#define si_overrun __si_fields.__si_common.__first.__timer.si_overrun +#define si_ptr si_value.sival_ptr +#define si_int si_value.sival_int +#define si_call_addr __si_fields.__sigsys.si_call_addr +#define si_syscall __si_fields.__sigsys.si_syscall +#define si_arch __si_fields.__sigsys.si_arch + +// Required for sys_sigaction sysdep. +#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 + +#ifdef __cplusplus +extern "C" { +#endif + +// Argument for signal() +typedef void (*__sighandler) (int); + +#define SIG_ERR ((__sighandler)(void *)(-1)) +#define SIG_DFL ((__sighandler)(void *)(0)) +#define SIG_IGN ((__sighandler)(void *)(1)) + +#define SIGABRT 6 +#define SIGFPE 8 +#define SIGILL 4 +#define SIGINT 2 +#define SIGSEGV 11 +#define SIGTERM 15 +#define SIGPROF 27 +#define SIGIO 29 +#define SIGPWR 30 +#define SIGRTMIN 35 +#define SIGRTMAX 64 + +typedef struct { + unsigned long sig[1024 / (8 * sizeof(long))]; +} sigset_t; + +// constants for sigprocmask() +#define SIG_BLOCK 0 +#define SIG_UNBLOCK 1 +#define SIG_SETMASK 2 + +#define SIGHUP 1 +#define SIGQUIT 3 +#define SIGTRAP 5 +#define SIGIOT SIGABRT +#define SIGBUS 7 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#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 SIGWINCH 28 +#define SIGPOLL 29 +#define SIGSYS 31 +#define SIGUNUSED SIGSYS +#define SIGCANCEL 32 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +typedef struct __stack { + void *ss_sp; + int ss_flags; + size_t ss_size; +} stack_t; + +// constants for sigev_notify of struct sigevent +#define SIGEV_SIGNAL 0 +#define SIGEV_NONE 1 +#define SIGEV_THREAD 2 +#define SIGEV_THREAD_ID 4 + +#define SEGV_MAPERR 1 +#define SEGV_ACCERR 2 + +#define BUS_ADRALN 1 +#define BUS_ADRERR 2 +#define BUS_OBJERR 3 +#define BUS_MCEERR_AR 4 +#define BUS_MCEERR_AO 5 + +#define ILL_ILLOPC 1 +#define ILL_ILLOPN 2 +#define ILL_ILLADR 3 +#define ILL_ILLTRP 4 +#define ILL_PRVOPC 5 +#define ILL_PRVREG 6 +#define ILL_COPROC 7 +#define ILL_BADSTK 8 +#define ILL_BADIADDR 9 + +#define NSIG 65 + +#define SI_ASYNCNL (-60) +#define SI_TKILL (-6) +#define SI_SIGIO (-5) +#define SI_ASYNCIO (-4) +#define SI_MESGQ (-3) +#define SI_TIMER (-2) +#define SI_QUEUE (-1) +#define SI_USER 0 +#define SI_KERNEL 128 + +#if defined(__i386__) +#define REG_GS 0 +#define REG_FS 1 +#define REG_ES 2 +#define REG_DS 3 +#define REG_EDI 4 +#define REG_ESI 5 +#define REG_EBP 6 +#define REG_ESP 7 +#define REG_EBX 8 +#define REG_EDX 9 +#define REG_ECX 10 +#define REG_EAX 11 +#define REG_TRAPNO 12 +#define REG_ERR 13 +#define REG_EIP 14 +#define REG_CS 15 +#define REG_EFL 16 +#define REG_UESP 17 +#define REG_SS 18 +#define NGREG 19 +#elif defined(__x86_64__) +#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 +#define NGREG 23 +#endif + +#include + +struct sigevent { + union sigval sigev_value; + int sigev_notify; + int sigev_signo; + void (*sigev_notify_function)(union sigval); + struct __mlibc_threadattr *sigev_notify_attributes; + pid_t sigev_notify_thread_id; +}; + +struct sigaction { + union { + void (*sa_handler)(int); + void (*sa_sigaction)(int, siginfo_t *, void *); + } __sa_handler; + unsigned long sa_flags; + void (*sa_restorer)(void); + sigset_t sa_mask; +}; + +#define sa_handler __sa_handler.sa_handler +#define sa_sigaction __sa_handler.sa_sigaction + +// Taken from the linux kernel headers + +#if defined(__x86_64__) || defined(__i386__) + +struct _fpreg { + unsigned short significand[4]; + unsigned short exponent; +}; + +struct _fpxreg { + unsigned short significand[4]; + unsigned short exponent; + unsigned short padding[3]; +}; + +struct _xmmreg { + uint32_t element[4]; +}; + +struct _fpstate { +#if defined(__x86_64__) + uint16_t cwd; + uint16_t swd; + uint16_t ftw; + uint16_t fop; + uint64_t rip; + uint64_t rdp; + uint32_t mxcsr; + uint32_t mxcr_mask; + struct _fpxreg _st[8]; + struct _xmmreg _xmm[16]; + uint32_t padding[24]; +#elif defined(__i386__) + uint32_t cw; + uint32_t sw; + uint32_t tag; + uint32_t ipoff; + uint32_t cssel; + uint32_t dataoff; + uint32_t datasel; + struct _fpreg _st[8]; + uint16_t status; + uint16_t magic; + + // FXSR FPU + + uint32_t _fxsr_env[6]; + uint32_t mxscr; + uint32_t reserved; + struct _fpxreg _fxsr_st[8]; + struct _xmmreg _xmm[8]; + + uint32_t padding2[56]; +#endif +}; + +typedef struct { + unsigned long gregs[NGREG]; + struct _fpstate *fpregs; + unsigned long __reserved1[8]; +} mcontext_t; + +typedef struct __ucontext { + unsigned long uc_flags; + struct __ucontext *uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + sigset_t uc_sigmask; +} ucontext_t; + +#elif defined(__riscv) && __riscv_xlen == 64 +// Definitions from Linux kernel headers. + +#define NGREG 32 + +enum { + REG_PC = 0, +#define REG_PC REG_PC + REG_RA = 1, +#define REG_RA REG_RA + REG_SP = 2, +#define REG_SP REG_SP + REG_TP = 4, +#define REG_TP REG_TP + REG_S0 = 8, +#define REG_S0 REG_S0 + REG_A0 = 10, +#define REG_A0 REG_A0 +}; + +struct __riscv_f_ext_state { + uint32_t f[32]; + uint32_t fcsr; +}; + +struct __riscv_d_ext_state { + uint64_t f[32]; + uint32_t fcsr; +}; + +struct __riscv_q_ext_state { + uint64_t f[64] __attribute__((__aligned__(16))); + uint32_t fcsr; + uint32_t reserved[3]; +}; + +union __riscv_fp_state { + struct __riscv_f_ext_state f; + struct __riscv_d_ext_state d; + struct __riscv_q_ext_state q; +}; + +typedef unsigned long __riscv_mc_gp_state[NGREG]; + +typedef struct sigcontext { + __riscv_mc_gp_state gregs; + union __riscv_fp_state fpregs; +} mcontext_t; + +typedef struct __ucontext { + unsigned long uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + sigset_t uc_sigmask; + uint8_t __unused[1024 / 8 - sizeof(sigset_t)]; + mcontext_t uc_mcontext; +} ucontext_t; + +#elif defined (__aarch64__) + +#define NGREG 34 + +typedef struct sigcontext { + uint64_t fault_address; + uint64_t regs[31]; + uint64_t sp; + uint64_t pc; + uint64_t pstate; + uint8_t __reserved[4096]; +} mcontext_t; + +#define FPSIMD_MAGIC 0x46508001 +#define ESR_MAGIC 0x45535201 +#define EXTRA_MAGIC 0x45585401 +#define SVE_MAGIC 0x53564501 +struct _aarch64_ctx { + uint32_t magic; + uint32_t size; +}; +struct fpsimd_context { + struct _aarch64_ctx head; + uint32_t fpsr; + uint32_t fpcr; + __uint128_t vregs[32]; +}; +struct esr_context { + struct _aarch64_ctx head; + uint64_t esr; +}; +struct extra_context { + struct _aarch64_ctx head; + uint64_t datap; + uint32_t size; + uint32_t __reserved[3]; +}; +struct sve_context { + struct _aarch64_ctx head; + uint16_t vl; + uint16_t __reserved[3]; +}; +#define SVE_VQ_BYTES 16 +#define SVE_VQ_MIN 1 +#define SVE_VQ_MAX 512 +#define SVE_VL_MIN (SVE_VQ_MIN * SVE_VQ_BYTES) +#define SVE_VL_MAX (SVE_VQ_MAX * SVE_VQ_BYTES) +#define SVE_NUM_ZREGS 32 +#define SVE_NUM_PREGS 16 +#define sve_vl_valid(vl) \ + ((vl) % SVE_VQ_BYTES == 0 && (vl) >= SVE_VL_MIN && (vl) <= SVE_VL_MAX) +#define sve_vq_from_vl(vl) ((vl) / SVE_VQ_BYTES) +#define sve_vl_from_vq(vq) ((vq) * SVE_VQ_BYTES) +#define SVE_SIG_ZREG_SIZE(vq) ((unsigned)(vq) * SVE_VQ_BYTES) +#define SVE_SIG_PREG_SIZE(vq) ((unsigned)(vq) * (SVE_VQ_BYTES / 8)) +#define SVE_SIG_FFR_SIZE(vq) SVE_SIG_PREG_SIZE(vq) +#define SVE_SIG_REGS_OFFSET \ + ((sizeof(struct sve_context) + (SVE_VQ_BYTES - 1)) \ + / SVE_VQ_BYTES * SVE_VQ_BYTES) +#define SVE_SIG_ZREGS_OFFSET SVE_SIG_REGS_OFFSET +#define SVE_SIG_ZREG_OFFSET(vq, n) \ + (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREG_SIZE(vq) * (n)) +#define SVE_SIG_ZREGS_SIZE(vq) \ + (SVE_SIG_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_SIG_ZREGS_OFFSET) +#define SVE_SIG_PREGS_OFFSET(vq) \ + (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREGS_SIZE(vq)) +#define SVE_SIG_PREG_OFFSET(vq, n) \ + (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREG_SIZE(vq) * (n)) +#define SVE_SIG_PREGS_SIZE(vq) \ + (SVE_SIG_PREG_OFFSET(vq, SVE_NUM_PREGS) - SVE_SIG_PREGS_OFFSET(vq)) +#define SVE_SIG_FFR_OFFSET(vq) \ + (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREGS_SIZE(vq)) +#define SVE_SIG_REGS_SIZE(vq) \ + (SVE_SIG_FFR_OFFSET(vq) + SVE_SIG_FFR_SIZE(vq) - SVE_SIG_REGS_OFFSET) +#define SVE_SIG_CONTEXT_SIZE(vq) (SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq)) + +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; + +#else +#error "Missing architecture specific code." +#endif + +#ifdef __cplusplus +} +#endif + +#endif // _ABIBITS_SIGNAL_H diff --git a/abis/pinceros/socket.h b/abis/pinceros/socket.h new file mode 100644 index 0000000000..78e1dc3228 --- /dev/null +++ b/abis/pinceros/socket.h @@ -0,0 +1,300 @@ +#ifndef _ABIBITS_SOCKET_H +#define _ABIBITS_SOCKET_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned short sa_family_t; + +struct msghdr { + void *msg_name; + socklen_t msg_namelen; + struct iovec *msg_iov; + size_t msg_iovlen; /* int in POSIX */ + void *msg_control; + size_t msg_controllen; /* socklen_t in POSIX */ + int msg_flags; +}; + +struct sockaddr_storage { + sa_family_t ss_family; + char __padding[128 - sizeof(sa_family_t) - sizeof(long)]; + long __force_alignment; +}; + +struct mmsghdr { + struct msghdr msg_hdr; + unsigned int msg_len; +}; + +struct cmsghdr { + size_t cmsg_len; /* socklen_t in POSIX */ + int cmsg_level; + int cmsg_type; +}; + +#ifdef __cplusplus +} +#endif + +#define SCM_RIGHTS 1 +#define SCM_CREDENTIALS 2 + +#define SHUT_RD 0 +#define SHUT_WR 1 +#define SHUT_RDWR 2 + +#ifndef SOCK_STREAM +#define SOCK_STREAM 1 +#define SOCK_DGRAM 2 +#endif + +#define SOCK_RAW 3 +#define SOCK_RDM 4 +#define SOCK_SEQPACKET 5 +#define SOCK_DCCP 6 +#define SOCK_PACKET 10 + +#ifndef SOCK_CLOEXEC +#define SOCK_CLOEXEC 02000000 +#define SOCK_NONBLOCK 04000 +#endif + +#define PF_UNSPEC 0 +#define PF_LOCAL 1 +#define PF_UNIX PF_LOCAL +#define PF_FILE PF_LOCAL +#define PF_INET 2 +#define PF_AX25 3 +#define PF_IPX 4 +#define PF_APPLETALK 5 +#define PF_NETROM 6 +#define PF_BRIDGE 7 +#define PF_ATMPVC 8 +#define PF_X25 9 +#define PF_INET6 10 +#define PF_ROSE 11 +#define PF_DECnet 12 +#define PF_NETBEUI 13 +#define PF_SECURITY 14 +#define PF_KEY 15 +#define PF_NETLINK 16 +#define PF_ROUTE PF_NETLINK +#define PF_PACKET 17 +#define PF_ASH 18 +#define PF_ECONET 19 +#define PF_ATMSVC 20 +#define PF_RDS 21 +#define PF_SNA 22 +#define PF_IRDA 23 +#define PF_PPPOX 24 +#define PF_WANPIPE 25 +#define PF_LLC 26 +#define PF_IB 27 +#define PF_MPLS 28 +#define PF_CAN 29 +#define PF_TIPC 30 +#define PF_BLUETOOTH 31 +#define PF_IUCV 32 +#define PF_RXRPC 33 +#define PF_ISDN 34 +#define PF_PHONET 35 +#define PF_IEEE802154 36 +#define PF_CAIF 37 +#define PF_ALG 38 +#define PF_NFC 39 +#define PF_VSOCK 40 +#define PF_KCM 41 +#define PF_QIPCRTR 42 +#define PF_SMC 43 +#define PF_XDP 44 +#define PF_MAX 45 + +#define AF_UNSPEC PF_UNSPEC +#define AF_LOCAL PF_LOCAL +#define AF_UNIX AF_LOCAL +#define AF_FILE AF_LOCAL +#define AF_INET PF_INET +#define AF_AX25 PF_AX25 +#define AF_IPX PF_IPX +#define AF_APPLETALK PF_APPLETALK +#define AF_NETROM PF_NETROM +#define AF_BRIDGE PF_BRIDGE +#define AF_ATMPVC PF_ATMPVC +#define AF_X25 PF_X25 +#define AF_INET6 PF_INET6 +#define AF_ROSE PF_ROSE +#define AF_DECnet PF_DECnet +#define AF_NETBEUI PF_NETBEUI +#define AF_SECURITY PF_SECURITY +#define AF_KEY PF_KEY +#define AF_NETLINK PF_NETLINK +#define AF_ROUTE PF_ROUTE +#define AF_PACKET PF_PACKET +#define AF_ASH PF_ASH +#define AF_ECONET PF_ECONET +#define AF_ATMSVC PF_ATMSVC +#define AF_RDS PF_RDS +#define AF_SNA PF_SNA +#define AF_IRDA PF_IRDA +#define AF_PPPOX PF_PPPOX +#define AF_WANPIPE PF_WANPIPE +#define AF_LLC PF_LLC +#define AF_IB PF_IB +#define AF_MPLS PF_MPLS +#define AF_CAN PF_CAN +#define AF_TIPC PF_TIPC +#define AF_BLUETOOTH PF_BLUETOOTH +#define AF_IUCV PF_IUCV +#define AF_RXRPC PF_RXRPC +#define AF_ISDN PF_ISDN +#define AF_PHONET PF_PHONET +#define AF_IEEE802154 PF_IEEE802154 +#define AF_CAIF PF_CAIF +#define AF_ALG PF_ALG +#define AF_NFC PF_NFC +#define AF_VSOCK PF_VSOCK +#define AF_KCM PF_KCM +#define AF_QIPCRTR PF_QIPCRTR +#define AF_SMC PF_SMC +#define AF_XDP PF_XDP +#define AF_MAX PF_MAX + +#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_PASSCRED 16 +#define SO_PEERCRED 17 +#define SO_RCVLOWAT 18 +#define SO_SNDLOWAT 19 +#define SO_ACCEPTCONN 30 +#define SO_PEERSEC 31 +#define SO_SNDBUFFORCE 32 +#define SO_RCVBUFFORCE 33 +#define SO_PROTOCOL 38 +#define SO_DOMAIN 39 + +#define SO_RCVTIMEO 20 +#define SO_SNDTIMEO 21 + +#define SO_TIMESTAMP 29 +#define SO_TIMESTAMPNS 35 +#define SO_TIMESTAMPING 37 + +#define SO_SECURITY_AUTHENTICATION 22 +#define SO_SECURITY_ENCRYPTION_TRANSPORT 23 +#define SO_SECURITY_ENCRYPTION_NETWORK 24 + +#define SO_BINDTODEVICE 25 + +#define SO_ATTACH_FILTER 26 +#define SO_DETACH_FILTER 27 +#define SO_GET_FILTER SO_ATTACH_FILTER + +#define SO_PEERNAME 28 +#define SCM_TIMESTAMP SO_TIMESTAMP +#define SO_PASSSEC 34 +#define SCM_TIMESTAMPNS SO_TIMESTAMPNS +#define SO_MARK 36 +#define SCM_TIMESTAMPING SO_TIMESTAMPING +#define SO_RXQ_OVFL 40 +#define SO_WIFI_STATUS 41 +#define SCM_WIFI_STATUS SO_WIFI_STATUS +#define SO_PEEK_OFF 42 +#define SO_NOFCS 43 +#define SO_LOCK_FILTER 44 +#define SO_SELECT_ERR_QUEUE 45 +#define SO_BUSY_POLL 46 +#define SO_MAX_PACING_RATE 47 +#define SO_BPF_EXTENSIONS 48 +#define SO_INCOMING_CPU 49 +#define SO_ATTACH_BPF 50 +#define SO_DETACH_BPF SO_DETACH_FILTER +#define SO_ATTACH_REUSEPORT_CBPF 51 +#define SO_ATTACH_REUSEPORT_EBPF 52 +#define SO_CNX_ADVICE 53 +#define SCM_TIMESTAMPING_OPT_STATS 54 +#define SO_MEMINFO 55 +#define SO_INCOMING_NAPI_ID 56 +#define SO_COOKIE 57 +#define SCM_TIMESTAMPING_PKTINFO 58 +#define SO_PEERGROUPS 59 +#define SO_ZEROCOPY 60 +#define SO_TXTIME 61 +#define SCM_TXTIME SO_TXTIME +#define SO_BINDTOIFINDEX 62 +#define SO_DETACH_REUSEPORT_BPF 68 + +#define SOL_SOCKET 1 + +#define SOL_IP 0 +#define SOL_IPV6 41 +#define SOL_ICMPV6 58 + +#define SOL_RAW 255 +#define SOL_DECNET 261 +#define SOL_X25 262 +#define SOL_PACKET 263 +#define SOL_ATM 264 +#define SOL_AAL 265 +#define SOL_IRDA 266 +#define SOL_NETBEUI 267 +#define SOL_LLC 268 +#define SOL_DCCP 269 +#define SOL_NETLINK 270 +#define SOL_TIPC 271 +#define SOL_RXRPC 272 +#define SOL_PPPOL2TP 273 +#define SOL_BLUETOOTH 274 +#define SOL_PNPIPE 275 +#define SOL_RDS 276 +#define SOL_IUCV 277 +#define SOL_CAIF 278 +#define SOL_ALG 279 +#define SOL_NFC 280 +#define SOL_KCM 281 +#define SOL_TLS 282 +#define SOL_XDP 283 + +#define SOMAXCONN 128 + +#define MSG_OOB 0x0001 +#define MSG_PEEK 0x0002 +#define MSG_DONTROUTE 0x0004 +#define MSG_CTRUNC 0x0008 +#define MSG_PROXY 0x0010 +#define MSG_TRUNC 0x0020 +#define MSG_DONTWAIT 0x0040 +#define MSG_EOR 0x0080 +#define MSG_WAITALL 0x0100 +#define MSG_FIN 0x0200 +#define MSG_SYN 0x0400 +#define MSG_CONFIRM 0x0800 +#define MSG_RST 0x1000 +#define MSG_ERRQUEUE 0x2000 +#define MSG_NOSIGNAL 0x4000 +#define MSG_MORE 0x8000 +#define MSG_WAITFORONE 0x10000 +#define MSG_BATCH 0x40000 +#define MSG_ZEROCOPY 0x4000000 +#define MSG_FASTOPEN 0x20000000 +#define MSG_CMSG_CLOEXEC 0x40000000 + +#endif diff --git a/abis/pinceros/socklen_t.h b/abis/pinceros/socklen_t.h new file mode 100644 index 0000000000..190e5f9f81 --- /dev/null +++ b/abis/pinceros/socklen_t.h @@ -0,0 +1,6 @@ +#ifndef _ABIBITS_SOCKLEN_T_H +#define _ABIBITS_SOCKLEN_T_H + +typedef unsigned socklen_t; + +#endif /* _ABIBITS_SOCKLEN_T_H */ diff --git a/abis/pinceros/stat.h b/abis/pinceros/stat.h new file mode 100644 index 0000000000..9b35bfe096 --- /dev/null +++ b/abis/pinceros/stat.h @@ -0,0 +1,124 @@ +#ifndef _ABIBITS_STAT_H +#define _ABIBITS_STAT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define S_IFMT 0x0F000 +#define S_IFBLK 0x06000 +#define S_IFCHR 0x02000 +#define S_IFIFO 0x01000 +#define S_IFREG 0x08000 +#define S_IFDIR 0x04000 +#define S_IFLNK 0x0A000 +#define S_IFSOCK 0x0C000 + +#define S_IRWXU 0700 +#define S_IRUSR 0400 +#define S_IWUSR 0200 +#define S_IXUSR 0100 +#define S_IEXEC S_IXUSR +#define S_IRWXG 070 +#define S_IRGRP 040 +#define S_IWGRP 020 +#define S_IXGRP 010 +#define S_IRWXO 07 +#define S_IROTH 04 +#define S_IWOTH 02 +#define S_IXOTH 01 +#define S_ISUID 04000 +#define S_ISGID 02000 +#define S_ISVTX 01000 + +#define S_IREAD S_IRUSR +#define S_IWRITE S_IWUSR +#define S_IEXEC S_IXUSR + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__x86_64__) + +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]; +}; + +#elif (defined(__riscv) && __riscv_xlen == 64) || defined (__aarch64__) + +struct stat { + dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + dev_t __pad1; + off_t st_size; + blksize_t st_blksize; + int __pad2; + blkcnt_t st_blocks; + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; + int __pad3[2]; +}; + +#elif defined(__i386__) + +struct stat { + dev_t st_dev; + int __st_dev_padding; + long __st_ino_truncated; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + int __st_rdev_padding; + off_t st_size; + blksize_t st_blksize; + blkcnt_t st_blocks; + struct { + long tv_sec; + long tv_nsec; + } __st_atim32, __st_mtim32, __st_ctim32; + ino_t st_ino; + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; +}; + +#endif + +#define stat64 stat + +#ifdef __cplusplus +} +#endif + +#endif // _ABIBITS_STAT_H diff --git a/abis/pinceros/statfs.h b/abis/pinceros/statfs.h new file mode 100644 index 0000000000..2f0ffa7116 --- /dev/null +++ b/abis/pinceros/statfs.h @@ -0,0 +1,44 @@ +#ifndef _ABIBITS_STATFS_H +#define _ABIBITS_STATFS_H + +#include +#include + +typedef struct __mlibc_fsid { + int __val[2]; +} fsid_t; + +/* WARNING: keep `statfs` and `statfs64` in sync or bad things will happen! */ +struct statfs { + unsigned long f_type; + unsigned long f_bsize; + fsblkcnt_t f_blocks; + fsblkcnt_t f_bfree; + fsblkcnt_t f_bavail; + fsfilcnt_t f_files; + fsfilcnt_t f_ffree; + fsid_t f_fsid; + unsigned long f_namelen; + unsigned long f_frsize; + unsigned long f_flags; + unsigned long __f_spare[4]; +}; + +/* WARNING: keep `statfs` and `statfs64` in sync or bad things will happen! */ +struct statfs64 { + unsigned long f_type; + unsigned long f_bsize; + fsblkcnt_t f_blocks; + fsblkcnt_t f_bfree; + fsblkcnt_t f_bavail; + fsfilcnt_t f_files; + fsfilcnt_t f_ffree; + fsid_t f_fsid; + unsigned long f_namelen; + unsigned long f_frsize; + unsigned long f_flags; + unsigned long __f_spare[4]; +}; + +#endif /* _ABIBITS_STATFS_H */ + diff --git a/abis/pinceros/statvfs.h b/abis/pinceros/statvfs.h new file mode 100644 index 0000000000..0fd011b415 --- /dev/null +++ b/abis/pinceros/statvfs.h @@ -0,0 +1,44 @@ +#ifndef _ABIBITS_STATVFS_H +#define _ABIBITS_STATVFS_H + +#include +#include + +#define ST_RDONLY 1 +#define ST_NOSUID 2 +#define ST_MANDLOCK 64 + +// On Linux, this struct is not directly used by the kernel. + +/* WARNING: keep `statvfs` and `statvfs64` in sync or bad things will happen! */ +struct statvfs { + unsigned long f_bsize; + unsigned long f_frsize; + fsblkcnt_t f_blocks; + fsblkcnt_t f_bfree; + fsblkcnt_t f_bavail; + fsfilcnt_t f_files; + fsfilcnt_t f_ffree; + fsfilcnt_t f_favail; + unsigned long f_fsid; + unsigned long f_flag; + unsigned long f_namemax; +}; + +/* WARNING: keep `statvfs` and `statvfs64` in sync or bad things will happen! */ +struct statvfs64 { + unsigned long f_bsize; + unsigned long f_frsize; + fsblkcnt_t f_blocks; + fsblkcnt_t f_bfree; + fsblkcnt_t f_bavail; + fsfilcnt_t f_files; + fsfilcnt_t f_ffree; + fsfilcnt_t f_favail; + unsigned long f_fsid; + unsigned long f_flag; + unsigned long f_namemax; +}; + +#endif /* _ABIBITS_STATVFS_H */ + diff --git a/abis/pinceros/statx.h b/abis/pinceros/statx.h new file mode 100644 index 0000000000..b94e349d52 --- /dev/null +++ b/abis/pinceros/statx.h @@ -0,0 +1,71 @@ +#ifndef _ABIBITS_STATX_H +#define _ABIBITS_STATX_H + +#include + +struct statx_timestamp { + __mlibc_int64 tv_sec; + __mlibc_uint32 tv_nsec; + __mlibc_uint32 __padding; +}; + +#define STATX_TYPE 0x1 +#define STATX_MODE 0x2 +#define STATX_NLINK 0x4 +#define STATX_UID 0x8 +#define STATX_GID 0x10 +#define STATX_ATIME 0x20 +#define STATX_MTIME 0x40 +#define STATX_CTIME 0x80 +#define STATX_INO 0x100 +#define STATX_SIZE 0x200 +#define STATX_BLOCKS 0x400 +#define STATX_BASIC_STATS 0x7ff +#define STATX_BTIME 0x800 +#define STATX_MNT_ID 0x1000 +#define STATX_DIOALIGN 0x2000 +#define STATX_ALL 0xfff + +#define STATX_ATTR_COMPRESSED 0x4 +#define STATX_ATTR_IMMUTABLE 0x10 +#define STATX_ATTR_APPEND 0x20 +#define STATX_ATTR_NODUMP 0x40 +#define STATX_ATTR_ENCRYPTED 0x800 +#define STATX_ATTR_AUTOMOUNT 0x1000 +#define STATX_ATTR_MOUNT_ROOT 0x2000 +#define STATX_ATTR_VERITY 0x100000 +#define STATX_ATTR_DAX 0x200000 + +struct statx { + __mlibc_uint32 stx_mask; + + __mlibc_uint32 stx_blksize; + __mlibc_uint64 stx_attributes; + __mlibc_uint32 stx_nlink; + __mlibc_uint32 stx_uid; + __mlibc_uint32 stx_gid; + __mlibc_uint16 stx_mode; + __mlibc_uint16 __padding; + __mlibc_uint64 stx_ino; + __mlibc_uint64 stx_size; + __mlibc_uint64 stx_blocks; + __mlibc_uint64 stx_attributes_mask; + + struct statx_timestamp stx_atime; + struct statx_timestamp stx_btime; + struct statx_timestamp stx_ctime; + struct statx_timestamp stx_mtime; + + __mlibc_uint32 stx_rdev_major; + __mlibc_uint32 stx_rdev_minor; + __mlibc_uint32 stx_dev_major; + __mlibc_uint32 stx_dev_minor; + + __mlibc_uint64 stx_mnt_id; + __mlibc_uint32 stx_dio_mem_align; + __mlibc_uint32 stx_dio_offset_align; + + __mlibc_uint64 __padding1[12]; +}; + +#endif diff --git a/abis/pinceros/suseconds_t.h b/abis/pinceros/suseconds_t.h new file mode 100644 index 0000000000..1de1a7cbc1 --- /dev/null +++ b/abis/pinceros/suseconds_t.h @@ -0,0 +1,8 @@ +#ifndef _ABIBITS_SUSECONDS_T_H +#define _ABIBITS_SUSECONDS_T_H + +#include + +typedef long suseconds_t; + +#endif /* _ABIBITS_SUSECONDS_T_H */ diff --git a/abis/pinceros/termios.h b/abis/pinceros/termios.h new file mode 100644 index 0000000000..3ee43d03cd --- /dev/null +++ b/abis/pinceros/termios.h @@ -0,0 +1,155 @@ +#ifndef _ABIBITS_TERMIOS_H +#define _ABIBITS_TERMIOS_H + +typedef unsigned char cc_t; +typedef unsigned int speed_t; +typedef unsigned int tcflag_t; + +// indices for the c_cc array in struct termios +#define NCCS 32 +#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 + +// bitwise flags for c_iflag in struct termios +#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 + +// bitwise flags for c_oflag in struct termios +#define OPOST 0000001 +#define OLCUC 0000002 +#define ONLCR 0000004 +#define OCRNL 0000010 +#define ONOCR 0000020 +#define ONLRET 0000040 +#define OFILL 0000100 +#define OFDEL 0000200 + +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE) + +#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 + +#endif + +#define VTDLY 0040000 +#define VT0 0000000 +#define VT1 0040000 + +// bitwise constants for c_cflag in struct termios +#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 + +// bitwise constants for c_lflag in struct termios +#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 + +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) + +#define EXTA 0000016 +#define EXTB 0000017 +#define CBAUD 0010017 +#define CBAUDEX 0010000 +#define CIBAUD 002003600000 +#define CMSPAR 010000000000 +#define CRTSCTS 020000000000 + +#define XCASE 0000004 +#define ECHOCTL 0001000 +#define ECHOPRT 0002000 +#define ECHOKE 0004000 +#define FLUSHO 0010000 +#define PENDIN 0040000 +#define EXTPROC 0200000 + +#define XTABS 0014000 + +#endif + +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 ibaud; + speed_t obaud; +}; + +#define NCC 8 +struct termio { + unsigned short c_iflag; + unsigned short c_oflag; + unsigned short c_cflag; + unsigned short c_lflag; + unsigned char c_line; + unsigned char c_cc[NCC]; +}; + +#endif diff --git a/abis/pinceros/time.h b/abis/pinceros/time.h new file mode 100644 index 0000000000..3f49db3c4a --- /dev/null +++ b/abis/pinceros/time.h @@ -0,0 +1,15 @@ +#ifndef _ABIBITS_TIME_H +#define _ABIBITS_TIME_H + +#include + +struct itimerval { + struct timeval it_interval; /* Interval for periodic timer */ + struct timeval it_value; /* Time until next expiration */ +}; + +#define ITIMER_REAL 0 +#define ITIMER_VIRTUAL 1 +#define ITIMER_PROF 2 + +#endif // _ABIBITS_TIME_H diff --git a/abis/pinceros/uid_t.h b/abis/pinceros/uid_t.h new file mode 100644 index 0000000000..5b53ca3097 --- /dev/null +++ b/abis/pinceros/uid_t.h @@ -0,0 +1,8 @@ + +#ifndef _ABIBITS_UID_T_H +#define _ABIBITS_UID_T_H + +typedef unsigned int uid_t; + +#endif // _ABIBITS_UID_T_H + diff --git a/abis/pinceros/utsname.h b/abis/pinceros/utsname.h new file mode 100644 index 0000000000..9875a46ebb --- /dev/null +++ b/abis/pinceros/utsname.h @@ -0,0 +1,13 @@ +#ifndef _ABIBITS_UTSNAME_T_H +#define _ABIBITS_UTSNAME_T_H + +struct utsname { + char sysname[65]; + char nodename[65]; + char release[65]; + char version[65]; + char machine[65]; + char domainname[65]; +}; + +#endif // _ABIBITS_UTSNAME_T_H diff --git a/abis/pinceros/vm-flags.h b/abis/pinceros/vm-flags.h new file mode 100644 index 0000000000..3f8137c667 --- /dev/null +++ b/abis/pinceros/vm-flags.h @@ -0,0 +1,70 @@ +#ifndef _ABIBITS_VM_FLAGS_H +#define _ABIBITS_VM_FLAGS_H + +#define PROT_NONE 0x00 +#define PROT_READ 0x01 +#define PROT_WRITE 0x02 +#define PROT_EXEC 0x04 + +#define MAP_FAILED ((void *)(-1)) +#define MAP_FILE 0x00 +#define MAP_SHARED 0x01 +#define MAP_PRIVATE 0x02 +#define MAP_FIXED 0x10 +#define MAP_ANON 0x20 +#define MAP_ANONYMOUS 0x20 +#define MAP_GROWSDOWN 0x100 +#define MAP_DENYWRITE 0x800 +#define MAP_EXECUTABLE 0x1000 +#define MAP_LOCKED 0x2000 +#define MAP_NORESERVE 0x4000 +#define MAP_POPULATE 0x8000 +#define MAP_NONBLOCK 0x10000 +#define MAP_STACK 0x20000 +#define MAP_HUGETLB 0x40000 +#define MAP_SYNC 0x80000 +#define MAP_FIXED_NOREPLACE 0x100000 + +#define MS_ASYNC 0x01 +#define MS_INVALIDATE 0x02 +#define MS_SYNC 0x04 + +#define MCL_CURRENT 0x01 +#define MCL_FUTURE 0x02 + +#define POSIX_MADV_NORMAL 0 +#define POSIX_MADV_RANDOM 1 +#define POSIX_MADV_SEQUENTIAL 2 +#define POSIX_MADV_WILLNEED 3 +#define POSIX_MADV_DONTNEED 4 + +#define MADV_NORMAL 0 +#define MADV_RANDOM 1 +#define MADV_SEQUENTIAL 2 +#define MADV_WILLNEED 3 +#define MADV_DONTNEED 4 +#define MADV_FREE 8 +#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_WIPEONFORK 18 +#define MADV_KEEPONFORK 19 +#define MADV_COLD 20 +#define MADV_PAGEOUT 21 +#define MADV_HWPOISON 100 +#define MADV_SOFT_OFFLINE 101 + +#define MREMAP_MAYMOVE 1 +#define MREMAP_FIXED 2 + +#define MFD_CLOEXEC 1U +#define MFD_ALLOW_SEALING 2U +#define MFD_HUGETLB 4U + +#endif // _ABIBITS_VM_FLAGS_H diff --git a/abis/pinceros/vt.h b/abis/pinceros/vt.h new file mode 100644 index 0000000000..811933b69a --- /dev/null +++ b/abis/pinceros/vt.h @@ -0,0 +1,76 @@ +#ifndef _ABIBITS_VT_H +#define _ABIBITS_VT_H + +#define MIN_NR_CONSOLES 1 +#define MAX_NR_CONSOLES 63 + +#define VT_OPENQRY 0x5600 +#define VT_GETMODE 0x5601 +#define VT_SETMODE 0x5602 +#define VT_GETSTATE 0x5603 +#define VT_SENDSIG 0x5604 +#define VT_RELDISP 0x5605 +#define VT_ACTIVATE 0x5606 +#define VT_WAITACTIVE 0x5607 +#define VT_DISALLOCATE 0x5608 +#define VT_RESIZE 0x5609 +#define VT_RESIZEX 0x560A +#define VT_LOCKSWITCH 0x560B +#define VT_UNLOCKSWITCH 0x560C +#define VT_GETHIFONTMASK 0x560D +#define VT_WAITEVENT 0x560E +#define VT_SETACTIVATE 0x560F + +struct vt_mode { + char mode; + char waitv; + short relsig; + short acqsig; + short frsig; +}; + +#define VT_AUTO 0x00 +#define VT_PROCESS 0x01 +#define VT_ACKACQ 0x02 + +struct vt_stat { + unsigned short v_active; + unsigned short v_signal; + unsigned short v_state; +}; + +struct vt_sizes { + unsigned short v_rows; + unsigned short v_cols; + unsigned short v_scrollsize; +}; + +struct vt_consize { + unsigned short v_rows; + unsigned short v_cols; + unsigned short v_vlin; + unsigned short v_clin; + unsigned short v_vcol; + unsigned short v_ccol; +}; + +#define VT_EVENT_SWITCH 0x0001 +#define VT_EVENT_BLANK 0x0002 +#define VT_EVENT_UNBLANK 0x0004 +#define VT_EVENT_RESIZE 0x0008 +#define VT_MAX_EVENT 0x000F + +struct vt_event { + unsigned int event; + + unsigned int oldev; + unsigned int newev; + unsigned int pad[4]; +}; + +struct vt_setactivate { + unsigned int console; + struct vt_mode mode; +}; + +#endif // _ABIBITS_VT_H diff --git a/abis/pinceros/wait.h b/abis/pinceros/wait.h new file mode 100644 index 0000000000..58d1462531 --- /dev/null +++ b/abis/pinceros/wait.h @@ -0,0 +1,28 @@ +#ifndef _ABIBITS_WAIT_H +#define _ABIBITS_WAIT_H + +#define WNOHANG 1 +#define WUNTRACED 2 +#define WSTOPPED 2 +#define WEXITED 4 +#define WCONTINUED 8 +#define WNOWAIT 0x01000000 + +#define __WALL 0x40000000 +#define __WCLONE 0x80000000 + +#define WCOREFLAG 0x80 + +#define WEXITSTATUS(x) (((x) & 0xff00) >> 8) +#define WTERMSIG(x) ((x) & 0x7f) +#define WSTOPSIG(x) WEXITSTATUS(x) +#define WIFEXITED(x) (WTERMSIG(x) == 0) +#define WIFSIGNALED(x) (((signed char) (((x) & 0x7f) + 1) >> 1) > 0) +#define WIFSTOPPED(x) (((x) & 0xff) == 0x7f) +#define WIFCONTINUED(x) ((x) == 0xffff) +#define WCOREDUMP(x) ((x) & WCOREFLAG) + +/* glibc extension, but also useful for kernels */ +#define W_EXITCODE(ret, sig) (((ret) << 8) | (sig)) + +#endif //_ABIBITS_WAIT_H diff --git a/abis/pinceros/xattr.h b/abis/pinceros/xattr.h new file mode 100644 index 0000000000..c0e7fbebde --- /dev/null +++ b/abis/pinceros/xattr.h @@ -0,0 +1,21 @@ +#ifndef MLIBC_ABIS_LINUX_XATTR_H +#define MLIBC_ABIS_LINUX_XATTR_H + +/* __USE_KERNEL_XATTR_DEFS is exported when XATTR_* are emitted, and + * __UAPI_DEF_XATTR is used to determine the behaviour of the + * header (through ), if it's set + * to 1, the header exports xattr defines and __USE_KERNEL_XATTR_DEFS. + * This applies for pretty much all other defines in libc-compat.h + * AFAICT. + */ +#ifndef __USE_KERNEL_XATTR_DEFS +enum { + XATTR_CREATE = 1, +#define XATTR_CREATE XATTR_CREATE + XATTR_REPLACE = 2, +#define XATTR_REPLACE XATTR_REPLACE +}; +# define __UAPI_DEF_XATTR 0 +#endif + +#endif /* MLIBC_ABIS_LINUX_XATTR_H */ diff --git a/compile.sh b/compile.sh new file mode 100755 index 0000000000..a8fc3a5cbe --- /dev/null +++ b/compile.sh @@ -0,0 +1,8 @@ +aarch64-linux-gnu-gcc -c test.c -I./build/install/usr/local/include -DPINCEROS + +aarch64-linux-gnu-ld -nostdlib test.o -L./build/install/usr/local/lib -static --no-omagic \ + -o a.out \ + ./build/sysdeps/pinceros/crt0.o ./build/sysdeps/pinceros/crti.o \ + -lc /usr/lib/gcc/aarch64-linux-gnu/14.2.0/libgcc.a \ + -T script.ld \ + -e _start diff --git a/meson.build b/meson.build index 471604e0c4..b0620e5324 100644 --- a/meson.build +++ b/meson.build @@ -248,6 +248,13 @@ elif host_machine.system() == 'dripos' rtld_include_dirs += include_directories('sysdeps/dripos/include') libc_include_dirs += include_directories('sysdeps/dripos/include') subdir('sysdeps/dripos') +elif host_machine.system() == 'pinceros' + disable_linux_option = true + add_project_arguments('-DPINCEROS', language : 'c') + add_project_arguments('-DPINCEROS', language : 'cpp') + rtld_include_dirs += include_directories('sysdeps/pinceros/include') + libc_include_dirs += include_directories('sysdeps/pinceros/include') + subdir('sysdeps/pinceros') else error('No sysdeps defined for OS: ' + host_machine.system()) endif diff --git a/options/posix/generic/unistd-stubs.cpp b/options/posix/generic/unistd-stubs.cpp index 3279cc664b..f86297d8ee 100644 --- a/options/posix/generic/unistd-stubs.cpp +++ b/options/posix/generic/unistd-stubs.cpp @@ -944,7 +944,11 @@ off64_t lseek64(int fd, off64_t offset, int whence) { } int close(int fd) { - return mlibc::sys_close(fd); + if (int e = mlibc::sys_close(fd); e) { + errno = e; + return -1; + } + return 0; } unsigned int sleep(unsigned int secs) { diff --git a/options/posix/include/unistd.h b/options/posix/include/unistd.h index afef0da1cd..8499f63936 100644 --- a/options/posix/include/unistd.h +++ b/options/posix/include/unistd.h @@ -402,5 +402,9 @@ void encrypt(char block[64], int flags); # include #endif +#ifdef PINCEROS +int dup3(int fd, int newfd, int flags); +#endif + #endif // _UNISTD_H diff --git a/options/rtld/generic/main.cpp b/options/rtld/generic/main.cpp index 360ed37b1a..1f9d1301e1 100644 --- a/options/rtld/generic/main.cpp +++ b/options/rtld/generic/main.cpp @@ -869,10 +869,11 @@ extern "C" [[gnu::visibility("default")]] int _dl_find_object(void *address, dl_ // using the host toolchain. // __gnu_linux__ is the define checked by libgcc -#if defined(__aarch64__) && defined(__gnu_linux__) && !defined(MLIBC_STATIC_BUILD) +#if defined(PINCEROS) || defined(__aarch64__) && defined(__gnu_linux__) && !defined(MLIBC_STATIC_BUILD) extern "C" unsigned long __getauxval(unsigned long type) { // Find the auxiliary vector by skipping args and environment. + return 0; auto aux = entryStack; aux += *aux + 1; // Skip argc and all arguments __ensure(!*aux); diff --git a/script.ld b/script.ld new file mode 100644 index 0000000000..249810bcec --- /dev/null +++ b/script.ld @@ -0,0 +1,38 @@ +SECTIONS +{ + /* Align .text to page size */ + . = 0x100000; /* or your base virtual address */ + .text ALIGN(0x1000) : { + __ehdr_start = .; + *(.text) + *(.text.*) + } + + .rodata ALIGN(0x1000) : { + *(.rodata) + *(.rodata.*) + } + + .init_array ALIGN(8) : { + __init_array_start = .; + KEEP(*(.init_array*)) + __init_array_end = .; + } + + .preinit_array ALIGN(8) : { + __preinit_array_start = .; + KEEP(*(.preinit_array*)) + __preinit_array_end = .; + } + + .data ALIGN(0x1000) : { + *(.data) + *(.data.*) + } + + .bss ALIGN(0x1000) (NOLOAD) : { + *(.bss) + *(.bss.*) + *(COMMON) + } +} diff --git a/scripts/aarch64-pinceros-clang.txt b/scripts/aarch64-pinceros-clang.txt new file mode 100644 index 0000000000..cc0e1d0d83 --- /dev/null +++ b/scripts/aarch64-pinceros-clang.txt @@ -0,0 +1,14 @@ +[binaries] +c = 'clang' +cpp = 'clang++' +strip = 'strip' + +[host_machine] +system = 'pinceros' +cpu_family = 'aarch64' +cpu = 'aarch64' +endian = 'little' + +[properties] +c_args = ['--target=aarch64-none-elf'] +cpp_args = ['--target=aarch64-none-elf'] diff --git a/scripts/aarch64-pinceros-gcc.txt b/scripts/aarch64-pinceros-gcc.txt new file mode 100644 index 0000000000..49cf3c9b44 --- /dev/null +++ b/scripts/aarch64-pinceros-gcc.txt @@ -0,0 +1,14 @@ +[binaries] +c = 'aarch64-linux-gnu-gcc' +cpp = 'aarch64-linux-gnu-g++' +strip = 'strip' + +[host_machine] +system = 'pinceros' +cpu_family = 'aarch64' +cpu = 'aarch64' +endian = 'little' + +[properties] +c_args = ['-DPINCEROS'] +cpp_args = ['-DPINCEROS'] diff --git a/scripts/gen-abi-bits.py b/scripts/gen-abi-bits.py new file mode 100755 index 0000000000..b38349a0cc --- /dev/null +++ b/scripts/gen-abi-bits.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +""" +Generates the necessary ABI bits files by copying the ABI bits from the Linux ABI files +""" + +import os +import shutil + +PORT_NAME = "pinceros" + + +os.makedirs(f"abis/{PORT_NAME}", exist_ok=True) +os.makedirs(f"sysdeps/{PORT_NAME}/include/abi-bits", exist_ok=True) + +for file in os.listdir("abis/linux"): + shutil.copyfile(f"abis/linux/{file}", f"abis/{PORT_NAME}/{file}") + try: + os.remove(f"sysdeps/{PORT_NAME}/include/abi-bits/{file}") + except FileNotFoundError: + pass + os.symlink( + f"../../../../abis/{PORT_NAME}/{file}", + f"sysdeps/{PORT_NAME}/include/abi-bits/{file}", + ) diff --git a/sysdeps/pinceros/aarch64/crt-src/Scrt1.S b/sysdeps/pinceros/aarch64/crt-src/Scrt1.S new file mode 100644 index 0000000000..3e5660881e --- /dev/null +++ b/sysdeps/pinceros/aarch64/crt-src/Scrt1.S @@ -0,0 +1,10 @@ +.section .text +.global _start +_start: + mov x0, sp + adr x1, main + + bl __mlibc_entry + brk #0 + +.section .note.GNU-stack,"",%progbits diff --git a/sysdeps/pinceros/aarch64/crt-src/crt0.S b/sysdeps/pinceros/aarch64/crt-src/crt0.S new file mode 100644 index 0000000000..5e59593464 --- /dev/null +++ b/sysdeps/pinceros/aarch64/crt-src/crt0.S @@ -0,0 +1,11 @@ + +.section .text +.global _start +_start: + mov x0, sp + adrp x1, main + add x1, x1, :lo12:main + bl __mlibc_entry + +.section .note.GNU-stack,"",%progbits + diff --git a/sysdeps/pinceros/aarch64/crt-src/crti.S b/sysdeps/pinceros/aarch64/crt-src/crti.S new file mode 100644 index 0000000000..4307dfb6b4 --- /dev/null +++ b/sysdeps/pinceros/aarch64/crt-src/crti.S @@ -0,0 +1,15 @@ + .ident "aarch64-managarm-mlibc crti" + + .section .init + .global _init +_init: + stp x29, x30, [sp, -16]! + mov x29, sp + + .section .fini + .global _fini +_fini: + stp x29, x30, [sp, -16]! + mov x29, sp + + .section .note.GNU-stack,"",%progbits diff --git a/sysdeps/pinceros/aarch64/crt-src/crtn.S b/sysdeps/pinceros/aarch64/crt-src/crtn.S new file mode 100644 index 0000000000..005d8702ab --- /dev/null +++ b/sysdeps/pinceros/aarch64/crt-src/crtn.S @@ -0,0 +1,11 @@ + .ident "aarch64-managarm-mlibc crtn" + + .section .init + ldp x29, x30, [sp], #16 + ret + + .section .fini + ldp x29, x30, [sp], #16 + ret + + .section .note.GNU-stack,"",%progbits diff --git a/sysdeps/pinceros/aarch64/dso_handle.S b/sysdeps/pinceros/aarch64/dso_handle.S new file mode 100644 index 0000000000..6679c9f587 --- /dev/null +++ b/sysdeps/pinceros/aarch64/dso_handle.S @@ -0,0 +1,5 @@ +.section .data +.hidden __dso_handle +.global __dso_handle +__dso_handle: + .quad __dso_handle diff --git a/sysdeps/pinceros/generic/ensure.cpp b/sysdeps/pinceros/generic/ensure.cpp new file mode 100644 index 0000000000..3189dd64e4 --- /dev/null +++ b/sysdeps/pinceros/generic/ensure.cpp @@ -0,0 +1,42 @@ + +#include +#include +#include + +#include +#include +#include + +#include + +namespace mlibc +{ + void sys_libc_log(const char *message) + { + ssize_t n = 0; + while (message[n]) + n++; + + ssize_t total_written = 0; + while (total_written < n) + { + ssize_t bytes_written = 0; + if (sys_pwrite(2, message + total_written, n - total_written, 0, &bytes_written)) + { + sys_libc_panic(); + } + total_written += bytes_written; + } + char lf = '\n'; + ssize_t bytes_written = 0; + if (sys_pwrite(2, &lf, 1, 0, &bytes_written)) + { + sys_libc_panic(); + } + } + + [[noreturn]] void sys_libc_panic() + { + __builtin_trap(); + } +} \ No newline at end of file diff --git a/sysdeps/pinceros/generic/entry.cpp b/sysdeps/pinceros/generic/entry.cpp new file mode 100644 index 0000000000..b77d84ce34 --- /dev/null +++ b/sysdeps/pinceros/generic/entry.cpp @@ -0,0 +1,44 @@ +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +// defined by the POSIX library +void __mlibc_initLocale(); + +extern "C" uintptr_t *__dlapi_entrystack(); +extern "C" void __dlapi_enter(uintptr_t *); + +extern char **environ; +static mlibc::exec_stack_data __mlibc_stack_data; + +size_t __hwcap; + +struct LibraryGuard { + LibraryGuard(); +}; + +static LibraryGuard guard; + +LibraryGuard::LibraryGuard() { + __mlibc_initLocale(); + + // Parse the exec() stack. + mlibc::parse_exec_stack(__dlapi_entrystack(), &__mlibc_stack_data); + mlibc::set_startup_data(__mlibc_stack_data.argc, __mlibc_stack_data.argv, + __mlibc_stack_data.envp); +} + +extern "C" void __mlibc_entry(uintptr_t *entry_stack, int (*main_fn)(int argc, char *argv[], char *env[])) { + __dlapi_enter(entry_stack); + // __hwcap = getauxval(AT_HWCAP); + auto result = main_fn(__mlibc_stack_data.argc, __mlibc_stack_data.argv, environ); + exit(result); +} diff --git a/sysdeps/pinceros/generic/file.cpp b/sysdeps/pinceros/generic/file.cpp new file mode 100644 index 0000000000..85097d54a9 --- /dev/null +++ b/sysdeps/pinceros/generic/file.cpp @@ -0,0 +1,104 @@ +#include +#include +#include +#include + +namespace mlibc +{ + int sys_open(const char *pathname, int flags, mode_t mode, int *fd) + { + return sys_openat(AT_FDCWD, pathname, flags, mode, fd); + } + + int sys_openat(int dirfd, const char *path, int flags, mode_t mode, int *fd) + { + long ret = __do_syscall5(OPENAT, dirfd, strlen(path), path, flags, mode); + if (ret < 0) + { + return -ret; + } + *fd = ret; + return 0; + } + + int sys_pread(int fd, void *buf, size_t n, off_t off, ssize_t *bytes_read) + { + long ret = __do_syscall4(PREAD, fd, buf, n, off); + if (ret < 0) + { + return -ret; + } + *bytes_read = ret; + return 0; + } + + int sys_read(int fd, void *buf, size_t count, ssize_t *bytes_read) + { + return sys_pread(fd, buf, count, 0, bytes_read); + } + + int sys_pwrite(int fd, const void *buf, size_t n, off_t off, ssize_t *bytes_written) + { + long ret = __do_syscall4(PWRITE, fd, buf, n, off); + if (ret < 0) + { + return -ret; + } + *bytes_written = ret; + return 0; + } + + int sys_write(int fd, const void *data, size_t size, ssize_t *bytes_written) + { + return sys_pwrite(fd, data, size, 0, bytes_written); + } + + int sys_seek(int /* fd */, off_t /* offset */, int /* whence */, off_t * /* new_offset */) + { + MLIBC_UNIMPLEMENTED(); + return -1; + } + + int sys_close(int fd) + { + return __do_syscall1(CLOSE, fd); + } + + int sys_stat(fsfd_target /* fsfdt */, int /* fd */, const char * /* path */, int /* flags */, + struct stat * /* statbuf */) + { + MLIBC_UNIMPLEMENTED(); + return -1; + } + + int sys_dup2(int fd, int flags, int newfd) + { + long ret = __do_syscall3(DUP3, fd, newfd, flags); + if (ret < 0) + { + return -ret; + } + return 0; + } + + int sys_vm_map(void *hint, size_t size, int prot, int flags, int fd, off_t offset, void **window) + { + long ret = __do_syscall6(MMAP, hint, size, prot, flags, fd, offset); + if (ret < 0) + { + return -ret; + } + *window = (void *)ret; + return 0; + } + + int sys_vm_unmap(void *pointer, size_t size) + { + long ret = __do_syscall2(MUNMAP, pointer, size); + if (ret < 0) + { + return -ret; + } + return 0; + } +} // namespace mlibc \ No newline at end of file diff --git a/sysdeps/pinceros/generic/fork-exec.cpp b/sysdeps/pinceros/generic/fork-exec.cpp new file mode 100644 index 0000000000..82cad4e469 --- /dev/null +++ b/sysdeps/pinceros/generic/fork-exec.cpp @@ -0,0 +1,36 @@ +#include +#include +#include + +namespace mlibc +{ + int sys_futex_tid() + { + MLIBC_UNIMPLEMENTED(); + return -1; + } + + int sys_futex_wait(int * /* pointer */, int /* expected */, const struct timespec * /* time */) + { + MLIBC_UNIMPLEMENTED(); + return -1; + } + + int sys_futex_wake(int * /* pointer */) + { + MLIBC_UNIMPLEMENTED(); + return -1; + } + + [[noreturn]] void sys_exit(int status) + { + __do_syscall1(EXIT, status); + __builtin_unreachable(); + } + + int sys_tcb_set(void * /* pointer */) + { + MLIBC_UNIMPLEMENTED(); + return -1; + } +} // namespace mlibc diff --git a/sysdeps/pinceros/generic/memory.cpp b/sysdeps/pinceros/generic/memory.cpp new file mode 100644 index 0000000000..00e68ff4c4 --- /dev/null +++ b/sysdeps/pinceros/generic/memory.cpp @@ -0,0 +1,19 @@ + +#include +#include + +namespace mlibc +{ + + int sys_anon_allocate(size_t size, void **pointer) + { + return sys_vm_map(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, + -1, 0, pointer); + } + + int sys_anon_free(void *pointer, size_t size) + { + return sys_vm_unmap(pointer, size); + } + +} // namespace mlibc diff --git a/sysdeps/pinceros/generic/pinceros.cpp b/sysdeps/pinceros/generic/pinceros.cpp new file mode 100644 index 0000000000..7f08fa634a --- /dev/null +++ b/sysdeps/pinceros/generic/pinceros.cpp @@ -0,0 +1,29 @@ +#include +#include +#include +#include + +extern "C" +{ + int dup3(int oldfd, int newfd, int flags) + { + if (oldfd == newfd) + { + errno = EINVAL; + return -1; + } + MLIBC_CHECK_OR_ENOSYS(mlibc::sys_dup2, -1); + if (int e = mlibc::sys_dup2(oldfd, flags, newfd); e) + { + errno = e; + return -1; + } + return newfd; + } + + [[noreturn]] void pinceros_shutdown() + { + __do_syscall0(SHUTDOWN); + __builtin_unreachable(); + } +} \ No newline at end of file diff --git a/sysdeps/pinceros/generic/time.cpp b/sysdeps/pinceros/generic/time.cpp new file mode 100644 index 0000000000..4c897ce839 --- /dev/null +++ b/sysdeps/pinceros/generic/time.cpp @@ -0,0 +1,12 @@ +#include +#include + +namespace mlibc +{ + + int sys_clock_get(int /* clock */, time_t * /* secs */, long * /* nanos */) + { + MLIBC_UNIMPLEMENTED(); + return -1; + } +} \ No newline at end of file diff --git a/sysdeps/pinceros/include/aarch64/syscall.h b/sysdeps/pinceros/include/aarch64/syscall.h new file mode 100644 index 0000000000..79855fa387 --- /dev/null +++ b/sysdeps/pinceros/include/aarch64/syscall.h @@ -0,0 +1,143 @@ +#ifndef _SYSCALL_H +#define _SYSCALL_H + +#define SHUTDOWN 1 +#define YIELD 3 +#define SPAWN 5 +#define EXIT 6 +#define CHANNEL 7 +#define SEND 8 +#define RECV 9 +#define PREAD 10 +#define PWRITE 11 +#define CLOSE 12 +#define DUP3 13 +#define PIPE 14 +#define OPENAT 15 +#define EXECVE 16 +#define WAIT 17 +#define MMAP 18 +#define MUNMAP 19 + +#define STR(x) #x + +#define __do_syscall0(sc) \ + ({ \ + register long ret asm("x0"); \ + asm volatile( \ + "svc " STR(sc) \ + : "=r"(ret) \ + : \ + : "memory"); \ + ret; \ + }) + +#define __do_syscall1(sc, arg1) \ + ({ \ + register long arg1_reg asm("x0") = (long)arg1; \ + register long ret asm("x0"); \ + asm volatile( \ + "svc " STR(sc) \ + : "=r"(ret) \ + : "r"(arg1_reg) \ + : "memory"); \ + ret; \ + }) + +#define __do_syscall2(sc, arg1, arg2) \ + ({ \ + long _arg1 = (long)arg1; \ + long _arg2 = (long)arg2; \ + register long arg1_reg asm("x0") = (long)_arg1; \ + register long arg2_reg asm("x1") = (long)_arg2; \ + register long ret asm("x0"); \ + asm volatile( \ + "svc " STR(sc) \ + : "=r"(ret) \ + : "r"(arg1_reg), "r"(arg2_reg) \ + : "memory"); \ + ret; \ + }) + +#define __do_syscall3(sc, arg1, arg2, arg3) \ + ({ \ + long _arg1 = (long)arg1; \ + long _arg2 = (long)arg2; \ + long _arg3 = (long)arg3; \ + register long arg1_reg asm("x0") = (long)_arg1; \ + register long arg2_reg asm("x1") = (long)_arg2; \ + register long arg3_reg asm("x2") = (long)_arg3; \ + register long ret asm("x0"); \ + asm volatile( \ + "svc " STR(sc) \ + : "=r"(ret) \ + : "r"(arg1_reg), "r"(arg2_reg), "r"(arg3_reg) \ + : "memory"); \ + ret; \ + }) + +#define __do_syscall4(sc, arg1, arg2, arg3, arg4) \ + ({ \ + long _arg1 = (long)arg1; \ + long _arg2 = (long)arg2; \ + long _arg3 = (long)arg3; \ + long _arg4 = (long)arg4; \ + register long arg1_reg asm("x0") = (long)_arg1; \ + register long arg2_reg asm("x1") = (long)_arg2; \ + register long arg3_reg asm("x2") = (long)_arg3; \ + register long arg4_reg asm("x3") = (long)_arg4; \ + register long ret asm("x0"); \ + asm volatile( \ + "svc " STR(sc) \ + : "=r"(ret) \ + : "r"(arg1_reg), "r"(arg2_reg), "r"(arg3_reg), "r"(arg4_reg) \ + : "memory"); \ + ret; \ + }) + +#define __do_syscall5(sc, arg1, arg2, arg3, arg4, arg5) \ + ({ \ + long _arg1 = (long)arg1; \ + long _arg2 = (long)arg2; \ + long _arg3 = (long)arg3; \ + long _arg4 = (long)arg4; \ + long _arg5 = (long)arg5; \ + register long arg1_reg asm("x0") = (long)_arg1; \ + register long arg2_reg asm("x1") = (long)_arg2; \ + register long arg3_reg asm("x2") = (long)_arg3; \ + register long arg4_reg asm("x3") = (long)_arg4; \ + register long arg5_reg asm("x4") = (long)_arg5; \ + register long ret asm("x0"); \ + asm volatile( \ + "svc " STR(sc) \ + : "=r"(ret) \ + : "r"(arg1_reg), "r"(arg2_reg), "r"(arg3_reg), "r"(arg4_reg), "r"(arg5_reg) \ + : "memory"); \ + ret; \ + }) + +#define __do_syscall6(sc, arg1, arg2, arg3, arg4, arg5, arg6) \ + ({ \ + long _arg1 = (long)arg1; \ + long _arg2 = (long)arg2; \ + long _arg3 = (long)arg3; \ + long _arg4 = (long)arg4; \ + long _arg5 = (long)arg5; \ + long _arg6 = (long)arg6; \ + register long arg1_reg asm("x0") = (long)_arg1; \ + register long arg2_reg asm("x1") = (long)_arg2; \ + register long arg3_reg asm("x2") = (long)_arg3; \ + register long arg4_reg asm("x3") = (long)_arg4; \ + register long arg5_reg asm("x4") = (long)_arg5; \ + register long arg6_reg asm("x5") = (long)_arg6; \ + register long ret asm("x0"); \ + asm volatile( \ + "svc " STR(sc) \ + : "=r"(ret) \ + : "r"(arg1_reg), "r"(arg2_reg), "r"(arg3_reg), "r"(arg4_reg), "r"(arg5_reg), \ + "r"(arg6_reg) \ + : "memory"); \ + ret; \ + }) + +#endif \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/access.h b/sysdeps/pinceros/include/abi-bits/access.h new file mode 120000 index 0000000000..ebaa88ac31 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/access.h @@ -0,0 +1 @@ +../../../../abis/pinceros/access.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/auxv.h b/sysdeps/pinceros/include/abi-bits/auxv.h new file mode 120000 index 0000000000..e96d8af7d0 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/auxv.h @@ -0,0 +1 @@ +../../../../abis/pinceros/auxv.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/blkcnt_t.h b/sysdeps/pinceros/include/abi-bits/blkcnt_t.h new file mode 120000 index 0000000000..9831fd4039 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/blkcnt_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/blkcnt_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/blksize_t.h b/sysdeps/pinceros/include/abi-bits/blksize_t.h new file mode 120000 index 0000000000..9fbc874a60 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/blksize_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/blksize_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/clockid_t.h b/sysdeps/pinceros/include/abi-bits/clockid_t.h new file mode 120000 index 0000000000..0f5235a70f --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/clockid_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/clockid_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/dev_t.h b/sysdeps/pinceros/include/abi-bits/dev_t.h new file mode 120000 index 0000000000..e4483f8c36 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/dev_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/dev_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/epoll.h b/sysdeps/pinceros/include/abi-bits/epoll.h new file mode 120000 index 0000000000..3e36035253 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/epoll.h @@ -0,0 +1 @@ +../../../../abis/pinceros/epoll.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/errno.h b/sysdeps/pinceros/include/abi-bits/errno.h new file mode 120000 index 0000000000..36f03d13e6 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/errno.h @@ -0,0 +1 @@ +../../../../abis/pinceros/errno.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/fcntl.h b/sysdeps/pinceros/include/abi-bits/fcntl.h new file mode 120000 index 0000000000..40d448ca90 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/fcntl.h @@ -0,0 +1 @@ +../../../../abis/pinceros/fcntl.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/fsblkcnt_t.h b/sysdeps/pinceros/include/abi-bits/fsblkcnt_t.h new file mode 120000 index 0000000000..d046ab6d4a --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/fsblkcnt_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/fsblkcnt_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/fsfilcnt_t.h b/sysdeps/pinceros/include/abi-bits/fsfilcnt_t.h new file mode 120000 index 0000000000..8601b40ec8 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/fsfilcnt_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/fsfilcnt_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/gid_t.h b/sysdeps/pinceros/include/abi-bits/gid_t.h new file mode 120000 index 0000000000..1b5b5a6f19 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/gid_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/gid_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/in.h b/sysdeps/pinceros/include/abi-bits/in.h new file mode 120000 index 0000000000..856ed36ecc --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/in.h @@ -0,0 +1 @@ +../../../../abis/pinceros/in.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/ino_t.h b/sysdeps/pinceros/include/abi-bits/ino_t.h new file mode 120000 index 0000000000..30427c50f0 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/ino_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/ino_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/inotify.h b/sysdeps/pinceros/include/abi-bits/inotify.h new file mode 120000 index 0000000000..13fd0db836 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/inotify.h @@ -0,0 +1 @@ +../../../../abis/pinceros/inotify.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/ioctls.h b/sysdeps/pinceros/include/abi-bits/ioctls.h new file mode 120000 index 0000000000..3b713f66f3 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/ioctls.h @@ -0,0 +1 @@ +../../../../abis/pinceros/ioctls.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/limits.h b/sysdeps/pinceros/include/abi-bits/limits.h new file mode 120000 index 0000000000..d495a755d0 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/limits.h @@ -0,0 +1 @@ +../../../../abis/pinceros/limits.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/mode_t.h b/sysdeps/pinceros/include/abi-bits/mode_t.h new file mode 120000 index 0000000000..4d7b2e755c --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/mode_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/mode_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/mqueue.h b/sysdeps/pinceros/include/abi-bits/mqueue.h new file mode 120000 index 0000000000..6ac68b21b4 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/mqueue.h @@ -0,0 +1 @@ +../../../../abis/pinceros/mqueue.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/msg.h b/sysdeps/pinceros/include/abi-bits/msg.h new file mode 120000 index 0000000000..ed774d11a8 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/msg.h @@ -0,0 +1 @@ +../../../../abis/pinceros/msg.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/nlink_t.h b/sysdeps/pinceros/include/abi-bits/nlink_t.h new file mode 120000 index 0000000000..fc1cc0891b --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/nlink_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/nlink_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/packet.h b/sysdeps/pinceros/include/abi-bits/packet.h new file mode 120000 index 0000000000..5e48c08599 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/packet.h @@ -0,0 +1 @@ +../../../../abis/pinceros/packet.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/pid_t.h b/sysdeps/pinceros/include/abi-bits/pid_t.h new file mode 120000 index 0000000000..1e68cafd67 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/pid_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/pid_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/poll.h b/sysdeps/pinceros/include/abi-bits/poll.h new file mode 120000 index 0000000000..96b039c6f1 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/poll.h @@ -0,0 +1 @@ +../../../../abis/pinceros/poll.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/ptrace.h b/sysdeps/pinceros/include/abi-bits/ptrace.h new file mode 120000 index 0000000000..e00cc66810 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/ptrace.h @@ -0,0 +1 @@ +../../../../abis/pinceros/ptrace.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/reboot.h b/sysdeps/pinceros/include/abi-bits/reboot.h new file mode 120000 index 0000000000..e080b34255 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/reboot.h @@ -0,0 +1 @@ +../../../../abis/pinceros/reboot.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/resource.h b/sysdeps/pinceros/include/abi-bits/resource.h new file mode 120000 index 0000000000..f351955a3d --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/resource.h @@ -0,0 +1 @@ +../../../../abis/pinceros/resource.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/seek-whence.h b/sysdeps/pinceros/include/abi-bits/seek-whence.h new file mode 120000 index 0000000000..e0fec1fe86 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/seek-whence.h @@ -0,0 +1 @@ +../../../../abis/pinceros/seek-whence.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/shm.h b/sysdeps/pinceros/include/abi-bits/shm.h new file mode 120000 index 0000000000..bc6b8e8b4f --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/shm.h @@ -0,0 +1 @@ +../../../../abis/pinceros/shm.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/signal.h b/sysdeps/pinceros/include/abi-bits/signal.h new file mode 120000 index 0000000000..0a19c376f3 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/signal.h @@ -0,0 +1 @@ +../../../../abis/pinceros/signal.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/socket.h b/sysdeps/pinceros/include/abi-bits/socket.h new file mode 120000 index 0000000000..53e7869ed4 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/socket.h @@ -0,0 +1 @@ +../../../../abis/pinceros/socket.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/socklen_t.h b/sysdeps/pinceros/include/abi-bits/socklen_t.h new file mode 120000 index 0000000000..99001b6d97 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/socklen_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/socklen_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/stat.h b/sysdeps/pinceros/include/abi-bits/stat.h new file mode 120000 index 0000000000..739e7c730f --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/stat.h @@ -0,0 +1 @@ +../../../../abis/pinceros/stat.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/statfs.h b/sysdeps/pinceros/include/abi-bits/statfs.h new file mode 120000 index 0000000000..62bc31a3be --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/statfs.h @@ -0,0 +1 @@ +../../../../abis/pinceros/statfs.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/statvfs.h b/sysdeps/pinceros/include/abi-bits/statvfs.h new file mode 120000 index 0000000000..ce74b58dbd --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/statvfs.h @@ -0,0 +1 @@ +../../../../abis/pinceros/statvfs.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/statx.h b/sysdeps/pinceros/include/abi-bits/statx.h new file mode 120000 index 0000000000..c535489ac8 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/statx.h @@ -0,0 +1 @@ +../../../../abis/pinceros/statx.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/suseconds_t.h b/sysdeps/pinceros/include/abi-bits/suseconds_t.h new file mode 120000 index 0000000000..d3cb448b70 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/suseconds_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/suseconds_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/termios.h b/sysdeps/pinceros/include/abi-bits/termios.h new file mode 120000 index 0000000000..b393ff4416 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/termios.h @@ -0,0 +1 @@ +../../../../abis/pinceros/termios.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/time.h b/sysdeps/pinceros/include/abi-bits/time.h new file mode 120000 index 0000000000..650d18f3eb --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/time.h @@ -0,0 +1 @@ +../../../../abis/pinceros/time.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/uid_t.h b/sysdeps/pinceros/include/abi-bits/uid_t.h new file mode 120000 index 0000000000..ca64890b32 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/uid_t.h @@ -0,0 +1 @@ +../../../../abis/pinceros/uid_t.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/utsname.h b/sysdeps/pinceros/include/abi-bits/utsname.h new file mode 120000 index 0000000000..48966d3001 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/utsname.h @@ -0,0 +1 @@ +../../../../abis/pinceros/utsname.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/vm-flags.h b/sysdeps/pinceros/include/abi-bits/vm-flags.h new file mode 120000 index 0000000000..ee5a3a7925 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/vm-flags.h @@ -0,0 +1 @@ +../../../../abis/pinceros/vm-flags.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/vt.h b/sysdeps/pinceros/include/abi-bits/vt.h new file mode 120000 index 0000000000..232089e178 --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/vt.h @@ -0,0 +1 @@ +../../../../abis/pinceros/vt.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/wait.h b/sysdeps/pinceros/include/abi-bits/wait.h new file mode 120000 index 0000000000..2f1fd2d90a --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/wait.h @@ -0,0 +1 @@ +../../../../abis/pinceros/wait.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/abi-bits/xattr.h b/sysdeps/pinceros/include/abi-bits/xattr.h new file mode 120000 index 0000000000..fa2b56cfca --- /dev/null +++ b/sysdeps/pinceros/include/abi-bits/xattr.h @@ -0,0 +1 @@ +../../../../abis/pinceros/xattr.h \ No newline at end of file diff --git a/sysdeps/pinceros/include/sys/pinceros.h b/sysdeps/pinceros/include/sys/pinceros.h new file mode 100644 index 0000000000..7952a3c188 --- /dev/null +++ b/sysdeps/pinceros/include/sys/pinceros.h @@ -0,0 +1 @@ +void pinceros_shutdown(); diff --git a/sysdeps/pinceros/meson.build b/sysdeps/pinceros/meson.build new file mode 100644 index 0000000000..07307d30f3 --- /dev/null +++ b/sysdeps/pinceros/meson.build @@ -0,0 +1,100 @@ +rtld_dso_sources += files( + 'generic/ensure.cpp', + 'generic/file.cpp', + 'generic/fork-exec.cpp', + 'generic/memory.cpp', +) + +libc_sources += files( + 'generic/ensure.cpp', + 'generic/entry.cpp', + 'generic/file.cpp', + 'generic/fork-exec.cpp', + 'generic/memory.cpp', + 'generic/time.cpp', + 'generic/pinceros.cpp', +) + +if not no_headers + install_headers( + 'include/abi-bits/auxv.h', + 'include/abi-bits/seek-whence.h', + 'include/abi-bits/vm-flags.h', + 'include/abi-bits/errno.h', + 'include/abi-bits/fcntl.h', + 'include/abi-bits/in.h', + 'include/abi-bits/stat.h', + 'include/abi-bits/statx.h', + 'include/abi-bits/signal.h', + 'include/abi-bits/reboot.h', + 'include/abi-bits/resource.h', + 'include/abi-bits/socket.h', + 'include/abi-bits/termios.h', + 'include/abi-bits/time.h', + 'include/abi-bits/blkcnt_t.h', + 'include/abi-bits/blksize_t.h', + 'include/abi-bits/dev_t.h', + 'include/abi-bits/gid_t.h', + 'include/abi-bits/ino_t.h', + 'include/abi-bits/mode_t.h', + 'include/abi-bits/nlink_t.h', + 'include/abi-bits/pid_t.h', + 'include/abi-bits/uid_t.h', + 'include/abi-bits/access.h', + 'include/abi-bits/wait.h', + 'include/abi-bits/limits.h', + 'include/abi-bits/utsname.h', + 'include/abi-bits/ptrace.h', + 'include/abi-bits/vt.h', + 'include/abi-bits/ptrace.h', + 'include/abi-bits/poll.h', + 'include/abi-bits/epoll.h', + 'include/abi-bits/packet.h', + 'include/abi-bits/inotify.h', + 'include/abi-bits/clockid_t.h', + 'include/abi-bits/shm.h', + 'include/abi-bits/mqueue.h', + 'include/abi-bits/suseconds_t.h', + 'include/abi-bits/fsfilcnt_t.h', + 'include/abi-bits/fsblkcnt_t.h', + 'include/abi-bits/socklen_t.h', + 'include/abi-bits/statfs.h', + 'include/abi-bits/statvfs.h', + 'include/abi-bits/ioctls.h', + 'include/abi-bits/xattr.h', + 'include/abi-bits/msg.h', + subdir: 'abi-bits', + follow_symlinks: true, + ) + + install_headers( + 'include/' + host_machine.cpu_family() + '/syscall.h', + 'include/sys/pinceros.h', + subdir: 'sys', + ) +endif + +if library_type in ['static', 'both'] + libc_sources += files('aarch64/dso_handle.S') +endif + +if not headers_only + crtstuff = ['crt0'] + if host_machine.cpu_family() in ['x86_64', 'aarch64'] + crtstuff += ['Scrt1', 'crti', 'crtn'] + endif + foreach crtthing : crtstuff + crtf = crtthing + '.S' + crt_src = files(host_machine.cpu_family() / 'crt-src' / crtf) + crt = custom_target( + crtthing, + build_by_default: true, + command: c_compiler.cmd_array() + ['-c', '-o', '@OUTPUT@', '@INPUT@'], + input: crt_src, + output: crtthing + '.o', + install: true, + install_dir: get_option('libdir'), + ) + endforeach + +endif \ No newline at end of file diff --git a/test.c b/test.c new file mode 100644 index 0000000000..84a5b06183 --- /dev/null +++ b/test.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + const char *header = "argv: "; + ssize_t header_written = 0; + ssize_t header_len = strlen(header); + while (header_written < header_len) + { + ssize_t bytes_written = pwrite(1, header + header_written, header_len - header_written, 0); + if (bytes_written < 0) + { + exit(1); + } + header_written += bytes_written; + } + + ssize_t arg_written = 0; + ssize_t arg_len = strlen(argv[0]); + while (arg_written < arg_len) + { + ssize_t bytes_written = pwrite(1, argv[0] + arg_written, arg_len - arg_written, 0); + if (bytes_written < 0) + { + exit(1); + } + arg_written += bytes_written; + } + pwrite(1, "\n", 1, 0); + + const char *footer = "argc is exit code\n"; + ssize_t footer_written = 0; + ssize_t footer_len = strlen(footer); + while (footer_written < footer_len) + { + ssize_t bytes_written = pwrite(1, footer + footer_written, footer_len - footer_written, 0); + if (bytes_written < 0) + { + exit(1); + } + footer_written += bytes_written; + } + + exit(argc); + + int fd = openat(3, "test.txt", 0, 0, NULL); + + char buf[100]; + ssize_t nbytes = pread(fd, buf, sizeof(buf), 0); + ssize_t total_written = 0; + while (total_written < nbytes) + { + ssize_t bytes_written = pwrite(1, buf + total_written, nbytes - total_written, 0); + if (bytes_written < 0) + { + exit(1); + } + total_written += bytes_written; + } + close(fd); + + char *mapping = mmap(NULL, 4096, 0, 1 << 1, -1, 0); + mapping[0] = 'A'; + munmap(mapping, 4096); + + // I don't think file backed mappings are 100% functional right now, but let's at least check that I can map and unmap + int fd2 = openat(3, "test2.txt", 0, 0, NULL); + char *mapped_file = mmap(NULL, 4096, 0, 1 << 1, fd2, 0); + munmap(mapped_file, 4096); + close(fd2); + + int fd3 = openat(3, "test.txt", 0, 0, NULL); + int fd4 = dup3(fd3, fd3 + 1, 0); + if (fd4 != fd3 + 1) { + exit(1); + } + int fd5 = dup2(fd3, fd3 + 2); + if (fd5 != fd3 + 2) { + exit(1); + } + close(fd3); + close(fd4); + close(fd5); + + exit(0); +} \ No newline at end of file