xref: /netbsd-src/external/gpl3/binutils/dist/gprofng/src/data_pckts.h (revision cb63e24e8d6aae7ddac1859a9015f48b1d8bd90e)
1 /* Copyright (C) 2021-2024 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 /* The maximum value that fits into ARCH_common.size */
510 #define ARCH_MAX_SIZE 0xffff
511 
512 #define ARCH_SEGMENT ARCH_TYPE(SEGMENT, 0)
513 
514 typedef struct
515 {
516   ARCH_common common;
517   int version;
518   uint32_t inode;
519   uint32_t textsz;      /* text segment size */
520   uint32_t platform;    /* sparc, intel, etc. */
521 } ARCH_segment;
522 
523 #define ARCH_MSG ARCH_TYPE(MSG, 0)
524 
525 typedef struct
526 {
527   ARCH_common common;
528   uint32_t errcode;
529 } ARCH_message;
530 
531 #define ARCH_INF ARCH_TYPE(INF, 0)
532 
533 typedef struct
534 {
535   ARCH_common common;
536 } ARCH_info;
537 
538 #define ARCH_MODULE ARCH_TYPE(MODULE, 0)
539 
540 typedef struct
541 {
542   ARCH_common common;
543   unsigned int lang_code;
544   unsigned int fragmented;
545 } ARCH_module;
546 
547 #define ARCH_FUNCTION ARCH_TYPE(FUNCTION, 0)
548 
549 typedef struct
550 {
551   ARCH_common common;
552   uint32_t offset;
553   uint32_t size;
554   uint32_t save_addr;
555 } ARCH_function;
556 
557 #define ARCH_LDINSTR  ARCH_TYPE(LDINSTR, 0)
558 #define ARCH_STINSTR  ARCH_TYPE(STINSTR, 0)
559 #define ARCH_PREFETCH ARCH_TYPE(PREFETCH, 0)
560 #define ARCH_BRTARGET ARCH_TYPE(BRTARGET, 0)
561 
562 typedef struct
563 {
564   ARCH_common common;
565 } ARCH_aninfo;
566 
567 #define ARCH_JCLASS_LOCATION ARCH_TYPE(JCLASS_LOCATION, 3)
568 
569 typedef struct
570 {
571   CM_Packet comm;
572   uint32_t pad;
573   uint64_t class_id;
574 } ARCH_jclass_location;
575 
576 #define ARCH_JCLASS ARCH_TYPE(JCLASS, 3)
577 
578 typedef struct
579 {
580   CM_Packet comm;
581   uint32_t pad;
582   uint64_t class_id;
583   hrtime_t tstamp;
584 } ARCH_jclass;
585 
586 #define ARCH_JMETHOD ARCH_TYPE(JMETHOD, 3)
587 
588 typedef struct
589 {
590   CM_Packet comm;
591   uint32_t pad;
592   uint64_t class_id;
593   uint64_t method_id;
594 } ARCH_jmethod;
595 
596 #endif /* _DATA_PCKTS_H */
597