18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * jitdump.h: jitted code info encapsulation file format
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Adapted from OProfile GPLv2 support jidump.h:
68c2ecf20Sopenharmony_ci * Copyright 2007 OProfile authors
78c2ecf20Sopenharmony_ci * Jens Wilke
88c2ecf20Sopenharmony_ci * Daniel Hansel
98c2ecf20Sopenharmony_ci * Copyright IBM Corporation 2007
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci#ifndef JITDUMP_H
128c2ecf20Sopenharmony_ci#define JITDUMP_H
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <sys/time.h>
158c2ecf20Sopenharmony_ci#include <time.h>
168c2ecf20Sopenharmony_ci#include <stdint.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci/* JiTD */
198c2ecf20Sopenharmony_ci#define JITHEADER_MAGIC		0x4A695444
208c2ecf20Sopenharmony_ci#define JITHEADER_MAGIC_SW	0x4454694A
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci#define PADDING_8ALIGNED(x) ((((x) + 7) & 7) ^ 7)
238c2ecf20Sopenharmony_ci#define ALIGN_8(x) (((x) + 7) & (~7))
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci#define JITHEADER_VERSION 1
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cienum jitdump_flags_bits {
288c2ecf20Sopenharmony_ci	JITDUMP_FLAGS_ARCH_TIMESTAMP_BIT,
298c2ecf20Sopenharmony_ci	JITDUMP_FLAGS_MAX_BIT,
308c2ecf20Sopenharmony_ci};
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci#define JITDUMP_FLAGS_ARCH_TIMESTAMP	(1ULL << JITDUMP_FLAGS_ARCH_TIMESTAMP_BIT)
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci#define JITDUMP_FLAGS_RESERVED (JITDUMP_FLAGS_MAX_BIT < 64 ? \
358c2ecf20Sopenharmony_ci				(~((1ULL << JITDUMP_FLAGS_MAX_BIT) - 1)) : 0)
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_cistruct jitheader {
388c2ecf20Sopenharmony_ci	uint32_t magic;		/* characters "jItD" */
398c2ecf20Sopenharmony_ci	uint32_t version;	/* header version */
408c2ecf20Sopenharmony_ci	uint32_t total_size;	/* total size of header */
418c2ecf20Sopenharmony_ci	uint32_t elf_mach;	/* elf mach target */
428c2ecf20Sopenharmony_ci	uint32_t pad1;		/* reserved */
438c2ecf20Sopenharmony_ci	uint32_t pid;		/* JIT process id */
448c2ecf20Sopenharmony_ci	uint64_t timestamp;	/* timestamp */
458c2ecf20Sopenharmony_ci	uint64_t flags;		/* flags */
468c2ecf20Sopenharmony_ci};
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cienum jit_record_type {
498c2ecf20Sopenharmony_ci	JIT_CODE_LOAD		= 0,
508c2ecf20Sopenharmony_ci        JIT_CODE_MOVE           = 1,
518c2ecf20Sopenharmony_ci	JIT_CODE_DEBUG_INFO	= 2,
528c2ecf20Sopenharmony_ci	JIT_CODE_CLOSE		= 3,
538c2ecf20Sopenharmony_ci	JIT_CODE_UNWINDING_INFO	= 4,
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	JIT_CODE_MAX,
568c2ecf20Sopenharmony_ci};
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci/* record prefix (mandatory in each record) */
598c2ecf20Sopenharmony_cistruct jr_prefix {
608c2ecf20Sopenharmony_ci	uint32_t id;
618c2ecf20Sopenharmony_ci	uint32_t total_size;
628c2ecf20Sopenharmony_ci	uint64_t timestamp;
638c2ecf20Sopenharmony_ci};
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_cistruct jr_code_load {
668c2ecf20Sopenharmony_ci	struct jr_prefix p;
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci	uint32_t pid;
698c2ecf20Sopenharmony_ci	uint32_t tid;
708c2ecf20Sopenharmony_ci	uint64_t vma;
718c2ecf20Sopenharmony_ci	uint64_t code_addr;
728c2ecf20Sopenharmony_ci	uint64_t code_size;
738c2ecf20Sopenharmony_ci	uint64_t code_index;
748c2ecf20Sopenharmony_ci};
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_cistruct jr_code_close {
778c2ecf20Sopenharmony_ci	struct jr_prefix p;
788c2ecf20Sopenharmony_ci};
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_cistruct jr_code_move {
818c2ecf20Sopenharmony_ci	struct jr_prefix p;
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	uint32_t pid;
848c2ecf20Sopenharmony_ci	uint32_t tid;
858c2ecf20Sopenharmony_ci	uint64_t vma;
868c2ecf20Sopenharmony_ci	uint64_t old_code_addr;
878c2ecf20Sopenharmony_ci	uint64_t new_code_addr;
888c2ecf20Sopenharmony_ci	uint64_t code_size;
898c2ecf20Sopenharmony_ci	uint64_t code_index;
908c2ecf20Sopenharmony_ci};
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_cistruct debug_entry {
938c2ecf20Sopenharmony_ci	uint64_t addr;
948c2ecf20Sopenharmony_ci	int lineno;	    /* source line number starting at 1 */
958c2ecf20Sopenharmony_ci	int discrim;	    /* column discriminator, 0 is default */
968c2ecf20Sopenharmony_ci	const char name[]; /* null terminated filename, \xff\0 if same as previous entry */
978c2ecf20Sopenharmony_ci};
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_cistruct jr_code_debug_info {
1008c2ecf20Sopenharmony_ci	struct jr_prefix p;
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	uint64_t code_addr;
1038c2ecf20Sopenharmony_ci	uint64_t nr_entry;
1048c2ecf20Sopenharmony_ci	struct debug_entry entries[];
1058c2ecf20Sopenharmony_ci};
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_cistruct jr_code_unwinding_info {
1088c2ecf20Sopenharmony_ci	struct jr_prefix p;
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci	uint64_t unwinding_size;
1118c2ecf20Sopenharmony_ci	uint64_t eh_frame_hdr_size;
1128c2ecf20Sopenharmony_ci	uint64_t mapped_size;
1138c2ecf20Sopenharmony_ci	const char unwinding_data[];
1148c2ecf20Sopenharmony_ci};
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ciunion jr_entry {
1178c2ecf20Sopenharmony_ci        struct jr_code_debug_info info;
1188c2ecf20Sopenharmony_ci        struct jr_code_close close;
1198c2ecf20Sopenharmony_ci        struct jr_code_load load;
1208c2ecf20Sopenharmony_ci        struct jr_code_move move;
1218c2ecf20Sopenharmony_ci        struct jr_prefix prefix;
1228c2ecf20Sopenharmony_ci        struct jr_code_unwinding_info unwinding;
1238c2ecf20Sopenharmony_ci};
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_cistatic inline struct debug_entry *
1268c2ecf20Sopenharmony_cidebug_entry_next(struct debug_entry *ent)
1278c2ecf20Sopenharmony_ci{
1288c2ecf20Sopenharmony_ci	void *a = ent + 1;
1298c2ecf20Sopenharmony_ci	size_t l = strlen(ent->name) + 1;
1308c2ecf20Sopenharmony_ci	return a + l;
1318c2ecf20Sopenharmony_ci}
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_cistatic inline char *
1348c2ecf20Sopenharmony_cidebug_entry_file(struct debug_entry *ent)
1358c2ecf20Sopenharmony_ci{
1368c2ecf20Sopenharmony_ci	void *a = ent + 1;
1378c2ecf20Sopenharmony_ci	return a;
1388c2ecf20Sopenharmony_ci}
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci#endif /* !JITDUMP_H */
141