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