141 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * jitdump.h: jitted code info encapsulation file format4 *5 * Adapted from OProfile GPLv2 support jidump.h:6 * Copyright 2007 OProfile authors7 * Jens Wilke8 * Daniel Hansel9 * Copyright IBM Corporation 200710 */11#ifndef JITDUMP_H12#define JITDUMP_H13 14#include <sys/time.h>15#include <time.h>16#include <stdint.h>17 18/* JiTD */19#define JITHEADER_MAGIC 0x4A69544420#define JITHEADER_MAGIC_SW 0x4454694A21 22#define PADDING_8ALIGNED(x) ((((x) + 7) & 7) ^ 7)23#define ALIGN_8(x) (((x) + 7) & (~7))24 25#define JITHEADER_VERSION 126 27enum jitdump_flags_bits {28 JITDUMP_FLAGS_ARCH_TIMESTAMP_BIT,29 JITDUMP_FLAGS_MAX_BIT,30};31 32#define JITDUMP_FLAGS_ARCH_TIMESTAMP (1ULL << JITDUMP_FLAGS_ARCH_TIMESTAMP_BIT)33 34#define JITDUMP_FLAGS_RESERVED (JITDUMP_FLAGS_MAX_BIT < 64 ? \35 (~((1ULL << JITDUMP_FLAGS_MAX_BIT) - 1)) : 0)36 37struct jitheader {38 uint32_t magic; /* characters "jItD" */39 uint32_t version; /* header version */40 uint32_t total_size; /* total size of header */41 uint32_t elf_mach; /* elf mach target */42 uint32_t pad1; /* reserved */43 uint32_t pid; /* JIT process id */44 uint64_t timestamp; /* timestamp */45 uint64_t flags; /* flags */46};47 48enum jit_record_type {49 JIT_CODE_LOAD = 0,50 JIT_CODE_MOVE = 1,51 JIT_CODE_DEBUG_INFO = 2,52 JIT_CODE_CLOSE = 3,53 JIT_CODE_UNWINDING_INFO = 4,54 55 JIT_CODE_MAX,56};57 58/* record prefix (mandatory in each record) */59struct jr_prefix {60 uint32_t id;61 uint32_t total_size;62 uint64_t timestamp;63};64 65struct jr_code_load {66 struct jr_prefix p;67 68 uint32_t pid;69 uint32_t tid;70 uint64_t vma;71 uint64_t code_addr;72 uint64_t code_size;73 uint64_t code_index;74};75 76struct jr_code_close {77 struct jr_prefix p;78};79 80struct jr_code_move {81 struct jr_prefix p;82 83 uint32_t pid;84 uint32_t tid;85 uint64_t vma;86 uint64_t old_code_addr;87 uint64_t new_code_addr;88 uint64_t code_size;89 uint64_t code_index;90};91 92struct debug_entry {93 uint64_t addr;94 int lineno; /* source line number starting at 1 */95 int discrim; /* column discriminator, 0 is default */96 const char name[]; /* null terminated filename, \xff\0 if same as previous entry */97};98 99struct jr_code_debug_info {100 struct jr_prefix p;101 102 uint64_t code_addr;103 uint64_t nr_entry;104 struct debug_entry entries[];105};106 107struct jr_code_unwinding_info {108 struct jr_prefix p;109 110 uint64_t unwinding_size;111 uint64_t eh_frame_hdr_size;112 uint64_t mapped_size;113 const char unwinding_data[];114};115 116union jr_entry {117 struct jr_code_debug_info info;118 struct jr_code_close close;119 struct jr_code_load load;120 struct jr_code_move move;121 struct jr_prefix prefix;122 struct jr_code_unwinding_info unwinding;123};124 125static inline struct debug_entry *126debug_entry_next(struct debug_entry *ent)127{128 void *a = ent + 1;129 size_t l = strlen(ent->name) + 1;130 return a + l;131}132 133static inline char *134debug_entry_file(struct debug_entry *ent)135{136 void *a = ent + 1;137 return a;138}139 140#endif /* !JITDUMP_H */141