xref: /openbmc/linux/tools/perf/util/jitdump.h (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1b15f321bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
29b07e27fSStephane Eranian /*
39b07e27fSStephane Eranian  * jitdump.h: jitted code info encapsulation file format
49b07e27fSStephane Eranian  *
59b07e27fSStephane Eranian  * Adapted from OProfile GPLv2 support jidump.h:
69b07e27fSStephane Eranian  * Copyright 2007 OProfile authors
79b07e27fSStephane Eranian  * Jens Wilke
89b07e27fSStephane Eranian  * Daniel Hansel
99b07e27fSStephane Eranian  * Copyright IBM Corporation 2007
109b07e27fSStephane Eranian  */
119b07e27fSStephane Eranian #ifndef JITDUMP_H
129b07e27fSStephane Eranian #define JITDUMP_H
139b07e27fSStephane Eranian 
149b07e27fSStephane Eranian #include <sys/time.h>
159b07e27fSStephane Eranian #include <time.h>
169b07e27fSStephane Eranian #include <stdint.h>
179b07e27fSStephane Eranian 
189b07e27fSStephane Eranian /* JiTD */
199b07e27fSStephane Eranian #define JITHEADER_MAGIC		0x4A695444
209b07e27fSStephane Eranian #define JITHEADER_MAGIC_SW	0x4454694A
219b07e27fSStephane Eranian 
229b07e27fSStephane Eranian #define PADDING_8ALIGNED(x) ((((x) + 7) & 7) ^ 7)
230284fecdSStefano Sanfilippo #define ALIGN_8(x) (((x) + 7) & (~7))
249b07e27fSStephane Eranian 
259b07e27fSStephane Eranian #define JITHEADER_VERSION 1
269b07e27fSStephane Eranian 
279b07e27fSStephane Eranian enum jitdump_flags_bits {
282a28e230SAdrian Hunter 	JITDUMP_FLAGS_ARCH_TIMESTAMP_BIT,
299b07e27fSStephane Eranian 	JITDUMP_FLAGS_MAX_BIT,
309b07e27fSStephane Eranian };
319b07e27fSStephane Eranian 
322a28e230SAdrian Hunter #define JITDUMP_FLAGS_ARCH_TIMESTAMP	(1ULL << JITDUMP_FLAGS_ARCH_TIMESTAMP_BIT)
332a28e230SAdrian Hunter 
349b07e27fSStephane Eranian #define JITDUMP_FLAGS_RESERVED (JITDUMP_FLAGS_MAX_BIT < 64 ? \
359b07e27fSStephane Eranian 				(~((1ULL << JITDUMP_FLAGS_MAX_BIT) - 1)) : 0)
369b07e27fSStephane Eranian 
379b07e27fSStephane Eranian struct jitheader {
389b07e27fSStephane Eranian 	uint32_t magic;		/* characters "jItD" */
399b07e27fSStephane Eranian 	uint32_t version;	/* header version */
409b07e27fSStephane Eranian 	uint32_t total_size;	/* total size of header */
419b07e27fSStephane Eranian 	uint32_t elf_mach;	/* elf mach target */
429b07e27fSStephane Eranian 	uint32_t pad1;		/* reserved */
439b07e27fSStephane Eranian 	uint32_t pid;		/* JIT process id */
449b07e27fSStephane Eranian 	uint64_t timestamp;	/* timestamp */
459b07e27fSStephane Eranian 	uint64_t flags;		/* flags */
469b07e27fSStephane Eranian };
479b07e27fSStephane Eranian 
489b07e27fSStephane Eranian enum jit_record_type {
499b07e27fSStephane Eranian 	JIT_CODE_LOAD		= 0,
509b07e27fSStephane Eranian         JIT_CODE_MOVE           = 1,
519b07e27fSStephane Eranian 	JIT_CODE_DEBUG_INFO	= 2,
529b07e27fSStephane Eranian 	JIT_CODE_CLOSE		= 3,
530284fecdSStefano Sanfilippo 	JIT_CODE_UNWINDING_INFO	= 4,
549b07e27fSStephane Eranian 
559b07e27fSStephane Eranian 	JIT_CODE_MAX,
569b07e27fSStephane Eranian };
579b07e27fSStephane Eranian 
589b07e27fSStephane Eranian /* record prefix (mandatory in each record) */
599b07e27fSStephane Eranian struct jr_prefix {
609b07e27fSStephane Eranian 	uint32_t id;
619b07e27fSStephane Eranian 	uint32_t total_size;
629b07e27fSStephane Eranian 	uint64_t timestamp;
639b07e27fSStephane Eranian };
649b07e27fSStephane Eranian 
659b07e27fSStephane Eranian struct jr_code_load {
669b07e27fSStephane Eranian 	struct jr_prefix p;
679b07e27fSStephane Eranian 
689b07e27fSStephane Eranian 	uint32_t pid;
699b07e27fSStephane Eranian 	uint32_t tid;
709b07e27fSStephane Eranian 	uint64_t vma;
719b07e27fSStephane Eranian 	uint64_t code_addr;
729b07e27fSStephane Eranian 	uint64_t code_size;
739b07e27fSStephane Eranian 	uint64_t code_index;
749b07e27fSStephane Eranian };
759b07e27fSStephane Eranian 
769b07e27fSStephane Eranian struct jr_code_close {
779b07e27fSStephane Eranian 	struct jr_prefix p;
789b07e27fSStephane Eranian };
799b07e27fSStephane Eranian 
809b07e27fSStephane Eranian struct jr_code_move {
819b07e27fSStephane Eranian 	struct jr_prefix p;
829b07e27fSStephane Eranian 
839b07e27fSStephane Eranian 	uint32_t pid;
849b07e27fSStephane Eranian 	uint32_t tid;
859b07e27fSStephane Eranian 	uint64_t vma;
869b07e27fSStephane Eranian 	uint64_t old_code_addr;
879b07e27fSStephane Eranian 	uint64_t new_code_addr;
889b07e27fSStephane Eranian 	uint64_t code_size;
899b07e27fSStephane Eranian 	uint64_t code_index;
909b07e27fSStephane Eranian };
919b07e27fSStephane Eranian 
929b07e27fSStephane Eranian struct debug_entry {
939b07e27fSStephane Eranian 	uint64_t addr;
949b07e27fSStephane Eranian 	int lineno;	    /* source line number starting at 1 */
959b07e27fSStephane Eranian 	int discrim;	    /* column discriminator, 0 is default */
96*6549a8c0SGustavo A. R. Silva 	const char name[]; /* null terminated filename, \xff\0 if same as previous entry */
979b07e27fSStephane Eranian };
989b07e27fSStephane Eranian 
999b07e27fSStephane Eranian struct jr_code_debug_info {
1009b07e27fSStephane Eranian 	struct jr_prefix p;
1019b07e27fSStephane Eranian 
1029b07e27fSStephane Eranian 	uint64_t code_addr;
1039b07e27fSStephane Eranian 	uint64_t nr_entry;
104*6549a8c0SGustavo A. R. Silva 	struct debug_entry entries[];
1059b07e27fSStephane Eranian };
1069b07e27fSStephane Eranian 
1070284fecdSStefano Sanfilippo struct jr_code_unwinding_info {
1080284fecdSStefano Sanfilippo 	struct jr_prefix p;
1090284fecdSStefano Sanfilippo 
1100284fecdSStefano Sanfilippo 	uint64_t unwinding_size;
1110284fecdSStefano Sanfilippo 	uint64_t eh_frame_hdr_size;
1120284fecdSStefano Sanfilippo 	uint64_t mapped_size;
113*6549a8c0SGustavo A. R. Silva 	const char unwinding_data[];
1140284fecdSStefano Sanfilippo };
1150284fecdSStefano Sanfilippo 
1169b07e27fSStephane Eranian union jr_entry {
1179b07e27fSStephane Eranian         struct jr_code_debug_info info;
1189b07e27fSStephane Eranian         struct jr_code_close close;
1199b07e27fSStephane Eranian         struct jr_code_load load;
1209b07e27fSStephane Eranian         struct jr_code_move move;
1219b07e27fSStephane Eranian         struct jr_prefix prefix;
1220284fecdSStefano Sanfilippo         struct jr_code_unwinding_info unwinding;
1239b07e27fSStephane Eranian };
1249b07e27fSStephane Eranian 
1259b07e27fSStephane Eranian static inline struct debug_entry *
debug_entry_next(struct debug_entry * ent)1269b07e27fSStephane Eranian debug_entry_next(struct debug_entry *ent)
1279b07e27fSStephane Eranian {
1289b07e27fSStephane Eranian 	void *a = ent + 1;
1299b07e27fSStephane Eranian 	size_t l = strlen(ent->name) + 1;
1309b07e27fSStephane Eranian 	return a + l;
1319b07e27fSStephane Eranian }
1329b07e27fSStephane Eranian 
1339b07e27fSStephane Eranian static inline char *
debug_entry_file(struct debug_entry * ent)1349b07e27fSStephane Eranian debug_entry_file(struct debug_entry *ent)
1359b07e27fSStephane Eranian {
1369b07e27fSStephane Eranian 	void *a = ent + 1;
1379b07e27fSStephane Eranian 	return a;
1389b07e27fSStephane Eranian }
1399b07e27fSStephane Eranian 
1409b07e27fSStephane Eranian #endif /* !JITDUMP_H */
141