1 /* Copyright (C) 2021 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 */ 596