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