1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * jitdump.h: jitted code info encapsulation file format |
4 | * |
5 | * Adapted from OProfile GPLv2 support jidump.h: |
6 | * Copyright 2007 OProfile authors |
7 | * Jens Wilke |
8 | * Daniel Hansel |
9 | * Copyright IBM Corporation 2007 |
10 | */ |
11 | #ifndef JITDUMP_H |
12 | #define JITDUMP_H |
13 | |
14 | #include <sys/time.h> |
15 | #include <time.h> |
16 | #include <stdint.h> |
17 | |
18 | /* JiTD */ |
19 | #define 0x4A695444 |
20 | #define 0x4454694A |
21 | |
22 | #define PADDING_8ALIGNED(x) ((((x) + 7) & 7) ^ 7) |
23 | #define ALIGN_8(x) (((x) + 7) & (~7)) |
24 | |
25 | #define 1 |
26 | |
27 | enum 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 | |
37 | struct { |
38 | uint32_t ; /* characters "jItD" */ |
39 | uint32_t ; /* header version */ |
40 | uint32_t ; /* total size of header */ |
41 | uint32_t ; /* elf mach target */ |
42 | uint32_t ; /* reserved */ |
43 | uint32_t ; /* JIT process id */ |
44 | uint64_t ; /* timestamp */ |
45 | uint64_t ; /* flags */ |
46 | }; |
47 | |
48 | enum 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) */ |
59 | struct jr_prefix { |
60 | uint32_t id; |
61 | uint32_t total_size; |
62 | uint64_t timestamp; |
63 | }; |
64 | |
65 | struct 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 | |
76 | struct jr_code_close { |
77 | struct jr_prefix p; |
78 | }; |
79 | |
80 | struct 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 | |
92 | struct 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 | |
99 | struct 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 | |
107 | struct 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 | |
116 | union 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 | |
125 | static inline struct debug_entry * |
126 | debug_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 | |
133 | static inline char * |
134 | debug_entry_file(struct debug_entry *ent) |
135 | { |
136 | void *a = ent + 1; |
137 | return a; |
138 | } |
139 | |
140 | #endif /* !JITDUMP_H */ |
141 | |