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