1/* 2 ************************************************************************** 3 * Copyright (c) 2014, The Linux Foundation. All rights reserved. 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all copies. 7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 10 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 12 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 13 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 ************************************************************************** 15 */ 16 17/* 18 * profpkt.h 19 * profile packet header to communicate with the profiler display tool 20 * 21 * IMPORTANT! There is a parallel verison of this file for both linux driver and profiler display tool 22 * 23 * Both this file and profilesample.h file must be placed 24 * in dirver/.../nss (for linux driver) and as well as in tools/profiler/include directories 25 * (for profilerd.c of profilerd and profile.cpp:1600::on_packet of profile tool). 26 * 27 * Ubi32 CPU Profiler packet formats for communication between the linux proc driver and the profiler display tool 28 */ 29 30#include "profilesample.h" // common definitions 31 32#define PROFILE_PORT 51080 33#define PROFILE_CONTROL_PORT 51081 34#define PROFILE_POSIX_NAME_LENGTH 32 35 36/* 37 * profile UDP packet format for communicating between ip3k and host 38 * 39 * every packet starts with a header, followed by samples. 40 * samples are only taken for non-hrt threads that are 41 * active 42 */ 43#define PROF_MAGIC 0x3ea0 44#define PROF_MAGIC_COUNTERS 0x9ea0 45#define PROF_MAGIC_MAPS 0xaea0 46 47/* 48 * Versions (31 max): 49 * 1 to 4 were before 6.0 release, development versions 50 * 5 was forward compatible version, shipped with 6.0 and 6.1 51 * 6 adds heap packets, and clock_freq to header, shipped with 6.2 52 * 7 adds a sequence numbers to check for dropped packets, shipped with 6.3.5 53 * 8 adds mqueue timing information, shipped with 6.3.5 54 * 9 adds sdram heap size information, shipped with 6.4 55 * 10 adds heapmem heap callers and long latency stack traces. shipped with 6.4 56 * 11 adds support for Mars (IP5K). shipped with 6.10 57 * 12 adds more support for Mars. Shipped with 7.0 58 * 13 adds per sample latency measurement. Shipped with 7.2 59 * 14 changes the heap format and adds a string packet. Shipped with 7.4 60 * 15 adds dsr stats and posix. shipped with 7.6 61 * 16 corrects maximum packet count for Ares. ships with 7.9 62 * 17 adds a5 register value to sample 63 * 18 adds counter support and removes unused header fields 64 * 19 adds PID support for MMU profiling 65 * 20 changes the protocol for transmitting map PID maps automatically 66 * 21 adds support for multiple possible parents, configurable 67 */ 68 69#define PROFILE_VERSION 21 70 71 72/* 73 * Each packet starts with a profile_header, then sample_count samples; 74 * samples are gprof samples of pc, the return address, condition codes, and active threads. 75 * For performance concern, the field sequence may be reordered to match profilenode to reduce 76 * a memory copy. 77 */ 78struct profile_pkg_header { // in network byte order ! 79 uint16_t magic; /* magic number and version */ 80 uint8_t header_size; /* number of bytes in profile header */ 81 uint8_t sample_count; /* number of samples in the packet */ 82 uint32_t sample_stack_words; /* number of stack words in the sample */ 83 uint32_t seq_num; /* to detect dropped profiler packets */ 84 uint32_t profile_instructions; /* instructions executed by profiler mainline */ 85 86 uint32_t unused_overlay; // untouched fields below in Linux -- to reduce memcpy 87 uint32_t cpu_id; /* CHIP_ID register contents */ 88 uint32_t clock_freq; /* clock frequency (Hz) of system being analyzed */ 89 uint32_t ddr_freq; /* DDR clock frequency */ 90}; 91 92struct profile_header { // in network byte order ! 93 struct profile_pkg_header pph; 94 struct profile_ext_header exh; 95}; 96 97struct profile_header_counters { 98 uint16_t magic; 99 uint16_t ultra_count; // how many ultra counters follow this 100 uint32_t ultra_sample_time; // in chip clocks 101 uint32_t linux_count; // how many linux counters follow this 102 uint32_t linux_sample_time; 103}; 104 105/* 106 * send memory maps from linux to profiler tool 107 */ 108 109struct profile_header_maps { 110 uint16_t magic; /* magic number and last packet bit */ 111 uint16_t count; 112 uint32_t page_shift; 113}; 114 115#define PROFILE_MAP_NUM_TYPES 16 116 117/* size field is pages. True size in bytes is (1 << PAGE_SHIFT) * size */ 118#define PROFILE_MAP_TYPE_FREE 0 119#define PROFILE_MAP_TYPE_SMALL 1 120#define PROFILE_MAP_TYPE_FS 2 121#define PROFILE_MAP_TYPE_UNKNOWN_USED 4 122#define PROFILE_MAP_TYPE_TEXT 5 123#define PROFILE_MAP_TYPE_STACK 6 124#define PROFILE_MAP_TYPE_APP_DATA 7 125#define PROFILE_MAP_TYPE_ASHMEM 8 126#define PROFILE_MAP_TYPE_READ_SHARED 9 127#define PROFILE_MAP_TYPE_CACHE 10 128#define PROFILE_MAP_TYPE_VMA_WASTE 11 129#define PROFILE_MAP_RESERVED 15 130 131#define PROFILE_MAP_TYPE_SHIFT 12 132#define PROFILE_MAP_SIZE_MASK 0xfff 133 134struct profile_map { 135 uint16_t start; /* start page number of segment, relative to start of OCM (Max 256 MB on IP7K or 1 GB on IP8K, plus 256 KB OCM) */ 136 uint16_t type_size; /* type (4 bits) of the segment and size (12 bits) in pages. A size of 0 means 4K pages */ 137}; 138 139#define PROFILE_MAX_MAPS (PROFILE_MAX_PACKET_SIZE - sizeof(struct profile_header_maps)) / sizeof(struct profile_map) 140