1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 /*
  27  * Copyright 2012 DEY Storage Systems, Inc.  All rights reserved.
  28  * Copyright (c) 2018 Joyent, Inc.
  29  */
  30 
  31 /*
  32  * String conversion routines the system structs found in
  33  * Solaris core file note sections. These items are not
  34  * ELF constructs. However, elfdump contains code for decoding
  35  * them, and therefore requires formatting support.
  36  */
  37 #include        <stdio.h>
  38 #include        <procfs.h>
  39 #include        <sys/corectl.h>
  40 #include        <sys/secflags.h>
  41 #include        <string.h>
  42 #include        <_conv.h>
  43 #include        <corenote_msg.h>
  44 
  45 const char *
  46 conv_cnote_type(Word type, Conv_fmt_flags_t fmt_flags,
  47     Conv_inv_buf_t *inv_buf)
  48 {
  49         static const Msg        types[] = {
  50                 MSG_NT_PRSTATUS,        MSG_NT_PRFPREG,
  51                 MSG_NT_PRPSINFO,        MSG_NT_PRXREG,
  52                 MSG_NT_PLATFORM,        MSG_NT_AUXV,
  53                 MSG_NT_GWINDOWS,        MSG_NT_ASRS,
  54                 MSG_NT_LDT,             MSG_NT_PSTATUS,
  55                 0,                      0,
  56                 MSG_NT_PSINFO,          MSG_NT_PRCRED,
  57                 MSG_NT_UTSNAME,         MSG_NT_LWPSTATUS,
  58                 MSG_NT_LWPSINFO,        MSG_NT_PRPRIV,
  59                 MSG_NT_PRPRIVINFO,      MSG_NT_CONTENT,
  60                 MSG_NT_ZONENAME,        MSG_NT_FDINFO,
  61                 MSG_NT_SPYMASTER,       MSG_NT_SECFLAGS
  62         };
  63 #if NT_NUM != NT_SECFLAGS
  64 #error "NT_NUM has grown. Update core note types[]"
  65 #endif
  66         static const conv_ds_msg_t ds_types = {
  67             CONV_DS_MSG_INIT(NT_PRSTATUS, types) };
  68         static const conv_ds_t  *ds[] = { CONV_DS_ADDR(ds_types), NULL };
  69 
  70 
  71         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, type, ds, fmt_flags,
  72             inv_buf));
  73 }
  74 
  75 
  76 const char *
  77 conv_cnote_auxv_type(Word type, Conv_fmt_flags_t fmt_flags,
  78     Conv_inv_buf_t *inv_buf)
  79 {
  80         static const Msg        types_0_22[] = {
  81                 MSG_AUXV_AT_NULL,               MSG_AUXV_AT_IGNORE,
  82                 MSG_AUXV_AT_EXECFD,             MSG_AUXV_AT_PHDR,
  83                 MSG_AUXV_AT_PHENT,              MSG_AUXV_AT_PHNUM,
  84                 MSG_AUXV_AT_PAGESZ,             MSG_AUXV_AT_BASE,
  85                 MSG_AUXV_AT_FLAGS,              MSG_AUXV_AT_ENTRY,
  86                 MSG_AUXV_AT_NOTELF,             MSG_AUXV_AT_UID,
  87                 MSG_AUXV_AT_EUID,               MSG_AUXV_AT_GID,
  88                 MSG_AUXV_AT_EGID,               MSG_AUXV_AT_PLATFORM,
  89                 MSG_AUXV_AT_HWCAP,              MSG_AUXV_AT_CLKTCK,
  90                 MSG_AUXV_AT_FPUCW,              MSG_AUXV_AT_DCACHEBSIZE,
  91                 MSG_AUXV_AT_ICACHEBSIZE,        MSG_AUXV_AT_UCACHEBSIZE,
  92                 MSG_AUXV_AT_IGNOREPPC
  93         };
  94         static const conv_ds_msg_t ds_types_0_22 = {
  95             CONV_DS_MSG_INIT(0, types_0_22) };
  96 
  97         static const Msg        types_2000_2011[] = {
  98                 MSG_AUXV_AT_SUN_UID,            MSG_AUXV_AT_SUN_RUID,
  99                 MSG_AUXV_AT_SUN_GID,            MSG_AUXV_AT_SUN_RGID,
 100                 MSG_AUXV_AT_SUN_LDELF,          MSG_AUXV_AT_SUN_LDSHDR,
 101                 MSG_AUXV_AT_SUN_LDNAME,         MSG_AUXV_AT_SUN_LPAGESZ,
 102                 MSG_AUXV_AT_SUN_PLATFORM,       MSG_AUXV_AT_SUN_HWCAP,
 103                 MSG_AUXV_AT_SUN_IFLUSH,         MSG_AUXV_AT_SUN_CPU
 104         };
 105         static const conv_ds_msg_t ds_types_2000_2011 = {
 106             CONV_DS_MSG_INIT(2000, types_2000_2011) };
 107 
 108         static const Msg        types_2014_2028[] = {
 109                 MSG_AUXV_AT_SUN_EXECNAME,       MSG_AUXV_AT_SUN_MMU,
 110                 MSG_AUXV_AT_SUN_LDDATA,         MSG_AUXV_AT_SUN_AUXFLAGS,
 111                 MSG_AUXV_AT_SUN_EMULATOR,       MSG_AUXV_AT_SUN_BRANDNAME,
 112                 MSG_AUXV_AT_SUN_BRAND_AUX1,     MSG_AUXV_AT_SUN_BRAND_AUX2,
 113                 MSG_AUXV_AT_SUN_BRAND_AUX3,     MSG_AUXV_AT_SUN_HWCAP2,
 114                 NULL,                           NULL,
 115                 MSG_AUXV_AT_SUN_COMMPAGE,       MSG_AUXV_AT_SUN_FPTYPE,
 116                 MSG_AUXV_AT_SUN_FPSIZE
 117         };
 118         static const conv_ds_msg_t ds_types_2014_2028 = {
 119             CONV_DS_MSG_INIT(2014, types_2014_2028) };
 120 
 121         static const conv_ds_t  *ds[] = {
 122                 CONV_DS_ADDR(ds_types_0_22), CONV_DS_ADDR(ds_types_2000_2011),
 123                 CONV_DS_ADDR(ds_types_2014_2028), NULL };
 124 
 125         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, type, ds, fmt_flags,
 126             inv_buf));
 127 }
 128 
 129 
 130 const char *
 131 conv_cnote_signal(Word sig, Conv_fmt_flags_t fmt_flags,
 132     Conv_inv_buf_t *inv_buf)
 133 {
 134         static const Msg        sigarr[] = {
 135                 MSG_SIGHUP,             MSG_SIGINT,
 136                 MSG_SIGQUIT,            MSG_SIGILL,
 137                 MSG_SIGTRAP,            MSG_SIGABRT,
 138                 MSG_SIGEMT,             MSG_SIGFPE,
 139                 MSG_SIGKILL,            MSG_SIGBUS,
 140                 MSG_SIGSEGV,            MSG_SIGSYS,
 141                 MSG_SIGPIPE,            MSG_SIGALRM,
 142                 MSG_SIGTERM,            MSG_SIGUSR1,
 143                 MSG_SIGUSR2,            MSG_SIGCHLD,
 144                 MSG_SIGPWR,             MSG_SIGWINCH,
 145                 MSG_SIGURG,             MSG_SIGPOLL,
 146                 MSG_SIGSTOP,            MSG_SIGTSTP,
 147                 MSG_SIGCONT,            MSG_SIGTTIN,
 148                 MSG_SIGTTOU,            MSG_SIGVTALRM,
 149                 MSG_SIGPROF,            MSG_SIGXCPU,
 150                 MSG_SIGXFSZ,            MSG_SIGWAITING,
 151                 MSG_SIGLWP,             MSG_SIGFREEZE,
 152                 MSG_SIGTHAW,            MSG_SIGCANCEL,
 153                 MSG_SIGLOST,            MSG_SIGXRES,
 154                 MSG_SIGJVM1,            MSG_SIGJVM2,
 155         };
 156         static const conv_ds_msg_t ds_sigarr = {
 157             CONV_DS_MSG_INIT(SIGHUP, sigarr) };
 158 
 159         static const conv_ds_t  *ds[] = { CONV_DS_ADDR(ds_sigarr), NULL };
 160 
 161         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, sig, ds, fmt_flags,
 162             inv_buf));
 163 }
 164 
 165 
 166 const char *
 167 conv_cnote_fault(Word flt, Conv_fmt_flags_t fmt_flags,
 168     Conv_inv_buf_t *inv_buf)
 169 {
 170         static const Msg        fltarr[] = {
 171                 MSG_FLTILL,             MSG_FLTPRIV,
 172                 MSG_FLTBPT,             MSG_FLTTRACE,
 173                 MSG_FLTACCESS,          MSG_FLTBOUNDS,
 174                 MSG_FLTIOVF,            MSG_FLTIZDIV,
 175                 MSG_FLTFPE,             MSG_FLTSTACK,
 176                 MSG_FLTPAGE,            MSG_FLTWATCH,
 177                 MSG_FLTCPCOVF
 178 
 179         };
 180         static const conv_ds_msg_t ds_fltarr = {
 181             CONV_DS_MSG_INIT(FLTILL, fltarr) };
 182 
 183         static const conv_ds_t  *ds[] = { CONV_DS_ADDR(ds_fltarr), NULL };
 184 
 185         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, flt, ds, fmt_flags,
 186             inv_buf));
 187 }
 188 
 189 
 190 const char *
 191 conv_cnote_syscall(Word sysnum, Conv_fmt_flags_t fmt_flags,
 192     Conv_inv_buf_t *inv_buf)
 193 {
 194         static const Msg        sysnumarr[] = {
 195                 MSG_SYS_EXIT,                   MSG_SYS_2,
 196                 MSG_SYS_READ,                   MSG_SYS_WRITE,
 197                 MSG_SYS_OPEN,                   MSG_SYS_CLOSE,
 198                 MSG_SYS_7,                      MSG_SYS_8,
 199                 MSG_SYS_LINK,                   MSG_SYS_UNLINK,
 200                 MSG_SYS_11,                     MSG_SYS_CHDIR,
 201                 MSG_SYS_TIME,                   MSG_SYS_MKNOD,
 202                 MSG_SYS_CHMOD,                  MSG_SYS_CHOWN,
 203                 MSG_SYS_BRK,                    MSG_SYS_STAT,
 204                 MSG_SYS_LSEEK,                  MSG_SYS_GETPID,
 205                 MSG_SYS_MOUNT,                  MSG_SYS_22,
 206                 MSG_SYS_SETUID,                 MSG_SYS_GETUID,
 207                 MSG_SYS_STIME,                  MSG_SYS_PCSAMPLE,
 208                 MSG_SYS_ALARM,                  MSG_SYS_FSTAT,
 209                 MSG_SYS_PAUSE,                  MSG_SYS_30,
 210                 MSG_SYS_STTY,                   MSG_SYS_GTTY,
 211                 MSG_SYS_ACCESS,                 MSG_SYS_NICE,
 212                 MSG_SYS_STATFS,                 MSG_SYS_SYNC,
 213                 MSG_SYS_KILL,                   MSG_SYS_FSTATFS,
 214                 MSG_SYS_PGRPSYS,                MSG_SYS_UUCOPYSTR,
 215                 MSG_SYS_41,                     MSG_SYS_PIPE,
 216                 MSG_SYS_TIMES,                  MSG_SYS_PROFIL,
 217                 MSG_SYS_FACCESSAT,              MSG_SYS_SETGID,
 218                 MSG_SYS_GETGID,                 MSG_SYS_48,
 219                 MSG_SYS_MSGSYS,                 MSG_SYS_SYSI86,
 220                 MSG_SYS_ACCT,                   MSG_SYS_SHMSYS,
 221                 MSG_SYS_SEMSYS,                 MSG_SYS_IOCTL,
 222                 MSG_SYS_UADMIN,                 MSG_SYS_FCHOWNAT,
 223                 MSG_SYS_UTSSYS,                 MSG_SYS_FDSYNC,
 224                 MSG_SYS_EXECVE,                 MSG_SYS_UMASK,
 225                 MSG_SYS_CHROOT,                 MSG_SYS_FCNTL,
 226                 MSG_SYS_ULIMIT,                 MSG_SYS_RENAMEAT,
 227                 MSG_SYS_UNLINKAT,               MSG_SYS_FSTATAT,
 228                 MSG_SYS_FSTATAT64,              MSG_SYS_OPENAT,
 229                 MSG_SYS_OPENAT64,               MSG_SYS_TASKSYS,
 230                 MSG_SYS_ACCTCTL,                MSG_SYS_EXACCTSYS,
 231                 MSG_SYS_GETPAGESIZES,           MSG_SYS_RCTLSYS,
 232                 MSG_SYS_SIDSYS,                 MSG_SYS_76,
 233                 MSG_SYS_LWP_PARK,               MSG_SYS_SENDFILEV,
 234                 MSG_SYS_RMDIR,                  MSG_SYS_MKDIR,
 235                 MSG_SYS_GETDENTS,               MSG_SYS_PRIVSYS,
 236                 MSG_SYS_UCREDSYS,               MSG_SYS_SYSFS,
 237                 MSG_SYS_GETMSG,                 MSG_SYS_PUTMSG,
 238                 MSG_SYS_87,                     MSG_SYS_LSTAT,
 239                 MSG_SYS_SYMLINK,                MSG_SYS_READLINK,
 240                 MSG_SYS_SETGROUPS,              MSG_SYS_GETGROUPS,
 241                 MSG_SYS_FCHMOD,                 MSG_SYS_FCHOWN,
 242                 MSG_SYS_SIGPROCMASK,            MSG_SYS_SIGSUSPEND,
 243                 MSG_SYS_SIGALTSTACK,            MSG_SYS_SIGACTION,
 244                 MSG_SYS_SIGPENDING,             MSG_SYS_CONTEXT,
 245                 MSG_SYS_101,                    MSG_SYS_102,
 246                 MSG_SYS_STATVFS,                MSG_SYS_FSTATVFS,
 247                 MSG_SYS_GETLOADAVG,             MSG_SYS_NFSSYS,
 248                 MSG_SYS_WAITID,                 MSG_SYS_SIGSENDSYS,
 249                 MSG_SYS_HRTSYS,                 MSG_SYS_UTIMESYS,
 250                 MSG_SYS_SIGRESEND,              MSG_SYS_PRIOCNTLSYS,
 251                 MSG_SYS_PATHCONF,               MSG_SYS_MINCORE,
 252                 MSG_SYS_MMAP,                   MSG_SYS_MPROTECT,
 253                 MSG_SYS_MUNMAP,                 MSG_SYS_FPATHCONF,
 254                 MSG_SYS_VFORK,                  MSG_SYS_FCHDIR,
 255                 MSG_SYS_READV,                  MSG_SYS_WRITEV,
 256                 MSG_SYS_123,                    MSG_SYS_124,
 257                 MSG_SYS_125,                    MSG_SYS_126,
 258                 MSG_SYS_MMAPOBJ,                MSG_SYS_SETRLIMIT,
 259                 MSG_SYS_GETRLIMIT,              MSG_SYS_LCHOWN,
 260                 MSG_SYS_MEMCNTL,                MSG_SYS_GETPMSG,
 261                 MSG_SYS_PUTPMSG,                MSG_SYS_RENAME,
 262                 MSG_SYS_UNAME,                  MSG_SYS_SETEGID,
 263                 MSG_SYS_SYSCONFIG,              MSG_SYS_ADJTIME,
 264                 MSG_SYS_SYSTEMINFO,             MSG_SYS_SHAREFS,
 265                 MSG_SYS_SETEUID,                MSG_SYS_FORKSYS,
 266                 MSG_SYS_143,                    MSG_SYS_SIGTIMEDWAIT,
 267                 MSG_SYS_LWP_INFO,               MSG_SYS_YIELD,
 268                 MSG_SYS_147,                    MSG_SYS_LWP_SEMA_POST,
 269                 MSG_SYS_LWP_SEMA_TRYWAIT,       MSG_SYS_LWP_DETACH,
 270                 MSG_SYS_CORECTL,                MSG_SYS_MODCTL,
 271                 MSG_SYS_FCHROOT,                MSG_SYS_154,
 272                 MSG_SYS_VHANGUP,                MSG_SYS_GETTIMEOFDAY,
 273                 MSG_SYS_GETITIMER,              MSG_SYS_SETITIMER,
 274                 MSG_SYS_LWP_CREATE,             MSG_SYS_LWP_EXIT,
 275                 MSG_SYS_LWP_SUSPEND,            MSG_SYS_LWP_CONTINUE,
 276                 MSG_SYS_LWP_KILL,               MSG_SYS_LWP_SELF,
 277                 MSG_SYS_LWP_SIGMASK,            MSG_SYS_LWP_PRIVATE,
 278                 MSG_SYS_LWP_WAIT,               MSG_SYS_LWP_MUTEX_WAKEUP,
 279                 MSG_SYS_169,                    MSG_SYS_LWP_COND_WAIT,
 280                 MSG_SYS_LWP_COND_SIGNAL,        MSG_SYS_LWP_COND_BROADCAST,
 281                 MSG_SYS_PREAD,                  MSG_SYS_PWRITE,
 282                 MSG_SYS_LLSEEK,                 MSG_SYS_INST_SYNC,
 283                 MSG_SYS_BRAND,                  MSG_SYS_KAIO,
 284                 MSG_SYS_CPC,                    MSG_SYS_LGRPSYS,
 285                 MSG_SYS_RUSAGESYS,              MSG_SYS_PORT,
 286                 MSG_SYS_POLLSYS,                MSG_SYS_LABELSYS,
 287                 MSG_SYS_ACL,                    MSG_SYS_AUDITSYS,
 288                 MSG_SYS_PROCESSOR_BIND,         MSG_SYS_PROCESSOR_INFO,
 289                 MSG_SYS_P_ONLINE,               MSG_SYS_SIGQUEUE,
 290                 MSG_SYS_CLOCK_GETTIME,          MSG_SYS_CLOCK_SETTIME,
 291                 MSG_SYS_CLOCK_GETRES,           MSG_SYS_TIMER_CREATE,
 292                 MSG_SYS_TIMER_DELETE,           MSG_SYS_TIMER_SETTIME,
 293                 MSG_SYS_TIMER_GETTIME,          MSG_SYS_TIMER_GETOVERRUN,
 294                 MSG_SYS_NANOSLEEP,              MSG_SYS_FACL,
 295                 MSG_SYS_DOOR,                   MSG_SYS_SETREUID,
 296                 MSG_SYS_SETREGID,               MSG_SYS_INSTALL_UTRAP,
 297                 MSG_SYS_SIGNOTIFY,              MSG_SYS_SCHEDCTL,
 298                 MSG_SYS_PSET,                   MSG_SYS_SPARC_UTRAP_INSTALL,
 299                 MSG_SYS_RESOLVEPATH,            MSG_SYS_LWP_MUTEX_TIMEDLOCK,
 300                 MSG_SYS_LWP_SEMA_TIMEDWAIT,     MSG_SYS_LWP_RWLOCK_SYS,
 301                 MSG_SYS_GETDENTS64,             MSG_SYS_MMAP64,
 302                 MSG_SYS_STAT64,                 MSG_SYS_LSTAT64,
 303                 MSG_SYS_FSTAT64,                MSG_SYS_STATVFS64,
 304                 MSG_SYS_FSTATVFS64,             MSG_SYS_SETRLIMIT64,
 305                 MSG_SYS_GETRLIMIT64,            MSG_SYS_PREAD64,
 306                 MSG_SYS_PWRITE64,               MSG_SYS_224,
 307                 MSG_SYS_OPEN64,                 MSG_SYS_RPCSYS,
 308                 MSG_SYS_ZONE,                   MSG_SYS_AUTOFSSYS,
 309                 MSG_SYS_GETCWD,                 MSG_SYS_SO_SOCKET,
 310                 MSG_SYS_SO_SOCKETPAIR,          MSG_SYS_BIND,
 311                 MSG_SYS_LISTEN,                 MSG_SYS_ACCEPT,
 312                 MSG_SYS_CONNECT,                MSG_SYS_SHUTDOWN,
 313                 MSG_SYS_RECV,                   MSG_SYS_RECVFROM,
 314                 MSG_SYS_RECVMSG,                MSG_SYS_SEND,
 315                 MSG_SYS_SENDMSG,                MSG_SYS_SENDTO,
 316                 MSG_SYS_GETPEERNAME,            MSG_SYS_GETSOCKNAME,
 317                 MSG_SYS_GETSOCKOPT,             MSG_SYS_SETSOCKOPT,
 318                 MSG_SYS_SOCKCONFIG,             MSG_SYS_NTP_GETTIME,
 319                 MSG_SYS_NTP_ADJTIME,            MSG_SYS_LWP_MUTEX_UNLOCK,
 320                 MSG_SYS_LWP_MUTEX_TRYLOCK,      MSG_SYS_LWP_MUTEX_REGISTER,
 321                 MSG_SYS_CLADM,                  MSG_SYS_UUCOPY,
 322                 MSG_SYS_UMOUNT2
 323         };
 324         static const conv_ds_msg_t ds_sysnumarr = {
 325             CONV_DS_MSG_INIT(1, sysnumarr) };
 326 
 327         static const conv_ds_t  *ds[] = { CONV_DS_ADDR(ds_sysnumarr), NULL };
 328 
 329         int     use_num = 0;
 330 
 331         /*
 332          * Range check, and handle the unused values in the middle
 333          * of the range. Although the missing values have strings,
 334          * we still prefer to format them, because those strings are
 335          * decimal, and the default behavior, unless the CONV_FMT_DECIMAL
 336          * flag is set, is to display such things in hex.
 337          */
 338         switch (sysnum) {
 339         case 0:
 340         case 2:
 341         case 7:
 342         case 8:
 343         case 11:
 344         case 22:
 345         case 30:
 346         case 41:
 347         case 48:
 348         case 76:
 349         case 87:
 350         case 101:
 351         case 102:
 352         case 123:
 353         case 124:
 354         case 125:
 355         case 126:
 356         case 143:
 357         case 147:
 358         case 154:
 359         case 169:
 360         case 224:
 361                 use_num = 1;
 362                 break;
 363         default:
 364                 use_num = (sysnum > SYS_umount2);
 365                 break;
 366         }
 367         if (use_num)
 368                 return (conv_invalid_val(inv_buf, sysnum, fmt_flags));
 369 
 370         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, sysnum, ds, fmt_flags,
 371             inv_buf));
 372 }
 373 
 374 
 375 const char *
 376 conv_cnote_errno(int errno_val, Conv_fmt_flags_t fmt_flags,
 377     Conv_inv_buf_t *inv_buf)
 378 {
 379         static const Msg        errarr_1_74[74] = {
 380                 MSG_ERRNO_EPERM,                MSG_ERRNO_ENOENT,
 381                 MSG_ERRNO_ESRCH,                MSG_ERRNO_EINTR,
 382                 MSG_ERRNO_EIO,                  MSG_ERRNO_ENXIO,
 383                 MSG_ERRNO_E2BIG,                MSG_ERRNO_ENOEXEC,
 384                 MSG_ERRNO_EBADF,                MSG_ERRNO_ECHILD,
 385                 MSG_ERRNO_EAGAIN,               MSG_ERRNO_ENOMEM,
 386                 MSG_ERRNO_EACCES,               MSG_ERRNO_EFAULT,
 387                 MSG_ERRNO_ENOTBLK,              MSG_ERRNO_EBUSY,
 388                 MSG_ERRNO_EEXIST,               MSG_ERRNO_EXDEV,
 389                 MSG_ERRNO_ENODEV,               MSG_ERRNO_ENOTDIR,
 390                 MSG_ERRNO_EISDIR,               MSG_ERRNO_EINVAL,
 391                 MSG_ERRNO_ENFILE,               MSG_ERRNO_EMFILE,
 392                 MSG_ERRNO_ENOTTY,               MSG_ERRNO_ETXTBSY,
 393                 MSG_ERRNO_EFBIG,                MSG_ERRNO_ENOSPC,
 394                 MSG_ERRNO_ESPIPE,               MSG_ERRNO_EROFS,
 395                 MSG_ERRNO_EMLINK,               MSG_ERRNO_EPIPE,
 396                 MSG_ERRNO_EDOM,                 MSG_ERRNO_ERANGE,
 397                 MSG_ERRNO_ENOMSG,               MSG_ERRNO_EIDRM,
 398                 MSG_ERRNO_ECHRNG,               MSG_ERRNO_EL2NSYNC,
 399                 MSG_ERRNO_EL3HLT,               MSG_ERRNO_EL3RST,
 400                 MSG_ERRNO_ELNRNG,               MSG_ERRNO_EUNATCH,
 401                 MSG_ERRNO_ENOCSI,               MSG_ERRNO_EL2HLT,
 402                 MSG_ERRNO_EDEADLK,              MSG_ERRNO_ENOLCK,
 403                 MSG_ERRNO_ECANCELED,            MSG_ERRNO_ENOTSUP,
 404                 MSG_ERRNO_EDQUOT,               MSG_ERRNO_EBADE,
 405                 MSG_ERRNO_EBADR,                MSG_ERRNO_EXFULL,
 406                 MSG_ERRNO_ENOANO,               MSG_ERRNO_EBADRQC,
 407                 MSG_ERRNO_EBADSLT,              MSG_ERRNO_EDEADLOCK,
 408                 MSG_ERRNO_EBFONT,               MSG_ERRNO_EOWNERDEAD,
 409                 MSG_ERRNO_ENOTRECOVERABLE,      MSG_ERRNO_ENOSTR,
 410                 MSG_ERRNO_ENODATA,              MSG_ERRNO_ETIME,
 411                 MSG_ERRNO_ENOSR,                MSG_ERRNO_ENONET,
 412                 MSG_ERRNO_ENOPKG,               MSG_ERRNO_EREMOTE,
 413                 MSG_ERRNO_ENOLINK,              MSG_ERRNO_EADV,
 414                 MSG_ERRNO_ESRMNT,               MSG_ERRNO_ECOMM,
 415                 MSG_ERRNO_EPROTO,               MSG_ERRNO_ELOCKUNMAPPED,
 416                 MSG_ERRNO_ENOTACTIVE,           MSG_ERRNO_EMULTIHOP
 417         };
 418         static const conv_ds_msg_t ds_errarr_1_74 = {
 419             CONV_DS_MSG_INIT(1, errarr_1_74) };
 420 
 421         static const Msg        errarr_77_99[23] = {
 422                 MSG_ERRNO_EBADMSG,              MSG_ERRNO_ENAMETOOLONG,
 423                 MSG_ERRNO_EOVERFLOW,            MSG_ERRNO_ENOTUNIQ,
 424                 MSG_ERRNO_EBADFD,               MSG_ERRNO_EREMCHG,
 425                 MSG_ERRNO_ELIBACC,              MSG_ERRNO_ELIBBAD,
 426                 MSG_ERRNO_ELIBSCN,              MSG_ERRNO_ELIBMAX,
 427                 MSG_ERRNO_ELIBEXEC,             MSG_ERRNO_EILSEQ,
 428                 MSG_ERRNO_ENOSYS,               MSG_ERRNO_ELOOP,
 429                 MSG_ERRNO_ERESTART,             MSG_ERRNO_ESTRPIPE,
 430                 MSG_ERRNO_ENOTEMPTY,            MSG_ERRNO_EUSERS,
 431                 MSG_ERRNO_ENOTSOCK,             MSG_ERRNO_EDESTADDRREQ,
 432                 MSG_ERRNO_EMSGSIZE,             MSG_ERRNO_EPROTOTYPE,
 433                 MSG_ERRNO_ENOPROTOOPT
 434         };
 435         static const conv_ds_msg_t ds_errarr_77_99 = {
 436             CONV_DS_MSG_INIT(77, errarr_77_99) };
 437 
 438         static const Msg        errarr_120_134[15] = {
 439                 MSG_ERRNO_EPROTONOSUPPORT,      MSG_ERRNO_ESOCKTNOSUPPORT,
 440                 MSG_ERRNO_EOPNOTSUPP,           MSG_ERRNO_EPFNOSUPPORT,
 441                 MSG_ERRNO_EAFNOSUPPORT,         MSG_ERRNO_EADDRINUSE,
 442                 MSG_ERRNO_EADDRNOTAVAIL,        MSG_ERRNO_ENETDOWN,
 443                 MSG_ERRNO_ENETUNREACH,          MSG_ERRNO_ENETRESET,
 444                 MSG_ERRNO_ECONNABORTED,         MSG_ERRNO_ECONNRESET,
 445                 MSG_ERRNO_ENOBUFS,              MSG_ERRNO_EISCONN,
 446                 MSG_ERRNO_ENOTCONN
 447         };
 448         static const conv_ds_msg_t ds_errarr_120_134 = {
 449             CONV_DS_MSG_INIT(120, errarr_120_134) };
 450 
 451         static const Msg        errarr_143_151[9] = {
 452                 MSG_ERRNO_ESHUTDOWN,            MSG_ERRNO_ETOOMANYREFS,
 453                 MSG_ERRNO_ETIMEDOUT,            MSG_ERRNO_ECONNREFUSED,
 454                 MSG_ERRNO_EHOSTDOWN,            MSG_ERRNO_EHOSTUNREACH,
 455                 MSG_ERRNO_EALREADY,             MSG_ERRNO_EINPROGRESS,
 456                 MSG_ERRNO_ESTALE
 457         };
 458         static const conv_ds_msg_t ds_errarr_143_151 = {
 459             CONV_DS_MSG_INIT(143, errarr_143_151) };
 460 
 461         static const conv_ds_t  *ds[] = { CONV_DS_ADDR(ds_errarr_1_74),
 462                 CONV_DS_ADDR(ds_errarr_77_99), CONV_DS_ADDR(ds_errarr_120_134),
 463                 CONV_DS_ADDR(ds_errarr_143_151), NULL };
 464 
 465 
 466         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, errno_val, ds, fmt_flags,
 467             inv_buf));
 468 }
 469 
 470 
 471 const char *
 472 conv_cnote_pr_dmodel(Word dmodel, Conv_fmt_flags_t fmt_flags,
 473     Conv_inv_buf_t *inv_buf)
 474 {
 475         static const Msg        models[] = {
 476                 MSG_PR_MODEL_UNKNOWN,
 477                 MSG_PR_MODEL_ILP32,
 478                 MSG_PR_MODEL_LP64
 479         };
 480         static const conv_ds_msg_t ds_models = {
 481             CONV_DS_MSG_INIT(PR_MODEL_UNKNOWN, models) };
 482         static const conv_ds_t  *ds[] = { CONV_DS_ADDR(ds_models), NULL };
 483 
 484         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, dmodel, ds, fmt_flags,
 485             inv_buf));
 486 }
 487 
 488 
 489 const char *
 490 conv_cnote_pr_why(short why, Conv_fmt_flags_t fmt_flags,
 491     Conv_inv_buf_t *inv_buf)
 492 {
 493         static const Msg        why_arr[] = {
 494                 MSG_PR_WHY_REQUESTED,
 495                 MSG_PR_WHY_SIGNALLED,
 496                 MSG_PR_WHY_SYSENTRY,
 497                 MSG_PR_WHY_SYSEXIT,
 498                 MSG_PR_WHY_JOBCONTROL,
 499                 MSG_PR_WHY_FAULTED,
 500                 MSG_PR_WHY_SUSPENDED,
 501                 MSG_PR_WHY_CHECKPOINT
 502         };
 503         static const conv_ds_msg_t ds_why_arr = {
 504             CONV_DS_MSG_INIT(1, why_arr) };
 505         static const conv_ds_t  *ds[] = { CONV_DS_ADDR(ds_why_arr), NULL };
 506 
 507         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, why, ds, fmt_flags,
 508             inv_buf));
 509 }
 510 
 511 
 512 const char *
 513 conv_cnote_pr_what(short why, short what, Conv_fmt_flags_t fmt_flags,
 514     Conv_inv_buf_t *inv_buf)
 515 {
 516         /*
 517          * The meaning of pr_what depends on the corresponding
 518          * value of pr_why, as discussed in the proc(4) manpage.
 519          */
 520         switch (why) {
 521         case PR_SIGNALLED:
 522         case PR_JOBCONTROL:
 523                 return (conv_cnote_signal(what, fmt_flags, inv_buf));
 524         case PR_SYSENTRY:
 525         case PR_SYSEXIT:
 526                 return (conv_cnote_syscall(what, fmt_flags, inv_buf));
 527         case PR_FAULTED:
 528                 return (conv_cnote_fault(what, fmt_flags, inv_buf));
 529         };
 530 
 531         return (conv_invalid_val(inv_buf, what, fmt_flags));
 532 }
 533 
 534 
 535 /*
 536  * Return the name of the general purpose register indexed by
 537  * regno in the pr_reg array of lwpstatus_t (<sys/procfs.h>).
 538  */
 539 const char *
 540 conv_cnote_pr_regname(Half mach, int regno, Conv_fmt_flags_t fmt_flags,
 541     Conv_inv_buf_t *inv_buf)
 542 {
 543         static const Msg        sparc_gen_reg[32] = {
 544                 MSG_REG_SPARC_G0,               MSG_REG_SPARC_G1,
 545                 MSG_REG_SPARC_G2,               MSG_REG_SPARC_G3,
 546                 MSG_REG_SPARC_G4,               MSG_REG_SPARC_G5,
 547                 MSG_REG_SPARC_G6,               MSG_REG_SPARC_G7,
 548                 MSG_REG_SPARC_O0,               MSG_REG_SPARC_O1,
 549                 MSG_REG_SPARC_O2,               MSG_REG_SPARC_O3,
 550                 MSG_REG_SPARC_O4,               MSG_REG_SPARC_O5,
 551                 MSG_REG_SPARC_O6,               MSG_REG_SPARC_O7,
 552                 MSG_REG_SPARC_L0,               MSG_REG_SPARC_L1,
 553                 MSG_REG_SPARC_L2,               MSG_REG_SPARC_L3,
 554                 MSG_REG_SPARC_L4,               MSG_REG_SPARC_L5,
 555                 MSG_REG_SPARC_L6,               MSG_REG_SPARC_L7,
 556                 MSG_REG_SPARC_I0,               MSG_REG_SPARC_I1,
 557                 MSG_REG_SPARC_I2,               MSG_REG_SPARC_I3,
 558                 MSG_REG_SPARC_I4,               MSG_REG_SPARC_I5,
 559                 MSG_REG_SPARC_I6,               MSG_REG_SPARC_I7
 560         };
 561         static const conv_ds_msg_t ds_sparc_gen_reg = {
 562             CONV_DS_MSG_INIT(0, sparc_gen_reg) };
 563 
 564         static const Msg        sparc_32_37_reg[6] = {
 565                 MSG_REG_SPARC_PSR,              MSG_REG_SPARC_PC,
 566                 MSG_REG_SPARC_nPC,              MSG_REG_SPARC_Y,
 567                 MSG_REG_SPARC_WIM,              MSG_REG_SPARC_TBR
 568         };
 569         static const conv_ds_msg_t ds_sparc_32_37_reg = {
 570             CONV_DS_MSG_INIT(32, sparc_32_37_reg) };
 571 
 572         static const Msg        sparcv9_32_37_reg[6] = {
 573                 MSG_REG_SPARC_CCR,              MSG_REG_SPARC_PC,
 574                 MSG_REG_SPARC_nPC,              MSG_REG_SPARC_Y,
 575                 MSG_REG_SPARC_ASI,              MSG_REG_SPARC_FPRS
 576         };
 577         static const conv_ds_msg_t ds_sparcv9_32_37_reg = {
 578             CONV_DS_MSG_INIT(32, sparcv9_32_37_reg) };
 579 
 580         static const Msg        amd64_reg[28] = {
 581                 MSG_REG_AMD64_R15,              MSG_REG_AMD64_R14,
 582                 MSG_REG_AMD64_R13,              MSG_REG_AMD64_R12,
 583                 MSG_REG_AMD64_R11,              MSG_REG_AMD64_R10,
 584                 MSG_REG_AMD64_R9,               MSG_REG_AMD64_R8,
 585                 MSG_REG_AMD64_RDI,              MSG_REG_AMD64_RSI,
 586                 MSG_REG_AMD64_RBP,              MSG_REG_AMD64_RBX,
 587                 MSG_REG_AMD64_RDX,              MSG_REG_AMD64_RCX,
 588                 MSG_REG_AMD64_RAX,              MSG_REG_AMD64_TRAPNO,
 589                 MSG_REG_AMD64_ERR,              MSG_REG_AMD64_RIP,
 590                 MSG_REG_AMD64_CS,               MSG_REG_AMD64_RFL,
 591                 MSG_REG_AMD64_RSP,              MSG_REG_AMD64_SS,
 592                 MSG_REG_AMD64_FS,               MSG_REG_AMD64_GS,
 593                 MSG_REG_AMD64_ES,               MSG_REG_AMD64_DS,
 594                 MSG_REG_AMD64_FSBASE,           MSG_REG_AMD64_GSBASE
 595         };
 596         static const conv_ds_msg_t ds_amd64_reg = {
 597             CONV_DS_MSG_INIT(0, amd64_reg) };
 598 
 599         static const Msg        i86_reg[19] = {
 600                 MSG_REG_I86_GS,                 MSG_REG_I86_FS,
 601                 MSG_REG_I86_ES,                 MSG_REG_I86_DS,
 602                 MSG_REG_I86_EDI,                MSG_REG_I86_ESI,
 603                 MSG_REG_I86_EBP,                MSG_REG_I86_ESP,
 604                 MSG_REG_I86_EBX,                MSG_REG_I86_EDX,
 605                 MSG_REG_I86_ECX,                MSG_REG_I86_EAX,
 606                 MSG_REG_I86_TRAPNO,             MSG_REG_I86_ERR,
 607                 MSG_REG_I86_EIP,                MSG_REG_I86_CS,
 608                 MSG_REG_I86_EFL,                MSG_REG_I86_UESP,
 609                 MSG_REG_I86_SS
 610         };
 611         static const conv_ds_msg_t ds_i86_reg = {
 612             CONV_DS_MSG_INIT(0, i86_reg) };
 613 
 614 
 615         static const conv_ds_t  *ds_sparc[] = {
 616                 CONV_DS_ADDR(ds_sparc_gen_reg),
 617                 CONV_DS_ADDR(ds_sparc_32_37_reg),
 618                 NULL
 619         };
 620         static const conv_ds_t  *ds_sparcv9[] = {
 621                 CONV_DS_ADDR(ds_sparc_gen_reg),
 622                 CONV_DS_ADDR(ds_sparcv9_32_37_reg),
 623                 NULL
 624         };
 625         static const conv_ds_t  *ds_amd64[] = {
 626                 CONV_DS_ADDR(ds_amd64_reg), NULL };
 627         static const conv_ds_t  *ds_i86[] = {
 628                 CONV_DS_ADDR(ds_i86_reg), NULL };
 629 
 630         const conv_ds_t **ds;
 631 
 632         switch (mach) {
 633         case EM_386:
 634                 ds = ds_i86;
 635                 break;
 636 
 637         case EM_AMD64:
 638                 ds = ds_amd64;
 639                 break;
 640 
 641         case EM_SPARC:
 642         case EM_SPARC32PLUS:
 643                 ds = ds_sparc;
 644                 break;
 645 
 646         case EM_SPARCV9:
 647                 ds = ds_sparcv9;
 648                 break;
 649 
 650         default:
 651                 return (conv_invalid_val(inv_buf, regno, fmt_flags));
 652         }
 653 
 654         return (conv_map_ds(ELFOSABI_NONE, mach, regno, ds, fmt_flags,
 655             inv_buf));
 656 }
 657 
 658 const char *
 659 conv_cnote_pr_stype(Word stype, Conv_fmt_flags_t fmt_flags,
 660     Conv_inv_buf_t *inv_buf)
 661 {
 662         static const Msg        types[] = {
 663                 MSG_SOBJ_NONE,          MSG_SOBJ_MUTEX,
 664                 MSG_SOBJ_RWLOCK,        MSG_SOBJ_CV,
 665                 MSG_SOBJ_SEMA,          MSG_SOBJ_USER,
 666                 MSG_SOBJ_USER_PI,       MSG_SOBJ_SHUTTLE
 667         };
 668         static const conv_ds_msg_t ds_types = { CONV_DS_MSG_INIT(0, types) };
 669         static const conv_ds_t  *ds[] = { CONV_DS_ADDR(ds_types), NULL };
 670 
 671 
 672         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, stype, ds, fmt_flags,
 673             inv_buf));
 674 }
 675 
 676 
 677 const char *
 678 conv_cnote_priv(int priv, Conv_fmt_flags_t fmt_flags,
 679     Conv_inv_buf_t *inv_buf)
 680 {
 681         const char *fmt;
 682 
 683         /*
 684          * The PRIV_ constants defined in <sys/priv.h> are unusual
 685          * in that they are negative values. The libconv code is all
 686          * built around the Word type, which is unsigned. Rather than
 687          * modify libconv for this one case, we simply handle
 688          * these constants differently that the usual approach,
 689          * and stay away from conv_invalid_val() and conv_map_ds().
 690          */
 691         switch (priv) {
 692         case PRIV_ALL:
 693                 return (MSG_ORIG(MSG_PRIV_ALL));
 694         case PRIV_MULTIPLE:
 695                 return (MSG_ORIG(MSG_PRIV_MULTIPLE));
 696         case PRIV_NONE:
 697                 return (MSG_ORIG(MSG_PRIV_NONE));
 698         case PRIV_ALLZONE:
 699                 return (MSG_ORIG(MSG_PRIV_ALLZONE));
 700         case PRIV_GLOBAL:
 701                 return (MSG_ORIG(MSG_PRIV_GLOBAL));
 702         }
 703 
 704         fmt = (fmt_flags & CONV_FMT_DECIMAL) ?
 705             MSG_ORIG(MSG_FMT_INT) : MSG_ORIG(MSG_FMT_HEXINT);
 706         (void) snprintf(inv_buf->buf, sizeof (inv_buf->buf), fmt, priv);
 707         return (inv_buf->buf);
 708 }
 709 
 710 
 711 const char *
 712 conv_cnote_psetid(int id, Conv_fmt_flags_t fmt_flags,
 713     Conv_inv_buf_t *inv_buf)
 714 {
 715         const char *fmt;
 716 
 717         /*
 718          * The PS_ constants defined in <sys/pset.h> are unusual
 719          * in that they are negative values. The libconv code is all
 720          * built around the Word type, which is unsigned. Rather than
 721          * modify libconv for this one case, we simply handle
 722          * these constants differently that the usual approach,
 723          * and stay away from conv_invalid_val() and conv_map_ds().
 724          */
 725         switch (id) {
 726         case PS_NONE:
 727                 return (MSG_ORIG(MSG_PS_NONE));
 728         case PS_QUERY:
 729                 return (MSG_ORIG(MSG_PS_QUERY));
 730         case PS_MYID:
 731                 return (MSG_ORIG(MSG_PS_MYID));
 732         case PS_SOFT:
 733                 return (MSG_ORIG(MSG_PS_SOFT));
 734         case PS_HARD:
 735                 return (MSG_ORIG(MSG_PS_HARD));
 736         case PS_QUERY_TYPE:
 737                 return (MSG_ORIG(MSG_PS_QUERY_TYPE));
 738         }
 739 
 740         fmt = (fmt_flags & CONV_FMT_DECIMAL) ?
 741             MSG_ORIG(MSG_FMT_INT) : MSG_ORIG(MSG_FMT_HEXINT);
 742         (void) snprintf(inv_buf->buf, sizeof (inv_buf->buf), fmt, id);
 743         return (inv_buf->buf);
 744 }
 745 
 746 
 747 /*
 748  * Return a string describing the si_code field of
 749  * the siginfo_t struct.
 750  *
 751  * The meaning of si_code is dependent on both the target
 752  * machine (mach) as well as the signal (sig).
 753  */
 754 const char *
 755 conv_cnote_si_code(Half mach, int sig, int si_code,
 756     Conv_fmt_flags_t fmt_flags, Conv_inv_buf_t *inv_buf)
 757 {
 758 
 759         /* Values of si_code for user generated signals */
 760         static const Msg        user_arr[6] = {
 761                 MSG_SI_USER,            MSG_SI_LWP,
 762                 MSG_SI_QUEUE,           MSG_SI_TIMER,
 763                 MSG_SI_ASYNCIO,         MSG_SI_MESGQ
 764         };
 765         static const conv_ds_msg_t ds_msg_user_arr = {
 766             CONV_DS_MSG_INIT(0, user_arr) };
 767         static const conv_ds_t  *ds_user_arr[] = {
 768                 CONV_DS_ADDR(ds_msg_user_arr), NULL };
 769 
 770 
 771         /*
 772          * Architecture dependent system generated signals. All
 773          * versions of Solaris use the same set of these values.
 774          */
 775         static const Msg        trap_arr[6] = {
 776                 MSG_SI_TRAP_BRKPT,      MSG_SI_TRAP_TRACE,
 777                 MSG_SI_TRAP_RWATCH,     MSG_SI_TRAP_WWATCH,
 778                 MSG_SI_TRAP_XWATCH,     MSG_SI_TRAP_DTRACE
 779         };
 780         static const conv_ds_msg_t ds_msg_trap_arr = {
 781             CONV_DS_MSG_INIT(1, trap_arr) };
 782         static const conv_ds_t  *ds_trap_arr[] = {
 783                 CONV_DS_ADDR(ds_msg_trap_arr), NULL };
 784 
 785         static const Msg        cld_arr[6] = {
 786                 MSG_SI_CLD_EXITED,      MSG_SI_CLD_KILLED,
 787                 MSG_SI_CLD_DUMPED,      MSG_SI_CLD_TRAPPED,
 788                 MSG_SI_CLD_STOPPED,     MSG_SI_CLD_CONTINUED
 789         };
 790         static const conv_ds_msg_t ds_msg_cld_arr = {
 791             CONV_DS_MSG_INIT(1, cld_arr) };
 792         static const conv_ds_t  *ds_cld_arr[] = {
 793                 CONV_DS_ADDR(ds_msg_cld_arr), NULL };
 794 
 795         static const Msg        poll_arr[6] = {
 796                 MSG_SI_POLL_IN,         MSG_SI_POLL_OUT,
 797                 MSG_SI_POLL_MSG,        MSG_SI_POLL_ERR,
 798                 MSG_SI_POLL_PRI,        MSG_SI_POLL_HUP
 799         };
 800         static const conv_ds_msg_t ds_msg_poll_arr = {
 801             CONV_DS_MSG_INIT(1, poll_arr) };
 802         static const conv_ds_t  *ds_poll_arr[] = {
 803                 CONV_DS_ADDR(ds_msg_poll_arr), NULL };
 804 
 805         /*
 806          * Architecture dependent system generated signals.
 807          * These items (ILL, EMT, FPE, SEGV, BUS) are platform
 808          * dependent. Some architectures have extra codes.
 809          * The same name may have a different integer value.
 810          * Multiple arrays are used when they differ, and one
 811          * array when all the architectures agree.
 812          */
 813 
 814         /* ILL */
 815         static const Msg        ill_arr[8] = {
 816                 MSG_SI_ILL_ILLOPC,      MSG_SI_ILL_ILLOPN,
 817                 MSG_SI_ILL_ILLADR,      MSG_SI_ILL_ILLTRP,
 818                 MSG_SI_ILL_PRVOPC,      MSG_SI_ILL_PRVREG,
 819                 MSG_SI_ILL_COPROC,      MSG_SI_ILL_BADSTK
 820         };
 821         static const conv_ds_msg_t ds_msg_ill_arr = {
 822             CONV_DS_MSG_INIT(1, ill_arr) };
 823         static const conv_ds_t  *ds_ill_arr[] = {
 824                 CONV_DS_ADDR(ds_msg_ill_arr), NULL };
 825 
 826         /* EMT */
 827         static const Msg        emt_arr_sparc[2] = {
 828                 MSG_SI_EMT_TAGOVF,      MSG_SI_EMT_CPCOVF
 829         };
 830         static const conv_ds_msg_t ds_msg_emt_arr_sparc = {
 831             CONV_DS_MSG_INIT(1, emt_arr_sparc) };
 832         static const conv_ds_t  *ds_emt_arr_sparc[] = {
 833                 CONV_DS_ADDR(ds_msg_emt_arr_sparc), NULL };
 834 
 835         static const Msg        emt_arr_x86[1] = {
 836                 MSG_SI_EMT_CPCOVF
 837         };
 838         static const conv_ds_msg_t ds_msg_emt_arr_x86 = {
 839             CONV_DS_MSG_INIT(1, emt_arr_x86) };
 840         static const conv_ds_t  *ds_emt_arr_x86[] = {
 841                 CONV_DS_ADDR(ds_msg_emt_arr_x86), NULL };
 842 
 843 
 844         /* FPE */
 845         static const Msg        fpe_arr_sparc[8] = {
 846                 MSG_SI_FPE_INTDIV,      MSG_SI_FPE_INTOVF,
 847                 MSG_SI_FPE_FLTDIV,      MSG_SI_FPE_FLTOVF,
 848                 MSG_SI_FPE_FLTUND,      MSG_SI_FPE_FLTRES,
 849                 MSG_SI_FPE_FLTINV,      MSG_SI_FPE_FLTSUB
 850         };
 851         static const conv_ds_msg_t ds_msg_fpe_arr_sparc = {
 852             CONV_DS_MSG_INIT(1, fpe_arr_sparc) };
 853         static const conv_ds_t  *ds_fpe_arr_sparc[] = {
 854                 CONV_DS_ADDR(ds_msg_fpe_arr_sparc), NULL };
 855 
 856         static const Msg        fpe_arr_x86[9] = {
 857                 MSG_SI_FPE_INTDIV,      MSG_SI_FPE_INTOVF,
 858                 MSG_SI_FPE_FLTDIV,      MSG_SI_FPE_FLTOVF,
 859                 MSG_SI_FPE_FLTUND,      MSG_SI_FPE_FLTRES,
 860                 MSG_SI_FPE_FLTINV,      MSG_SI_FPE_FLTSUB,
 861                 MSG_SI_FPE_FLTDEN
 862         };
 863         static const conv_ds_msg_t ds_msg_fpe_arr_x86 = {
 864             CONV_DS_MSG_INIT(1, fpe_arr_x86) };
 865         static const conv_ds_t  *ds_fpe_arr_x86[] = {
 866                 CONV_DS_ADDR(ds_msg_fpe_arr_x86), NULL };
 867 
 868         /* SEGV */
 869         static const Msg        segv_arr[2] = {
 870                 MSG_SI_SEGV_MAPERR,     MSG_SI_SEGV_ACCERR
 871         };
 872         static const conv_ds_msg_t ds_msg_segv_arr = {
 873             CONV_DS_MSG_INIT(1, segv_arr) };
 874         static const conv_ds_t  *ds_segv_arr[] = {
 875                 CONV_DS_ADDR(ds_msg_segv_arr), NULL };
 876 
 877         /* BUS */
 878         static const Msg        bus_arr[3] = {
 879                 MSG_SI_BUS_ADRALN,      MSG_SI_BUS_ADRERR,
 880                 MSG_SI_BUS_OBJERR
 881         };
 882         static const conv_ds_msg_t ds_msg_bus_arr = {
 883             CONV_DS_MSG_INIT(1, bus_arr) };
 884         static const conv_ds_t  *ds_bus_arr[] = {
 885                 CONV_DS_ADDR(ds_msg_bus_arr), NULL };
 886 
 887         enum { ARCH_NONE, ARCH_X86, ARCH_SPARC } arch;
 888 
 889 
 890         /* Handle the si_code values that do not depend on the signal */
 891         switch (si_code) {
 892         case SI_NOINFO:
 893                 return (MSG_ORIG(MSG_SI_NOINFO));
 894         case SI_DTRACE:
 895                 return (MSG_ORIG(MSG_SI_DTRACE));
 896         case SI_RCTL:
 897                 return (MSG_ORIG(MSG_SI_RCTL));
 898         default:
 899                 /* User generated signal codes are <= 0 */
 900                 if (si_code <= 0) {
 901                         int ndx = -si_code;
 902 
 903                         /*
 904                          * If no signal was delivered, and si_code is
 905                          * 0, return "0" rather than "SI_USER".
 906                          */
 907                         if ((si_code == 0) && (sig == 0))
 908                                 return (MSG_ORIG(MSG_GBL_ZERO));
 909 
 910                         if (ndx >= ARRAY_NELTS(user_arr)) {
 911                                 const char *fmt;
 912 
 913                                 fmt = (fmt_flags & CONV_FMT_DECIMAL) ?
 914                                     MSG_ORIG(MSG_FMT_INT) :
 915                                     MSG_ORIG(MSG_FMT_HEXINT);
 916 
 917                                 (void) snprintf(inv_buf->buf,
 918                                     sizeof (inv_buf->buf), fmt, si_code);
 919                                 return (inv_buf->buf);
 920                         }
 921                         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, ndx,
 922                             ds_user_arr, fmt_flags, inv_buf));
 923                 }
 924         }
 925 
 926         /*
 927          * If we didn't return above, then this is a
 928          * system generated signal, and the meaning of si_code
 929          * depends on the signal that was delivered, and possibly
 930          * on the target architecture.
 931          */
 932         switch (mach) {
 933         case EM_386:
 934         case EM_AMD64:
 935                 arch = ARCH_X86;
 936                 break;
 937 
 938         case EM_SPARC:
 939         case EM_SPARC32PLUS:
 940         case EM_SPARCV9:
 941                 arch = ARCH_X86;
 942                 break;
 943 
 944         default:
 945                 arch = ARCH_NONE;
 946                 break;
 947         }
 948 
 949         switch (sig) {
 950         case SIGTRAP:
 951                 return (conv_map_ds(ELFOSABI_NONE, EM_NONE, si_code,
 952                     ds_trap_arr, fmt_flags, inv_buf));
 953 
 954         case SIGCLD:
 955                 return (conv_map_ds(ELFOSABI_NONE, EM_NONE, si_code,
 956                     ds_cld_arr, fmt_flags, inv_buf));
 957 
 958         case SIGPOLL:
 959                 return (conv_map_ds(ELFOSABI_NONE, EM_NONE, si_code,
 960                     ds_poll_arr, fmt_flags, inv_buf));
 961 
 962         case SIGILL:
 963                 return (conv_map_ds(ELFOSABI_NONE, EM_NONE, si_code,
 964                     ds_ill_arr, fmt_flags, inv_buf));
 965 
 966         case SIGEMT:
 967                 switch (arch) {
 968                 case ARCH_SPARC:
 969                         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, si_code,
 970                             ds_emt_arr_sparc, fmt_flags, inv_buf));
 971                 case ARCH_X86:
 972                         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, si_code,
 973                             ds_emt_arr_x86, fmt_flags, inv_buf));
 974                 }
 975                 break;
 976 
 977         case SIGFPE:
 978                 switch (arch) {
 979                 case ARCH_SPARC:
 980                         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, si_code,
 981                             ds_fpe_arr_sparc, fmt_flags, inv_buf));
 982                 case ARCH_X86:
 983                         return (conv_map_ds(ELFOSABI_NONE, EM_NONE, si_code,
 984                             ds_fpe_arr_x86, fmt_flags, inv_buf));
 985                 }
 986                 break;
 987 
 988         case SIGSEGV:
 989                 return (conv_map_ds(ELFOSABI_NONE, EM_NONE, si_code,
 990                     ds_segv_arr, fmt_flags, inv_buf));
 991 
 992         case SIGBUS:
 993                 return (conv_map_ds(ELFOSABI_NONE, EM_NONE, si_code,
 994                     ds_bus_arr, fmt_flags, inv_buf));
 995         }
 996 
 997         /* If not recognized, format as a number */
 998         return (conv_invalid_val(inv_buf, si_code, fmt_flags));
 999 
