1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2009, Steven Rostedt <srostedt@redhat.com> 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is free software; you can redistribute it and/or modify 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * it under the terms of the GNU General Public License as published by 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * the Free Software Foundation; version 2 of the License (not later!) 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is distributed in the hope that it will be useful, 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * but WITHOUT ANY WARRANTY; without even the implied warranty of 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * GNU General Public License for more details. 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * You should have received a copy of the GNU General Public License 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * along with this program; if not, write to the Free Software 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <dirent.h> 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdio.h> 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdlib.h> 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <string.h> 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <getopt.h> 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdarg.h> 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/types.h> 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/stat.h> 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/wait.h> 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/mman.h> 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <pthread.h> 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <fcntl.h> 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <unistd.h> 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <errno.h> 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../perf.h" 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util.h" 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "trace-event.h" 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int input_fd; 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic ssize_t trace_data_size; 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic bool repipe; 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int __do_read(int fd, void *buf, int size) 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int rsize = size; 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (size) { 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int ret = read(fd, buf, size); 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (ret <= 0) 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (repipe) { 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int retw = write(STDOUT_FILENO, buf, ret); 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (retw <= 0 || retw != ret) { 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("repiping input file"); 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size -= ret; 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng buf += ret; 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return rsize; 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int do_read(void *data, int size) 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int r; 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng r = __do_read(input_fd, data, size); 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (r <= 0) { 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("reading input file (size expected=%d received=%d)", 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size, r); 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng trace_data_size += r; 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return r; 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* If it fails, the next read will report it */ 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void skip(int size) 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char buf[BUFSIZ]; 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int r; 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (size) { 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng r = size > BUFSIZ ? BUFSIZ : size; 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng do_read(buf, r); 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size -= r; 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }; 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic unsigned int read4(struct pevent *pevent) 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned int data; 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(&data, 4) < 0) 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return __data2host4(pevent, data); 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic unsigned long long read8(struct pevent *pevent) 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned long long data; 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(&data, 8) < 0) 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return __data2host8(pevent, data); 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic char *read_string(void) 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char buf[BUFSIZ]; 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *str = NULL; 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int size = 0; 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng off_t r; 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char c; 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (;;) { 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng r = read(input_fd, &c, 1); 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (r < 0) { 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("reading input file"); 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!r) { 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("no data"); 135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (repipe) { 139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int retw = write(STDOUT_FILENO, &c, 1); 140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (retw <= 0 || retw != r) { 142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("repiping input file string"); 143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng buf[size++] = c; 148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!c) 150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng break; 151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng trace_data_size += size; 154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng str = malloc(size); 156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (str) 157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng memcpy(str, buf, size); 158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout: 159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return str; 160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_proc_kallsyms(struct pevent *pevent) 163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned int size; 165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *buf; 166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size = read4(pevent); 168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!size) 169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng buf = malloc(size + 1); 172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (buf == NULL) 173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(buf, size) < 0) { 176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(buf); 177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng buf[size] = '\0'; 180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng parse_proc_kallsyms(pevent, buf, size); 182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(buf); 184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_ftrace_printk(struct pevent *pevent) 188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned int size; 190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *buf; 191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* it can have 0 size */ 193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size = read4(pevent); 194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!size) 195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng buf = malloc(size); 198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (buf == NULL) 199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(buf, size) < 0) { 202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(buf); 203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng parse_ftrace_printk(pevent, buf, size); 207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(buf); 209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_header_files(struct pevent *pevent) 213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned long long size; 215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *header_page; 216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char buf[BUFSIZ]; 217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int ret = 0; 218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(buf, 12) < 0) 220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (memcmp(buf, "header_page", 12) != 0) { 223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("did not read header page"); 224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size = read8(pevent); 228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng header_page = malloc(size); 230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (header_page == NULL) 231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(header_page, size) < 0) { 234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("did not read header page"); 235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(header_page); 236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!pevent_parse_header_page(pevent, header_page, size, 240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pevent_get_long_size(pevent))) { 241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* 242e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * The commit field in the page is of type long, 243e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * use that instead, since it represents the kernel. 244e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 245e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pevent_set_long_size(pevent, pevent->header_page_size_size); 246e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 247e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(header_page); 248e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 249e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(buf, 13) < 0) 250e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 251e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 252e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (memcmp(buf, "header_event", 13) != 0) { 253e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("did not read header event"); 254e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 255e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 256e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 257e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size = read8(pevent); 258e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng skip(size); 259e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 260e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return ret; 261e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 262e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 263e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_ftrace_file(struct pevent *pevent, unsigned long long size) 264e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 265e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *buf; 266e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 267e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng buf = malloc(size); 268e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (buf == NULL) 269e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 270e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 271e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(buf, size) < 0) { 272e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(buf); 273e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 274e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 275e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 276e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng parse_ftrace_file(pevent, buf, size); 277e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(buf); 278e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 279e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 280e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 281e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_event_file(struct pevent *pevent, char *sys, 282e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned long long size) 283e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 284e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *buf; 285e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 286e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng buf = malloc(size); 287e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (buf == NULL) 288e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 289e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 290e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(buf, size) < 0) { 291e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(buf); 292e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 293e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 294e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 295e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng parse_event_file(pevent, buf, size, sys); 296e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(buf); 297e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 298e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 299e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 300e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_ftrace_files(struct pevent *pevent) 301e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 302e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned long long size; 303e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int count; 304e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i; 305e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int ret; 306e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 307e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng count = read4(pevent); 308e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 309e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < count; i++) { 310e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size = read8(pevent); 311e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret = read_ftrace_file(pevent, size); 312e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (ret) 313e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return ret; 314e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 315e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 316e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 317e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 318e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int read_event_files(struct pevent *pevent) 319e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 320e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng unsigned long long size; 321e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *sys; 322e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int systems; 323e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int count; 324e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i,x; 325e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int ret; 326e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 327e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng systems = read4(pevent); 328e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 329e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < systems; i++) { 330e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sys = read_string(); 331e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (sys == NULL) 332e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 333e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 334e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng count = read4(pevent); 335e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 336e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (x=0; x < count; x++) { 337e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size = read8(pevent); 338e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret = read_event_file(pevent, sys, size); 339e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (ret) 340e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return ret; 341e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 342e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 343e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 344e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 345e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 346e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe) 347e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 348e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char buf[BUFSIZ]; 349e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char test[] = { 23, 8, 68 }; 350e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *version; 351e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int show_version = 0; 352e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int show_funcs = 0; 353e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int show_printk = 0; 354e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ssize_t size = -1; 355e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int file_bigendian; 356e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int host_bigendian; 357e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int file_long_size; 358e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int file_page_size; 359e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct pevent *pevent; 360e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int err; 361e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 362e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *ppevent = NULL; 363e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 364e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng repipe = __repipe; 365e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng input_fd = fd; 366e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 367e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(buf, 3) < 0) 368e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 369e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (memcmp(buf, test, 3) != 0) { 370e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("no trace data in the file"); 371e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 372e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 373e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 374e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(buf, 7) < 0) 375e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 376e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (memcmp(buf, "tracing", 7) != 0) { 377e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("not a trace file (missing 'tracing' tag)"); 378e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 379e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 380e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 381e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng version = read_string(); 382e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (version == NULL) 383e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 384e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (show_version) 385e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng printf("version = %s\n", version); 386e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(version); 387e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 388e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(buf, 1) < 0) 389e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 390e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng file_bigendian = buf[0]; 391e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng host_bigendian = bigendian(); 392e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 393e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pevent = read_trace_init(file_bigendian, host_bigendian); 394e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (pevent == NULL) { 395e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("read_trace_init failed"); 396e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 397e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 398e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 399e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (do_read(buf, 1) < 0) 400e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 401e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng file_long_size = buf[0]; 402e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 403e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng file_page_size = read4(pevent); 404e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!file_page_size) 405e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 406e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 407e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pevent_set_long_size(pevent, file_long_size); 408e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pevent_set_page_size(pevent, file_page_size); 409e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 410e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = read_header_files(pevent); 411e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (err) 412e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 413e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = read_ftrace_files(pevent); 414e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (err) 415e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 416e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = read_event_files(pevent); 417e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (err) 418e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 419e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = read_proc_kallsyms(pevent); 420e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (err) 421e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 422e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = read_ftrace_printk(pevent); 423e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (err) 424e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 425e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 426e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size = trace_data_size; 427e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng repipe = false; 428e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 429e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (show_funcs) { 430e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pevent_print_funcs(pevent); 431e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } else if (show_printk) { 432e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pevent_print_printk(pevent); 433e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 434e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 435e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *ppevent = pevent; 436e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pevent = NULL; 437e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 438e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout: 439e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (pevent) 440e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pevent_free(pevent); 441e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return size; 442e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 443