Merge tag 'for-linus-20160324' of git://git.infradead.org/linux-mtd
[linux-2.6-block.git] / tools / perf / util / jitdump.h
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
23 #define JITHEADER_VERSION 1
24
25 enum jitdump_flags_bits {
26         JITDUMP_FLAGS_MAX_BIT,
27 };
28
29 #define JITDUMP_FLAGS_RESERVED (JITDUMP_FLAGS_MAX_BIT < 64 ? \
30                                 (~((1ULL << JITDUMP_FLAGS_MAX_BIT) - 1)) : 0)
31
32 struct jitheader {
33         uint32_t magic;         /* characters "jItD" */
34         uint32_t version;       /* header version */
35         uint32_t total_size;    /* total size of header */
36         uint32_t elf_mach;      /* elf mach target */
37         uint32_t pad1;          /* reserved */
38         uint32_t pid;           /* JIT process id */
39         uint64_t timestamp;     /* timestamp */
40         uint64_t flags;         /* flags */
41 };
42
43 enum jit_record_type {
44         JIT_CODE_LOAD           = 0,
45         JIT_CODE_MOVE           = 1,
46         JIT_CODE_DEBUG_INFO     = 2,
47         JIT_CODE_CLOSE          = 3,
48
49         JIT_CODE_MAX,
50 };
51
52 /* record prefix (mandatory in each record) */
53 struct jr_prefix {
54         uint32_t id;
55         uint32_t total_size;
56         uint64_t timestamp;
57 };
58
59 struct jr_code_load {
60         struct jr_prefix p;
61
62         uint32_t pid;
63         uint32_t tid;
64         uint64_t vma;
65         uint64_t code_addr;
66         uint64_t code_size;
67         uint64_t code_index;
68 };
69
70 struct jr_code_close {
71         struct jr_prefix p;
72 };
73
74 struct jr_code_move {
75         struct jr_prefix p;
76
77         uint32_t pid;
78         uint32_t tid;
79         uint64_t vma;
80         uint64_t old_code_addr;
81         uint64_t new_code_addr;
82         uint64_t code_size;
83         uint64_t code_index;
84 };
85
86 struct debug_entry {
87         uint64_t addr;
88         int lineno;         /* source line number starting at 1 */
89         int discrim;        /* column discriminator, 0 is default */
90         const char name[0]; /* null terminated filename, \xff\0 if same as previous entry */
91 };
92
93 struct jr_code_debug_info {
94         struct jr_prefix p;
95
96         uint64_t code_addr;
97         uint64_t nr_entry;
98         struct debug_entry entries[0];
99 };
100
101 union jr_entry {
102         struct jr_code_debug_info info;
103         struct jr_code_close close;
104         struct jr_code_load load;
105         struct jr_code_move move;
106         struct jr_prefix prefix;
107 };
108
109 static inline struct debug_entry *
110 debug_entry_next(struct debug_entry *ent)
111 {
112         void *a = ent + 1;
113         size_t l = strlen(ent->name) + 1;
114         return a + l;
115 }
116
117 static inline char *
118 debug_entry_file(struct debug_entry *ent)
119 {
120         void *a = ent + 1;
121         return a;
122 }
123
124 #endif /* !JITDUMP_H */