1000 }
1001 
1002 
1003 #define AUXAFFLGSZ      CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
1004         MSG_AUXV_AF_SUN_SETUGID_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1005         MSG_AUXV_AF_SUN_HWCAPVERIFY_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1006         MSG_AUXV_AF_SUN_NOPLM_SIZE      + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1007         CONV_INV_BUFSIZE                + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
1008 
1009 /*
1010  * Ensure that Conv_cnote_auxv_af_buf_t is large enough:
1011  *
1012  * AUXAFFLGSZ is the real minimum size of the buffer required by
1013  * conv_cnote_auxv_af(). However, Conv_cnote_auxv_af_buf_t
1014  * uses CONV_CNOTE_AUXV_AF_BUFSIZE to set the buffer size. We do
1015  * things this way because the definition of AUXAFFLGSZ uses information
1016  * that is not available in the environment of other programs
1017  * that include the conv.h header file.
1018  */
1019 #if (CONV_CNOTE_AUXV_AF_BUFSIZE != AUXAFFLGSZ) && !defined(__lint)
1020 #define REPORT_BUFSIZE AUXAFFLGSZ
1021 #include "report_bufsize.h"
1022 #error "CONV_CNOTE_AUXV_AF_BUFSIZE does not match AUXAFFLGSZ"
1023 #endif
1024 
1025 const char *
1026 conv_cnote_auxv_af(Word flags, Conv_fmt_flags_t fmt_flags,
1027     Conv_cnote_auxv_af_buf_t *cnote_auxv_af_buf)
1028 {
1029         static const Val_desc vda[] = {
1030                 { AF_SUN_SETUGID,       MSG_AUXV_AF_SUN_SETUGID },
1031                 { AF_SUN_HWCAPVERIFY,   MSG_AUXV_AF_SUN_HWCAPVERIFY },
1032                 { AF_SUN_NOPLM,         MSG_AUXV_AF_SUN_NOPLM },
1033                 { 0,                    0 }
1034         };
1035         static CONV_EXPN_FIELD_ARG conv_arg = {
1036             NULL, sizeof (cnote_auxv_af_buf->buf) };
1037 
1038         if (flags == 0)
1039                 return (MSG_ORIG(MSG_GBL_ZERO));
1040 
1041         conv_arg.buf = cnote_auxv_af_buf->buf;
1042         conv_arg.oflags = conv_arg.rflags = flags;
1043         (void) conv_expn_field(&conv_arg, vda, fmt_flags);
1044 
1045         return ((const char *)cnote_auxv_af_buf->buf);
1046 }
1047 
1048 
1049 #define CCFLGSZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
1050         MSG_CC_CONTENT_STACK_SIZE       + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1051         MSG_CC_CONTENT_HEAP_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1052         MSG_CC_CONTENT_SHFILE_SIZE      + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1053         MSG_CC_CONTENT_SHANON_SIZE      + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1054         MSG_CC_CONTENT_TEXT_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1055         MSG_CC_CONTENT_DATA_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1056         MSG_CC_CONTENT_RODATA_SIZE      + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1057         MSG_CC_CONTENT_ANON_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1058         MSG_CC_CONTENT_SHM_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1059         MSG_CC_CONTENT_ISM_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1060         MSG_CC_CONTENT_DISM_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1061         MSG_CC_CONTENT_CTF_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1062         MSG_CC_CONTENT_SYMTAB_SIZE      + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1063         CONV_INV_BUFSIZE                + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
1064 
1065 /*
1066  * Ensure that Conv_cnote_cc_content_buf_t is large enough:
1067  *
1068  * CCFLGSZ is the real minimum size of the buffer required by
1069  * conv_cnote_cc_content(). However, Conv_cnote_cc_content_buf_t
1070  * uses CONV_CNOTE_CC_CONTENT_BUFSIZE to set the buffer size. We do
1071  * things this way because the definition of CCFLGSZ uses information
1072  * that is not available in the environment of other programs
1073  * that include the conv.h header file.
1074  */
1075 #if (CONV_CNOTE_CC_CONTENT_BUFSIZE != CCFLGSZ) && !defined(__lint)
1076 #define REPORT_BUFSIZE CCFLGSZ
1077 #include "report_bufsize.h"
1078 #error "CONV_CNOTE_CC_CONTENT_BUFSIZE does not match CCFLGSZ"
1079 #endif
1080 
1081 const char *
1082 conv_cnote_cc_content(Lword flags, Conv_fmt_flags_t fmt_flags,
1083     Conv_cnote_cc_content_buf_t *cnote_cc_content_buf)
1084 {
1085         /*
1086          * Note: core_content_t is a 64-bit integer value, but our
1087          * conv_expn_field() logic is all built around 32-bit
1088          * Word values. This will probably need changing someday,
1089          * but for now, we make do with the 32-bit engine. This works
1090          * because the number of bits actually assigned in
1091          * the core_content_t data type (<sys/corectl.h>) bits within
1092          * 32-bits.
1093          *
1094          * The downside is that any bits set in the upper half of
1095          * the flags will be ignored. At the time of this writing,
1096          * that can only occur via core file corruption, which presumably
1097          * would be evident in other ways.
1098          */
1099         static const Val_desc vda[] = {
1100                 { (Word) CC_CONTENT_STACK,      MSG_CC_CONTENT_STACK },
1101                 { (Word) CC_CONTENT_HEAP,       MSG_CC_CONTENT_HEAP },
1102                 { (Word) CC_CONTENT_SHFILE,     MSG_CC_CONTENT_SHFILE },
1103                 { (Word) CC_CONTENT_SHANON,     MSG_CC_CONTENT_SHANON },
1104                 { (Word) CC_CONTENT_TEXT,       MSG_CC_CONTENT_TEXT },
1105                 { (Word) CC_CONTENT_DATA,       MSG_CC_CONTENT_DATA },
1106                 { (Word) CC_CONTENT_RODATA,     MSG_CC_CONTENT_RODATA },
1107                 { (Word) CC_CONTENT_ANON,       MSG_CC_CONTENT_ANON },
1108                 { (Word) CC_CONTENT_SHM,        MSG_CC_CONTENT_SHM },
1109                 { (Word) CC_CONTENT_ISM,        MSG_CC_CONTENT_ISM },
1110                 { (Word) CC_CONTENT_DISM,       MSG_CC_CONTENT_DISM },
1111                 { (Word) CC_CONTENT_CTF,        MSG_CC_CONTENT_CTF },
1112                 { (Word) CC_CONTENT_SYMTAB,     MSG_CC_CONTENT_SYMTAB },
1113                 { 0,                    0 }
1114         };
1115         static CONV_EXPN_FIELD_ARG conv_arg = {
1116             NULL, sizeof (cnote_cc_content_buf->buf) };
1117 
1118         if (flags == 0)
1119                 return (MSG_ORIG(MSG_GBL_ZERO));
1120 
1121         conv_arg.buf = cnote_cc_content_buf->buf;
1122         conv_arg.oflags = conv_arg.rflags = flags;
1123         (void) conv_expn_field(&conv_arg, vda, fmt_flags);
1124 
1125         return ((const char *)cnote_cc_content_buf->buf);
1126 }
1127 
1128 
1129 #define PRFLGSZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
1130         MSG_PR_FLAGS_STOPPED_SIZE       + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1131         MSG_PR_FLAGS_ISTOP_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1132         MSG_PR_FLAGS_DSTOP_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1133         MSG_PR_FLAGS_STEP_SIZE          + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1134         MSG_PR_FLAGS_ASLEEP_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1135         MSG_PR_FLAGS_PCINVAL_SIZE       + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1136         MSG_PR_FLAGS_ASLWP_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1137         MSG_PR_FLAGS_AGENT_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1138         MSG_PR_FLAGS_DETACH_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1139         MSG_PR_FLAGS_DAEMON_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1140         MSG_PR_FLAGS_IDLE_SIZE          + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1141         MSG_PR_FLAGS_ISSYS_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1142         MSG_PR_FLAGS_VFORKP_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1143         MSG_PR_FLAGS_ORPHAN_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1144         MSG_PR_FLAGS_NOSIGCHLD_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1145         MSG_PR_FLAGS_WAITPID_SIZE       + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1146         MSG_PR_FLAGS_FORK_SIZE          + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1147         MSG_PR_FLAGS_RLC_SIZE           + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1148         MSG_PR_FLAGS_KLC_SIZE           + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1149         MSG_PR_FLAGS_ASYNC_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1150         MSG_PR_FLAGS_MSACCT_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1151         MSG_PR_FLAGS_BPTADJ_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1152         MSG_PR_FLAGS_PTRACE_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1153         MSG_PR_FLAGS_MSFORK_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1154         CONV_INV_BUFSIZE                + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
1155 
1156 /*
1157  * Ensure that Conv_cnote_pr_flags_buf_t is large enough:
1158  *
1159  * PRFLGSZ is the real minimum size of the buffer required by
1160  * conv_cnote_pr_flags(). However, Conv_cnote_pr_flags_buf_t
1161  * uses CONV_CNOTE_PR_FLAGS_BUFSIZE to set the buffer size. We do
1162  * things this way because the definition of PRFLGSZ uses information
1163  * that is not available in the environment of other programs
1164  * that include the conv.h header file.
1165  */
1166 #if (CONV_CNOTE_PR_FLAGS_BUFSIZE != PRFLGSZ) && !defined(__lint)
1167 #define REPORT_BUFSIZE PRFLGSZ
1168 #include "report_bufsize.h"
1169 #error "CONV_CNOTE_PR_FLAGS_BUFSIZE does not match PRFLGSZ"
1170 #endif
1171 
1172 const char *
1173 conv_cnote_pr_flags(int flags, Conv_fmt_flags_t fmt_flags,
1174     Conv_cnote_pr_flags_buf_t *cnote_pr_flags_buf)
1175 {
1176         static const Val_desc vda[] = {
1177                 { PR_STOPPED,           MSG_PR_FLAGS_STOPPED },
1178                 { PR_ISTOP,             MSG_PR_FLAGS_ISTOP },
1179                 { PR_DSTOP,             MSG_PR_FLAGS_DSTOP },
1180                 { PR_STEP,              MSG_PR_FLAGS_STEP },
1181                 { PR_ASLEEP,            MSG_PR_FLAGS_ASLEEP },
1182                 { PR_PCINVAL,           MSG_PR_FLAGS_PCINVAL },
1183                 { PR_ASLWP,             MSG_PR_FLAGS_ASLWP },
1184                 { PR_AGENT,             MSG_PR_FLAGS_AGENT },
1185                 { PR_DETACH,            MSG_PR_FLAGS_DETACH },
1186                 { PR_DAEMON,            MSG_PR_FLAGS_DAEMON },
1187                 { PR_IDLE,              MSG_PR_FLAGS_IDLE },
1188                 { PR_ISSYS,             MSG_PR_FLAGS_ISSYS },
1189                 { PR_VFORKP,            MSG_PR_FLAGS_VFORKP },
1190                 { PR_ORPHAN,            MSG_PR_FLAGS_ORPHAN },
1191                 { PR_NOSIGCHLD,         MSG_PR_FLAGS_NOSIGCHLD },
1192                 { PR_WAITPID,           MSG_PR_FLAGS_WAITPID },
1193                 { PR_FORK,              MSG_PR_FLAGS_FORK },
1194                 { PR_RLC,               MSG_PR_FLAGS_RLC },
1195                 { PR_KLC,               MSG_PR_FLAGS_KLC },
1196                 { PR_ASYNC,             MSG_PR_FLAGS_ASYNC },
1197                 { PR_MSACCT,            MSG_PR_FLAGS_MSACCT },
1198                 { PR_BPTADJ,            MSG_PR_FLAGS_BPTADJ },
1199                 { PR_PTRACE,            MSG_PR_FLAGS_PTRACE },
1200                 { PR_MSFORK,            MSG_PR_FLAGS_MSFORK },
1201                 { 0,                    0 }
1202         };
1203         static CONV_EXPN_FIELD_ARG conv_arg = {
1204             NULL, sizeof (cnote_pr_flags_buf->buf) };
1205 
1206         if (flags == 0)
1207                 return (MSG_ORIG(MSG_GBL_ZERO));
1208 
1209         conv_arg.buf = cnote_pr_flags_buf->buf;
1210         conv_arg.oflags = conv_arg.rflags = flags;
1211         (void) conv_expn_field(&conv_arg, vda, fmt_flags);
1212 
1213         return ((const char *)cnote_pr_flags_buf->buf);
1214 }
1215 
1216 
1217 #define OLDPRFLGSZ      CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
1218         MSG_PR_FLAGS_STOPPED_SIZE       + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1219         MSG_PR_FLAGS_ISTOP_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1220         MSG_PR_FLAGS_DSTOP_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1221         MSG_PR_FLAGS_ASLEEP_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1222         MSG_PR_FLAGS_FORK_SIZE          + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1223         MSG_PR_FLAGS_RLC_SIZE           + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1224         MSG_PR_FLAGS_PTRACE_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1225         MSG_PR_FLAGS_PCINVAL_SIZE       + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1226         MSG_PR_FLAGS_ISSYS_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1227         MSG_PR_FLAGS_STEP_SIZE          + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1228         MSG_PR_FLAGS_KLC_SIZE           + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1229         MSG_PR_FLAGS_ASYNC_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1230         MSG_PR_FLAGS_PCOMPAT_SIZE       + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1231         MSG_PR_FLAGS_MSACCT_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1232         MSG_PR_FLAGS_BPTADJ_SIZE        + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1233         MSG_PR_FLAGS_ASLWP_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1234         CONV_INV_BUFSIZE                + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
1235 
1236 /*
1237  * Ensure that Conv_cnote_old_pr_flags_buf_t is large enough:
1238  *
1239  * OLDPRFLGSZ is the real minimum size of the buffer required by
1240  * conv_cnote_old_pr_flags(). However, Conv_cnote_old_pr_flags_buf_t
1241  * uses CONV_CNOTE_OLD_PR_FLAGS_BUFSIZE to set the buffer size. We do
1242  * things this way because the definition of OLDPRFLGSZ uses information
1243  * that is not available in the environment of other programs
1244  * that include the conv.h header file.
1245  */
1246 #if (CONV_CNOTE_OLD_PR_FLAGS_BUFSIZE != OLDPRFLGSZ) && !defined(__lint)
1247 #define REPORT_BUFSIZE OLDPRFLGSZ
1248 #include "report_bufsize.h"
1249 #error "CONV_CNOTE_OLD_PR_FLAGS_BUFSIZE does not match OLDPRFLGSZ"
1250 #endif
1251 
1252 const char *
1253 conv_cnote_old_pr_flags(int flags, Conv_fmt_flags_t fmt_flags,
1254     Conv_cnote_old_pr_flags_buf_t *cnote_old_pr_flags_buf)
1255 {
1256         /*
1257          * <sys/old_procfs.h> defines names for many of these flags
1258          * that are also defined in <sys/procfs.h>, but with different
1259          * values. To avoid confusion, we don't include <sys/old_procfs.h>,
1260          * and specify the values directly.
1261          */
1262         static const Val_desc vda[] = {
1263                 { 0x0001,               MSG_PR_FLAGS_STOPPED },
1264                 { 0x0002,               MSG_PR_FLAGS_ISTOP },
1265                 { 0x0004,               MSG_PR_FLAGS_DSTOP },
1266                 { 0x0008,               MSG_PR_FLAGS_ASLEEP },
1267                 { 0x0010,               MSG_PR_FLAGS_FORK },
1268                 { 0x0020,               MSG_PR_FLAGS_RLC },
1269                 { 0x0040,               MSG_PR_FLAGS_PTRACE },
1270                 { 0x0080,               MSG_PR_FLAGS_PCINVAL },
1271                 { 0x0100,               MSG_PR_FLAGS_ISSYS },
1272                 { 0x0200,               MSG_PR_FLAGS_STEP },
1273                 { 0x0400,               MSG_PR_FLAGS_KLC },
1274                 { 0x0800,               MSG_PR_FLAGS_ASYNC },
1275                 { 0x1000,               MSG_PR_FLAGS_PCOMPAT },
1276                 { 0x2000,               MSG_PR_FLAGS_MSACCT },
1277                 { 0x4000,               MSG_PR_FLAGS_BPTADJ },
1278                 { 0x8000,               MSG_PR_FLAGS_ASLWP },
1279                 { 0,                    0 }
1280         };
1281         static CONV_EXPN_FIELD_ARG conv_arg = {
1282             NULL, sizeof (cnote_old_pr_flags_buf->buf) };
1283 
1284         if (flags == 0)
1285                 return (MSG_ORIG(MSG_GBL_ZERO));
1286 
1287         conv_arg.buf = cnote_old_pr_flags_buf->buf;
1288         conv_arg.oflags = conv_arg.rflags = flags;
1289         (void) conv_expn_field(&conv_arg, vda, fmt_flags);
1290 
1291         return ((const char *)cnote_old_pr_flags_buf->buf);
1292 }
1293 
1294 
1295 #define PROCFLGSZ       CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
1296         MSG_PROC_FLAG_SSYS_SIZE         + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1297         MSG_PROC_FLAG_SMSACCT_SIZE      + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1298         CONV_INV_BUFSIZE                + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
1299 
1300 /*
1301  * Ensure that Conv_cnote_proc_flag_buf_t is large enough:
1302  *
1303  * PROCFLGSZ is the real minimum size of the buffer required by
1304  * conv_cnote_proc_flag(). However, Conv_cnote_proc_flag_buf_t
1305  * uses CONV_CNOTE_PROC_FLAG_BUFSIZE to set the buffer size. We do
1306  * things this way because the definition of PROCFLGSZ uses information
1307  * that is not available in the environment of other programs
1308  * that include the conv.h header file.
1309  */
1310 #if (CONV_CNOTE_PROC_FLAG_BUFSIZE != PROCFLGSZ) && !defined(__lint)
1311 #define REPORT_BUFSIZE PROCFLGSZ
1312 #include "report_bufsize.h"
1313 #error "CONV_CNOTE_PROC_FLAG_BUFSIZE does not match PROCFLGSZ"
1314 #endif
1315 
1316 const char *
1317 conv_cnote_proc_flag(int flags, Conv_fmt_flags_t fmt_flags,
1318     Conv_cnote_proc_flag_buf_t *cnote_proc_flag_buf)
1319 {
1320         /*
1321          * Most of the proc flags are implementation dependant, and can
1322          * change between releases. As such, we do not attempt to translate
1323          * them to symbolic form, but simply report them in hex form.
1324          * However, SMSACCT and SSYS are special, and their bit values
1325          * are maintained between releases so they can be used in the
1326          * psinfo_t.p_flag field. We therefore translate these items.
1327          *
1328          * See <system/proc.h>
1329          *
1330          * Note: We don't want to include <sys/proc.h> in this file, because
1331          * it redefines 'struct list', which we have defined in sgs.h. As
1332          * SMSACCT and SSYS are stable public values, we simply use
1333          * their numeric value.
1334          */
1335         static const Val_desc vda[] = {
1336                 { 0x00000001,           MSG_PROC_FLAG_SSYS },
1337                 { 0x02000000,           MSG_PROC_FLAG_SMSACCT },
1338                 { 0,                    0 }
1339         };
1340         static CONV_EXPN_FIELD_ARG conv_arg = {
1341             NULL, sizeof (cnote_proc_flag_buf->buf) };
1342 
1343         if (flags == 0)
1344                 return (MSG_ORIG(MSG_GBL_ZERO));
1345 
1346         conv_arg.buf = cnote_proc_flag_buf->buf;
1347         conv_arg.oflags = conv_arg.rflags = flags;
1348         (void) conv_expn_field(&conv_arg, vda, fmt_flags);
1349 
1350         return ((const char *)cnote_proc_flag_buf->buf);
1351 }
1352 
1353 
1354 #define SAFLGSZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
1355         MSG_SA_ONSTACK_SIZE             + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1356         MSG_SA_RESETHAND_SIZE           + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1357         MSG_SA_RESTART_SIZE             + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1358         MSG_SA_SIGINFO_SIZE             + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1359         MSG_SA_NODEFER_SIZE             + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1360         MSG_SA_NOCLDWAIT_SIZE           + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1361         MSG_SA_NOCLDSTOP_SIZE           + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1362         CONV_INV_BUFSIZE                + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
1363 
1364 /*
1365  * Ensure that Conv_cnote_sa_flags_buf_t is large enough:
1366  *
1367  * SAFLGSZ is the real minimum size of the buffer required by
1368  * conv_cnote_sa_flags(). However, Conv_cnote_sa_flags_buf_t
1369  * uses CONV_CNOTE_SA_FLAGS_BUFSIZE to set the buffer size. We do
1370  * things this way because the definition of SAFLGSZ uses information
1371  * that is not available in the environment of other programs
1372  * that include the conv.h header file.
1373  */
1374 #if (CONV_CNOTE_SA_FLAGS_BUFSIZE != SAFLGSZ) && !defined(__lint)
1375 #define REPORT_BUFSIZE SAFLGSZ
1376 #include "report_bufsize.h"
1377 #error "CONV_CNOTE_SA_FLAGS_BUFSIZE does not match SAFLGSZ"
1378 #endif
1379 
1380 const char *
1381 conv_cnote_sa_flags(int flags, Conv_fmt_flags_t fmt_flags,
1382     Conv_cnote_sa_flags_buf_t *cnote_sa_flags_buf)
1383 {
1384         static const Val_desc vda[] = {
1385                 { SA_ONSTACK,           MSG_SA_ONSTACK },
1386                 { SA_RESETHAND,         MSG_SA_RESETHAND },
1387                 { SA_RESTART,           MSG_SA_RESTART },
1388                 { SA_SIGINFO,           MSG_SA_SIGINFO },
1389                 { SA_NODEFER,           MSG_SA_NODEFER },
1390                 { SA_NOCLDWAIT,         MSG_SA_NOCLDWAIT },
1391                 { SA_NOCLDSTOP,         MSG_SA_NOCLDSTOP },
1392                 { 0,                    0 }
1393         };
1394         static CONV_EXPN_FIELD_ARG conv_arg = {
1395             NULL, sizeof (cnote_sa_flags_buf->buf) };
1396 
1397         if (flags == 0)
1398                 return (MSG_ORIG(MSG_GBL_ZERO));
1399 
1400         conv_arg.buf = cnote_sa_flags_buf->buf;
1401         conv_arg.oflags = conv_arg.rflags = flags;
1402         (void) conv_expn_field(&conv_arg, vda, fmt_flags);
1403 
1404         return ((const char *)cnote_sa_flags_buf->buf);
1405 }
1406 
1407 
1408 #define SSFLGSZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
1409         MSG_SS_ONSTACK_SIZE             + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1410         MSG_SS_DISABLE_SIZE             + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1411         CONV_INV_BUFSIZE                + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
1412 
1413 /*
1414  * Ensure that Conv_cnote_ss_flags_buf_t is large enough:
1415  *
1416  * SSFLGSZ is the real minimum size of the buffer required by
1417  * conv_cnote_ss_flags(). However, Conv_cnote_ss_flags_buf_t
1418  * uses CONV_CNOTE_SS_FLAGS_BUFSIZE to set the buffer size. We do
1419  * things this way because the definition of SSFLGSZ uses information
1420  * that is not available in the environment of other programs
1421  * that include the conv.h header file.
1422  */
1423 #if (CONV_CNOTE_SS_FLAGS_BUFSIZE != SSFLGSZ) && !defined(__lint)
1424 #define REPORT_BUFSIZE SSFLGSZ
1425 #include "report_bufsize.h"
1426 #error "CONV_CNOTE_SS_FLAGS_BUFSIZE does not match SSFLGSZ"
1427 #endif
1428 
1429 const char *
1430 conv_cnote_ss_flags(int flags, Conv_fmt_flags_t fmt_flags,
1431     Conv_cnote_ss_flags_buf_t *cnote_ss_flags_buf)
1432 {
1433         static const Val_desc vda[] = {
1434                 { SS_ONSTACK,           MSG_SS_ONSTACK },
1435                 { SS_DISABLE,           MSG_SS_DISABLE },
1436                 { 0,                    0 }
1437         };
1438         static CONV_EXPN_FIELD_ARG conv_arg = {
1439             NULL, sizeof (cnote_ss_flags_buf->buf) };
1440 
1441         if (flags == 0)
1442                 return (MSG_ORIG(MSG_GBL_ZERO));
1443 
1444         conv_arg.buf = cnote_ss_flags_buf->buf;
1445         conv_arg.oflags = conv_arg.rflags = flags;
1446         (void) conv_expn_field(&conv_arg, vda, fmt_flags);
1447 
1448         return ((const char *)cnote_ss_flags_buf->buf);
1449 }
1450 
1451 
1452 /*
1453  * Solaris has a variety of types that use bitmasks to represent
1454  * sets of things like signals (sigset_t), faults (fltset_t), and
1455  * system calls (sysset_t). These types use arrays of unsigned 32-bit
1456  * integers to represent the set. These are public types that
1457  * cannot be changed, so they are generously oversized to allow
1458  * for future growth. Hence, there are usually unused bits.
1459  *
1460  * conv_bitmaskset() generalizes the process of displaying these items.
1461  */
1462 
1463 typedef struct {
1464         const Val_desc  *vdp;           /* NULL, or bitmask description */
1465         uint32_t        unused_bits;    /* Mask of undefined bits */
1466 } conv_bitmaskset_desc_t;
1467 
1468 /*
1469  * entry:
1470  *      n_mask - # of 32-bit masks that make up this bitmask type.
1471  *      maskarr - Array of n_mask 32-bit mask values
1472  *      bitmask_descarr - Array of n_mask bitmask_desc_t descriptors,
1473  *              one for each mask, specifying the bitmask names, and
1474  *              a mask of the bits that are not defined by the system.
1475  *      fmt_flags - CONV_FMT_* values, used to specify formatting details.
1476  *      conv_buf - Buffer to receive formatted results
1477  *      conv_buf_size - Size of conv_buf, including room for NULL termination
1478  */
1479 static const char *
1480 conv_bitmaskset(uint32_t *maskarr, int n_mask,
1481     const conv_bitmaskset_desc_t *bitmask_descarr, Conv_fmt_flags_t fmt_flags,
1482     char *conv_buf, size_t conv_buf_size)
1483 {
1484         CONV_EXPN_FIELD_ARG     conv_arg;
1485         int     i, need_sep = 0;
1486 
1487         /* If every bit of every mask is 0, return 0 as the result */
1488         for (i = 0; i < n_mask; i++)
1489                 if (maskarr[i] != 0)
1490                         break;
1491         if (i == n_mask)
1492                 return (MSG_ORIG(MSG_GBL_ZERO));
1493 
1494         /*
1495          * At least one bit is non-zero. Move through the masks
1496          * and process each one.
1497          */
1498         (void) memset(&conv_arg, 0, sizeof (conv_arg));
1499         conv_arg.bufsize = conv_buf_size;
1500         conv_arg.buf = conv_buf;
1501         if ((fmt_flags & CONV_FMT_NOBKT) == 0) {
1502                 *conv_arg.buf++ = '[';
1503                 *conv_arg.buf++ = ' ';
1504                 conv_arg.bufsize -= 2;
1505         }
1506 
1507         /*
1508          * conv_expn_field() orders its output with the most significant
1509          * bits on the left. To preserve this ordering across the
1510          * subwords or our "virtual bitmask", we need to process
1511          * the sub-words in the same order, from most significant down
1512          * to least significant. Since unassigned bits tend to be at
1513          * the MSB end of the word, we process the unused bits first.
1514          *
1515          * One implication of this is that the caller should not use
1516          * the unassigned bits for "abandoned" bits in the middle of
1517          * a used range, but should instead define the string for
1518          * that bit as being the string representation of that decimal
1519          * value (i.e. "65"). That will cause the bit to be properly
1520          * sorted among the named bits to either side of it.
1521          */
1522         for (i = 0; i < n_mask; i++) {
1523                 size_t          n;
1524                 uint32_t        mask, unused_bits;
1525                 const int       bits_per_mask = sizeof (mask) * 8;
1526 
1527                 mask = maskarr[i];
1528                 unused_bits = mask & bitmask_descarr[i].unused_bits;
1529                 mask &= ~unused_bits;
1530 
1531                 if (mask != 0) {
1532 
1533                         conv_arg.oflags = conv_arg.rflags = mask;
1534                         if (need_sep) {
1535                                 *conv_arg.buf++ = ' ';
1536                                 conv_arg.bufsize--;
1537                         }
1538                         need_sep = 1;
1539                         (void) conv_expn_field(&conv_arg,
1540                             bitmask_descarr[i].vdp, fmt_flags | CONV_FMT_NOBKT);
1541                         n = strlen(conv_arg.buf);
1542                         conv_arg.bufsize -= n;
1543                         conv_arg.buf += n;
1544                 }
1545 
1546                 if (unused_bits != 0) {
1547                         uint32_t        bit = 0x00000001;
1548                         int             j;
1549 
1550                         for (j = 1; j <= bits_per_mask; j++, bit *= 2) {
1551                                 if ((unused_bits & bit) == 0)
1552                                         continue;
1553 
1554                                 if (need_sep) {
1555                                         *conv_arg.buf++ = ' ';
1556                                         conv_arg.bufsize--;
1557                                 }
1558                                 need_sep = 1;
1559                                 n = snprintf(conv_arg.buf, conv_arg.bufsize,
1560                                     MSG_ORIG(MSG_FMT_WORD),
1561                                     EC_WORD(j + (bits_per_mask * i)));
1562                                 conv_arg.buf += n;
1563                                 conv_arg.bufsize -= n;
1564                         }
1565                 }
1566         }
1567         if ((fmt_flags & CONV_FMT_NOBKT) == 0) {
1568                 *conv_arg.buf++ = ' ';
1569                 *conv_arg.buf++ = ']';
1570         }
1571         *conv_arg.buf = '\0';
1572 
1573         return ((const char *) conv_buf);
1574 }
1575 
1576 
1577 #define SIGSET_FLAGSZ   CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
1578         /* sigset_t [0] - Signals [1 - 32] */ \
1579         MSG_SIGHUP_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1580         MSG_SIGINT_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1581         MSG_SIGQUIT_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1582         MSG_SIGILL_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1583         MSG_SIGTRAP_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1584         MSG_SIGABRT_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1585         MSG_SIGEMT_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1586         MSG_SIGFPE_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1587         MSG_SIGKILL_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1588         MSG_SIGBUS_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1589         MSG_SIGSEGV_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1590         MSG_SIGSYS_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1591         MSG_SIGPIPE_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1592         MSG_SIGALRM_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1593         MSG_SIGTERM_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1594         MSG_SIGUSR1_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1595         MSG_SIGUSR2_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1596         MSG_SIGCHLD_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1597         MSG_SIGPWR_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1598         MSG_SIGWINCH_ALT_SIZE   + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1599         MSG_SIGURG_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1600         MSG_SIGPOLL_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1601         MSG_SIGSTOP_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1602         MSG_SIGTSTP_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1603         MSG_SIGCONT_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1604         MSG_SIGTTIN_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1605         MSG_SIGTTOU_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1606         MSG_SIGVTALRM_ALT_SIZE  + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1607         MSG_SIGPROF_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1608         MSG_SIGXCPU_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1609         MSG_SIGXFSZ_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1610         MSG_SIGWAITING_ALT_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1611         \
1612         /* \
1613          * sigset_t [1] - Signals [33 - 64] \
1614          * There are 24 unused bits, each of which needs two \
1615          * characters plus a separator. \
1616          */ \
1617         MSG_SIGLWP_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1618         MSG_SIGFREEZE_ALT_SIZE  + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1619         MSG_SIGTHAW_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1620         MSG_SIGCANCEL_ALT_SIZE  + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1621         MSG_SIGLOST_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1622         MSG_SIGXRES_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1623         MSG_SIGJVM1_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1624         MSG_SIGJVM2_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1625         (24 * (2 + CONV_EXPN_FIELD_DEF_SEP_SIZE)) + \
1626         \
1627         /* \
1628          * sigset_t [2] - Signals [65 - 96] \
1629          * There are 32 unused bits, each of which needs two \
1630          * characters plus a separator. \
1631          */ \
1632         (32 * (2 + CONV_EXPN_FIELD_DEF_SEP_SIZE)) + \
1633         \
1634         /* \
1635          * sigset_t [2] - Signals [97 - 128] \
1636          * There are 32 unused bits. Three of these need two \
1637          * characters, and 29 need 3. Each one needs a separator. \
1638          */ \
1639         (3 * (2 + CONV_EXPN_FIELD_DEF_SEP_SIZE)) + \
1640         (29 * (3 + CONV_EXPN_FIELD_DEF_SEP_SIZE)) + \
1641         \
1642         CONV_INV_BUFSIZE        + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
1643 
1644 /*
1645  * Ensure that Conv_cnote_sigset_buf_t is large enough:
1646  *
1647  * SIGSET_FLAGSZ is the real minimum size of the buffer required by
1648  * conv_cnote_sigset(). However, Conv_cnote_sigset_buf_t
1649  * uses CONV_CNOTE_SIGSET_BUFSIZE to set the buffer size. We do
1650  * things this way because the definition of SIGSET_FLAGSZ uses information
1651  * that is not available in the environment of other programs
1652  * that include the conv.h header file.
1653  */
1654 #if (CONV_CNOTE_SIGSET_BUFSIZE != SIGSET_FLAGSZ) && !defined(__lint)
1655 #define REPORT_BUFSIZE SIGSET_FLAGSZ
1656 #include "report_bufsize.h"
1657 #error "CONV_CNOTE_SIGSET_BUFSIZE does not match SIGSET_FLAGSZ"
1658 #endif
1659 
1660 const char *
1661 conv_cnote_sigset(uint32_t *maskarr, int n_mask,
1662     Conv_fmt_flags_t fmt_flags, Conv_cnote_sigset_buf_t *cnote_sigset_buf)
1663 {
1664 #define N_MASK 4
1665 
1666         static const Val_desc vda0[] = {
1667                 { 0x00000001,           MSG_SIGHUP_ALT },
1668                 { 0x00000002,           MSG_SIGINT_ALT },
1669                 { 0x00000004,           MSG_SIGQUIT_ALT },
1670                 { 0x00000008,           MSG_SIGILL_ALT },
1671                 { 0x00000010,           MSG_SIGTRAP_ALT },
1672                 { 0x00000020,           MSG_SIGABRT_ALT },
1673                 { 0x00000040,           MSG_SIGEMT_ALT },
1674                 { 0x00000080,           MSG_SIGFPE_ALT },
1675                 { 0x00000100,           MSG_SIGKILL_ALT },
1676                 { 0x00000200,           MSG_SIGBUS_ALT },
1677                 { 0x00000400,           MSG_SIGSEGV_ALT },
1678                 { 0x00000800,           MSG_SIGSYS_ALT },
1679                 { 0x00001000,           MSG_SIGPIPE_ALT },
1680                 { 0x00002000,           MSG_SIGALRM_ALT },
1681                 { 0x00004000,           MSG_SIGTERM_ALT },
1682                 { 0x00008000,           MSG_SIGUSR1_ALT },
1683                 { 0x00010000,           MSG_SIGUSR2_ALT },
1684                 { 0x00020000,           MSG_SIGCHLD_ALT },
1685                 { 0x00040000,           MSG_SIGPWR_ALT },
1686                 { 0x00080000,           MSG_SIGWINCH_ALT },
1687                 { 0x00100000,           MSG_SIGURG_ALT },
1688                 { 0x00200000,           MSG_SIGPOLL_ALT },
1689                 { 0x00400000,           MSG_SIGSTOP_ALT },
1690                 { 0x00800000,           MSG_SIGTSTP_ALT },
1691                 { 0x01000000,           MSG_SIGCONT_ALT },
1692                 { 0x02000000,           MSG_SIGTTIN_ALT },
1693                 { 0x04000000,           MSG_SIGTTOU_ALT },
1694                 { 0x08000000,           MSG_SIGVTALRM_ALT },
1695                 { 0x10000000,           MSG_SIGPROF_ALT },
1696                 { 0x20000000,           MSG_SIGXCPU_ALT },
1697                 { 0x40000000,           MSG_SIGXFSZ_ALT },
1698                 { 0x80000000,           MSG_SIGWAITING_ALT },
1699                 { 0,                    0 }
1700         };
1701         static const Val_desc vda1[] = {
1702                 { 0x00000001,           MSG_SIGLWP_ALT },
1703                 { 0x00000002,           MSG_SIGFREEZE_ALT },
1704                 { 0x00000004,           MSG_SIGTHAW_ALT },
1705                 { 0x00000008,           MSG_SIGCANCEL_ALT },
1706                 { 0x00000010,           MSG_SIGLOST_ALT },
1707                 { 0x00000020,           MSG_SIGXRES_ALT },
1708                 { 0x00000040,           MSG_SIGJVM1_ALT },
1709                 { 0x00000080,           MSG_SIGJVM2_ALT },
1710                 { 0,                    0 }
1711         };
1712         static const conv_bitmaskset_desc_t bitmask_desc[N_MASK] = {
1713                 { vda0, 0 },
1714                 { vda1, 0xffffff00 },
1715                 { NULL, 0xffffffff },
1716                 { NULL, 0xffffffff }
1717         };
1718 
1719         if (n_mask > N_MASK)
1720                 n_mask = N_MASK;
1721         return (conv_bitmaskset(maskarr, n_mask, bitmask_desc, fmt_flags,
1722             cnote_sigset_buf->buf, CONV_CNOTE_SIGSET_BUFSIZE));
1723 
1724 #undef N_MASK
1725 }
1726 
1727 
1728 #define FLTSET_FLAGSZ   CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
1729         /* \
1730          * fltset_t[0] - Faults [1 - 32] \
1731          * There are 19 unused bits, each of which needs two \
1732          * characters plus a separator. \
1733          */ \
1734         MSG_FLTILL_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1735         MSG_FLTPRIV_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1736         MSG_FLTBPT_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1737         MSG_FLTTRACE_ALT_SIZE   + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1738         MSG_FLTACCESS_ALT_SIZE  + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1739         MSG_FLTBOUNDS_ALT_SIZE  + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1740         MSG_FLTIOVF_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1741         MSG_FLTIZDIV_ALT_SIZE   + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1742         MSG_FLTFPE_ALT_SIZE     + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1743         MSG_FLTSTACK_ALT_SIZE   + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1744         MSG_FLTPAGE_ALT_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1745         MSG_FLTWATCH_ALT_SIZE   + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1746         MSG_FLTCPCOVF_ALT_SIZE  + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
1747         (19 * (2 + CONV_EXPN_FIELD_DEF_SEP_SIZE)) + \
1748         /* \
1749          * fltset_t [1] - Faults [33 - 64] \
1750          * There are 32 unused bits, each of which needs two \
1751          * characters plus a separator. \
1752          */ \
1753         (32 * (2 + CONV_EXPN_FIELD_DEF_SEP_SIZE)) + \
1754         /* \
1755          * fltset_t [2] - Faults [65 - 96] \
1756          * There are 32 unused bits, each of which needs two \
1757          * characters plus a separator. \
1758          */ \
1759         (32 * (2 + CONV_EXPN_FIELD_DEF_SEP_SIZE)) + \
1760         /* \
1761          * fltset_t [3] - Faults [97 - 128] \
1762          * There are 32 unused bits. Three of these need two \
1763          * characters, and 29 need 3. Each one needs a separator. \
1764          */ \
1765         (3 * (2 + CONV_EXPN_FIELD_DEF_SEP_SIZE)) + \
1766         (29 * (3 + CONV_EXPN_FIELD_DEF_SEP_SIZE)) + \
1767         \
1768         CONV_INV_BUFSIZE        + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
1769 
1770 /*
1771  * Ensure that Conv_cnote_fltset_buf_t is large enough:
1772  *
1773  * FLTSET_FLAGSZ is the real minimum size of the buffer required by
1774  * conv_cnote_fltset(). However, Conv_cnote_fltset_buf_t
1775  * uses CONV_CNOTE_FLTSET_BUFSIZE to set the buffer size. We do
1776  * things this way because the definition of FLTSET_FLAGSZ uses information
1777  * that is not available in the environment of other programs
1778  * that include the conv.h header file.
1779  */
1780 #if (CONV_CNOTE_FLTSET_BUFSIZE != FLTSET_FLAGSZ) && !defined(__lint)
1781 #define REPORT_BUFSIZE FLTSET_FLAGSZ
1782 #include "report_bufsize.h"
1783 #error "CONV_CNOTE_FLTSET_BUFSIZE does not match FLTSET_FLAGSZ"
1784 #endif
1785 
1786 const char *
1787 conv_cnote_fltset(uint32_t *maskarr, int n_mask,
1788     Conv_fmt_flags_t fmt_flags, Conv_cnote_fltset_buf_t *cnote_fltset_buf)
1789 {
1790 #define N_MASK 4
1791 
1792         static const Val_desc vda0[] = {
1793                 { 0x00000001,           MSG_FLTILL_ALT },
1794                 { 0x00000002,           MSG_FLTPRIV_ALT },
1795                 { 0x00000004,           MSG_FLTBPT_ALT },
1796                 { 0x00000008,           MSG_FLTTRACE_ALT },
1797                 { 0x00000010,           MSG_FLTACCESS_ALT },
1798                 { 0x00000020,           MSG_FLTBOUNDS_ALT },
1799                 { 0x00000040,           MSG_FLTIOVF_ALT },
1800                 { 0x00000080,           MSG_FLTIZDIV_ALT },
1801                 { 0x00000100,           MSG_FLTFPE_ALT },
1802                 { 0x00000200,           MSG_FLTSTACK_ALT },
1803                 { 0x00000400,           MSG_FLTPAGE_ALT },
1804                 { 0x00000800,           MSG_FLTWATCH_ALT },
1805                 { 0x00001000,           MSG_FLTCPCOVF_ALT },
1806                 { 0,                    0 }
1807         };
1808         static const conv_bitmaskset_desc_t bitmask_desc[N_MASK] = {
1809                 { vda0, 0xffffe000 },
1810                 { NULL, 0xffffffff },
1811                 { NULL, 0xffffffff },
1812                 { NULL, 0xffffffff }
1813         };
1814 
1815         if (n_mask > N_MASK)
1816                 n_mask = N_MASK;
1817         return (conv_bitmaskset(maskarr, n_mask, bitmask_desc, fmt_flags,
1818             cnote_fltset_buf->buf, CONV_CNOTE_FLTSET_BUFSIZE));
1819 
1820 #undef N_MASK
1821 }
1822 
1823 
1824 
1825 #define SYSSET_FLAGSZ   CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
1826         (512 * CONV_EXPN_FIELD_DEF_SEP_SIZE) + \
1827         \
1828         /* sysset_t[0] - System Calls [1 - 32] */ \
1829         MSG_SYS_EXIT_ALT_SIZE                   /* 1 */ + \
1830         MSG_SYS_2_SIZE                          /* 2 (unused) */ + \
1831         MSG_SYS_READ_ALT_SIZE                   /* 3 */ + \
1832         MSG_SYS_WRITE_ALT_SIZE                  /* 4 */ + \
1833         MSG_SYS_OPEN_ALT_SIZE                   /* 5 */ + \
1834         MSG_SYS_CLOSE_ALT_SIZE                  /* 6 */ + \
1835         MSG_SYS_7_SIZE                          /* 7 (unused) */ + \
1836         MSG_SYS_8_SIZE                          /* 8 (unused) */ + \
1837         MSG_SYS_LINK_ALT_SIZE                   /* 9 */ + \
1838         MSG_SYS_UNLINK_ALT_SIZE                 /* 10 */ + \
1839         MSG_SYS_11_SIZE                         /* 11 (unused) */ + \
1840         MSG_SYS_CHDIR_ALT_SIZE                  /* 12 */ + \
1841         MSG_SYS_TIME_ALT_SIZE                   /* 13 */ + \
1842         MSG_SYS_MKNOD_ALT_SIZE                  /* 14 */ + \
1843         MSG_SYS_CHMOD_ALT_SIZE                  /* 15 */ + \
1844         MSG_SYS_CHOWN_ALT_SIZE                  /* 16 */ + \
1845         MSG_SYS_BRK_ALT_SIZE                    /* 17 */ + \
1846         MSG_SYS_STAT_ALT_SIZE                   /* 18 */ + \
1847         MSG_SYS_LSEEK_ALT_SIZE                  /* 19 */ + \
1848         MSG_SYS_GETPID_ALT_SIZE                 /* 20 */ + \
1849         MSG_SYS_MOUNT_ALT_SIZE                  /* 21 */ + \
1850         MSG_SYS_22_SIZE                         /* 22 (unused) */ + \
1851         MSG_SYS_SETUID_ALT_SIZE                 /* 23 */ + \
1852         MSG_SYS_GETUID_ALT_SIZE                 /* 24 */ + \
1853         MSG_SYS_STIME_ALT_SIZE                  /* 25 */ + \
1854         MSG_SYS_PCSAMPLE_ALT_SIZE               /* 26 */ + \
1855         MSG_SYS_ALARM_ALT_SIZE                  /* 27 */ + \
1856         MSG_SYS_FSTAT_ALT_SIZE                  /* 28 */ + \
1857         MSG_SYS_PAUSE_ALT_SIZE                  /* 29 */ + \
1858         MSG_SYS_30_SIZE                         /* 30 (unused) */ + \
1859         MSG_SYS_STTY_ALT_SIZE                   /* 31 */ + \
1860         MSG_SYS_GTTY_ALT_SIZE                   /* 32 */ + \
1861         \
1862         /* sysset_t[1] - System Calls [33 - 64] */ \
1863         MSG_SYS_ACCESS_ALT_SIZE                 /* 33 */ + \
1864         MSG_SYS_NICE_ALT_SIZE                   /* 34 */ + \
1865         MSG_SYS_STATFS_ALT_SIZE                 /* 35 */ + \
1866         MSG_SYS_SYNC_ALT_SIZE                   /* 36 */ + \
1867         MSG_SYS_KILL_ALT_SIZE                   /* 37 */ + \
1868         MSG_SYS_FSTATFS_ALT_SIZE                /* 38 */ + \
1869         MSG_SYS_PGRPSYS_ALT_SIZE                /* 39 */ + \
1870         MSG_SYS_UUCOPYSTR_ALT_SIZE              /* 40 */ + \
1871         MSG_SYS_41_SIZE                         /* 41 (unused) */ + \
1872         MSG_SYS_PIPE_ALT_SIZE                   /* 42 */ + \
1873         MSG_SYS_TIMES_ALT_SIZE                  /* 43 */ + \
1874         MSG_SYS_PROFIL_ALT_SIZE                 /* 44 */ + \
1875         MSG_SYS_FACCESSAT_ALT_SIZE              /* 45 */ + \
1876         MSG_SYS_SETGID_ALT_SIZE                 /* 46 */ + \
1877         MSG_SYS_GETGID_ALT_SIZE                 /* 47 */ + \
1878         MSG_SYS_48_SIZE                         /* 48 (unused) */ + \
1879         MSG_SYS_MSGSYS_ALT_SIZE                 /* 49 */ + \
1880         MSG_SYS_SYSI86_ALT_SIZE                 /* 50 */ + \
1881         MSG_SYS_ACCT_ALT_SIZE                   /* 51 */ + \
1882         MSG_SYS_SHMSYS_ALT_SIZE                 /* 52 */ + \
1883         MSG_SYS_SEMSYS_ALT_SIZE                 /* 53 */ + \
1884         MSG_SYS_IOCTL_ALT_SIZE                  /* 54 */ + \
1885         MSG_SYS_UADMIN_ALT_SIZE                 /* 55 */ + \
1886         MSG_SYS_FCHOWNAT_ALT_SIZE               /* 56 */ + \
1887         MSG_SYS_UTSSYS_ALT_SIZE                 /* 57 */ + \
1888         MSG_SYS_FDSYNC_ALT_SIZE                 /* 58 */ + \
1889         MSG_SYS_EXECVE_ALT_SIZE                 /* 59 */ + \
1890         MSG_SYS_UMASK_ALT_SIZE                  /* 60 */ + \
1891         MSG_SYS_CHROOT_ALT_SIZE                 /* 61 */ + \
1892         MSG_SYS_FCNTL_ALT_SIZE                  /* 62 */ + \
1893         MSG_SYS_ULIMIT_ALT_SIZE                 /* 63 */ + \
1894         MSG_SYS_RENAMEAT_ALT_SIZE               /* 64 */ + \
1895         \
1896         /* sysset_t[2] - System Calls [65 - 96] */ \
1897         MSG_SYS_UNLINKAT_ALT_SIZE               /* 65 */ + \
1898         MSG_SYS_FSTATAT_ALT_SIZE                /* 66 */ + \
1899         MSG_SYS_FSTATAT64_ALT_SIZE              /* 67 */ + \
1900         MSG_SYS_OPENAT_ALT_SIZE                 /* 68 */ + \
1901         MSG_SYS_OPENAT64_ALT_SIZE               /* 69 */ + \
1902         MSG_SYS_TASKSYS_ALT_SIZE                /* 70 */ + \
1903         MSG_SYS_ACCTCTL_ALT_SIZE                /* 71 */ + \
1904         MSG_SYS_EXACCTSYS_ALT_SIZE              /* 72 */ + \
1905         MSG_SYS_GETPAGESIZES_ALT_SIZE           /* 73 */ + \
1906         MSG_SYS_RCTLSYS_ALT_SIZE                /* 74 */ + \
1907         MSG_SYS_SIDSYS_ALT_SIZE                 /* 75 */ + \
1908         MSG_SYS_76_SIZE                         /* 76 (unused) */ + \
1909         MSG_SYS_LWP_PARK_ALT_SIZE               /* 77 */ + \
1910         MSG_SYS_SENDFILEV_ALT_SIZE              /* 78 */ + \
1911         MSG_SYS_RMDIR_ALT_SIZE                  /* 79 */ + \
1912         MSG_SYS_MKDIR_ALT_SIZE                  /* 80 */ + \
1913         MSG_SYS_GETDENTS_ALT_SIZE               /* 81 */ + \
1914         MSG_SYS_PRIVSYS_ALT_SIZE                /* 82 */ + \
1915         MSG_SYS_UCREDSYS_ALT_SIZE               /* 83 */ + \
1916         MSG_SYS_SYSFS_ALT_SIZE                  /* 84 */ + \
1917         MSG_SYS_GETMSG_ALT_SIZE                 /* 85 */ + \
1918         MSG_SYS_PUTMSG_ALT_SIZE                 /* 86 */ + \
1919         MSG_SYS_87_SIZE                         /* 87 (unused) */ + \
1920         MSG_SYS_LSTAT_ALT_SIZE                  /* 88 */ + \
1921         MSG_SYS_SYMLINK_ALT_SIZE                /* 89 */ + \
1922         MSG_SYS_READLINK_ALT_SIZE               /* 90 */ + \
1923         MSG_SYS_SETGROUPS_ALT_SIZE              /* 91 */ + \
1924         MSG_SYS_GETGROUPS_ALT_SIZE              /* 92 */ + \
1925         MSG_SYS_FCHMOD_ALT_SIZE                 /* 93 */ + \
1926         MSG_SYS_FCHOWN_ALT_SIZE                 /* 94 */ + \
1927         MSG_SYS_SIGPROCMASK_ALT_SIZE            /* 95 */ + \
1928         MSG_SYS_SIGSUSPEND_ALT_SIZE             /* 96 */ + \
1929         \
1930         /* sysset_t[3] - System Calls [97 - 128] */ \
1931         MSG_SYS_SIGALTSTACK_ALT_SIZE            /* 97 */ + \
1932         MSG_SYS_SIGACTION_ALT_SIZE              /* 98 */ + \
1933         MSG_SYS_SIGPENDING_ALT_SIZE             /* 99 */ + \
1934         MSG_SYS_CONTEXT_ALT_SIZE                /* 100 */ + \
1935         MSG_SYS_101_SIZE                        /* 101 (unused) */ + \
1936         MSG_SYS_102_SIZE                        /* 102 (unused) */ + \
1937         MSG_SYS_STATVFS_ALT_SIZE                /* 103 */ + \
1938         MSG_SYS_FSTATVFS_ALT_SIZE               /* 104 */ + \
1939         MSG_SYS_GETLOADAVG_ALT_SIZE             /* 105 */ + \
1940         MSG_SYS_NFSSYS_ALT_SIZE                 /* 106 */ + \
1941         MSG_SYS_WAITID_ALT_SIZE                 /* 107 */ + \
1942         MSG_SYS_SIGSENDSYS_ALT_SIZE             /* 108 */ + \
1943         MSG_SYS_HRTSYS_ALT_SIZE                 /* 109 */ + \
1944         MSG_SYS_UTIMESYS_ALT_SIZE               /* 110 */ + \
1945         MSG_SYS_SIGRESEND_ALT_SIZE              /* 111 */ + \
1946         MSG_SYS_PRIOCNTLSYS_ALT_SIZE            /* 112 */ + \
1947         MSG_SYS_PATHCONF_ALT_SIZE               /* 113 */ + \
1948         MSG_SYS_MINCORE_ALT_SIZE                /* 114 */ + \
1949         MSG_SYS_MMAP_ALT_SIZE                   /* 115 */ + \
1950         MSG_SYS_MPROTECT_ALT_SIZE               /* 116 */ + \
1951         MSG_SYS_MUNMAP_ALT_SIZE                 /* 117 */ + \
1952         MSG_SYS_FPATHCONF_ALT_SIZE              /* 118 */ + \
1953         MSG_SYS_VFORK_ALT_SIZE                  /* 119 */ + \
1954         MSG_SYS_FCHDIR_ALT_SIZE                 /* 120 */ + \
1955         MSG_SYS_READV_ALT_SIZE                  /* 121 */ + \
1956         MSG_SYS_WRITEV_ALT_SIZE                 /* 122 */ + \
1957         MSG_SYS_123_SIZE                        /* 123 (unused) */ + \
1958         MSG_SYS_124_SIZE                        /* 124 (unused) */ + \
1959         MSG_SYS_125_SIZE                        /* 125 (unused) */ + \
1960         MSG_SYS_126_SIZE                        /* 126 (unused) */ + \
1961         MSG_SYS_MMAPOBJ_ALT_SIZE                /* 127 */ + \
1962         MSG_SYS_SETRLIMIT_ALT_SIZE              /* 128 */ + \
1963         \
1964         /* sysset_t[4] - System Calls [129 - 160] */ \
1965         MSG_SYS_GETRLIMIT_ALT_SIZE              /* 129 */ + \
1966         MSG_SYS_LCHOWN_ALT_SIZE                 /* 130 */ + \
1967         MSG_SYS_MEMCNTL_ALT_SIZE                /* 131 */ + \
1968         MSG_SYS_GETPMSG_ALT_SIZE                /* 132 */ + \
1969         MSG_SYS_PUTPMSG_ALT_SIZE                /* 133 */ + \
1970         MSG_SYS_RENAME_ALT_SIZE                 /* 134 */ + \
1971         MSG_SYS_UNAME_ALT_SIZE                  /* 135 */ + \
1972         MSG_SYS_SETEGID_ALT_SIZE                /* 136 */ + \
1973         MSG_SYS_SYSCONFIG_ALT_SIZE              /* 137 */ + \
1974         MSG_SYS_ADJTIME_ALT_SIZE                /* 138 */ + \
1975         MSG_SYS_SYSTEMINFO_ALT_SIZE             /* 139 */ + \
1976         MSG_SYS_SHAREFS_ALT_SIZE                /* 140 */ + \
1977         MSG_SYS_SETEUID_ALT_SIZE                /* 141 */ + \
1978         MSG_SYS_FORKSYS_ALT_SIZE                /* 142 */ + \
1979         MSG_SYS_143_SIZE                        /* 143 (unused) */ + \
1980         MSG_SYS_SIGTIMEDWAIT_ALT_SIZE           /* 144 */ + \
1981         MSG_SYS_LWP_INFO_ALT_SIZE               /* 145 */ + \
1982         MSG_SYS_YIELD_ALT_SIZE                  /* 146 */ + \
1983         MSG_SYS_147_SIZE                        /* 147 (unused) */ + \
1984         MSG_SYS_LWP_SEMA_POST_ALT_SIZE          /* 148 */ + \
1985         MSG_SYS_LWP_SEMA_TRYWAIT_ALT_SIZE       /* 149 */ + \
1986         MSG_SYS_LWP_DETACH_ALT_SIZE             /* 150 */ + \
1987         MSG_SYS_CORECTL_ALT_SIZE                /* 151 */ + \
1988         MSG_SYS_MODCTL_ALT_SIZE                 /* 152 */ + \
1989         MSG_SYS_FCHROOT_ALT_SIZE                /* 153 */ + \
1990         MSG_SYS_154_SIZE                        /* 154 (unused) */ + \
1991         MSG_SYS_VHANGUP_ALT_SIZE                /* 155 */ + \
1992         MSG_SYS_GETTIMEOFDAY_ALT_SIZE           /* 156 */ + \
1993         MSG_SYS_GETITIMER_ALT_SIZE              /* 157 */ + \
1994         MSG_SYS_SETITIMER_ALT_SIZE              /* 158 */ + \
1995         MSG_SYS_LWP_CREATE_ALT_SIZE             /* 159 */ + \
1996         MSG_SYS_LWP_EXIT_ALT_SIZE               /* 160 */ + \
1997         \
1998         /* sysset_t[5] - System Calls [161 - 192] */ \
1999         MSG_SYS_LWP_SUSPEND_ALT_SIZE            /* 161 */ + \
2000         MSG_SYS_LWP_CONTINUE_ALT_SIZE           /* 162 */ + \
2001         MSG_SYS_LWP_KILL_ALT_SIZE               /* 163 */ + \
2002         MSG_SYS_LWP_SELF_ALT_SIZE               /* 164 */ + \
2003         MSG_SYS_LWP_SIGMASK_ALT_SIZE            /* 165 */ + \
2004         MSG_SYS_LWP_PRIVATE_ALT_SIZE            /* 166 */ + \
2005         MSG_SYS_LWP_WAIT_ALT_SIZE               /* 167 */ + \
2006         MSG_SYS_LWP_MUTEX_WAKEUP_ALT_SIZE       /* 168 */ + \
2007         MSG_SYS_169_SIZE                        /* 169 (unused) */ + \
2008         MSG_SYS_LWP_COND_WAIT_ALT_SIZE          /* 170 */ + \
2009         MSG_SYS_LWP_COND_SIGNAL_ALT_SIZE        /* 171 */ + \
2010         MSG_SYS_LWP_COND_BROADCAST_ALT_SIZE     /* 172 */ + \
2011         MSG_SYS_PREAD_ALT_SIZE                  /* 173 */ + \
2012         MSG_SYS_PWRITE_ALT_SIZE                 /* 174 */ + \
2013         MSG_SYS_LLSEEK_ALT_SIZE                 /* 175 */ + \
2014         MSG_SYS_INST_SYNC_ALT_SIZE              /* 176 */ + \
2015         MSG_SYS_BRAND_ALT_SIZE                  /* 177 */ + \
2016         MSG_SYS_KAIO_ALT_SIZE                   /* 178 */ + \
2017         MSG_SYS_CPC_ALT_SIZE                    /* 179 */ + \
2018         MSG_SYS_LGRPSYS_ALT_SIZE                /* 180 */ + \
2019         MSG_SYS_RUSAGESYS_ALT_SIZE              /* 181 */ + \
2020         MSG_SYS_PORT_ALT_SIZE                   /* 182 */ + \
2021         MSG_SYS_POLLSYS_ALT_SIZE                /* 183 */ + \
2022         MSG_SYS_LABELSYS_ALT_SIZE               /* 184 */ + \
2023         MSG_SYS_ACL_ALT_SIZE                    /* 185 */ + \
2024         MSG_SYS_AUDITSYS_ALT_SIZE               /* 186 */ + \
2025         MSG_SYS_PROCESSOR_BIND_ALT_SIZE         /* 187 */ + \
2026         MSG_SYS_PROCESSOR_INFO_ALT_SIZE         /* 188 */ + \
2027         MSG_SYS_P_ONLINE_ALT_SIZE               /* 189 */ + \
2028         MSG_SYS_SIGQUEUE_ALT_SIZE               /* 190 */ + \
2029         MSG_SYS_CLOCK_GETTIME_ALT_SIZE          /* 191 */ + \
2030         MSG_SYS_CLOCK_SETTIME_ALT_SIZE          /* 192 */ + \
2031         \
2032         /* sysset_t[6] - System Calls [193 - 224] */ \
2033         MSG_SYS_CLOCK_GETRES_ALT_SIZE           /* 193 */ + \
2034         MSG_SYS_TIMER_CREATE_ALT_SIZE           /* 194 */ + \
2035         MSG_SYS_TIMER_DELETE_ALT_SIZE           /* 195 */ + \
2036         MSG_SYS_TIMER_SETTIME_ALT_SIZE          /* 196 */ + \
2037         MSG_SYS_TIMER_GETTIME_ALT_SIZE          /* 197 */ + \
2038         MSG_SYS_TIMER_GETOVERRUN_ALT_SIZE       /* 198 */ + \
2039         MSG_SYS_NANOSLEEP_ALT_SIZE              /* 199 */ + \
2040         MSG_SYS_FACL_ALT_SIZE                   /* 200 */ + \
2041         MSG_SYS_DOOR_ALT_SIZE                   /* 201 */ + \
2042         MSG_SYS_SETREUID_ALT_SIZE               /* 202 */ + \
2043         MSG_SYS_SETREGID_ALT_SIZE               /* 203 */ + \
2044         MSG_SYS_INSTALL_UTRAP_ALT_SIZE          /* 204 */ + \
2045         MSG_SYS_SIGNOTIFY_ALT_SIZE              /* 205 */ + \
2046         MSG_SYS_SCHEDCTL_ALT_SIZE               /* 206 */ + \
2047         MSG_SYS_PSET_ALT_SIZE                   /* 207 */ + \
2048         MSG_SYS_SPARC_UTRAP_INSTALL_ALT_SIZE    /* 208 */ + \
2049         MSG_SYS_RESOLVEPATH_ALT_SIZE            /* 209 */ + \
2050         MSG_SYS_LWP_MUTEX_TIMEDLOCK_ALT_SIZE    /* 210 */ + \
2051         MSG_SYS_LWP_SEMA_TIMEDWAIT_ALT_SIZE     /* 211 */ + \
2052         MSG_SYS_LWP_RWLOCK_SYS_ALT_SIZE         /* 212 */ + \
2053         MSG_SYS_GETDENTS64_ALT_SIZE             /* 213 */ + \
2054         MSG_SYS_MMAP64_ALT_SIZE                 /* 214 */ + \
2055         MSG_SYS_STAT64_ALT_SIZE                 /* 215 */ + \
2056         MSG_SYS_LSTAT64_ALT_SIZE                /* 216 */ + \
2057         MSG_SYS_FSTAT64_ALT_SIZE                /* 217 */ + \
2058         MSG_SYS_STATVFS64_ALT_SIZE              /* 218 */ + \
2059         MSG_SYS_FSTATVFS64_ALT_SIZE             /* 219 */ + \
2060         MSG_SYS_SETRLIMIT64_ALT_SIZE            /* 220 */ + \
2061         MSG_SYS_GETRLIMIT64_ALT_SIZE            /* 221 */ + \
2062         MSG_SYS_PREAD64_ALT_SIZE                /* 222 */ + \
2063         MSG_SYS_PWRITE64_ALT_SIZE               /* 223 */ + \
2064         MSG_SYS_224_SIZE                        /* 224 (unused) */ + \
2065         \
2066         /* sysset_t[7] - System Calls [225 - 256] */ \
2067         MSG_SYS_OPEN64_ALT_SIZE                 /* 225 */ + \
2068         MSG_SYS_RPCSYS_ALT_SIZE                 /* 226 */ + \
2069         MSG_SYS_ZONE_ALT_SIZE                   /* 227 */ + \
2070         MSG_SYS_AUTOFSSYS_ALT_SIZE              /* 228 */ + \
2071         MSG_SYS_GETCWD_ALT_SIZE                 /* 229 */ + \
2072         MSG_SYS_SO_SOCKET_ALT_SIZE              /* 230 */ + \
2073         MSG_SYS_SO_SOCKETPAIR_ALT_SIZE          /* 231 */ + \
2074         MSG_SYS_BIND_ALT_SIZE                   /* 232 */ + \
2075         MSG_SYS_LISTEN_ALT_SIZE                 /* 233 */ + \
2076         MSG_SYS_ACCEPT_ALT_SIZE                 /* 234 */ + \
2077         MSG_SYS_CONNECT_ALT_SIZE                /* 235 */ + \
2078         MSG_SYS_SHUTDOWN_ALT_SIZE               /* 236 */ + \
2079         MSG_SYS_RECV_ALT_SIZE                   /* 237 */ + \
2080         MSG_SYS_RECVFROM_ALT_SIZE               /* 238 */ + \
2081         MSG_SYS_RECVMSG_ALT_SIZE                /* 239 */ + \
2082         MSG_SYS_SEND_ALT_SIZE                   /* 240 */ + \
2083         MSG_SYS_SENDMSG_ALT_SIZE                /* 241 */ + \
2084         MSG_SYS_SENDTO_ALT_SIZE                 /* 242 */ + \
2085         MSG_SYS_GETPEERNAME_ALT_SIZE            /* 243 */ + \
2086         MSG_SYS_GETSOCKNAME_ALT_SIZE            /* 244 */ + \
2087         MSG_SYS_GETSOCKOPT_ALT_SIZE             /* 245 */ + \
2088         MSG_SYS_SETSOCKOPT_ALT_SIZE             /* 246 */ + \
2089         MSG_SYS_SOCKCONFIG_ALT_SIZE             /* 247 */ + \
2090         MSG_SYS_NTP_GETTIME_ALT_SIZE            /* 248 */ + \
2091         MSG_SYS_NTP_ADJTIME_ALT_SIZE            /* 249 */ + \
2092         MSG_SYS_LWP_MUTEX_UNLOCK_ALT_SIZE       /* 250 */ + \
2093         MSG_SYS_LWP_MUTEX_TRYLOCK_ALT_SIZE      /* 251 */ + \
2094         MSG_SYS_LWP_MUTEX_REGISTER_ALT_SIZE     /* 252 */ + \
2095         MSG_SYS_CLADM_ALT_SIZE                  /* 253 */ + \
2096         MSG_SYS_UUCOPY_ALT_SIZE                 /* 254 */ + \
2097         MSG_SYS_UMOUNT2_ALT_SIZE                /* 255 */ + \
2098         3                                       /* 256 (unused) */ + \
2099         \
2100         /* sysset_t[8] - System Calls [257 - 288] */ \
2101         (32 * 3)                                /* 257 - 288 (unused) */ + \
2102         \
2103         /* sysset_t[9] - System Calls [289 - 320] */ \
2104         (32 * 3)                                /* 289 - 320 (unused) */ + \
2105         \
2106         /* sysset_t[10] - System Calls [321 - 352] */ \
2107         (32 * 3)                                /* 321 - 352 (unused) */ + \
2108         \
2109         /* sysset_t[11] - System Calls [353 - 384] */ \
2110         (32 * 3)                                /* 353 - 384 (unused) */ + \
2111         \
2112         /* sysset_t[12] - System Calls [385 - 416] */ \
2113         (32 * 3)                                /* 385 - 416 (unused) */ + \
2114         \
2115         /* sysset_t[13] - System Calls [417 - 448] */ \
2116         (32 * 3)                                /* 417 - 448 (unused) */ + \
2117         \
2118         /* sysset_t[14] - System Calls [449 - 480] */ \
2119         (32 * 3)                                /* 449 - 480 (unused) */ + \
2120         \
2121         /* sysset_t[15] - System Calls [481 - 512] */ \
2122         (32 * 3)                                /* 481 - 512 (unused) */ + \
2123         \
2124         CONV_INV_BUFSIZE        + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
2125 
2126 /*
2127  * Ensure that Conv_cnote_sysset_buf_t is large enough:
2128  *
2129  * SYSSET_FLAGSZ is the real minimum size of the buffer required by
2130  * conv_cnote_sysset(). However, Conv_cnote_sysset_buf_t
2131  * uses CONV_CNOTE_SYSSET_BUFSIZE to set the buffer size. We do
2132  * things this way because the definition of SYSSET_FLAGSZ uses information
2133  * that is not available in the environment of other programs
2134  * that include the conv.h header file.
2135  */
2136 #if (CONV_CNOTE_SYSSET_BUFSIZE != SYSSET_FLAGSZ) && !defined(__lint)
2137 #define REPORT_BUFSIZE SYSSET_FLAGSZ
2138 #include "report_bufsize.h"
2139 #error "CONV_CNOTE_SYSSET_BUFSIZE does not match SYSSET_FLAGSZ"
2140 #endif
2141 
2142 const char *
2143 conv_cnote_sysset(uint32_t *maskarr, int n_mask,
2144     Conv_fmt_flags_t fmt_flags, Conv_cnote_sysset_buf_t *cnote_sysset_buf)
2145 {
2146 #define N_MASK 16
2147 
2148         static const Val_desc vda0[] = {        /* System Calls [1 - 32] */
2149                 { 0x00000001,   MSG_SYS_EXIT_ALT },
2150                 { 0x00000002,   MSG_SYS_2 },
2151                 { 0x00000004,   MSG_SYS_READ_ALT },
2152                 { 0x00000008,   MSG_SYS_WRITE_ALT },
2153                 { 0x00000010,   MSG_SYS_OPEN_ALT },
2154                 { 0x00000020,   MSG_SYS_CLOSE_ALT },
2155                 { 0x00000040,   MSG_SYS_7 },
2156                 { 0x00000080,   MSG_SYS_8 },
2157                 { 0x00000100,   MSG_SYS_LINK_ALT },
2158                 { 0x00000200,   MSG_SYS_UNLINK_ALT },
2159                 { 0x00000400,   MSG_SYS_11 },
2160                 { 0x00000800,   MSG_SYS_CHDIR_ALT },
2161                 { 0x00001000,   MSG_SYS_TIME_ALT },
2162                 { 0x00002000,   MSG_SYS_MKNOD_ALT },
2163                 { 0x00004000,   MSG_SYS_CHMOD_ALT },
2164                 { 0x00008000,   MSG_SYS_CHOWN_ALT },
2165                 { 0x00010000,   MSG_SYS_BRK_ALT },
2166                 { 0x00020000,   MSG_SYS_STAT_ALT },
2167                 { 0x00040000,   MSG_SYS_LSEEK_ALT },
2168                 { 0x00080000,   MSG_SYS_GETPID_ALT },
2169                 { 0x00100000,   MSG_SYS_MOUNT_ALT },
2170                 { 0x00200000,   MSG_SYS_22 },
2171                 { 0x00400000,   MSG_SYS_SETUID_ALT },
2172                 { 0x00800000,   MSG_SYS_GETUID_ALT },
2173                 { 0x01000000,   MSG_SYS_STIME_ALT },
2174                 { 0x02000000,   MSG_SYS_PCSAMPLE_ALT },
2175                 { 0x04000000,   MSG_SYS_ALARM_ALT },
2176                 { 0x08000000,   MSG_SYS_FSTAT_ALT },
2177                 { 0x10000000,   MSG_SYS_PAUSE_ALT },
2178                 { 0x20000000,   MSG_SYS_30 },
2179                 { 0x40000000,   MSG_SYS_STTY_ALT },
2180                 { 0x80000000,   MSG_SYS_GTTY_ALT },
2181                 { 0,            0 }
2182         };
2183         static const Val_desc vda1[] = {        /* System Calls [33 - 64] */
2184                 { 0x00000001,   MSG_SYS_ACCESS_ALT },
2185                 { 0x00000002,   MSG_SYS_NICE_ALT },
2186                 { 0x00000004,   MSG_SYS_STATFS_ALT },
2187                 { 0x00000008,   MSG_SYS_SYNC_ALT },
2188                 { 0x00000010,   MSG_SYS_KILL_ALT },
2189                 { 0x00000020,   MSG_SYS_FSTATFS_ALT },
2190                 { 0x00000040,   MSG_SYS_PGRPSYS_ALT },
2191                 { 0x00000080,   MSG_SYS_UUCOPYSTR_ALT },
2192                 { 0x00000100,   MSG_SYS_41 },
2193                 { 0x00000200,   MSG_SYS_PIPE_ALT },
2194                 { 0x00000400,   MSG_SYS_TIMES_ALT },
2195                 { 0x00000800,   MSG_SYS_PROFIL_ALT },
2196                 { 0x00001000,   MSG_SYS_FACCESSAT_ALT },
2197                 { 0x00002000,   MSG_SYS_SETGID_ALT },
2198                 { 0x00004000,   MSG_SYS_GETGID_ALT },
2199                 { 0x00008000,   MSG_SYS_48 },
2200                 { 0x00010000,   MSG_SYS_MSGSYS_ALT },
2201                 { 0x00020000,   MSG_SYS_SYSI86_ALT },
2202                 { 0x00040000,   MSG_SYS_ACCT_ALT },
2203                 { 0x00080000,   MSG_SYS_SHMSYS_ALT },
2204                 { 0x00100000,   MSG_SYS_SEMSYS_ALT },
2205                 { 0x00200000,   MSG_SYS_IOCTL_ALT },
2206                 { 0x00400000,   MSG_SYS_UADMIN_ALT },
2207                 { 0x00800000,   MSG_SYS_FCHOWNAT_ALT },
2208                 { 0x01000000,   MSG_SYS_UTSSYS_ALT },
2209                 { 0x0200000,    MSG_SYS_FDSYNC_ALT },
2210                 { 0x04000000,   MSG_SYS_EXECVE_ALT },
2211                 { 0x08000000,   MSG_SYS_UMASK_ALT },
2212                 { 0x10000000,   MSG_SYS_CHROOT_ALT },
2213                 { 0x20000000,   MSG_SYS_FCNTL_ALT },
2214                 { 0x40000000,   MSG_SYS_ULIMIT_ALT },
2215                 { 0x80000000,   MSG_SYS_RENAMEAT_ALT },
2216                 { 0,            0 }
2217         };
2218         static const Val_desc vda2[] = {        /* System Calls [65 - 96] */
2219                 { 0x00000001,   MSG_SYS_UNLINKAT_ALT },
2220                 { 0x00000002,   MSG_SYS_FSTATAT_ALT },
2221                 { 0x00000004,   MSG_SYS_FSTATAT64_ALT },
2222                 { 0x00000008,   MSG_SYS_OPENAT_ALT },
2223                 { 0x00000010,   MSG_SYS_OPENAT64_ALT },
2224                 { 0x00000020,   MSG_SYS_TASKSYS_ALT },
2225                 { 0x00000040,   MSG_SYS_ACCTCTL_ALT },
2226                 { 0x00000080,   MSG_SYS_EXACCTSYS_ALT },
2227                 { 0x00000100,   MSG_SYS_GETPAGESIZES_ALT },
2228                 { 0x00000200,   MSG_SYS_RCTLSYS_ALT },
2229                 { 0x00000400,   MSG_SYS_SIDSYS_ALT },
2230                 { 0x00000800,   MSG_SYS_76 },
2231                 { 0x00001000,   MSG_SYS_LWP_PARK_ALT },
2232                 { 0x00002000,   MSG_SYS_SENDFILEV_ALT },
2233                 { 0x00004000,   MSG_SYS_RMDIR_ALT },
2234                 { 0x00008000,   MSG_SYS_MKDIR_ALT },
2235                 { 0x00010000,   MSG_SYS_GETDENTS_ALT },
2236                 { 0x00020000,   MSG_SYS_PRIVSYS_ALT },
2237                 { 0x00040000,   MSG_SYS_UCREDSYS_ALT },
2238                 { 0x00080000,   MSG_SYS_SYSFS_ALT },
2239                 { 0x00100000,   MSG_SYS_GETMSG_ALT },
2240                 { 0x00200000,   MSG_SYS_PUTMSG_ALT },
2241                 { 0x00400000,   MSG_SYS_87 },
2242                 { 0x00800000,   MSG_SYS_LSTAT_ALT },
2243                 { 0x01000000,   MSG_SYS_SYMLINK_ALT },
2244                 { 0x02000000,   MSG_SYS_READLINK_ALT },
2245                 { 0x04000000,   MSG_SYS_SETGROUPS_ALT },
2246                 { 0x08000000,   MSG_SYS_GETGROUPS_ALT },
2247                 { 0x10000000,   MSG_SYS_FCHMOD_ALT },
2248                 { 0x20000000,   MSG_SYS_FCHOWN_ALT },
2249                 { 0x40000000,   MSG_SYS_SIGPROCMASK_ALT },
2250                 { 0x80000000,   MSG_SYS_SIGSUSPEND_ALT },
2251                 { 0,            0 }
2252         };
2253         static const Val_desc vda3[] = {        /* System Calls [97 - 128] */
2254                 { 0x00000001,   MSG_SYS_SIGALTSTACK_ALT },
2255                 { 0x00000002,   MSG_SYS_SIGACTION_ALT },
2256                 { 0x00000004,   MSG_SYS_SIGPENDING_ALT },
2257                 { 0x00000008,   MSG_SYS_CONTEXT_ALT },
2258                 { 0x00000010,   MSG_SYS_101 },
2259                 { 0x00000020,   MSG_SYS_102 },
2260                 { 0x00000040,   MSG_SYS_STATVFS_ALT },
2261                 { 0x00000080,   MSG_SYS_FSTATVFS_ALT },
2262                 { 0x00000100,   MSG_SYS_GETLOADAVG_ALT },
2263                 { 0x00000200,   MSG_SYS_NFSSYS_ALT },
2264                 { 0x00000400,   MSG_SYS_WAITID_ALT },
2265                 { 0x00000800,   MSG_SYS_SIGSENDSYS_ALT },
2266                 { 0x00001000,   MSG_SYS_HRTSYS_ALT },
2267                 { 0x00002000,   MSG_SYS_UTIMESYS_ALT },
2268                 { 0x00004000,   MSG_SYS_SIGRESEND_ALT },
2269                 { 0x00008000,   MSG_SYS_PRIOCNTLSYS_ALT },
2270                 { 0x00010000,   MSG_SYS_PATHCONF_ALT },
2271                 { 0x00020000,   MSG_SYS_MINCORE_ALT },
2272                 { 0x00040000,   MSG_SYS_MMAP_ALT },
2273                 { 0x00080000,   MSG_SYS_MPROTECT_ALT },
2274                 { 0x00100000,   MSG_SYS_MUNMAP_ALT },
2275                 { 0x00200000,   MSG_SYS_FPATHCONF_ALT },
2276                 { 0x00400000,   MSG_SYS_VFORK_ALT },
2277                 { 0x00800000,   MSG_SYS_FCHDIR_ALT },
2278                 { 0x01000000,   MSG_SYS_READV_ALT },
2279                 { 0x02000000,   MSG_SYS_WRITEV_ALT },
2280                 { 0x04000000,   MSG_SYS_123 },
2281                 { 0x08000000,   MSG_SYS_124 },
2282                 { 0x10000000,   MSG_SYS_125 },
2283                 { 0x20000000,   MSG_SYS_126 },
2284                 { 0x40000000,   MSG_SYS_MMAPOBJ_ALT },
2285                 { 0x80000000,   MSG_SYS_SETRLIMIT_ALT },
2286                 { 0,                    0 }
2287         };
2288         static const Val_desc vda4[] = {        /* System Calls [129 - 160] */
2289                 { 0x00000001,   MSG_SYS_GETRLIMIT_ALT },
2290                 { 0x00000002,   MSG_SYS_LCHOWN_ALT },
2291                 { 0x00000004,   MSG_SYS_MEMCNTL_ALT },
2292                 { 0x00000008,   MSG_SYS_GETPMSG_ALT },
2293                 { 0x00000010,   MSG_SYS_PUTPMSG_ALT },
2294                 { 0x00000020,   MSG_SYS_RENAME_ALT },
2295                 { 0x00000040,   MSG_SYS_UNAME_ALT },
2296                 { 0x00000080,   MSG_SYS_SETEGID_ALT },
2297                 { 0x00000100,   MSG_SYS_SYSCONFIG_ALT },
2298                 { 0x00000200,   MSG_SYS_ADJTIME_ALT },
2299                 { 0x00000400,   MSG_SYS_SYSTEMINFO_ALT },
2300                 { 0x00000800,   MSG_SYS_SHAREFS_ALT },
2301                 { 0x00001000,   MSG_SYS_SETEUID_ALT },
2302                 { 0x00002000,   MSG_SYS_FORKSYS_ALT },
2303                 { 0x00004000,   MSG_SYS_143 },
2304                 { 0x00008000,   MSG_SYS_SIGTIMEDWAIT_ALT },
2305                 { 0x00010000,   MSG_SYS_LWP_INFO_ALT },
2306                 { 0x00020000,   MSG_SYS_YIELD_ALT },
2307                 { 0x00040000,   MSG_SYS_147 },
2308                 { 0x00080000,   MSG_SYS_LWP_SEMA_POST_ALT },
2309                 { 0x00100000,   MSG_SYS_LWP_SEMA_TRYWAIT_ALT },
2310                 { 0x00200000,   MSG_SYS_LWP_DETACH_ALT },
2311                 { 0x00400000,   MSG_SYS_CORECTL_ALT },
2312                 { 0x00800000,   MSG_SYS_MODCTL_ALT },
2313                 { 0x01000000,   MSG_SYS_FCHROOT_ALT },
2314                 { 0x02000000,   MSG_SYS_154 },
2315                 { 0x04000000,   MSG_SYS_VHANGUP_ALT },
2316                 { 0x08000000,   MSG_SYS_GETTIMEOFDAY_ALT },
2317                 { 0x10000000,   MSG_SYS_GETITIMER_ALT },
2318                 { 0x20000000,   MSG_SYS_SETITIMER_ALT },
2319                 { 0x40000000,   MSG_SYS_LWP_CREATE_ALT },
2320                 { 0x80000000,   MSG_SYS_LWP_EXIT_ALT },
2321                 { 0,            0 }
2322         };
2323         static const Val_desc vda5[] = {        /* System Calls [161 - 192] */
2324                 { 0x00000001,   MSG_SYS_LWP_SUSPEND_ALT },
2325                 { 0x00000002,   MSG_SYS_LWP_CONTINUE_ALT },
2326                 { 0x00000004,   MSG_SYS_LWP_KILL_ALT },
2327                 { 0x00000008,   MSG_SYS_LWP_SELF_ALT },
2328                 { 0x00000010,   MSG_SYS_LWP_SIGMASK_ALT },
2329                 { 0x00000020,   MSG_SYS_LWP_PRIVATE_ALT },
2330                 { 0x00000040,   MSG_SYS_LWP_WAIT_ALT },
2331                 { 0x00000080,   MSG_SYS_LWP_MUTEX_WAKEUP_ALT },
2332                 { 0x00000100,   MSG_SYS_169 },
2333                 { 0x00000200,   MSG_SYS_LWP_COND_WAIT_ALT },
2334                 { 0x00000400,   MSG_SYS_LWP_COND_SIGNAL_ALT },
2335                 { 0x00000800,   MSG_SYS_LWP_COND_BROADCAST_ALT },
2336                 { 0x00001000,   MSG_SYS_PREAD_ALT },
2337                 { 0x00002000,   MSG_SYS_PWRITE_ALT },
2338                 { 0x00004000,   MSG_SYS_LLSEEK_ALT },
2339                 { 0x00008000,   MSG_SYS_INST_SYNC_ALT },
2340                 { 0x00010000,   MSG_SYS_BRAND_ALT },
2341                 { 0x00020000,   MSG_SYS_KAIO_ALT },
2342                 { 0x00040000,   MSG_SYS_CPC_ALT },
2343                 { 0x00080000,   MSG_SYS_LGRPSYS_ALT },
2344                 { 0x00100000,   MSG_SYS_RUSAGESYS_ALT },
2345                 { 0x00200000,   MSG_SYS_PORT_ALT },
2346                 { 0x00400000,   MSG_SYS_POLLSYS_ALT },
2347                 { 0x00800000,   MSG_SYS_LABELSYS_ALT },
2348                 { 0x01000000,   MSG_SYS_ACL_ALT },
2349                 { 0x02000000,   MSG_SYS_AUDITSYS_ALT },
2350                 { 0x04000000,   MSG_SYS_PROCESSOR_BIND_ALT },
2351                 { 0x08000000,   MSG_SYS_PROCESSOR_INFO_ALT },
2352                 { 0x10000000,   MSG_SYS_P_ONLINE_ALT },
2353                 { 0x20000000,   MSG_SYS_SIGQUEUE_ALT },
2354                 { 0x40000000,   MSG_SYS_CLOCK_GETTIME_ALT },
2355                 { 0x80000000,   MSG_SYS_CLOCK_SETTIME_ALT },
2356                 { 0,            0 }
2357         };
2358         static const Val_desc vda6[] = {        /* System Calls [193 - 224] */
2359                 { 0x00000001,   MSG_SYS_CLOCK_GETRES_ALT },
2360                 { 0x00000002,   MSG_SYS_TIMER_CREATE_ALT },
2361                 { 0x00000004,   MSG_SYS_TIMER_DELETE_ALT },
2362                 { 0x00000008,   MSG_SYS_TIMER_SETTIME_ALT },
2363                 { 0x00000010,   MSG_SYS_TIMER_GETTIME_ALT },
2364                 { 0x00000020,   MSG_SYS_TIMER_GETOVERRUN_ALT },
2365                 { 0x00000040,   MSG_SYS_NANOSLEEP_ALT },
2366                 { 0x00000080,   MSG_SYS_FACL_ALT },
2367                 { 0x00000100,   MSG_SYS_DOOR_ALT },
2368                 { 0x00000200,   MSG_SYS_SETREUID_ALT },
2369                 { 0x00000400,   MSG_SYS_SETREGID_ALT },
2370                 { 0x00000800,   MSG_SYS_INSTALL_UTRAP_ALT },
2371                 { 0x00001000,   MSG_SYS_SIGNOTIFY_ALT },
2372                 { 0x00002000,   MSG_SYS_SCHEDCTL_ALT },
2373                 { 0x00004000,   MSG_SYS_PSET_ALT },
2374                 { 0x00008000,   MSG_SYS_SPARC_UTRAP_INSTALL_ALT },
2375                 { 0x00010000,   MSG_SYS_RESOLVEPATH_ALT },
2376                 { 0x00020000,   MSG_SYS_LWP_MUTEX_TIMEDLOCK_ALT },
2377                 { 0x00040000,   MSG_SYS_LWP_SEMA_TIMEDWAIT_ALT },
2378                 { 0x00080000,   MSG_SYS_LWP_RWLOCK_SYS_ALT },
2379                 { 0x00100000,   MSG_SYS_GETDENTS64_ALT },
2380                 { 0x00200000,   MSG_SYS_MMAP64_ALT },
2381                 { 0x00400000,   MSG_SYS_STAT64_ALT },
2382                 { 0x00800000,   MSG_SYS_LSTAT64_ALT },
2383                 { 0x01000000,   MSG_SYS_FSTAT64_ALT },
2384                 { 0x02000000,   MSG_SYS_STATVFS64_ALT },
2385                 { 0x04000000,   MSG_SYS_FSTATVFS64_ALT },
2386                 { 0x08000000,   MSG_SYS_SETRLIMIT64_ALT },
2387                 { 0x10000000,   MSG_SYS_GETRLIMIT64_ALT },
2388                 { 0x20000000,   MSG_SYS_PREAD64_ALT },
2389                 { 0x40000000,   MSG_SYS_PWRITE64_ALT },
2390                 { 0x80000000,   MSG_SYS_224 },
2391                 { 0,                    0 }
2392         };
2393         static const Val_desc vda7[] = {        /* System Calls [225 - 256] */
2394                 { 0x00000001,   MSG_SYS_OPEN64_ALT },
2395                 { 0x00000002,   MSG_SYS_RPCSYS_ALT },
2396                 { 0x00000004,   MSG_SYS_ZONE_ALT },
2397                 { 0x00000008,   MSG_SYS_AUTOFSSYS_ALT },
2398                 { 0x00000010,   MSG_SYS_GETCWD_ALT },
2399                 { 0x00000020,   MSG_SYS_SO_SOCKET_ALT },
2400                 { 0x00000040,   MSG_SYS_SO_SOCKETPAIR_ALT },
2401                 { 0x00000080,   MSG_SYS_BIND_ALT },
2402                 { 0x00000100,   MSG_SYS_LISTEN_ALT },
2403                 { 0x00000200,   MSG_SYS_ACCEPT_ALT },
2404                 { 0x00000400,   MSG_SYS_CONNECT_ALT },
2405                 { 0x00000800,   MSG_SYS_SHUTDOWN_ALT },
2406                 { 0x00001000,   MSG_SYS_RECV_ALT },
2407                 { 0x00002000,   MSG_SYS_RECVFROM_ALT },
2408                 { 0x00004000,   MSG_SYS_RECVMSG_ALT },
2409                 { 0x00008000,   MSG_SYS_SEND_ALT },
2410                 { 0x00010000,   MSG_SYS_SENDMSG_ALT },
2411                 { 0x00020000,   MSG_SYS_SENDTO_ALT },
2412                 { 0x00040000,   MSG_SYS_GETPEERNAME_ALT },
2413                 { 0x00080000,   MSG_SYS_GETSOCKNAME_ALT },
2414                 { 0x00100000,   MSG_SYS_GETSOCKOPT_ALT },
2415                 { 0x00200000,   MSG_SYS_SETSOCKOPT_ALT },
2416                 { 0x00400000,   MSG_SYS_SOCKCONFIG_ALT },
2417                 { 0x00800000,   MSG_SYS_NTP_GETTIME_ALT },
2418                 { 0x01000000,   MSG_SYS_NTP_ADJTIME_ALT },
2419                 { 0x02000000,   MSG_SYS_LWP_MUTEX_UNLOCK_ALT },
2420                 { 0x04000000,   MSG_SYS_LWP_MUTEX_TRYLOCK_ALT },
2421                 { 0x08000000,   MSG_SYS_LWP_MUTEX_REGISTER_ALT },
2422                 { 0x10000000,   MSG_SYS_CLADM_ALT },
2423                 { 0x20000000,   MSG_SYS_UUCOPY_ALT },
2424                 { 0x40000000,   MSG_SYS_UMOUNT2_ALT },
2425                 /* 256 (unused) */
2426                 { 0,            0 }
2427         };
2428         static const conv_bitmaskset_desc_t bitmask_desc[N_MASK] = {
2429                 { vda0, 0x00000000 },
2430                 { vda1, 0x00000000 },
2431                 { vda2, 0x00000000 },
2432                 { vda3, 0x00000000 },
2433                 { vda4, 0x00000000 },
2434                 { vda5, 0x00000000 },
2435                 { vda6, 0x00000000 },
2436                 { vda7, 0x80000000 },
2437                 { NULL, 0xffffffff },
2438                 { NULL, 0xffffffff },
2439                 { NULL, 0xffffffff },
2440                 { NULL, 0xffffffff },
2441                 { NULL, 0xffffffff },
2442                 { NULL, 0xffffffff },
2443                 { NULL, 0xffffffff },
2444                 { NULL, 0xffffffff }
2445         };
2446 
2447         if (n_mask > N_MASK)
2448                 n_mask = N_MASK;
2449         return (conv_bitmaskset(maskarr, n_mask, bitmask_desc, fmt_flags,
2450             cnote_sysset_buf->buf, CONV_CNOTE_SYSSET_BUFSIZE));
2451 
2452 #undef N_MASK
2453 }
2454 
2455 const char *
2456 conv_cnote_fileflags(uint32_t fileflags, Conv_fmt_flags_t fmt_flags,
2457     char *buf, size_t bufsize)
2458 {
2459         CONV_EXPN_FIELD_ARG arg = { 0 };
2460 
2461         Val_desc vda[] = {
2462                 { 0x0001,       MSG_PR_O_WRONLY },
2463                 { 0x0002,       MSG_PR_O_RDONLY },
2464                 { 0x200000,     MSG_PR_O_SEARCH },
2465                 { 0x400000,     MSG_PR_O_EXEC },
2466                 { 0x0004,       MSG_PR_O_NDELAY },
2467                 { 0x0008,       MSG_PR_O_APPEND },
2468                 { 0x0010,       MSG_PR_O_SYNC },
2469                 { 0x0040,       MSG_PR_O_DSYNC },
2470                 { 0x0080,       MSG_PR_O_NONBLOCK },
2471                 { 0x0100,       MSG_PR_O_CREAT },
2472                 { 0x0200,       MSG_PR_O_TRUNC },
2473                 { 0x0400,       MSG_PR_O_EXCL },
2474                 { 0x0800,       MSG_PR_O_NOCTTY },
2475                 { 0x4000,       MSG_PR_O_XATTR },
2476                 { 0x8000,       MSG_PR_O_RSYNC },
2477                 { 0x2000,       MSG_PR_O_LARGEFILE },
2478                 { 0x20000,      MSG_PR_O_NOFOLLOW },
2479                 { 0x40000,      MSG_PR_O_NOLINKS },
2480                 { 0, NULL },
2481         };
2482 
2483         arg.oflags = arg.rflags = fileflags;
2484         arg.buf = buf;
2485         arg.bufsize = bufsize;
2486 
2487         switch (fileflags & (0x600003)) {
2488         case 0: /* RDONLY */
2489                 vda[0].v_msg = MSG_PR_O_RDONLY;
2490                 arg.oflags |= 1;
2491                 arg.rflags |= 1;
2492                 break;
2493         case 1: /* WRONLY */
2494         case 2: /* RDWR */
2495         case 0x200000:  /* SEARCH */
2496         case 0x400000:
2497                 /* In isolate, treat these as normal bits */
2498                 break;
2499         default:
2500                 /* More than one bit set in this group, emit numerically */
2501                 arg.oflags &= ~(fileflags & 0x600003);
2502         }
2503 
2504         if (fileflags == 0)
2505                 return (MSG_ORIG(MSG_GBL_ZERO));
2506 
2507         (void) conv_expn_field(&arg, vda, fmt_flags);
2508         return (buf);
2509 }
2510 
2511 const char *
2512 conv_cnote_filemode(uint32_t mode, Conv_fmt_flags_t fmt_flags,
2513     char *buf, size_t bufsize)
2514 {
2515         CONV_EXPN_FIELD_ARG arg = { 0 };
2516         Msg s;
2517 
2518         Val_desc vda[] = {
2519                 { 0x1000,       MSG_S_IFIFO },
2520                 { 0x800,        MSG_S_ISUID },
2521                 { 0x400,        MSG_S_ISGID },
2522                 { 0x200,        MSG_S_ISVTX },
2523                 { 0400,         MSG_S_IRUSR },
2524                 { 0200,         MSG_S_IWUSR },
2525                 { 0100,         MSG_S_IXUSR },
2526                 { 0040,         MSG_S_IRGRP },
2527                 { 0020,         MSG_S_IWGRP },
2528                 { 0010,         MSG_S_IXGRP },
2529                 { 0004,         MSG_S_IROTH },
2530                 { 0002,         MSG_S_IWOTH },
2531                 { 0001,         MSG_S_IXOTH },
2532                 { 0, NULL },
2533         };
2534 
2535         arg.oflags = arg.rflags = mode & ~(0xf000);
2536         arg.buf = buf;
2537         arg.bufsize = bufsize;
2538 
2539         switch (mode & (0xf000)) {
2540         case 0x1000:
2541                 s = MSG_S_IFIFO;
2542                 break;
2543         case 0x2000:
2544                 s = MSG_S_IFCHR;
2545                 break;
2546         case 0x4000:
2547                 s = MSG_S_IFDIR;
2548                 break;
2549         case 0x5000:
2550                 s = MSG_S_IFNAM;
2551                 break;
2552         case 0x6000:
2553                 s = MSG_S_IFBLK;
2554                 break;
2555         case 0x8000:
2556                 s = MSG_S_IFREG;
2557                 break;
2558         case 0xA000:
2559                 s = MSG_S_IFLNK;
2560                 break;
2561         case 0xc000:
2562                 s = MSG_S_IFSOCK;
2563                 break;
2564         case 0xd000:
2565                 s = MSG_S_IFDOOR;
2566                 break;
2567         case 0xe000:
2568                 s = MSG_S_IFPORT;
2569                 break;
2570         default:
2571                 s = NULL;
2572                 break;
2573         }
2574 
2575         if (s) {
2576                 arg.oflags |= 0x1000;
2577                 arg.rflags |= 0x1000;
2578                 vda[0].v_msg = s;
2579         } else {
2580                 arg.rflags = mode;
2581         }
2582 
2583         if (mode == 0)
2584                 return (MSG_ORIG(MSG_GBL_ZERO));
2585 
2586         (void) conv_expn_field(&arg, vda, fmt_flags);
2587         return (buf);
2588 }
2589 
2590 
2591 #define PROCSECFLGSZ    CONV_EXPN_FIELD_DEF_PREFIX_SIZE +               \
2592         MSG_ASLR_SIZE           + CONV_EXPN_FIELD_DEF_SEP_SIZE +        \
2593         MSG_FORBIDNULLMAP_SIZE  + CONV_EXPN_FIELD_DEF_SEP_SIZE +        \
2594         MSG_NOEXECSTACK_SIZE    + CONV_EXPN_FIELD_DEF_SEP_SIZE +        \
2595         CONV_INV_BUFSIZE        + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
2596 
2597 /*
2598  * Ensure that Conv_cnote_pr_secflags_buf_t is large enough:
2599  *
2600  * PROCSECFLGSZ is the real minimum size of the buffer required by
2601  * conv_prsecflags(). However, Conv_cnote_pr_secflags_buf_t uses
2602  * CONV_CNOTE_PSECFLAGS_FLAG_BUFSIZE to set the buffer size. We do things this
2603  * way because the definition of PROCSECFLGSZ uses information that is not
2604  * available in the environment of other programs that include the conv.h
2605  * header file.
2606  */
2607 #if (CONV_PRSECFLAGS_BUFSIZE != PROCSECFLGSZ) && !defined(__lint)
2608 #define REPORT_BUFSIZE PROCSECFLGSZ
2609 #include "report_bufsize.h"
2610 #error "CONV_PRSECFLAGS_BUFSIZE does not match PROCSECFLGSZ"
2611 #endif
2612 
2613 const char *
2614 conv_prsecflags(secflagset_t flags, Conv_fmt_flags_t fmt_flags,
2615     Conv_secflags_buf_t *secflags_buf)
2616 {
2617         /*
2618          * The values are initialized later, based on position in this array
2619          */
2620         static Val_desc vda[] = {
2621                 { 0, MSG_ASLR },
2622                 { 0, MSG_FORBIDNULLMAP },
2623                 { 0, MSG_NOEXECSTACK },
2624                 { 0, 0 }
2625         };
2626         static CONV_EXPN_FIELD_ARG conv_arg = {
2627             NULL, sizeof (secflags_buf->buf)
2628         };
2629         int i;
2630 
2631         for (i = 0; vda[i].v_msg != 0; i++)
2632                 vda[i].v_val = secflag_to_bit(i);
2633 
2634         if (flags == 0)
2635                 return (MSG_ORIG(MSG_GBL_ZERO));
2636 
2637         conv_arg.buf = secflags_buf->buf;
2638         conv_arg.oflags = conv_arg.rflags = flags;
2639         (void) conv_expn_field(&conv_arg, vda, fmt_flags);
2640 
2641         return ((const char *)secflags_buf->buf);
2642 }