1fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 2fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* 3fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Copyright (C) Texas Instruments - http://www.ti.com/ 4fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 5fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * This library is free software; you can redistribute it and/or 6fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * modify it under the terms of the GNU Lesser General Public 7fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * License as published by the Free Software Foundation; either 8fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * version 2.1 of the License, or (at your option) any later version. 9fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 10fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 11fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * This library is distributed in the hope that it will be useful, 12fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * but WITHOUT ANY WARRANTY; without even the implied warranty of 13fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Lesser General Public License for more details. 15fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 16fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 17fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * You should have received a copy of the GNU Lesser General Public 18fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * License along with this library; if not, write to the Free Software 19fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin */ 21fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#ifdef __PERF_READER__ 22fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 23fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define __DECODE(c) (((c) < 0 || (c) > 63) ? '#' : ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789./_" [c])) 24fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 25fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "perf.h" 26fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*============================================================================= 27fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin DEFINITIONS 28fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin=============================================================================*/ 29fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 30fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* minimum and maximum time-correction handled */ 31fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin #define MIN_DELTA 1U 32fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin #define MAX_DELTA 4292967295U 33fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 34fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 35fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** __PERF_CUSTOMIZABLE__ must be enabled, as we are using the 36fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * standard PERF module for printing */ 37fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin #ifndef __PERF_CUSTOMIZABLE__ 38fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin #error "Must define __PERF_CUSTOMIZABLE__ to enable printing for reader" 39fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin #else 40fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 41fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin #include "perf_config.h" 42fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin #include "perf.h" 43fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 44fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin #include <errno.h> 45fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 46fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavintypedef unsigned long U32; 47fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 48fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*============================================================================= 49fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin GLOBALS 50fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin=============================================================================*/ 51fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 52fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic U32 read_U32(FILE *fLog) 53fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 54fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin U32 data; 55fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin fread(&data, sizeof(U32), 1, fLog); 56fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return(data); 57fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 58fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 59fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinPERF_OBJHANDLE __PERF_common_Create(struct PERF_Config *config, 60fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin unsigned long ulID, 61fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_MODULETYPE eModule); 62fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid __PERF_CUSTOM_create(PERF_OBJHANDLE hObject, 63fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin struct PERF_Config *config, 64fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_MODULETYPE eModule); 65fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 66fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid PERF_Replay(FILE *fLog, PERF_Config *pConfig) 67fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 68fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin U32 ulData0, ulData1, ulData2, ulData3, ulData4, ulData5, ulData6, ulData7, operation; 69fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin char szFile[21], szFunc[21]; 70fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin U32 sending, multiple, frame, size; 71fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_OBJHANDLE hObject = NULL; 72fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_Private *me = NULL; 73fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin long time_correction = 0; 74fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin union __PERF_float_long uA, uV; 75fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 76fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* logging is disabled during replay because the __log_ API-s get the 77fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin time on their own, and are not feasible to be modified to work with 78fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin replayed times */ 79fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (pConfig->trace_file) 80fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 81fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin free(pConfig->trace_file); 82fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin pConfig->trace_file = NULL; 83fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 84fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 85fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* read initialization info */ 86fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 87fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* we support having multiple log files concatenated into one log file */ 88fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* read through each log file */ 89fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* we have to pre-read to detect end of file */ 90fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin while ((ulData0 = read_U32(fLog)), !feof(fLog)) 91fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 92fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 93fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* if there is no object, create one */ 94fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (!hObject) 95fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 96fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* create PERF replay object */ 97fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* pre-read word is the eModuleType */ 98fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1 = read_U32(fLog); /* ID */ 99fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 100fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin hObject = __PERF_common_Create(pConfig, ulData1, ulData0); 101fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (!hObject) 102fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 103fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin fprintf(stderr, "error: could not create PERF replay object\n"); 104fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin exit(1); 105fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 106fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 107fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me = get_Private(hObject); 108fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 109fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* set up initial state */ 110fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->ulPID = read_U32(fLog); /* PID */ 111fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1 = read_U32(fLog); /* startTime.sec */ 112fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData2 = read_U32(fLog); /* startTime.usec */ 113fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin TIME_SET(me->time, ulData1, ulData2); 114fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin time_correction = 0; 115fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 116fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* continue setting up the PERF object */ 117fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_CUSTOM_create(hObject, pConfig, ulData0); 118fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me->uMode == PERF_Mode_Replay) 119fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 120fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin fprintf(stderr, "Only replay mode is selected. Aborting...\n"); 121fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_Done(hObject); 122fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 123fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 124fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else 125fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 126fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* pre-read word is replay time difference, except for PERF_LOG_Location logs */ 127fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* get operation */ 128fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1 = read_U32(fLog); 129fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin operation = ulData1 & PERF_LOG_Mask; 130fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 131fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (operation != PERF_LOG_Location) 132fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 133fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* invariant: time_replayed = time_logged + time_correction */ 134fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 135fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* if a negative or too-small time-stamp is encountered */ 136fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (ulData0 > MAX_DELTA || ulData0 < MIN_DELTA || 137fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* or if we cannot completely correct a prior time correction */ 138fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin (time_correction && ulData0 < MIN_DELTA + (U32) (-time_correction))) 139fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { /* store the time difference than cannot be replayed in the 140fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin time_correction variable, and replay a MIN_DELTA time 141fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin difference */ 142fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin time_correction += (long) ulData0 - (long) MIN_DELTA; 143fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData0 = MIN_DELTA; 144fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 145fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else if (time_correction) 146fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 147fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData0 = ulData0 + (U32) time_correction; 148fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin time_correction = 0; 149fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 150fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin TIME_INCREASE(me->time, ulData0); 151fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData0 = ulData1; 152fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 153fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 154fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Check for buffer operations */ 155fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (operation & PERF_LOG_Buffer) 156fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 157fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Buffer operation */ 158fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (operation & PERF_LOG_Xfering) { 159fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sending = PERF_FlagXfering; 160fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin size = PERF_bits(ulData0, 2 * PERF_ModuleBits, 161fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 30 - 2 * PERF_ModuleBits) << 3; 162fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } else { 163fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sending = operation & PERF_LOG_Sending; 164fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin size = PERF_bits(ulData0, PERF_ModuleBits, 165fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 28 - PERF_ModuleBits); 166fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData0 &= PERF_ModuleMask; 167fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 168fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 169fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* read address */ 170fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1 = read_U32(fLog); 171fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin multiple = (ulData1 & PERF_LOG_Multiple) ? PERF_FlagMultiple : PERF_FlagSingle; 172fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin frame = (ulData1 & PERF_LOG_Frame) ? PERF_FlagFrame : PERF_FlagBuffer; 173fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 174fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* read 2nd address if logged multiple buffers */ 175fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData2 = PERF_IsMultiple(multiple) ? read_U32(fLog) : 0; 176fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 177fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_CUSTOM_Buffer(hObject, 178fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sending, 179fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin multiple, 180fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin frame, 181fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1 & ~3, 182fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData2, 183fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin size, 184fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_bits(ulData0, 0, PERF_ModuleBits), 185fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_bits(ulData0, PERF_ModuleBits, PERF_ModuleBits) ); 186fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 187fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Check for command operations */ 188fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else if (operation & PERF_LOG_Command) 189fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 190fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1 = read_U32(fLog); 191fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData2 = read_U32(fLog); 192fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_CUSTOM_Command(hObject, 193fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin operation & PERF_LOG_Sending, 194fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1, 195fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData2, 196fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData0 & PERF_LOG_NotMask); 197fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 198fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else switch (operation) 199fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 200fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Log operation */ 201fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin case PERF_LOG_Log: 202fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1 = read_U32(fLog); 203fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData2 = read_U32(fLog); 204fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 205fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_CUSTOM_Log(hObject, 206fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData0 & PERF_LOG_NotMask, 207fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1, 208fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData2); 209fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin break; 210fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 211fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* SyncAV operation */ 212fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin case PERF_LOG_Sync: 213fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin uA.l = read_U32(fLog); 214fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin uV.l = read_U32(fLog); 215fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 216fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_CUSTOM_SyncAV(hObject, uA.f, uV.f, 217fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData0 & PERF_LOG_NotMask); 218fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin break; 219fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 220fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin case PERF_LOG_Done: 221fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* This can be also PERF_Thread, PERF_Boundary */ 222fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin operation = ulData0 & PERF_LOG_Mask2; 223fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin switch (operation) 224fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 225fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Thread Creation operation */ 226fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin case PERF_LOG_Thread: 227fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1 = read_U32(fLog); 228fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 229fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_CUSTOM_ThreadCreated(hObject, 230fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData0 & PERF_LOG_NotMask2, 231fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1); 232fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin break; 233fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 234fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Boundary operation */ 235fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin case PERF_LOG_Boundary: 236fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_CUSTOM_Boundary(hObject, 237fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData0 & PERF_LOG_NotMask2); 238fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin break; 239fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 240fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin case PERF_LOG_Done: 241fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_Done(hObject); 242fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 243fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin break; 244fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 245fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin break; 246fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 247fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* location log */ 248fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin case PERF_LOG_Location: 249fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData2 = read_U32(fLog); 250fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData3 = read_U32(fLog); 251fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData4 = read_U32(fLog); 252fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData5 = read_U32(fLog); 253fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData6 = read_U32(fLog); 254fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData7 = read_U32(fLog); 255fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 256fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* decode szFile */ 257fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[19] = __DECODE(ulData2 & 0x3f); 258fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[18] = __DECODE((ulData2 >> 6) & 0x3f); 259fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[17] = __DECODE((ulData2 >> 12) & 0x3f); 260fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[16] = __DECODE((ulData2 >> 18) & 0x3f); 261fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[15] = __DECODE((ulData2 >> 24) & 0x3f); 262fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[14] = __DECODE(((ulData2 >> 26) & 0x30) | ((ulData0 >> 24) & 0x0f)); 263fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[13] = __DECODE(ulData3 & 0x3f); 264fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[12] = __DECODE((ulData3 >> 6) & 0x3f); 265fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[11] = __DECODE((ulData3 >> 12) & 0x3f); 266fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[10] = __DECODE((ulData3 >> 18) & 0x3f); 267fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[9] = __DECODE((ulData3 >> 24) & 0x3f); 268fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[8] = __DECODE(((ulData3 >> 26) & 0x30) | ((ulData0 >> 28) & 0x0f)); 269fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[7] = __DECODE(ulData4 & 0x3f); 270fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[6] = __DECODE((ulData4 >> 6) & 0x3f); 271fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[5] = __DECODE((ulData4 >> 12) & 0x3f); 272fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[4] = __DECODE((ulData4 >> 18) & 0x3f); 273fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[3] = __DECODE((ulData4 >> 24) & 0x3f); 274fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[2] = __DECODE(((ulData4 >> 26) & 0x30) | (ulData1 & 0x0f)); 275fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[1] = __DECODE(ulData0 & 0x3f); 276fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[0] = __DECODE((ulData0 >> 6) & 0x3f); 277fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFile[20] = '\0'; 278fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 279fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[19] = __DECODE(ulData5 & 0x3f); 280fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[18] = __DECODE((ulData5 >> 6) & 0x3f); 281fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[17] = __DECODE((ulData5 >> 12) & 0x3f); 282fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[16] = __DECODE((ulData5 >> 18) & 0x3f); 283fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[15] = __DECODE((ulData5 >> 24) & 0x3f); 284fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[14] = __DECODE(((ulData5 >> 26) & 0x30) | ((ulData1 >> 4) & 0x0f)); 285fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[13] = __DECODE(ulData6 & 0x3f); 286fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[12] = __DECODE((ulData6 >> 6) & 0x3f); 287fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[11] = __DECODE((ulData6 >> 12) & 0x3f); 288fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[10] = __DECODE((ulData6 >> 18) & 0x3f); 289fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[9] = __DECODE((ulData6 >> 24) & 0x3f); 290fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[8] = __DECODE(((ulData6 >> 26) & 0x30) | ((ulData1 >> 8) & 0x0f)); 291fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[7] = __DECODE(ulData7 & 0x3f); 292fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[6] = __DECODE((ulData7 >> 6) & 0x3f); 293fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[5] = __DECODE((ulData7 >> 12) & 0x3f); 294fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[4] = __DECODE((ulData7 >> 18) & 0x3f); 295fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[3] = __DECODE((ulData7 >> 24) & 0x3f); 296fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[2] = __DECODE(((ulData7 >> 26) & 0x30) | ((ulData1 >> 12) & 0x0f)); 297fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[1] = __DECODE((ulData0 >> 12) & 0x3f); 298fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[0] = __DECODE((ulData0 >> 18) & 0x3f); 299fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc[20] = '\0'; 300fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 301fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* skip leading /-s */ 302fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for (ulData2 = 0; szFile[ulData2] == '/'; ulData2++); 303fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for (ulData3 = 0; szFunc[ulData3] == '/'; ulData3++); 304fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 305fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ulData1 = (ulData1 >> 16) & 0xfff; 306fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_CUSTOM_Location(hObject,szFile + ulData2, ulData1, 307fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin szFunc + ulData3); 308fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 309fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin break; 310fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 311fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin default: 312fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin fprintf(stderr, "Unknown operation recorded: %lx\n", ulData0); 313fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin exit(1); 314fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin break; 315fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 316fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 317fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 318fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 319fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (hObject) 320fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 321fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin fprintf(stderr, "Incomplete log ended...\n"); 322fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_Done(hObject); 323fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 324fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 325fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 326fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint main(int argc, char **argv) 327fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 328fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin int i; 329fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin FILE *log = NULL; 330fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_Config config; 331fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 332fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 333fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for (i = 1; i < argc; i++) 334fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 335fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* replay file */ 336fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 337fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* open input, or stdin if '-' is specified */ 338fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin log = strcmp(argv [i], "-") ? fopen(argv [i], "rb") : stdin; 339fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 340fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (log) 341fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 342fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* read config file */ 343fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_Config_Init(&config); 344fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_Config_Read(&config, "replay"); 345fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin config.mask = 0xFFFFFFFF; 346fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 347fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* note config gets modified during Replay */ 348fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_Replay(log, &config); 349fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 350fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_Config_Release(&config); 351fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 352fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* don't close stdin! */ 353fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (log != stdin) fclose(log); 354fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 355fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else 356fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 357fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin fprintf(stderr, "Could not open log file %s: %d\n", 358fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin argv [i], errno); 359fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 360fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 361fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 362fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return (0); 363fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 364fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 365fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin #endif /* __PERF_CUSTOMIZABLE__ */ 366fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 367fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#endif /* __PERF_READER__ */ 368fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 369