(root)/
gcc-13.2.0/
libsanitizer/
sanitizer_common/
sanitizer_platform_limits_solaris.h
       1  //===-- sanitizer_platform_limits_solaris.h -------------------------------===//
       2  //
       3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
       4  // See https://llvm.org/LICENSE.txt for license information.
       5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
       6  //
       7  //===----------------------------------------------------------------------===//
       8  //
       9  // This file is a part of Sanitizer common code.
      10  //
      11  // Sizes and layouts of platform-specific Solaris data structures.
      12  //===----------------------------------------------------------------------===//
      13  
      14  #ifndef SANITIZER_PLATFORM_LIMITS_SOLARIS_H
      15  #define SANITIZER_PLATFORM_LIMITS_SOLARIS_H
      16  
      17  #if SANITIZER_SOLARIS
      18  
      19  #include "sanitizer_internal_defs.h"
      20  #include "sanitizer_platform.h"
      21  
      22  namespace __sanitizer {
      23  extern unsigned struct_utsname_sz;
      24  extern unsigned struct_stat_sz;
      25  extern unsigned struct_stat64_sz;
      26  extern unsigned struct_rusage_sz;
      27  extern unsigned siginfo_t_sz;
      28  extern unsigned struct_itimerval_sz;
      29  extern unsigned pthread_t_sz;
      30  extern unsigned pthread_mutex_t_sz;
      31  extern unsigned pthread_cond_t_sz;
      32  extern unsigned pid_t_sz;
      33  extern unsigned timeval_sz;
      34  extern unsigned uid_t_sz;
      35  extern unsigned gid_t_sz;
      36  extern unsigned mbstate_t_sz;
      37  extern unsigned struct_timezone_sz;
      38  extern unsigned struct_tms_sz;
      39  extern unsigned struct_itimerspec_sz;
      40  extern unsigned struct_sigevent_sz;
      41  extern unsigned struct_stack_t_sz;
      42  extern unsigned struct_sched_param_sz;
      43  extern unsigned struct_statfs64_sz;
      44  extern unsigned struct_statfs_sz;
      45  extern unsigned struct_sockaddr_sz;
      46  unsigned ucontext_t_sz(void *ctx);
      47  
      48  extern unsigned struct_timespec_sz;
      49  extern unsigned struct_rlimit_sz;
      50  extern unsigned struct_utimbuf_sz;
      51  
      52  struct __sanitizer_sem_t {
      53    //u64 data[6];
      54    u32 sem_count;
      55    u16 sem_type;
      56    u16 sem_magic;
      57    u64 sem_pad1[3];
      58    u64 sem_pad2[2];
      59  };
      60  
      61  struct __sanitizer_ipc_perm {
      62    unsigned int uid;           // uid_t
      63    unsigned int gid;           // gid_t
      64    unsigned int cuid;          // uid_t
      65    unsigned int cgid;          // gid_t
      66    unsigned int mode;          // mode_t
      67    unsigned int seq;           // uint_t
      68    int key;                    // key_t
      69  #if !defined(_LP64)
      70    int pad[4];
      71  #endif
      72  };
      73  
      74  struct __sanitizer_shmid_ds {
      75    __sanitizer_ipc_perm shm_perm;
      76    unsigned long shm_segsz;    // size_t
      77    unsigned long shm_flags;    // uintptr_t
      78    unsigned short shm_lkcnt;   // ushort_t
      79    int shm_lpid;               // pid_t
      80    int shm_cpid;               // pid_t
      81    unsigned long shm_nattch;   // shmatt_t
      82    unsigned long shm_cnattch;  // ulong_t
      83  #if defined(_LP64)
      84    long shm_atime;             // time_t
      85    long shm_dtime;
      86    long shm_ctime;
      87    void *shm_amp;
      88    u64 shm_gransize;           // uint64_t
      89    u64 shm_allocated;          // uint64_t
      90    u64 shm_pad4[1];            // int64_t
      91  #else
      92    long shm_atime;             // time_t
      93    int shm_pad1;               // int32_t
      94    long shm_dtime;             // time_t
      95    int shm_pad2;               // int32_t
      96    long shm_ctime;             // time_t
      97    void *shm_amp;
      98    u64 shm_gransize;           // uint64_t
      99    u64 shm_allocated;          // uint64_t
     100  #endif
     101  };
     102  
     103  extern unsigned struct_statvfs_sz;
     104  #if SANITIZER_SOLARIS32
     105  extern unsigned struct_statvfs64_sz;
     106  #endif
     107  
     108  struct __sanitizer_iovec {
     109    void *iov_base;
     110    uptr iov_len;
     111  };
     112  
     113  struct __sanitizer_ifaddrs {
     114    struct __sanitizer_ifaddrs *ifa_next;
     115    char *ifa_name;
     116    u64 ifa_flags;     // uint64_t
     117    void *ifa_addr;    // (struct sockaddr *)
     118    void *ifa_netmask; // (struct sockaddr *)
     119    // This is a union on Linux.
     120  # ifdef ifa_dstaddr
     121  # undef ifa_dstaddr
     122  # endif
     123    void *ifa_dstaddr; // (struct sockaddr *)
     124    void *ifa_data;
     125  };
     126  
     127  typedef unsigned __sanitizer_pthread_key_t;
     128  
     129  struct __sanitizer_XDR {
     130    int x_op;
     131    void *x_ops;
     132    uptr x_public;
     133    uptr x_private;
     134    uptr x_base;
     135    unsigned x_handy;
     136  };
     137  
     138  const int __sanitizer_XDR_ENCODE = 0;
     139  const int __sanitizer_XDR_DECODE = 1;
     140  const int __sanitizer_XDR_FREE = 2;
     141  
     142  struct __sanitizer_passwd {
     143    char *pw_name;
     144    char *pw_passwd;
     145    unsigned int pw_uid;    // uid_t
     146    unsigned int pw_gid;    // gid_t
     147    char *pw_age;
     148    char *pw_comment;
     149    char *pw_gecos;
     150    char *pw_dir;
     151    char *pw_shell;
     152  };
     153  
     154  struct __sanitizer_group {
     155    char *gr_name;
     156    char *gr_passwd;
     157    int gr_gid;
     158    char **gr_mem;
     159  };
     160  
     161  typedef long __sanitizer_time_t;
     162  
     163  typedef long __sanitizer_suseconds_t;
     164  
     165  struct __sanitizer_timeval {
     166    __sanitizer_time_t tv_sec;
     167    __sanitizer_suseconds_t tv_usec;
     168  };
     169  
     170  struct __sanitizer_itimerval {
     171    struct __sanitizer_timeval it_interval;
     172    struct __sanitizer_timeval it_value;
     173  };
     174  
     175  struct __sanitizer_timeb {
     176    __sanitizer_time_t time;
     177    unsigned short millitm;
     178    short timezone;
     179    short dstflag;
     180  };
     181  
     182  struct __sanitizer_ether_addr {
     183    u8 octet[6];
     184  };
     185  
     186  struct __sanitizer_tm {
     187    int tm_sec;
     188    int tm_min;
     189    int tm_hour;
     190    int tm_mday;
     191    int tm_mon;
     192    int tm_year;
     193    int tm_wday;
     194    int tm_yday;
     195    int tm_isdst;
     196  };
     197  
     198  struct __sanitizer_msghdr {
     199    void *msg_name;
     200    unsigned msg_namelen;
     201    struct __sanitizer_iovec *msg_iov;
     202    unsigned msg_iovlen;
     203    void *msg_control;
     204    unsigned msg_controllen;
     205    int msg_flags;
     206  };
     207  struct __sanitizer_cmsghdr {
     208    unsigned cmsg_len;
     209    int cmsg_level;
     210    int cmsg_type;
     211  };
     212  
     213  #if SANITIZER_SOLARIS && (defined(_LP64) || _FILE_OFFSET_BITS == 64)
     214  struct __sanitizer_dirent {
     215    unsigned long long d_ino;
     216    long long d_off;
     217    unsigned short d_reclen;
     218    // more fields that we don't care about
     219  };
     220  #else
     221  struct __sanitizer_dirent {
     222    unsigned long d_ino;
     223    long d_off;
     224    unsigned short d_reclen;
     225    // more fields that we don't care about
     226  };
     227  #endif
     228  
     229  struct __sanitizer_dirent64 {
     230    unsigned long long d_ino;
     231    unsigned long long d_off;
     232    unsigned short d_reclen;
     233    // more fields that we don't care about
     234  };
     235  
     236  typedef long __sanitizer_clock_t;
     237  typedef int __sanitizer_clockid_t;
     238  
     239  // This thing depends on the platform. We are only interested in the upper
     240  // limit. Verified with a compiler assert in .cpp.
     241  union __sanitizer_pthread_attr_t {
     242    char size[128];
     243    void *align;
     244  };
     245  
     246  struct __sanitizer_sigset_t {
     247    // uint32_t * 4
     248    unsigned int __bits[4];
     249  };
     250  
     251  struct __sanitizer_siginfo {
     252    // The size is determined by looking at sizeof of real siginfo_t on linux.
     253    u64 opaque[128 / sizeof(u64)];
     254  };
     255  
     256  using __sanitizer_sighandler_ptr = void (*)(int sig);
     257  using __sanitizer_sigactionhandler_ptr =
     258      void (*)(int sig, __sanitizer_siginfo *siginfo, void *uctx);
     259  
     260  struct __sanitizer_sigaction {
     261    int sa_flags;
     262    union {
     263      __sanitizer_sigactionhandler_ptr sigaction;
     264      __sanitizer_sighandler_ptr handler;
     265    };
     266    __sanitizer_sigset_t sa_mask;
     267  #if !defined(_LP64)
     268    int sa_resv[2];
     269  #endif
     270  };
     271  
     272  struct __sanitizer_kernel_sigset_t {
     273    u8 sig[8];
     274  };
     275  
     276  struct __sanitizer_kernel_sigaction_t {
     277    union {
     278      void (*handler)(int signo);
     279      void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx);
     280    };
     281    unsigned long sa_flags;
     282    void (*sa_restorer)(void);
     283    __sanitizer_kernel_sigset_t sa_mask;
     284  };
     285  
     286  extern const uptr sig_ign;
     287  extern const uptr sig_dfl;
     288  extern const uptr sig_err;
     289  extern const uptr sa_siginfo;
     290  
     291  extern int af_inet;
     292  extern int af_inet6;
     293  uptr __sanitizer_in_addr_sz(int af);
     294  
     295  struct __sanitizer_dl_phdr_info {
     296    uptr dlpi_addr;
     297    const char *dlpi_name;
     298    const void *dlpi_phdr;
     299    short dlpi_phnum;
     300  };
     301  
     302  extern unsigned struct_ElfW_Phdr_sz;
     303  
     304  struct __sanitizer_addrinfo {
     305    int ai_flags;
     306    int ai_family;
     307    int ai_socktype;
     308    int ai_protocol;
     309  #if defined(__sparcv9)
     310    int _ai_pad;
     311  #endif
     312    unsigned ai_addrlen;
     313    char *ai_canonname;
     314    void *ai_addr;
     315    struct __sanitizer_addrinfo *ai_next;
     316  };
     317  
     318  struct __sanitizer_hostent {
     319    char *h_name;
     320    char **h_aliases;
     321    int h_addrtype;
     322    int h_length;
     323    char **h_addr_list;
     324  };
     325  
     326  struct __sanitizer_pollfd {
     327    int fd;
     328    short events;
     329    short revents;
     330  };
     331  
     332  typedef unsigned long __sanitizer_nfds_t;
     333  
     334  struct __sanitizer_glob_t {
     335    uptr gl_pathc;
     336    char **gl_pathv;
     337    uptr gl_offs;
     338    char **gl_pathp;
     339    int gl_pathn;
     340  };
     341  
     342  extern int glob_nomatch;
     343  extern int glob_altdirfunc;
     344  extern const int wordexp_wrde_dooffs;
     345  
     346  extern unsigned path_max;
     347  
     348  struct __sanitizer_wordexp_t {
     349    uptr we_wordc;
     350    char **we_wordv;
     351    uptr we_offs;
     352    char **we_wordp;
     353    int we_wordn;
     354  };
     355  
     356  typedef void __sanitizer_FILE;
     357  #define SANITIZER_HAS_STRUCT_FILE 0
     358  
     359  // This simplifies generic code
     360  #define struct_shminfo_sz -1
     361  #define struct_shm_info_sz -1
     362  #define shmctl_shm_stat -1
     363  #define shmctl_ipc_info -1
     364  #define shmctl_shm_info -1
     365  
     366  extern int shmctl_ipc_stat;
     367  
     368  extern unsigned struct_utmp_sz;
     369  extern unsigned struct_utmpx_sz;
     370  
     371  extern int map_fixed;
     372  
     373  // ioctl arguments
     374  struct __sanitizer_ifconf {
     375    int ifc_len;
     376    union {
     377      void *ifcu_req;
     378    } ifc_ifcu;
     379  };
     380  
     381  // <sys/ioccom.h>
     382  #define IOC_NRBITS 8
     383  #define IOC_TYPEBITS 8
     384  #define IOC_SIZEBITS 12
     385  #define IOC_DIRBITS 4
     386  #undef IOC_NONE
     387  #define IOC_NONE 2U     // IOC_VOID
     388  #define IOC_READ 4U     // IOC_OUT
     389  #define IOC_WRITE 8U    // IOC_IN
     390  
     391  #define IOC_NRMASK ((1 << IOC_NRBITS) - 1)
     392  #define IOC_TYPEMASK ((1 << IOC_TYPEBITS) - 1)
     393  #define IOC_SIZEMASK ((1 << IOC_SIZEBITS) - 1)
     394  #define IOC_DIRMASK ((1 << IOC_DIRBITS) - 1)
     395  #define IOC_NRSHIFT 0
     396  #define IOC_TYPESHIFT (IOC_NRSHIFT + IOC_NRBITS)
     397  #define IOC_SIZESHIFT (IOC_TYPESHIFT + IOC_TYPEBITS)
     398  #define IOC_DIRSHIFT (IOC_SIZESHIFT + IOC_SIZEBITS)
     399  
     400  #define IOC_DIR(nr) (((nr) >> IOC_DIRSHIFT) & IOC_DIRMASK)
     401  #define IOC_TYPE(nr) (((nr) >> IOC_TYPESHIFT) & IOC_TYPEMASK)
     402  #define IOC_NR(nr) (((nr) >> IOC_NRSHIFT) & IOC_NRMASK)
     403  
     404  #if defined(__sparc__)
     405  // In sparc the 14 bits SIZE field overlaps with the
     406  // least significant bit of DIR, so either IOC_READ or
     407  // IOC_WRITE shall be 1 in order to get a non-zero SIZE.
     408  #define IOC_SIZE(nr) \
     409    ((((((nr) >> 29) & 0x7) & (4U | 2U)) == 0) ? 0 : (((nr) >> 16) & 0x3fff))
     410  #else
     411  #define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK)
     412  #endif
     413  
     414  extern unsigned struct_ifreq_sz;
     415  extern unsigned struct_termios_sz;
     416  extern unsigned struct_winsize_sz;
     417  
     418  extern unsigned struct_sioc_sg_req_sz;
     419  extern unsigned struct_sioc_vif_req_sz;
     420  
     421  // ioctl request identifiers
     422  
     423  // A special value to mark ioctls that are not present on the target platform,
     424  // when it can not be determined without including any system headers.
     425  extern const unsigned IOCTL_NOT_PRESENT;
     426  
     427  extern unsigned IOCTL_FIOASYNC;
     428  extern unsigned IOCTL_FIOCLEX;
     429  extern unsigned IOCTL_FIOGETOWN;
     430  extern unsigned IOCTL_FIONBIO;
     431  extern unsigned IOCTL_FIONCLEX;
     432  extern unsigned IOCTL_FIOSETOWN;
     433  extern unsigned IOCTL_SIOCADDMULTI;
     434  extern unsigned IOCTL_SIOCATMARK;
     435  extern unsigned IOCTL_SIOCDELMULTI;
     436  extern unsigned IOCTL_SIOCGIFADDR;
     437  extern unsigned IOCTL_SIOCGIFBRDADDR;
     438  extern unsigned IOCTL_SIOCGIFCONF;
     439  extern unsigned IOCTL_SIOCGIFDSTADDR;
     440  extern unsigned IOCTL_SIOCGIFFLAGS;
     441  extern unsigned IOCTL_SIOCGIFMETRIC;
     442  extern unsigned IOCTL_SIOCGIFMTU;
     443  extern unsigned IOCTL_SIOCGIFNETMASK;
     444  extern unsigned IOCTL_SIOCGPGRP;
     445  extern unsigned IOCTL_SIOCSIFADDR;
     446  extern unsigned IOCTL_SIOCSIFBRDADDR;
     447  extern unsigned IOCTL_SIOCSIFDSTADDR;
     448  extern unsigned IOCTL_SIOCSIFFLAGS;
     449  extern unsigned IOCTL_SIOCSIFMETRIC;
     450  extern unsigned IOCTL_SIOCSIFMTU;
     451  extern unsigned IOCTL_SIOCSIFNETMASK;
     452  extern unsigned IOCTL_SIOCSPGRP;
     453  extern unsigned IOCTL_TIOCEXCL;
     454  extern unsigned IOCTL_TIOCGETD;
     455  extern unsigned IOCTL_TIOCGPGRP;
     456  extern unsigned IOCTL_TIOCGWINSZ;
     457  extern unsigned IOCTL_TIOCMBIC;
     458  extern unsigned IOCTL_TIOCMBIS;
     459  extern unsigned IOCTL_TIOCMGET;
     460  extern unsigned IOCTL_TIOCMSET;
     461  extern unsigned IOCTL_TIOCNOTTY;
     462  extern unsigned IOCTL_TIOCNXCL;
     463  extern unsigned IOCTL_TIOCOUTQ;
     464  extern unsigned IOCTL_TIOCPKT;
     465  extern unsigned IOCTL_TIOCSCTTY;
     466  extern unsigned IOCTL_TIOCSETD;
     467  extern unsigned IOCTL_TIOCSPGRP;
     468  extern unsigned IOCTL_TIOCSTI;
     469  extern unsigned IOCTL_TIOCSWINSZ;
     470  extern unsigned IOCTL_MTIOCGET;
     471  extern unsigned IOCTL_MTIOCTOP;
     472  
     473  extern const int si_SEGV_MAPERR;
     474  extern const int si_SEGV_ACCERR;
     475  }  // namespace __sanitizer
     476  
     477  #define CHECK_TYPE_SIZE(TYPE) \
     478    COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE))
     479  
     480  #define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER)                       \
     481    COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *) NULL)->MEMBER) == \
     482                   sizeof(((CLASS *) NULL)->MEMBER));                \
     483    COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) ==          \
     484                   offsetof(CLASS, MEMBER))
     485  
     486  // For sigaction, which is a function and struct at the same time,
     487  // and thus requires explicit "struct" in sizeof() expression.
     488  #define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER)                       \
     489    COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *) NULL)->MEMBER) == \
     490                   sizeof(((struct CLASS *) NULL)->MEMBER));                \
     491    COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) ==          \
     492                   offsetof(struct CLASS, MEMBER))
     493  
     494  #endif  // SANITIZER_SOLARIS
     495  
     496  #endif