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