123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 |
- //===-- sanitizer_platform_limits_solaris.h -------------------------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file is a part of Sanitizer common code.
- //
- // Sizes and layouts of platform-specific Solaris data structures.
- //===----------------------------------------------------------------------===//
- #ifndef SANITIZER_PLATFORM_LIMITS_SOLARIS_H
- #define SANITIZER_PLATFORM_LIMITS_SOLARIS_H
- #if SANITIZER_SOLARIS
- #include "sanitizer_internal_defs.h"
- #include "sanitizer_platform.h"
- namespace __sanitizer {
- extern unsigned struct_utsname_sz;
- extern unsigned struct_stat_sz;
- extern unsigned struct_stat64_sz;
- extern unsigned struct_rusage_sz;
- extern unsigned siginfo_t_sz;
- extern unsigned struct_itimerval_sz;
- extern unsigned pthread_t_sz;
- extern unsigned pthread_mutex_t_sz;
- extern unsigned pthread_cond_t_sz;
- extern unsigned pid_t_sz;
- extern unsigned timeval_sz;
- extern unsigned uid_t_sz;
- extern unsigned gid_t_sz;
- extern unsigned mbstate_t_sz;
- extern unsigned struct_timezone_sz;
- extern unsigned struct_tms_sz;
- extern unsigned struct_itimerspec_sz;
- extern unsigned struct_sigevent_sz;
- extern unsigned struct_stack_t_sz;
- extern unsigned struct_sched_param_sz;
- extern unsigned struct_statfs64_sz;
- extern unsigned struct_statfs_sz;
- extern unsigned struct_sockaddr_sz;
- extern unsigned ucontext_t_sz;
- extern unsigned struct_timespec_sz;
- extern unsigned struct_rlimit_sz;
- extern unsigned struct_utimbuf_sz;
- struct __sanitizer_sem_t {
- //u64 data[6];
- u32 sem_count;
- u16 sem_type;
- u16 sem_magic;
- u64 sem_pad1[3];
- u64 sem_pad2[2];
- };
- struct __sanitizer_ipc_perm {
- unsigned int uid; // uid_t
- unsigned int gid; // gid_t
- unsigned int cuid; // uid_t
- unsigned int cgid; // gid_t
- unsigned int mode; // mode_t
- unsigned int seq; // uint_t
- int key; // key_t
- #if !defined(_LP64)
- int pad[4];
- #endif
- };
- struct __sanitizer_shmid_ds {
- __sanitizer_ipc_perm shm_perm;
- unsigned long shm_segsz; // size_t
- unsigned long shm_flags; // uintptr_t
- unsigned short shm_lkcnt; // ushort_t
- int shm_lpid; // pid_t
- int shm_cpid; // pid_t
- unsigned long shm_nattch; // shmatt_t
- unsigned long shm_cnattch; // ulong_t
- #if defined(_LP64)
- long shm_atime; // time_t
- long shm_dtime;
- long shm_ctime;
- void *shm_amp;
- u64 shm_gransize; // uint64_t
- u64 shm_allocated; // uint64_t
- u64 shm_pad4[1]; // int64_t
- #else
- long shm_atime; // time_t
- int shm_pad1; // int32_t
- long shm_dtime; // time_t
- int shm_pad2; // int32_t
- long shm_ctime; // time_t
- void *shm_amp;
- u64 shm_gransize; // uint64_t
- u64 shm_allocated; // uint64_t
- #endif
- };
- extern unsigned struct_statvfs_sz;
- #if SANITIZER_SOLARIS32
- extern unsigned struct_statvfs64_sz;
- #endif
- struct __sanitizer_iovec {
- void *iov_base;
- uptr iov_len;
- };
- struct __sanitizer_ifaddrs {
- struct __sanitizer_ifaddrs *ifa_next;
- char *ifa_name;
- u64 ifa_flags; // uint64_t
- void *ifa_addr; // (struct sockaddr *)
- void *ifa_netmask; // (struct sockaddr *)
- // This is a union on Linux.
- # ifdef ifa_dstaddr
- # undef ifa_dstaddr
- # endif
- void *ifa_dstaddr; // (struct sockaddr *)
- void *ifa_data;
- };
- typedef unsigned __sanitizer_pthread_key_t;
- struct __sanitizer_XDR {
- int x_op;
- void *x_ops;
- uptr x_public;
- uptr x_private;
- uptr x_base;
- unsigned x_handy;
- };
- const int __sanitizer_XDR_ENCODE = 0;
- const int __sanitizer_XDR_DECODE = 1;
- const int __sanitizer_XDR_FREE = 2;
- struct __sanitizer_passwd {
- char *pw_name;
- char *pw_passwd;
- unsigned int pw_uid; // uid_t
- unsigned int pw_gid; // gid_t
- char *pw_age;
- char *pw_comment;
- char *pw_gecos;
- char *pw_dir;
- char *pw_shell;
- };
- struct __sanitizer_group {
- char *gr_name;
- char *gr_passwd;
- int gr_gid;
- char **gr_mem;
- };
- typedef long __sanitizer_time_t;
- typedef long __sanitizer_suseconds_t;
- struct __sanitizer_timeval {
- __sanitizer_time_t tv_sec;
- __sanitizer_suseconds_t tv_usec;
- };
- struct __sanitizer_itimerval {
- struct __sanitizer_timeval it_interval;
- struct __sanitizer_timeval it_value;
- };
- struct __sanitizer_timeb {
- __sanitizer_time_t time;
- unsigned short millitm;
- short timezone;
- short dstflag;
- };
- struct __sanitizer_ether_addr {
- u8 octet[6];
- };
- struct __sanitizer_tm {
- int tm_sec;
- int tm_min;
- int tm_hour;
- int tm_mday;
- int tm_mon;
- int tm_year;
- int tm_wday;
- int tm_yday;
- int tm_isdst;
- };
- struct __sanitizer_msghdr {
- void *msg_name;
- unsigned msg_namelen;
- struct __sanitizer_iovec *msg_iov;
- unsigned msg_iovlen;
- void *msg_control;
- unsigned msg_controllen;
- int msg_flags;
- };
- struct __sanitizer_cmsghdr {
- unsigned cmsg_len;
- int cmsg_level;
- int cmsg_type;
- };
- #if SANITIZER_SOLARIS && (defined(_LP64) || _FILE_OFFSET_BITS == 64)
- struct __sanitizer_dirent {
- unsigned long long d_ino;
- long long d_off;
- unsigned short d_reclen;
- // more fields that we don't care about
- };
- #else
- struct __sanitizer_dirent {
- unsigned long d_ino;
- long d_off;
- unsigned short d_reclen;
- // more fields that we don't care about
- };
- #endif
- struct __sanitizer_dirent64 {
- unsigned long long d_ino;
- unsigned long long d_off;
- unsigned short d_reclen;
- // more fields that we don't care about
- };
- typedef long __sanitizer_clock_t;
- typedef int __sanitizer_clockid_t;
- // This thing depends on the platform. We are only interested in the upper
- // limit. Verified with a compiler assert in .cpp.
- union __sanitizer_pthread_attr_t {
- char size[128];
- void *align;
- };
- struct __sanitizer_sigset_t {
- // uint32_t * 4
- unsigned int __bits[4];
- };
- struct __sanitizer_siginfo {
- // The size is determined by looking at sizeof of real siginfo_t on linux.
- u64 opaque[128 / sizeof(u64)];
- };
- using __sanitizer_sighandler_ptr = void (*)(int sig);
- using __sanitizer_sigactionhandler_ptr =
- void (*)(int sig, __sanitizer_siginfo *siginfo, void *uctx);
- struct __sanitizer_sigaction {
- int sa_flags;
- union {
- __sanitizer_sigactionhandler_ptr sigaction;
- __sanitizer_sighandler_ptr handler;
- };
- __sanitizer_sigset_t sa_mask;
- #if !defined(_LP64)
- int sa_resv[2];
- #endif
- };
- struct __sanitizer_kernel_sigset_t {
- u8 sig[8];
- };
- struct __sanitizer_kernel_sigaction_t {
- union {
- void (*handler)(int signo);
- void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx);
- };
- unsigned long sa_flags;
- void (*sa_restorer)(void);
- __sanitizer_kernel_sigset_t sa_mask;
- };
- extern const uptr sig_ign;
- extern const uptr sig_dfl;
- extern const uptr sig_err;
- extern const uptr sa_siginfo;
- extern int af_inet;
- extern int af_inet6;
- uptr __sanitizer_in_addr_sz(int af);
- struct __sanitizer_dl_phdr_info {
- uptr dlpi_addr;
- const char *dlpi_name;
- const void *dlpi_phdr;
- short dlpi_phnum;
- };
- extern unsigned struct_ElfW_Phdr_sz;
- struct __sanitizer_addrinfo {
- int ai_flags;
- int ai_family;
- int ai_socktype;
- int ai_protocol;
- #if defined(__sparcv9)
- int _ai_pad;
- #endif
- unsigned ai_addrlen;
- char *ai_canonname;
- void *ai_addr;
- struct __sanitizer_addrinfo *ai_next;
- };
- struct __sanitizer_hostent {
- char *h_name;
- char **h_aliases;
- int h_addrtype;
- int h_length;
- char **h_addr_list;
- };
- struct __sanitizer_pollfd {
- int fd;
- short events;
- short revents;
- };
- typedef unsigned long __sanitizer_nfds_t;
- struct __sanitizer_glob_t {
- uptr gl_pathc;
- char **gl_pathv;
- uptr gl_offs;
- char **gl_pathp;
- int gl_pathn;
- };
- extern int glob_nomatch;
- extern int glob_altdirfunc;
- extern const int wordexp_wrde_dooffs;
- extern unsigned path_max;
- struct __sanitizer_wordexp_t {
- uptr we_wordc;
- char **we_wordv;
- uptr we_offs;
- char **we_wordp;
- int we_wordn;
- };
- typedef void __sanitizer_FILE;
- #define SANITIZER_HAS_STRUCT_FILE 0
- // This simplifies generic code
- #define struct_shminfo_sz -1
- #define struct_shm_info_sz -1
- #define shmctl_shm_stat -1
- #define shmctl_ipc_info -1
- #define shmctl_shm_info -1
- extern int shmctl_ipc_stat;
- extern unsigned struct_utmp_sz;
- extern unsigned struct_utmpx_sz;
- extern int map_fixed;
- // ioctl arguments
- struct __sanitizer_ifconf {
- int ifc_len;
- union {
- void *ifcu_req;
- } ifc_ifcu;
- };
- // <sys/ioccom.h>
- #define IOC_NRBITS 8
- #define IOC_TYPEBITS 8
- #define IOC_SIZEBITS 12
- #define IOC_DIRBITS 4
- #undef IOC_NONE
- #define IOC_NONE 2U // IOC_VOID
- #define IOC_READ 4U // IOC_OUT
- #define IOC_WRITE 8U // IOC_IN
- #define IOC_NRMASK ((1 << IOC_NRBITS) - 1)
- #define IOC_TYPEMASK ((1 << IOC_TYPEBITS) - 1)
- #define IOC_SIZEMASK ((1 << IOC_SIZEBITS) - 1)
- #define IOC_DIRMASK ((1 << IOC_DIRBITS) - 1)
- #define IOC_NRSHIFT 0
- #define IOC_TYPESHIFT (IOC_NRSHIFT + IOC_NRBITS)
- #define IOC_SIZESHIFT (IOC_TYPESHIFT + IOC_TYPEBITS)
- #define IOC_DIRSHIFT (IOC_SIZESHIFT + IOC_SIZEBITS)
- #define IOC_DIR(nr) (((nr) >> IOC_DIRSHIFT) & IOC_DIRMASK)
- #define IOC_TYPE(nr) (((nr) >> IOC_TYPESHIFT) & IOC_TYPEMASK)
- #define IOC_NR(nr) (((nr) >> IOC_NRSHIFT) & IOC_NRMASK)
- #if defined(__sparc__)
- // In sparc the 14 bits SIZE field overlaps with the
- // least significant bit of DIR, so either IOC_READ or
- // IOC_WRITE shall be 1 in order to get a non-zero SIZE.
- #define IOC_SIZE(nr) \
- ((((((nr) >> 29) & 0x7) & (4U | 2U)) == 0) ? 0 : (((nr) >> 16) & 0x3fff))
- #else
- #define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK)
- #endif
- extern unsigned struct_ifreq_sz;
- extern unsigned struct_termios_sz;
- extern unsigned struct_winsize_sz;
- extern unsigned struct_sioc_sg_req_sz;
- extern unsigned struct_sioc_vif_req_sz;
- // ioctl request identifiers
- // A special value to mark ioctls that are not present on the target platform,
- // when it can not be determined without including any system headers.
- extern const unsigned IOCTL_NOT_PRESENT;
- extern unsigned IOCTL_FIOASYNC;
- extern unsigned IOCTL_FIOCLEX;
- extern unsigned IOCTL_FIOGETOWN;
- extern unsigned IOCTL_FIONBIO;
- extern unsigned IOCTL_FIONCLEX;
- extern unsigned IOCTL_FIOSETOWN;
- extern unsigned IOCTL_SIOCADDMULTI;
- extern unsigned IOCTL_SIOCATMARK;
- extern unsigned IOCTL_SIOCDELMULTI;
- extern unsigned IOCTL_SIOCGIFADDR;
- extern unsigned IOCTL_SIOCGIFBRDADDR;
- extern unsigned IOCTL_SIOCGIFCONF;
- extern unsigned IOCTL_SIOCGIFDSTADDR;
- extern unsigned IOCTL_SIOCGIFFLAGS;
- extern unsigned IOCTL_SIOCGIFMETRIC;
- extern unsigned IOCTL_SIOCGIFMTU;
- extern unsigned IOCTL_SIOCGIFNETMASK;
- extern unsigned IOCTL_SIOCGPGRP;
- extern unsigned IOCTL_SIOCSIFADDR;
- extern unsigned IOCTL_SIOCSIFBRDADDR;
- extern unsigned IOCTL_SIOCSIFDSTADDR;
- extern unsigned IOCTL_SIOCSIFFLAGS;
- extern unsigned IOCTL_SIOCSIFMETRIC;
- extern unsigned IOCTL_SIOCSIFMTU;
- extern unsigned IOCTL_SIOCSIFNETMASK;
- extern unsigned IOCTL_SIOCSPGRP;
- extern unsigned IOCTL_TIOCEXCL;
- extern unsigned IOCTL_TIOCGETD;
- extern unsigned IOCTL_TIOCGPGRP;
- extern unsigned IOCTL_TIOCGWINSZ;
- extern unsigned IOCTL_TIOCMBIC;
- extern unsigned IOCTL_TIOCMBIS;
- extern unsigned IOCTL_TIOCMGET;
- extern unsigned IOCTL_TIOCMSET;
- extern unsigned IOCTL_TIOCNOTTY;
- extern unsigned IOCTL_TIOCNXCL;
- extern unsigned IOCTL_TIOCOUTQ;
- extern unsigned IOCTL_TIOCPKT;
- extern unsigned IOCTL_TIOCSCTTY;
- extern unsigned IOCTL_TIOCSETD;
- extern unsigned IOCTL_TIOCSPGRP;
- extern unsigned IOCTL_TIOCSTI;
- extern unsigned IOCTL_TIOCSWINSZ;
- extern unsigned IOCTL_MTIOCGET;
- extern unsigned IOCTL_MTIOCTOP;
- extern const int si_SEGV_MAPERR;
- extern const int si_SEGV_ACCERR;
- } // namespace __sanitizer
- #define CHECK_TYPE_SIZE(TYPE) \
- COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE))
- #define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER) \
- COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *) NULL)->MEMBER) == \
- sizeof(((CLASS *) NULL)->MEMBER)); \
- COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) == \
- offsetof(CLASS, MEMBER))
- // For sigaction, which is a function and struct at the same time,
- // and thus requires explicit "struct" in sizeof() expression.
- #define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER) \
- COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *) NULL)->MEMBER) == \
- sizeof(((struct CLASS *) NULL)->MEMBER)); \
- COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) == \
- offsetof(struct CLASS, MEMBER))
- #endif // SANITIZER_SOLARIS
- #endif
|