1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Copyright (C) 2009, Steven Rostedt <srostedt@redhat.com> 3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * This program is free software; you can redistribute it and/or modify 7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * it under the terms of the GNU General Public License as published by 8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * the Free Software Foundation; version 2 of the License (not later!) 9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * This program is distributed in the hope that it will be useful, 11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * but WITHOUT ANY WARRANTY; without even the implied warranty of 12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * GNU General Public License for more details. 14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * You should have received a copy of the GNU General Public License 16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * along with this program; if not, write to the Free Software 17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define _FILE_OFFSET_BITS 64 22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <dirent.h> 24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdio.h> 25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdlib.h> 26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <string.h> 27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <getopt.h> 28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdarg.h> 29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/types.h> 30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/stat.h> 31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/wait.h> 32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/mman.h> 33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <pthread.h> 34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <fcntl.h> 35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <unistd.h> 36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <ctype.h> 37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <errno.h> 38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "../perf.h" 40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "util.h" 41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "trace-event.h" 42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic int input_fd; 44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic int read_page; 46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint file_bigendian; 48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint host_bigendian; 49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic int long_size; 50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic unsigned long page_size; 52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic ssize_t calc_data_size; 54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic bool repipe; 55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic int do_read(int fd, void *buf, int size) 57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int rsize = size; 59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (size) { 61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int ret = read(fd, buf, size); 62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (ret <= 0) 64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return -1; 65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (repipe) { 67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int retw = write(STDOUT_FILENO, buf, ret); 68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (retw <= 0 || retw != ret) 70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("repiping input file"); 71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size -= ret; 74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng buf += ret; 75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return rsize; 78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic int read_or_die(void *data, int size) 81e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 82e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int r; 83e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 84e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng r = do_read(input_fd, data, size); 85e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (r <= 0) 86e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("reading input file (size expected=%d received=%d)", 87e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size, r); 88e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 89e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (calc_data_size) 90e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng calc_data_size += r; 91e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 92e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return r; 93e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 94e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 95e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* If it fails, the next read will report it */ 96e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void skip(int size) 97e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 98e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char buf[BUFSIZ]; 99e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int r; 100e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 101e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (size) { 102e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng r = size > BUFSIZ ? BUFSIZ : size; 103e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(buf, r); 104e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size -= r; 105e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng }; 106e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 107e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 108e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic unsigned int read4(void) 109e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 110e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned int data; 111e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 112e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(&data, 4); 113e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return __data2host4(data); 114e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 115e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 116e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic unsigned long long read8(void) 117e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 118e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long long data; 119e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 120e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(&data, 8); 121e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return __data2host8(data); 122e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 123e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 124e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic char *read_string(void) 125e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 126e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char buf[BUFSIZ]; 127e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char *str = NULL; 128e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int size = 0; 129e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng off_t r; 130e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char c; 131e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 132e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for (;;) { 133e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng r = read(input_fd, &c, 1); 134e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (r < 0) 135e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("reading input file"); 136e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 137e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!r) 138e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("no data"); 139e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 140e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (repipe) { 141e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int retw = write(STDOUT_FILENO, &c, 1); 142e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 143e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (retw <= 0 || retw != r) 144e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("repiping input file string"); 145e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 146e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 147e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng buf[size++] = c; 148e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 149e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!c) 150e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 151e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 152e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 153e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (calc_data_size) 154e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng calc_data_size += size; 155e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 156e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng str = malloc_or_die(size); 157e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng memcpy(str, buf, size); 158e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 159e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return str; 160e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 161e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 162e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void read_proc_kallsyms(void) 163e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 164e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned int size; 165e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char *buf; 166e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 167e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size = read4(); 168e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!size) 169e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return; 170e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 171e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng buf = malloc_or_die(size + 1); 172e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(buf, size); 173e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng buf[size] = '\0'; 174e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 175e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng parse_proc_kallsyms(buf, size); 176e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 177e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng free(buf); 178e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 179e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 180e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void read_ftrace_printk(void) 181e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 182e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned int size; 183e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char *buf; 184e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 185e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size = read4(); 186e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!size) 187e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return; 188e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 189e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng buf = malloc_or_die(size); 190e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(buf, size); 191e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 192e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng parse_ftrace_printk(buf, size); 193e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 194e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng free(buf); 195e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 196e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 197e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void read_header_files(void) 198e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 199e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long long size; 200e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char *header_event; 201e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char buf[BUFSIZ]; 202e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 203e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(buf, 12); 204e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 205e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (memcmp(buf, "header_page", 12) != 0) 206e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("did not read header page"); 207e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 208e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size = read8(); 209e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng skip(size); 210e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 211e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 212e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * The size field in the page is of type long, 213e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * use that instead, since it represents the kernel. 214e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 215e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng long_size = header_page_size_size; 216e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 217e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(buf, 13); 218e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (memcmp(buf, "header_event", 13) != 0) 219e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("did not read header event"); 220e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 221e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size = read8(); 222e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng header_event = malloc_or_die(size); 223e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(header_event, size); 224e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng free(header_event); 225e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 226e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 227e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void read_ftrace_file(unsigned long long size) 228e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 229e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char *buf; 230e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 231e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng buf = malloc_or_die(size); 232e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(buf, size); 233e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng parse_ftrace_file(buf, size); 234e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng free(buf); 235e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 236e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 237e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void read_event_file(char *sys, unsigned long long size) 238e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 239e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char *buf; 240e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 241e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng buf = malloc_or_die(size); 242e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(buf, size); 243e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng parse_event_file(buf, size, sys); 244e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng free(buf); 245e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 246e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 247e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void read_ftrace_files(void) 248e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 249e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long long size; 250e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int count; 251e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int i; 252e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 253e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng count = read4(); 254e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 255e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for (i = 0; i < count; i++) { 256e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size = read8(); 257e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_ftrace_file(size); 258e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 259e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 260e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 261e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void read_event_files(void) 262e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 263e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long long size; 264e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char *sys; 265e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int systems; 266e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int count; 267e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int i,x; 268e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 269e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng systems = read4(); 270e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 271e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for (i = 0; i < systems; i++) { 272e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng sys = read_string(); 273e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 274e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng count = read4(); 275e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for (x=0; x < count; x++) { 276e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size = read8(); 277e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_event_file(sys, size); 278e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 279e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 280e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 281e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 282e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct cpu_data { 283e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long long offset; 284e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long long size; 285e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long long timestamp; 286e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct record *next; 287e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char *page; 288e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int cpu; 289e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int index; 290e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int page_size; 291e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}; 292e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 293e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic struct cpu_data *cpu_data; 294e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 295e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void update_cpu_data_index(int cpu) 296e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 297e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].offset += page_size; 298e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].size -= page_size; 299e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].index = 0; 300e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 301e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 302e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void get_next_page(int cpu) 303e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 304e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng off_t save_seek; 305e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng off_t ret; 306e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 307e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!cpu_data[cpu].page) 308e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return; 309e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 310e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (read_page) { 311e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (cpu_data[cpu].size <= page_size) { 312e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng free(cpu_data[cpu].page); 313e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].page = NULL; 314e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return; 315e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 316e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 317e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng update_cpu_data_index(cpu); 318e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 319e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* other parts of the code may expect the pointer to not move */ 320e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng save_seek = lseek(input_fd, 0, SEEK_CUR); 321e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 322e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret = lseek(input_fd, cpu_data[cpu].offset, SEEK_SET); 323e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (ret == (off_t)-1) 324e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("failed to lseek"); 325e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret = read(input_fd, cpu_data[cpu].page, page_size); 326e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (ret < 0) 327e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("failed to read page"); 328e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 329e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* reset the file pointer back */ 330e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng lseek(input_fd, save_seek, SEEK_SET); 331e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 332e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return; 333e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 334e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 335e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng munmap(cpu_data[cpu].page, page_size); 336e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].page = NULL; 337e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 338e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (cpu_data[cpu].size <= page_size) 339e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return; 340e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 341e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng update_cpu_data_index(cpu); 342e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 343e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].page = mmap(NULL, page_size, PROT_READ, MAP_PRIVATE, 344e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng input_fd, cpu_data[cpu].offset); 345e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (cpu_data[cpu].page == MAP_FAILED) 346e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("failed to mmap cpu %d at offset 0x%llx", 347e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu, cpu_data[cpu].offset); 348e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 349e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 350e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic unsigned int type_len4host(unsigned int type_len_ts) 351e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 352e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (file_bigendian) 353e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return (type_len_ts >> 27) & ((1 << 5) - 1); 354e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else 355e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return type_len_ts & ((1 << 5) - 1); 356e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 357e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 358e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic unsigned int ts4host(unsigned int type_len_ts) 359e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 360e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (file_bigendian) 361e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return type_len_ts & ((1 << 27) - 1); 362e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else 363e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return type_len_ts >> 5; 364e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 365e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 366e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic int calc_index(void *ptr, int cpu) 367e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 368e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return (unsigned long)ptr - (unsigned long)cpu_data[cpu].page; 369e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 370e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 371e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct record *trace_peek_data(int cpu) 372e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 373e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct record *data; 374e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void *page = cpu_data[cpu].page; 375e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int idx = cpu_data[cpu].index; 376e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng void *ptr = page + idx; 377e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned long long extend; 378e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned int type_len_ts; 379e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned int type_len; 380e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned int delta; 381e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned int length = 0; 382e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 383e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (cpu_data[cpu].next) 384e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return cpu_data[cpu].next; 385e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 386e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!page) 387e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return NULL; 388e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 389e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!idx) { 390e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* FIXME: handle header page */ 391e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (header_page_ts_size != 8) 392e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("expected a long long type for timestamp"); 393e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].timestamp = data2host8(ptr); 394e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ptr += 8; 395e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng switch (header_page_size_size) { 396e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 4: 397e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].page_size = data2host4(ptr); 398e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ptr += 4; 399e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 400e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 8: 401e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].page_size = data2host8(ptr); 402e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ptr += 8; 403e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 404e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng default: 405e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("bad long size"); 406e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 407e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ptr = cpu_data[cpu].page + header_page_data_offset; 408e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 409e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 410e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengread_again: 411e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng idx = calc_index(ptr, cpu); 412e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 413e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (idx >= cpu_data[cpu].page_size) { 414e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng get_next_page(cpu); 415e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return trace_peek_data(cpu); 416e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 417e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 418e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng type_len_ts = data2host4(ptr); 419e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ptr += 4; 420e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 421e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng type_len = type_len4host(type_len_ts); 422e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng delta = ts4host(type_len_ts); 423e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 424e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng switch (type_len) { 425e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case RINGBUF_TYPE_PADDING: 426e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!delta) 427e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("error, hit unexpected end of page"); 428e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng length = data2host4(ptr); 429e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ptr += 4; 430e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng length *= 4; 431e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ptr += length; 432e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto read_again; 433e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 434e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case RINGBUF_TYPE_TIME_EXTEND: 435e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng extend = data2host4(ptr); 436e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ptr += 4; 437e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng extend <<= TS_SHIFT; 438e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng extend += delta; 439e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].timestamp += extend; 440e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto read_again; 441e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 442e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case RINGBUF_TYPE_TIME_STAMP: 443e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ptr += 12; 444e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 445e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 0: 446e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng length = data2host4(ptr); 447e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ptr += 4; 448e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("here! length=%d", length); 449e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 450e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng default: 451e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng length = type_len * 4; 452e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 453e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 454e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 455e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].timestamp += delta; 456e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 457e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng data = malloc_or_die(sizeof(*data)); 458e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng memset(data, 0, sizeof(*data)); 459e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 460e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng data->ts = cpu_data[cpu].timestamp; 461e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng data->size = length; 462e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng data->data = ptr; 463e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ptr += length; 464e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 465e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].index = calc_index(ptr, cpu); 466e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].next = data; 467e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 468e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return data; 469e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 470e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 471e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct record *trace_read_data(int cpu) 472e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 473e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct record *data; 474e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 475e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng data = trace_peek_data(cpu); 476e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cpu_data[cpu].next = NULL; 477e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 478e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return data; 479e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 480e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 481e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengssize_t trace_report(int fd, bool __repipe) 482e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 483e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char buf[BUFSIZ]; 484e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char test[] = { 23, 8, 68 }; 485e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char *version; 486e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int show_version = 0; 487e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int show_funcs = 0; 488e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int show_printk = 0; 489e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ssize_t size; 490e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 491e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng calc_data_size = 1; 492e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng repipe = __repipe; 493e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 494e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng input_fd = fd; 495e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 496e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(buf, 3); 497e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (memcmp(buf, test, 3) != 0) 498e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("no trace data in the file"); 499e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 500e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(buf, 7); 501e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (memcmp(buf, "tracing", 7) != 0) 502e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng die("not a trace file (missing 'tracing' tag)"); 503e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 504e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng version = read_string(); 505e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (show_version) 506e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("version = %s\n", version); 507e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng free(version); 508e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 509e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(buf, 1); 510e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng file_bigendian = buf[0]; 511e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng host_bigendian = bigendian(); 512e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 513e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_or_die(buf, 1); 514e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng long_size = buf[0]; 515e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 516e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng page_size = read4(); 517e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 518e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_header_files(); 519e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 520e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_ftrace_files(); 521e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_event_files(); 522e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_proc_kallsyms(); 523e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng read_ftrace_printk(); 524e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 525e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size = calc_data_size - 1; 526e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng calc_data_size = 0; 527e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng repipe = false; 528e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 529e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (show_funcs) { 530e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print_funcs(); 531e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return size; 532e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 533e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (show_printk) { 534e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print_printk(); 535e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return size; 536e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 537e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 538e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return size; 539e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 540