(root)/
binutils-2.41/
gprofng/
src/
data_pckts.h
       1  /* Copyright (C) 2021-2023 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  
      55  typedef enum
      56  {
      57    MASTER_SMPL = 0,
      58    PROGRAM_SMPL,
      59    PERIOD_SMPL,
      60    MANUAL_SMPL
      61  } Smpl_type;
      62  
      63  typedef enum
      64  { /* values for "profpckt kind" stored in log.xml */
      65    EMPTY_PCKT = 0,
      66    PROF_PCKT,
      67    SYNC_PCKT,
      68    HW_PCKT,
      69    XHWC_PCKT,
      70    HEAP_PCKT,
      71    MPI_PCKT,
      72    MHWC_PCKT,
      73    OPROF_PCKT,
      74    OMP_PCKT,
      75    RACE_PCKT,
      76    FRAME_PCKT,
      77    OMP2_PCKT,
      78    DEADLOCK_PCKT,
      79    OMP3_PCKT,
      80    OMP4_PCKT,
      81    OMP5_PCKT,
      82    UID_PCKT,
      83    FRAME2_PCKT,
      84    IOTRACE_PCKT,
      85    LAST_PCKT,            /* last data packet type */
      86    CLOSED_PCKT = 65535   /*  -1, this packet closes a block */
      87  } Pckt_type;
      88  
      89  typedef enum
      90  {
      91    EMPTY_INFO = 0,
      92    STACK_INFO,
      93    JAVA_INFO,
      94    OMP_INFO,
      95    MPI_INFO,
      96    OMP2_INFO,
      97    LAST_INFO             /* keep this one last */
      98  } Info_type;
      99  
     100  #define COMPRESSED_INFO 0x80000000
     101  
     102  #define JAVA_PCKT       0x80
     103  #define OMPS_PCKT       0x40  /* packet contains OMP state info */
     104  #define PCKT_TYPE(x)    ((x) & 0x1f)
     105  
     106  typedef struct CommonHead_packet
     107  {
     108    unsigned int tsize : 16;
     109    unsigned int type : 16;
     110  } CommonHead_packet;
     111  
     112  // All collector modules record their packets as extensions of CM_Packet
     113  typedef struct CM_Packet
     114  {
     115    unsigned int tsize : 16;
     116    unsigned int type : 16;
     117  } CM_Packet;
     118  
     119  typedef struct Common_packet
     120  {
     121    unsigned int tsize : 16; /* packet size  */
     122    unsigned int type : 16;
     123    pthread_t    lwp_id;
     124    pthread_t    thr_id;
     125    uint32_t     cpu_id;
     126    hrtime_t     tstamp;
     127    uint64_t     frinfo;
     128  } Common_packet;
     129  
     130  /* Definition of values stored in the experiment PROP_MSTATE field */
     131  /* They include:
     132   *   LWP microstates (copied from msacct.h).  Also see PrUsage class.
     133   *   Linux's CPU time
     134   *   er_kernel time
     135   */
     136  /*   Can be used with LMS_STATE_STRINGS (below) */
     137  #define LMS_USER        0   /* running in user mode */
     138  #define LMS_SYSTEM      1   /* running in sys call or page fault */
     139  #define LMS_TRAP        2   /* running in other trap */
     140  #define LMS_TFAULT      3   /* asleep in user text page fault */
     141  #define LMS_DFAULT      4   /* asleep in user data page fault */
     142  #define LMS_KFAULT      5   /* asleep in kernel page fault */
     143  #define LMS_USER_LOCK   6   /* asleep waiting for user-mode lock */
     144  #define LMS_SLEEP       7   /* asleep for any other reason */
     145  #define LMS_WAIT_CPU    8   /* waiting for CPU (latency) */
     146  #define LMS_STOPPED     9   /* stopped (/proc, jobcontrol, or lwp_stop) */
     147  #define LMS_LINUX_CPU   10  /* LINUX timer_create(CLOCK_THREAD_CPUTIME_ID) */
     148  #define LMS_KERNEL_CPU  11  /* LINUX timer_create(CLOCK_THREAD_CPUTIME_ID) */
     149  #define LMS_NUM_STATES  12  /* total number of above states */
     150  #define LMS_NUM_SOLARIS_MSTATES     10  /* LMS microstates thru LMS_STOPPED */
     151  
     152  // Magic value stored in experiments that identifies which LMS states are valid
     153  #define LMS_MAGIC_ID_SOLARIS        10  // Solaris: LMS_USER thru LMS_STOPPED
     154  #define LMS_MAGIC_ID_ERKERNEL_USER   2  // er_kernel user: LMS_USER, LMS_SYSTEM
     155  #define LMS_MAGIC_ID_ERKERNEL_KERNEL 3  // er_kernel kernel: LMS_KERNEL_CPU
     156  #define LMS_MAGIC_ID_LINUX           1  // Linux: LMS_LINUX_CPU
     157  
     158  #define LMS_STATE_STRINGS \
     159  { \
     160    NTXT("USER"),         /* LMS_USER */ \
     161    NTXT("SYSTEM"),       /* LMS_SYSTEM */ \
     162    NTXT("TRAP"),         /* LMS_TRAP */ \
     163    NTXT("TFAULT"),       /* LMS_TFAULT */ \
     164    NTXT("DFAULT"),       /* LMS_DFAULT */ \
     165    NTXT("KFAULT"),       /* LMS_KFAULT */ \
     166    NTXT("USER_LOCK"),    /* LMS_USER_LOCK */ \
     167    NTXT("SLEEP"),        /* LMS_SLEEP */ \
     168    NTXT("WAIT_CPU"),     /* LMS_WAIT_CPU */ \
     169    NTXT("STOPPED"),      /* LMS_STOPPED */ \
     170    NTXT("LINUX_CPU"),    /* LMS_LINUX_CPU */ \
     171    NTXT("KERNEL_CPU")    /* LMS_KERNEL_CPU */ \
     172  }
     173  #define LMS_STATE_USTRINGS \
     174  { \
     175    GTXT("User CPU"),             /* LMS_USER */ \
     176    GTXT("System CPU"),           /* LMS_SYSTEM */ \
     177    GTXT("Trap CPU"),             /* LMS_TRAP */ \
     178    GTXT("Text Page Fault"),      /* LMS_TFAULT */ \
     179    GTXT("Data Page Fault"),      /* LMS_DFAULT */ \
     180    GTXT("Kernel Page Fault"),    /* LMS_KFAULT */ \
     181    GTXT("User Lock"),            /* LMS_USER_LOCK */ \
     182    GTXT("Sleep"),                /* LMS_SLEEP */ \
     183    GTXT("Wait CPU"),             /* LMS_WAIT_CPU */ \
     184    GTXT("Stopped"),              /* LMS_STOPPED */ \
     185    GTXT("User+System CPU"),      /* LMS_LINUX_CPU */ \
     186    GTXT("Kernel CPU")            /* LMS_KERNEL_CPU */ \
     187  }
     188  
     189  typedef enum
     190  {
     191    MALLOC_TRACE = 0,
     192    FREE_TRACE,
     193    REALLOC_TRACE,
     194    MMAP_TRACE,
     195    MUNMAP_TRACE,
     196    HEAPTYPE_LAST
     197  } Heap_type;
     198  
     199  #define HEAPTYPE_STATE_STRINGS \
     200  { \
     201      NTXT("MALLOC"), \
     202      NTXT("FREE"), \
     203      NTXT("REALLOC"), \
     204      NTXT("MMAP"), \
     205      NTXT("MUNMAP") \
     206  }
     207  #define HEAPTYPE_STATE_USTRINGS \
     208  { \
     209      GTXT("malloc"), \
     210      GTXT("free"), \
     211      GTXT("realloc"), \
     212      GTXT("mmap"), \
     213      GTXT("munmap") \
     214  }
     215  
     216  typedef enum
     217  {
     218    ZFS_TYPE = 0,
     219    NFS_TYPE,
     220    UFS_TYPE,
     221    UDFS_TYPE,
     222    LOFS_TYPE,
     223    VXFS_TYPE,
     224    TMPFS_TYPE,
     225    PCFS_TYPE,
     226    HSFS_TYPE,
     227    PROCFS_TYPE,
     228    FIFOFS_TYPE,
     229    SWAPFS_TYPE,
     230    CACHEFS_TYPE,
     231    AUTOFS_TYPE,
     232    SPECFS_TYPE,
     233    SOCKFS_TYPE,
     234    FDFS_TYPE,
     235    MNTFS_TYPE,
     236    NAMEFS_TYPE,
     237    OBJFS_TYPE,
     238    SHAREFS_TYPE,
     239    EXT2FS_TYPE,
     240    EXT3FS_TYPE,
     241    EXT4FS_TYPE,
     242    UNKNOWNFS_TYPE,
     243    FSTYPE_LAST
     244  } FileSystem_type;
     245  
     246  typedef enum
     247  {
     248    READ_TRACE = 0,
     249    WRITE_TRACE,
     250    OPEN_TRACE,
     251    CLOSE_TRACE,
     252    OTHERIO_TRACE,
     253    READ_TRACE_ERROR,
     254    WRITE_TRACE_ERROR,
     255    OPEN_TRACE_ERROR,
     256    CLOSE_TRACE_ERROR,
     257    OTHERIO_TRACE_ERROR,
     258    IOTRACETYPE_LAST
     259  } IOTrace_type;
     260  
     261  #define IOTRACETYPE_STATE_STRINGS \
     262  { \
     263    NTXT("READ"), \
     264    NTXT("WRITE"), \
     265    NTXT("OPEN"), \
     266    NTXT("CLOSE"), \
     267    NTXT("OTHERIO"), \
     268    NTXT("READERROR"), \
     269    NTXT("WRITEERROR"), \
     270    NTXT("OPENERROR"), \
     271    NTXT("CLOSEERROR"), \
     272    NTXT("OTHERIOERROR") \
     273  }
     274  #define IOTRACETYPE_STATE_USTRINGS \
     275  { \
     276    GTXT("Read"), \
     277    GTXT("Write"), \
     278    GTXT("Open"), \
     279    GTXT("Close"), \
     280    GTXT("Other I/O"), \
     281    GTXT("Read error"), \
     282    GTXT("Write error"), \
     283    GTXT("Open error"), \
     284    GTXT("Close error"), \
     285    GTXT("Other I/O error") \
     286  }
     287  
     288  // the type of racing memory access with redundance flag
     289  typedef enum
     290  {
     291    WRITE_RACE = 0,
     292    WRITE_RACE_RED,
     293    READ_RACE,
     294    READ_RACE_RED,
     295    RACETYPE_LAST
     296  } Race_type;
     297  
     298  typedef struct Frame_packet
     299  {
     300    unsigned int tsize : 16; /* packet size */
     301    unsigned int type : 16;
     302    uint32_t hsize;           /* header size */
     303    uint64_t uid;             /* unique id (experiment wide) */
     304  } Frame_packet;
     305  
     306  typedef struct Uid_packet
     307  {
     308    unsigned int tsize : 16;  /* packet size */
     309    unsigned int type : 16;
     310    uint32_t flags;
     311    uint64_t uid;             /* unique id (experiment wide) */
     312  } Uid_packet;
     313  
     314  /*
     315   * Components of the variable part of Frame_packet
     316   */
     317  typedef struct Common_info
     318  {
     319    unsigned int hsize;   /* size of this info */
     320    unsigned int kind;
     321    uint64_t uid;         /* unique id of this info if any */
     322  } Common_info;
     323  
     324  typedef struct Stack_info
     325  { /* Native call stack */
     326    unsigned int hsize;
     327    unsigned int kind;
     328    uint64_t uid;
     329  } Stack_info;
     330  
     331  typedef struct Java_info
     332  { /* Java call stack */
     333    unsigned int hsize;
     334    unsigned int kind;
     335    uint64_t uid;
     336  } Java_info;
     337  
     338  typedef struct OMP_info
     339  { /* OMP thread state */
     340    unsigned int hsize;
     341    unsigned int kind;
     342    uint32_t omp_state;
     343    uint32_t pad;
     344  } OMP_info;
     345  
     346  typedef struct OMP2_info
     347  { /* OpenMP user call stack */
     348    unsigned int hsize;
     349    unsigned int kind;
     350    uint32_t omp_state;
     351    uint32_t pad;
     352    uint64_t uid;
     353  } OMP2_info;
     354  
     355  /* OMP thread states as recorded in the experiment */
     356  /*   Definition of values stored in the experiment PROP_OMPSTATE field */
     357  
     358  /*   Can be used with OMP_THR_STATE_STRINGS (below) */
     359  typedef enum
     360  {
     361    OMP_NO_STATE = 0, /* Not initialized */
     362    OMP_OVHD_STATE, /* Overhead */
     363    OMP_WORK_STATE, /* Useful work, excluding reduction, master, single, critical */
     364    OMP_IBAR_STATE, /* In an implicit barrier */
     365    OMP_EBAR_STATE, /* In an explicit barrier */
     366    OMP_IDLE_STATE, /* Slave waiting */
     367    OMP_SERL_STATE, /* User OMPead not in any OMP parallel region */
     368    OMP_RDUC_STATE, /* Reduction */
     369    OMP_LKWT_STATE, /* Waiting for lock */
     370    OMP_CTWT_STATE, /* Waiting to enter critical section */
     371    OMP_ODWT_STATE, /* Waiting to execute an ordered section */
     372    OMP_ATWT_STATE, /* Wait for atomic */
     373    OMP_TSKWT_STATE, /* Task wait */
     374    OMP_LAST_STATE
     375  } OMP_THR_STATE;
     376  #define OMP_THR_STATE_STRINGS \
     377  { \
     378    NTXT("NO"),       /* OMP_NO_STATE */ \
     379    NTXT("OVHD"),     /* OMP_OVHD_STATE */ \
     380    NTXT("WORK"),     /* OMP_WORK_STATE */ \
     381    NTXT("IBAR"),     /* OMP_IBAR_STATE */ \
     382    NTXT("EBAR"),     /* OMP_EBAR_STATE */ \
     383    NTXT("IDLE"),     /* OMP_IDLE_STATE */ \
     384    NTXT("SERL"),     /* OMP_SERL_STATE */ \
     385    NTXT("RDUC"),     /* OMP_RDUC_STATE */ \
     386    NTXT("LKWT"),     /* OMP_LKWT_STATE */ \
     387    NTXT("CTWT"),     /* OMP_CTWT_STATE */ \
     388    NTXT("ODWT"),     /* OMP_ODWT_STATE */ \
     389    NTXT("ATWT"),     /* OMP_ATWT_STATE */ \
     390    NTXT("TSKWT")     /* OMP_TSKWT_STATE */ \
     391  }
     392  #define OMP_THR_STATE_USTRINGS \
     393  { \
     394    GTXT("None"),                 /* OMP_NO_STATE */ \
     395    GTXT("Overhead"),             /* OMP_OVHD_STATE */ \
     396    GTXT("Work"),                 /* OMP_WORK_STATE */ \
     397    GTXT("Implicit Barrier"),     /* OMP_IBAR_STATE */ \
     398    GTXT("Explicit Barrier"),     /* OMP_EBAR_STATE */ \
     399    GTXT("Idle"),                 /* OMP_IDLE_STATE */ \
     400    GTXT("Serial"),               /* OMP_SERL_STATE */ \
     401    GTXT("Reduction"),            /* OMP_RDUC_STATE */ \
     402    GTXT("Lock Wait"),            /* OMP_LKWT_STATE */ \
     403    GTXT("Critical Section Wait"), /* OMP_CTWT_STATE */ \
     404    GTXT("Ordered Section Wait"), /* OMP_ODWT_STATE */ \
     405    GTXT("Atomic Wait"),          /* OMP_ATWT_STATE */ \
     406    GTXT("Task Wait")             /* OMP_TSKWT_STATE */ \
     407  }
     408  
     409  /* sub-packet for MPI state information */
     410  typedef struct MPI_info
     411  { /* MPI thread state */
     412    unsigned int hsize;
     413    unsigned int kind;
     414    uint32_t mpi_state;
     415    uint32_t pad;
     416  } MPI_info;
     417  
     418  /* MPI thread states, as recorded in the experiment */
     419  typedef enum
     420  {
     421    MPI_NO_STATE = 0,     /* Not initialized */
     422    MPI_USER,             /* Executing user code, not in MPI */
     423    MPI_PROG,             /* Executing in the MPI library (progressing) */
     424    MPI_WAIT              /* Waiting in the MPI library */
     425  } MPI_THR_STATE;
     426  
     427  /*
     428   *	Dyntext file structure
     429   */
     430  typedef enum
     431  {
     432    DT_HEADER = 1,
     433    DT_CODE,
     434    DT_LTABLE,
     435    DT_SRCFILE
     436  } DT_type;
     437  
     438  typedef struct DT_common
     439  {
     440    DT_type type;
     441    unsigned int size;
     442  } DT_common;
     443  
     444  typedef struct DT_header
     445  {
     446    DT_type type;
     447    unsigned int size;
     448    hrtime_t time; /* time of loading */
     449    uint64_t vaddr;
     450  } DT_header;
     451  
     452  typedef struct DT_code
     453  {
     454    DT_type type;
     455    unsigned int size;
     456  } DT_code;
     457  
     458  typedef struct DT_ltable
     459  {
     460    DT_type type;
     461    unsigned int size;
     462  } DT_ltable;
     463  
     464  typedef struct DT_lineno
     465  {
     466    unsigned int offset;
     467    unsigned int lineno;
     468  } DT_lineno;
     469  
     470  typedef struct DT_srcfile
     471  {
     472    DT_type type;
     473    unsigned int size;
     474  } DT_srcfile;
     475  
     476  /*
     477   *	Archive file structure
     478   */
     479  #define ARCH_VERSION 0x100 /* version 1.0 */
     480  
     481  /* For compatibility with older archives append new types only */
     482  typedef enum
     483  {
     484    ARCH_SEGMENT_TYPE = 1,
     485    ARCH_MSG_TYPE,
     486    ARCH_PLT_TYPE,
     487    ARCH_MODULE_TYPE,
     488    ARCH_FUNCTION_TYPE,
     489    ARCH_LDINSTR_TYPE,
     490    ARCH_STINSTR_TYPE,
     491    ARCH_PREFETCH_TYPE,
     492    ARCH_BRTARGET_TYPE,
     493    ARCH_JCLASS_TYPE,
     494    ARCH_JMETHOD_TYPE,
     495    ARCH_JUNLOAD_TYPE,
     496    ARCH_INF_TYPE,
     497    ARCH_JCLASS_LOCATION_TYPE
     498  } ARCH_type;
     499  
     500  #define ARCH_TYPE(x,y)      ((ARCH_##x##_TYPE<<8)|y)
     501  
     502  typedef struct
     503  {
     504    unsigned int type : 16;
     505    unsigned int size : 16;
     506  } ARCH_common;
     507  
     508  /* The maximum value that fits into ARCH_common.size */
     509  #define ARCH_MAX_SIZE 0xffff
     510  
     511  #define ARCH_SEGMENT ARCH_TYPE(SEGMENT, 0)
     512  
     513  typedef struct
     514  {
     515    ARCH_common common;
     516    int version;
     517    uint32_t inode;
     518    uint32_t textsz;      /* text segment size */
     519    uint32_t platform;    /* sparc, intel, etc. */
     520  } ARCH_segment;
     521  
     522  #define ARCH_MSG ARCH_TYPE(MSG, 0)
     523  
     524  typedef struct
     525  {
     526    ARCH_common common;
     527    uint32_t errcode;
     528  } ARCH_message;
     529  
     530  #define ARCH_INF ARCH_TYPE(INF, 0)
     531  
     532  typedef struct
     533  {
     534    ARCH_common common;
     535  } ARCH_info;
     536  
     537  #define ARCH_MODULE ARCH_TYPE(MODULE, 0)
     538  
     539  typedef struct
     540  {
     541    ARCH_common common;
     542    unsigned int lang_code;
     543    unsigned int fragmented;
     544  } ARCH_module;
     545  
     546  #define ARCH_FUNCTION ARCH_TYPE(FUNCTION, 0)
     547  
     548  typedef struct
     549  {
     550    ARCH_common common;
     551    uint32_t offset;
     552    uint32_t size;
     553    uint32_t save_addr;
     554  } ARCH_function;
     555  
     556  #define ARCH_LDINSTR  ARCH_TYPE(LDINSTR, 0)
     557  #define ARCH_STINSTR  ARCH_TYPE(STINSTR, 0)
     558  #define ARCH_PREFETCH ARCH_TYPE(PREFETCH, 0)
     559  #define ARCH_BRTARGET ARCH_TYPE(BRTARGET, 0)
     560  
     561  typedef struct
     562  {
     563    ARCH_common common;
     564  } ARCH_aninfo;
     565  
     566  #define ARCH_JCLASS_LOCATION ARCH_TYPE(JCLASS_LOCATION, 3)
     567  
     568  typedef struct
     569  {
     570    CM_Packet comm;
     571    uint32_t pad;
     572    uint64_t class_id;
     573  } ARCH_jclass_location;
     574  
     575  #define ARCH_JCLASS ARCH_TYPE(JCLASS, 3)
     576  
     577  typedef struct
     578  {
     579    CM_Packet comm;
     580    uint32_t pad;
     581    uint64_t class_id;
     582    hrtime_t tstamp;
     583  } ARCH_jclass;
     584  
     585  #define ARCH_JMETHOD ARCH_TYPE(JMETHOD, 3)
     586  
     587  typedef struct
     588  {
     589    CM_Packet comm;
     590    uint32_t pad;
     591    uint64_t class_id;
     592    uint64_t method_id;
     593  } ARCH_jmethod;
     594  
     595  #endif /* _DATA_PCKTS_H */