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#include "perf.h" 22fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "perf_config.h" 23fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 24fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define PERF_MAX_LOG_LENGTH (sizeof(unsigned long) * 8) 25fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 26fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* ============================================================================ 27fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF LOG Methods 28fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin============================================================================ */ 29fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 30fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* Effects: flush log */ 31fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid __PERF_LOG_flush(PERF_LOG_Private *me) 32fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 33fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* only flush if we collected data */ 34fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me->puPtr > me->puBuffer) 35fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 36fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* open file if we have not yet opened it */ 37fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (!me->fOut) me->fOut = fopen(me->fOutFile, "wb"); 38fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 39fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me->fOut) 40fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 41fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin fwrite(me->puBuffer, me->puPtr - me->puBuffer, sizeof(*me->puPtr), 42fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->fOut); 43fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->uBufferCount++; 44fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 45fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 46fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* reset pointer to start of buffer */ 47fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->puPtr = me->puBuffer; 48fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 49fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 50fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 51fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** The Done method is called at the end of the UC test or UI 52fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* application. 53fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param phObject 54fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Pointer to a handle to the PERF object, which will be 55fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* deleted and set to NULL upon completion. 56fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* */ 57fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 58fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid __PERF_LOG_done(PERF_Private *perf) 59fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 60fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_LOG_Private *me = perf->pLog; 61fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 62fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me) 63fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 64fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* if we could allocate a buffer, we can log the completion */ 65fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me->puBuffer && me->fOutFile) 66fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 67fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_log1(perf, PERF_LOG_Done); 68fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 69fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_LOG_flush(me); /* flush log */ 70fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 71fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 72fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* free buffer */ 73fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me->puBuffer) free(me->puBuffer); 74fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->puBuffer = NULL; 75fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 76fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* free file name string */ 77fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me->fOutFile) free(me->fOutFile); 78fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->fOutFile = NULL; 79fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 80fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* close file */ 81fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me->fOut) fclose(me->fOut); 82fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->fOut = NULL; 83fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 84fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin fprintf(stderr, 85fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin "PERF Instrumentation [%c%c%c%c %05ld-%08lx] produced" 86fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin " %ld buffers\n", 87fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_FOUR_CHARS(perf->ulID), perf->ulPID, 88fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin (unsigned long) perf, 89fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->uBufferCount); 90fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 91fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* delete LOG private structure */ 92fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin free(me); 93fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin perf->pLog = NULL; 94fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 95fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 96fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 97fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* Effects: creates LOG private object and logs initial block of information */ 98fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinPERF_LOG_Private *__PERF_LOG_create(PERF_Private *perf, 99fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_Config *config, 100fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_MODULETYPE eModule) 101fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 102fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_LOG_Private *me = 103fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin perf->pLog = (PERF_LOG_Private *) malloc (sizeof (PERF_LOG_Private)); 104fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 105fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me) 106fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 107fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->fOut = NULL; 108fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->uBufferCount = 0; 109fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->uBufSize = config->buffer_size; 110fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 111fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* limit buffer size to allow at least one log creation */ 112fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me->uBufSize < PERF_MAX_LOG_LENGTH) 113fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 114fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->uBufSize = PERF_MAX_LOG_LENGTH; 115fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 116fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 117fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->puBuffer = 118fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin (unsigned long *) malloc (sizeof (unsigned long) * me->uBufSize); 119fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->fOutFile = (char *) malloc (strlen(config->trace_file) + 34); 120fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me->puBuffer && me->fOutFile) 121fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 122fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin perf->uMode |= PERF_Mode_Log; /* we are logging */ 123fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 124fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->puPtr = me->puBuffer; /* start at beginning of buffer */ 125fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->puEnd = me->puBuffer + me->uBufSize - PERF_MAX_LOG_LENGTH; 126fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 127fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sprintf(me->fOutFile, "%s-%05lu-%08lx-%c%c%c%c.trace", 128fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin config->trace_file, perf->ulPID, (unsigned long) perf, 129fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_FOUR_CHARS(perf->ulID)); 130fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 131fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* for delayed open we don't try to open the file until we need to 132fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin save a buffer into it */ 133fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (!config->delayed_open) 134fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 135fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->fOut = fopen(me->fOutFile, "ab"); 136fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 137fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else 138fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 139fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin me->fOut = NULL; 140fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 141fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* save initial data to the log */ 142fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 143fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *me->puPtr++ = (unsigned long) eModule; /* module ID */ 144fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *me->puPtr++ = perf->ulID; /* ID */ 145fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *me->puPtr++ = perf->ulPID; /* process ID */ 146fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 147fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* original tempTime stamp */ 148fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *me->puPtr++ = TIME_SECONDS(perf->time); 149fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *me->puPtr++ = TIME_MICROSECONDS(perf->time); 150fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 151fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 152fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* if some allocation or opening failed, delete object */ 153fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (!me->puBuffer || !me->fOutFile || (!config->delayed_open && !me->fOut)) 154fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 155fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin perf->uMode &= ~PERF_Mode_Log; /* delete logging flag */ 156fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin __PERF_LOG_done(perf); 157fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 158fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 159fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 160fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* it may have been deleted already, so we read it again */ 161fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return(perf->pLog); 162fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 163fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 164fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* Effects: appends tempTime stamp to log */ 165fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid __PERF_LOG_log_common(PERF_Private *perf, unsigned long *time_loc) 166fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 167fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin unsigned long delta = 0; 168fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin PERF_LOG_Private *me = perf->pLog; /* get LOG private object */ 169fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 170fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* get tempTime of from last tempTime stamp */ 171fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin TIME_GET(perf->tempTime); 172fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin delta = TIME_DELTA(perf->tempTime, perf->time); 173fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 174fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *time_loc = delta; /* save time stamp */ 175fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 176fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* save tempTime stamp as last tempTime stamp */ 177fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin TIME_COPY(perf->time, perf->tempTime); 178fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 179fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* flush if we reached end of the buffer */ 180fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (me->puPtr > me->puEnd) __PERF_LOG_flush(me); 181fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 182fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 183