aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ubicom32/files/arch/ubicom32/mach-common/profpkt.h
blob: 37d9219a6d05217fec414244048fb5621497354c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158

/*
 * arch/ubicom32/mach-common/profpkt.c
 *   Ubicom32 Profiler packet formats for communication between the linux proc driver and the profiler display tool
 *
 * (C) Copyright 2009, Ubicom, Inc.
 *
 * This file is part of the Ubicom32 Linux Kernel Port.
 *
 * The Ubicom32 Linux Kernel Port is free software: you can redistribute
 * it and/or modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation, either version 2 of the
 * License, or (at your option) any later version.
 *
 * The Ubicom32 Linux Kernel Port is distributed in the hope that it
 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
 * the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with the Ubicom32 Linux Kernel Port.  If not,
 * see <http://www.gnu.org/licenses/>.
 */

#define PROFILE_PORT 51080
#define PROFILE_POSIX_NAME_LENGTH 32

/*
 * profile UDP packet format for communicating between ip3k and host
 *
 * every packet starts with a header, followed by samples.
 * samples are only taken for non-hrt threads that are
 * active
 */
#define PROF_MAGIC 0x3ea0
#define PROF_MAGIC_COUNTERS 0x9ea0
#define PROF_MAGIC_MAPS 0xaea0

/*
 * Versions (31 max):
 * 1 to 4 were before 6.0 release,  development versions
 * 5 was forward compatible version, shipped with 6.0 and 6.1
 * 6 adds heap packets, and clock_freq to header, shipped with 6.2
 * 7 adds a sequence numbers to check for dropped packets, shipped with 6.3.5
 * 8 adds mqueue timing information, shipped with 6.3.5
 * 9 adds sdram heap size information, shipped with 6.4
 * 10 adds heapmem heap callers and long latency stack traces.  shipped with 6.4
 * 11 adds support for Mars (IP5K).  shipped with 6.10
 * 12 adds more support for Mars.  Shipped with 7.0
 * 13 adds per sample latency measurement.  Shipped with 7.2
 * 14 changes the heap format and adds a string packet.  Shipped with 7.4
 * 15 adds dsr stats and posix.  shipped with 7.6
 * 16 corrects maximum packet count for Ares.  ships with 7.9
 * 17 adds a5 register value to sample
 */

#define PROFILE_VERSION 17
#define PROFILE_MAX_PACKET_SIZE 1440

#define PROFILE_MAX_THREADS 16

/*
 * each packet starts with a profile_header, then sample_count samples
 * samples are gprof samples of pc, the return address, condition codes, and
 * active threads
 */
struct profile_header {
	u16_t magic;			/* magic number and version */
	u8_t header_size;		/* number of bytes in profile header */
	u8_t sample_count;		/* number of samples in the packet */
	u32_t clocks;			/* clock counter value */
	u32_t instruction_count[PROFILE_MAX_THREADS];
					/* instructions executed per thread */
	u32_t profile_instructions;	/* instructions executed by profiler mainline */
	u16_t enabled;			/* which threads are enabled */
	u16_t hrt;			/* which threads are hrt */
	u16_t high;			/* which threads are high priority */
	u16_t profiler_thread;		/* which thread runs the profiler */
	u32_t heap_free;		/* current free on-cihp heap space in bytes */
	u32_t heap_low_water;		/* on-chip heap low water mark */
	u32_t netpage_free;		/* number of free on-chip net pages */
	u32_t netpage_low_water;	/* low water mark on free on-chip netpages */
	u32_t min_sp[PROFILE_MAX_THREADS];
					/* stack pointer values per thread */
	u32_t clock_freq;		/* clock frequency (Hz) of system being analyzed */
	u32_t seq_num;			/* to detect dropped profiler packets */
	u32_t timing_sequence;		/* sample number since boot */
	u32_t timing_interval;		/* second per sample timing interval */
	u32_t timing_worst_time;	/* duration of longest finction called, in core clocks */
	u32_t timing_function;		/* address of longest function */
	u32_t timing_average;		/* average time of all functions in last interval */
	u32_t timing_count;		/* number of functions called in last interval */
	u32_t extheap_free;		/* current free extmem heap space in bytes */
	u32_t extheap_low_water;	/* extmem heap low water mark */
	u32_t cpu_id;			/* CHIP_ID register contents */
	u32_t perf_counters[4];		/* contents of the CPU performance counters */
	u8_t perf_config[4];		/* what is being counted */
	u32_t ddr_freq;			/* DDR clock frequency */
	u32_t extnetpage_free;		/* number of free off chip net pages */
	u32_t extnetpage_low_water;	/* low water mark on off-chip free netpages */
	u32_t dsr_max_latency;		/* max time to process a dsr interrupt, in clocks, since last packet */
	u32_t dsr_ave_latency;		/* average dsr latency over last DSR_STATS_RECENT_COUNT interrupts */
	u32_t dsr_count;		/* number of dsr interrupts since last packet */
};

struct profile_header_counters {
	u16_t magic;
	u16_t ultra_count;		/* how many ultra counters follow this */
	u32_t ultra_sample_time;	/* in chip clocks */
	u32_t linux_count;		/* how many linux counters follow this */
	u32_t linux_sample_time;
};

/*
 * values chosen so all counter values fit in a single 1400 byte UDP packet
 */
#define PROFILE_COUNTER_NAME_LENGTH 20
#define PROFILE_MAX_COUNTERS ((PROFILE_MAX_PACKET_SIZE - sizeof(struct profile_header_counters)) / (PROFILE_COUNTER_NAME_LENGTH + 4))

struct profile_counter_pkt {
	char name[PROFILE_COUNTER_NAME_LENGTH];
	unsigned int value;
};

/*
 * send memory maps from linux to profiler tool
 */

struct profile_header_maps {
	u16_t magic;
	u16_t count;
	u32_t page_shift;
};

#define PROFILE_MAP_NUM_TYPES 32

/* types 0-15: size field is order.  True size is 2^order */
#define PROFILE_MAP_TYPE_UNKNOWN 0
#define PROFILE_MAP_TYPE_FREE 1
#define PROFILE_MAP_TYPE_SMALL 2
#define PROFILE_MAP_TYPE_FS 3
/* types 16-31: size field is pages.  True size is (1 << PAGE_SHIFT) * size */
#define PROFILE_MAP_SIZE_TYPE 16
#define PROFILE_MAP_TYPE_TEXT 16
#define PROFILE_MAP_TYPE_STACK 17
#define PROFILE_MAP_TYPE_APP_DATA 18
#define PROFILE_MAP_TYPE_CACHE 19
#define PROFILE_MAP_RESERVED 24

#define PROFILE_MAP_TYPE_SHIFT 11
#define PROFILE_MAP_SIZE_MASK 0x7ff

struct profile_map {
	u16_t start;		/* start page number of segment, relative to start of DRAM */
	u16_t type_size;	/* type (4 bits) of the segment and size in pages (12 bits) */
};

#define PROFILE_MAX_MAPS (PROFILE_MAX_PACKET_SIZE - sizeof(struct profile_header_maps)) / sizeof(struct profile_map)