Home | History | Annotate | Line # | Download | only in src
      1 /* Copyright (C) 2021-2026 Free Software Foundation, Inc.
      2    Contributed by Oracle.
      3 
      4    This file is part of GNU Binutils.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3, or (at your option)
      9    any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 #ifndef _DATA_PCKTS_H
     22 #define _DATA_PCKTS_H
     23 
     24 /*
     25  * This file contains structure definitions for the binary file formats
     26  * used in the experiment.  It is implemented as C header file so that
     27  * it can be processed by both ANSI-C and C++.
     28  */
     29 
     30 #include <pthread.h>
     31 #include <stdint.h>
     32 
     33 #include "gp-defs.h"
     34 #include "gp-time.h"
     35 
     36 #if WSIZE(64)
     37 typedef uint64_t Vaddr_type;    /* process address for 64 bit apps */
     38 typedef uint64_t Size_type;     /* size_t for 64 bit apps */
     39 #else
     40 typedef uint32_t Vaddr_type;    /* process address */
     41 typedef uint32_t Size_type;     /* size_t for 32 bit apps */
     42 #endif
     43 
     44 /* marker to indicate dump of O7 register on stack (support for leaf routines) */
     45 #define SP_LEAF_CHECK_MARKER    ((uint64_t)(-1))
     46 
     47 /* marker to indicate truncated stack */
     48 #define SP_TRUNC_STACK_MARKER   ((uint64_t)(-2))
     49 
     50 /* marker to indicate failed stack unwind */
     51 #define SP_FAILED_UNWIND_MARKER ((uint64_t)(-3))
     52 
     53 #define PROFILE_BUFFER_CHUNK    16384
     54 #define fld_sizeof(t, f) (sizeof (((t *)0)->f))
     55 
     56 typedef enum
     57 {
     58   MASTER_SMPL = 0,
     59   PROGRAM_SMPL,
     60   PERIOD_SMPL,
     61   MANUAL_SMPL
     62 } Smpl_type;
     63 
     64 typedef enum
     65 { /* values for "profpckt kind" stored in log.xml */
     66   EMPTY_PCKT = 0,
     67   PROF_PCKT,
     68   SYNC_PCKT,
     69   HW_PCKT,
     70   XHWC_PCKT,
     71   HEAP_PCKT,
     72   MPI_PCKT,
     73   MHWC_PCKT,
     74   OPROF_PCKT,
     75   OMP_PCKT,
     76   RACE_PCKT,
     77   FRAME_PCKT,
     78   OMP2_PCKT,
     79   DEADLOCK_PCKT,
     80   OMP3_PCKT,
     81   OMP4_PCKT,
     82   OMP5_PCKT,
     83   UID_PCKT,
     84   FRAME2_PCKT,
     85   IOTRACE_PCKT,
     86   LAST_PCKT,            /* last data packet type */
     87   CLOSED_PCKT = 65535   /*  -1, this packet closes a block */
     88 } Pckt_type;
     89 
     90 typedef enum
     91 {
     92   EMPTY_INFO = 0,
     93   STACK_INFO,
     94   JAVA_INFO,
     95   OMP_INFO,
     96   MPI_INFO,
     97   OMP2_INFO,
     98   LAST_INFO             /* keep this one last */
     99 } Info_type;
    100 
    101 #define COMPRESSED_INFO 0x80000000
    102 
    103 #define JAVA_PCKT       0x80
    104 #define OMPS_PCKT       0x40  /* packet contains OMP state info */
    105 #define PCKT_TYPE(x)    ((x) & 0x1f)
    106 
    107 typedef struct CommonHead_packet
    108 {
    109   unsigned int tsize : 16;
    110   unsigned int type : 16;
    111 } CommonHead_packet;
    112 
    113 // All collector modules record their packets as extensions of CM_Packet
    114 typedef struct CM_Packet
    115 {
    116   unsigned int tsize : 16;
    117   unsigned int type : 16;
    118 } CM_Packet;
    119 
    120 typedef struct Common_packet
    121 {
    122   unsigned int tsize : 16; /* packet size  */
    123   unsigned int type : 16;
    124   pthread_t    lwp_id;
    125   pthread_t    thr_id;
    126   uint32_t     cpu_id;
    127   hrtime_t     tstamp;
    128   uint64_t     frinfo;
    129 } Common_packet;
    130 
    131 /* Definition of values stored in the experiment PROP_MSTATE field */
    132 /* They include:
    133  *   LWP microstates (copied from msacct.h).  Also see PrUsage class.
    134  *   Linux's CPU time
    135  *   er_kernel time
    136  */
    137 /*   Can be used with LMS_STATE_STRINGS (below) */
    138 #define LMS_USER        0   /* running in user mode */
    139 #define LMS_SYSTEM      1   /* running in sys call or page fault */
    140 #define LMS_TRAP        2   /* running in other trap */
    141 #define LMS_TFAULT      3   /* asleep in user text page fault */
    142 #define LMS_DFAULT      4   /* asleep in user data page fault */
    143 #define LMS_KFAULT      5   /* asleep in kernel page fault */
    144 #define LMS_USER_LOCK   6   /* asleep waiting for user-mode lock */
    145 #define LMS_SLEEP       7   /* asleep for any other reason */
    146 #define LMS_WAIT_CPU    8   /* waiting for CPU (latency) */
    147 #define LMS_STOPPED     9   /* stopped (/proc, jobcontrol, or lwp_stop) */
    148 #define LMS_LINUX_CPU   10  /* LINUX timer_create(CLOCK_THREAD_CPUTIME_ID) */
    149 #define LMS_KERNEL_CPU  11  /* LINUX timer_create(CLOCK_THREAD_CPUTIME_ID) */
    150 #define LMS_NUM_STATES  12  /* total number of above states */
    151 #define LMS_NUM_SOLARIS_MSTATES     10  /* LMS microstates thru LMS_STOPPED */
    152 
    153 // Magic value stored in experiments that identifies which LMS states are valid
    154 #define LMS_MAGIC_ID_SOLARIS        10  // Solaris: LMS_USER thru LMS_STOPPED
    155 #define LMS_MAGIC_ID_ERKERNEL_USER   2  // er_kernel user: LMS_USER, LMS_SYSTEM
    156 #define LMS_MAGIC_ID_ERKERNEL_KERNEL 3  // er_kernel kernel: LMS_KERNEL_CPU
    157 #define LMS_MAGIC_ID_LINUX           1  // Linux: LMS_LINUX_CPU
    158 
    159 #define LMS_STATE_STRINGS \
    160 { \
    161   NTXT("USER"),         /* LMS_USER */ \
    162   NTXT("SYSTEM"),       /* LMS_SYSTEM */ \
    163   NTXT("TRAP"),         /* LMS_TRAP */ \
    164   NTXT("TFAULT"),       /* LMS_TFAULT */ \
    165   NTXT("DFAULT"),       /* LMS_DFAULT */ \
    166   NTXT("KFAULT"),       /* LMS_KFAULT */ \
    167   NTXT("USER_LOCK"),    /* LMS_USER_LOCK */ \
    168   NTXT("SLEEP"),        /* LMS_SLEEP */ \
    169   NTXT("WAIT_CPU"),     /* LMS_WAIT_CPU */ \
    170   NTXT("STOPPED"),      /* LMS_STOPPED */ \
    171   NTXT("LINUX_CPU"),    /* LMS_LINUX_CPU */ \
    172   NTXT("KERNEL_CPU")    /* LMS_KERNEL_CPU */ \
    173 }
    174 #define LMS_STATE_USTRINGS \
    175 { \
    176   GTXT("User CPU"),             /* LMS_USER */ \
    177   GTXT("System CPU"),           /* LMS_SYSTEM */ \
    178   GTXT("Trap CPU"),             /* LMS_TRAP */ \
    179   GTXT("Text Page Fault"),      /* LMS_TFAULT */ \
    180   GTXT("Data Page Fault"),      /* LMS_DFAULT */ \
    181   GTXT("Kernel Page Fault"),    /* LMS_KFAULT */ \
    182   GTXT("User Lock"),            /* LMS_USER_LOCK */ \
    183   GTXT("Sleep"),                /* LMS_SLEEP */ \
    184   GTXT("Wait CPU"),             /* LMS_WAIT_CPU */ \
    185   GTXT("Stopped"),              /* LMS_STOPPED */ \
    186   GTXT("User+System CPU"),      /* LMS_LINUX_CPU */ \
    187   GTXT("Kernel CPU")            /* LMS_KERNEL_CPU */ \
    188 }
    189 
    190 typedef enum
    191 {
    192   MALLOC_TRACE = 0,
    193   FREE_TRACE,
    194   REALLOC_TRACE,
    195   MMAP_TRACE,
    196   MUNMAP_TRACE,
    197   HEAPTYPE_LAST
    198 } Heap_type;
    199 
    200 #define HEAPTYPE_STATE_STRINGS \
    201 { \
    202     NTXT("MALLOC"), \
    203     NTXT("FREE"), \
    204     NTXT("REALLOC"), \
    205     NTXT("MMAP"), \
    206     NTXT("MUNMAP") \
    207 }
    208 #define HEAPTYPE_STATE_USTRINGS \
    209 { \
    210     GTXT("malloc"), \
    211     GTXT("free"), \
    212     GTXT("realloc"), \
    213     GTXT("mmap"), \
    214     GTXT("munmap") \
    215 }
    216 
    217 typedef enum
    218 {
    219   ZFS_TYPE = 0,
    220   NFS_TYPE,
    221   UFS_TYPE,
    222   UDFS_TYPE,
    223   LOFS_TYPE,
    224   VXFS_TYPE,
    225   TMPFS_TYPE,
    226   PCFS_TYPE,
    227   HSFS_TYPE,
    228   PROCFS_TYPE,
    229   FIFOFS_TYPE,
    230   SWAPFS_TYPE,
    231   CACHEFS_TYPE,
    232   AUTOFS_TYPE,
    233   SPECFS_TYPE,
    234   SOCKFS_TYPE,
    235   FDFS_TYPE,
    236   MNTFS_TYPE,
    237   NAMEFS_TYPE,
    238   OBJFS_TYPE,
    239   SHAREFS_TYPE,
    240   EXT2FS_TYPE,
    241   EXT3FS_TYPE,
    242   EXT4FS_TYPE,
    243   UNKNOWNFS_TYPE,
    244   FSTYPE_LAST
    245 } FileSystem_type;
    246 
    247 typedef enum
    248 {
    249   READ_TRACE = 0,
    250   WRITE_TRACE,
    251   OPEN_TRACE,
    252   CLOSE_TRACE,
    253   OTHERIO_TRACE,
    254   READ_TRACE_ERROR,
    255   WRITE_TRACE_ERROR,
    256   OPEN_TRACE_ERROR,
    257   CLOSE_TRACE_ERROR,
    258   OTHERIO_TRACE_ERROR,
    259   IOTRACETYPE_LAST
    260 } IOTrace_type;
    261 
    262 #define IOTRACETYPE_STATE_STRINGS \
    263 { \
    264   NTXT("READ"), \
    265   NTXT("WRITE"), \
    266   NTXT("OPEN"), \
    267   NTXT("CLOSE"), \
    268   NTXT("OTHERIO"), \
    269   NTXT("READERROR"), \
    270   NTXT("WRITEERROR"), \
    271   NTXT("OPENERROR"), \
    272   NTXT("CLOSEERROR"), \
    273   NTXT("OTHERIOERROR") \
    274 }
    275 #define IOTRACETYPE_STATE_USTRINGS \
    276 { \
    277   GTXT("Read"), \
    278   GTXT("Write"), \
    279   GTXT("Open"), \
    280   GTXT("Close"), \
    281   GTXT("Other I/O"), \
    282   GTXT("Read error"), \
    283   GTXT("Write error"), \
    284   GTXT("Open error"), \
    285   GTXT("Close error"), \
    286   GTXT("Other I/O error") \
    287 }
    288 
    289 // the type of racing memory access with redundance flag
    290 typedef enum
    291 {
    292   WRITE_RACE = 0,
    293   WRITE_RACE_RED,
    294   READ_RACE,
    295   READ_RACE_RED,
    296   RACETYPE_LAST
    297 } Race_type;
    298 
    299 typedef struct Frame_packet
    300 {
    301   unsigned int tsize : 16; /* packet size */
    302   unsigned int type : 16;
    303   uint32_t hsize;           /* header size */
    304   uint64_t uid;             /* unique id (experiment wide) */
    305 } Frame_packet;
    306 
    307 typedef struct Uid_packet
    308 {
    309   unsigned int tsize : 16;  /* packet size */
    310   unsigned int type : 16;
    311   uint32_t flags;
    312   uint64_t uid;             /* unique id (experiment wide) */
    313 } Uid_packet;
    314 
    315 /*
    316  * Components of the variable part of Frame_packet
    317  */
    318 typedef struct Common_info
    319 {
    320   unsigned int hsize;   /* size of this info */
    321   unsigned int kind;
    322   uint64_t uid;         /* unique id of this info if any */
    323 } Common_info;
    324 
    325 typedef struct Stack_info
    326 { /* Native call stack */
    327   unsigned int hsize;
    328   unsigned int kind;
    329   uint64_t uid;
    330 } Stack_info;
    331 
    332 typedef struct Java_info
    333 { /* Java call stack */
    334   unsigned int hsize;
    335   unsigned int kind;
    336   uint64_t uid;
    337 } Java_info;
    338 
    339 typedef struct OMP_info
    340 { /* OMP thread state */
    341   unsigned int hsize;
    342   unsigned int kind;
    343   uint32_t omp_state;
    344   uint32_t pad;
    345 } OMP_info;
    346 
    347 typedef struct OMP2_info
    348 { /* OpenMP user call stack */
    349   unsigned int hsize;
    350   unsigned int kind;
    351   uint32_t omp_state;
    352   uint32_t pad;
    353   uint64_t uid;
    354 } OMP2_info;
    355 
    356 /* OMP thread states as recorded in the experiment */
    357 /*   Definition of values stored in the experiment PROP_OMPSTATE field */
    358 
    359 /*   Can be used with OMP_THR_STATE_STRINGS (below) */
    360 typedef enum
    361 {
    362   OMP_NO_STATE = 0, /* Not initialized */
    363   OMP_OVHD_STATE, /* Overhead */
    364   OMP_WORK_STATE, /* Useful work, excluding reduction, master, single, critical */
    365   OMP_IBAR_STATE, /* In an implicit barrier */
    366   OMP_EBAR_STATE, /* In an explicit barrier */
    367   OMP_IDLE_STATE, /* Slave waiting */
    368   OMP_SERL_STATE, /* User OMPead not in any OMP parallel region */
    369   OMP_RDUC_STATE, /* Reduction */
    370   OMP_LKWT_STATE, /* Waiting for lock */
    371   OMP_CTWT_STATE, /* Waiting to enter critical section */
    372   OMP_ODWT_STATE, /* Waiting to execute an ordered section */
    373   OMP_ATWT_STATE, /* Wait for atomic */
    374   OMP_TSKWT_STATE, /* Task wait */
    375   OMP_LAST_STATE
    376 } OMP_THR_STATE;
    377 #define OMP_THR_STATE_STRINGS \
    378 { \
    379   NTXT("NO"),       /* OMP_NO_STATE */ \
    380   NTXT("OVHD"),     /* OMP_OVHD_STATE */ \
    381   NTXT("WORK"),     /* OMP_WORK_STATE */ \
    382   NTXT("IBAR"),     /* OMP_IBAR_STATE */ \
    383   NTXT("EBAR"),     /* OMP_EBAR_STATE */ \
    384   NTXT("IDLE"),     /* OMP_IDLE_STATE */ \
    385   NTXT("SERL"),     /* OMP_SERL_STATE */ \
    386   NTXT("RDUC"),     /* OMP_RDUC_STATE */ \
    387   NTXT("LKWT"),     /* OMP_LKWT_STATE */ \
    388   NTXT("CTWT"),     /* OMP_CTWT_STATE */ \
    389   NTXT("ODWT"),     /* OMP_ODWT_STATE */ \
    390   NTXT("ATWT"),     /* OMP_ATWT_STATE */ \
    391   NTXT("TSKWT")     /* OMP_TSKWT_STATE */ \
    392 }
    393 #define OMP_THR_STATE_USTRINGS \
    394 { \
    395   GTXT("None"),                 /* OMP_NO_STATE */ \
    396   GTXT("Overhead"),             /* OMP_OVHD_STATE */ \
    397   GTXT("Work"),                 /* OMP_WORK_STATE */ \
    398   GTXT("Implicit Barrier"),     /* OMP_IBAR_STATE */ \
    399   GTXT("Explicit Barrier"),     /* OMP_EBAR_STATE */ \
    400   GTXT("Idle"),                 /* OMP_IDLE_STATE */ \
    401   GTXT("Serial"),               /* OMP_SERL_STATE */ \
    402   GTXT("Reduction"),            /* OMP_RDUC_STATE */ \
    403   GTXT("Lock Wait"),            /* OMP_LKWT_STATE */ \
    404   GTXT("Critical Section Wait"), /* OMP_CTWT_STATE */ \
    405   GTXT("Ordered Section Wait"), /* OMP_ODWT_STATE */ \
    406   GTXT("Atomic Wait"),          /* OMP_ATWT_STATE */ \
    407   GTXT("Task Wait")             /* OMP_TSKWT_STATE */ \
    408 }
    409 
    410 /* sub-packet for MPI state information */
    411 typedef struct MPI_info
    412 { /* MPI thread state */
    413   unsigned int hsize;
    414   unsigned int kind;
    415   uint32_t mpi_state;
    416   uint32_t pad;
    417 } MPI_info;
    418 
    419 /* MPI thread states, as recorded in the experiment */
    420 typedef enum
    421 {
    422   MPI_NO_STATE = 0,     /* Not initialized */
    423   MPI_USER,             /* Executing user code, not in MPI */
    424   MPI_PROG,             /* Executing in the MPI library (progressing) */
    425   MPI_WAIT              /* Waiting in the MPI library */
    426 } MPI_THR_STATE;
    427 
    428 /*
    429  *	Dyntext file structure
    430  */
    431 typedef enum
    432 {
    433   DT_HEADER = 1,
    434   DT_CODE,
    435   DT_LTABLE,
    436   DT_SRCFILE
    437 } DT_type;
    438 
    439 typedef struct DT_common
    440 {
    441   DT_type type;
    442   unsigned int size;
    443 } DT_common;
    444 
    445 typedef struct DT_header
    446 {
    447   DT_type type;
    448   unsigned int size;
    449   hrtime_t time; /* time of loading */
    450   uint64_t vaddr;
    451 } DT_header;
    452 
    453 typedef struct DT_code
    454 {
    455   DT_type type;
    456   unsigned int size;
    457 } DT_code;
    458 
    459 typedef struct DT_ltable
    460 {
    461   DT_type type;
    462   unsigned int size;
    463 } DT_ltable;
    464 
    465 typedef struct DT_lineno
    466 {
    467   unsigned int offset;
    468   unsigned int lineno;
    469 } DT_lineno;
    470 
    471 typedef struct DT_srcfile
    472 {
    473   DT_type type;
    474   unsigned int size;
    475 } DT_srcfile;
    476 
    477 /*
    478  *	Archive file structure
    479  */
    480 #define ARCH_VERSION 0x100 /* version 1.0 */
    481 
    482 /* For compatibility with older archives append new types only */
    483 typedef enum
    484 {
    485   ARCH_SEGMENT_TYPE = 1,
    486   ARCH_MSG_TYPE,
    487   ARCH_PLT_TYPE,
    488   ARCH_MODULE_TYPE,
    489   ARCH_FUNCTION_TYPE,
    490   ARCH_LDINSTR_TYPE,
    491   ARCH_STINSTR_TYPE,
    492   ARCH_PREFETCH_TYPE,
    493   ARCH_BRTARGET_TYPE,
    494   ARCH_JCLASS_TYPE,
    495   ARCH_JMETHOD_TYPE,
    496   ARCH_JUNLOAD_TYPE,
    497   ARCH_INF_TYPE,
    498   ARCH_JCLASS_LOCATION_TYPE
    499 } ARCH_type;
    500 
    501 #define ARCH_TYPE(x,y)      ((ARCH_##x##_TYPE<<8)|y)
    502 
    503 typedef struct
    504 {
    505   unsigned int type : 16;
    506   unsigned int size : 16;
    507 } ARCH_common;
    508 
    509 #define ARCH_JCLASS_LOCATION ARCH_TYPE(JCLASS_LOCATION, 3)
    510 
    511 typedef struct
    512 {
    513   CM_Packet comm;
    514   uint32_t pad;
    515   uint64_t class_id;
    516 } ARCH_jclass_location;
    517 
    518 #define ARCH_JCLASS ARCH_TYPE(JCLASS, 3)
    519 
    520 typedef struct
    521 {
    522   CM_Packet comm;
    523   uint32_t pad;
    524   uint64_t class_id;
    525   hrtime_t tstamp;
    526 } ARCH_jclass;
    527 
    528 #define ARCH_JMETHOD ARCH_TYPE(JMETHOD, 3)
    529 
    530 typedef struct
    531 {
    532   CM_Packet comm;
    533   uint32_t pad;
    534   uint64_t class_id;
    535   uint64_t method_id;
    536 } ARCH_jmethod;
    537 
    538 #endif /* _DATA_PCKTS_H */
    539