1*4e1bc9a0SAchim Leubner /*******************************************************************************
2*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
3*4e1bc9a0SAchim Leubner *
4*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*4e1bc9a0SAchim Leubner *that the following conditions are met:
6*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*4e1bc9a0SAchim Leubner *following disclaimer.
8*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
9*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*4e1bc9a0SAchim Leubner *with the distribution.
11*4e1bc9a0SAchim Leubner *
12*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20*4e1bc9a0SAchim Leubner
21*4e1bc9a0SAchim Leubner ********************************************************************************/
22*4e1bc9a0SAchim Leubner
23*4e1bc9a0SAchim Leubner /*******************************************************************************/
24*4e1bc9a0SAchim Leubner /*! \file mpidebug.c
25*4e1bc9a0SAchim Leubner * \brief The file is a MPI Libraries to implement the MPI debug and trace functions
26*4e1bc9a0SAchim Leubner *
27*4e1bc9a0SAchim Leubner * The file implements the MPI functions.
28*4e1bc9a0SAchim Leubner *
29*4e1bc9a0SAchim Leubner */
30*4e1bc9a0SAchim Leubner /*******************************************************************************/
31*4e1bc9a0SAchim Leubner #include <sys/cdefs.h>
32*4e1bc9a0SAchim Leubner #include <dev/pms/config.h>
33*4e1bc9a0SAchim Leubner
34*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
35*4e1bc9a0SAchim Leubner #ifdef MPI_DEBUG_TRACE_ENABLE /* enable with CCBUILD_MPI_TRACE*/
36*4e1bc9a0SAchim Leubner
37*4e1bc9a0SAchim Leubner /*******************************************************************************/
38*4e1bc9a0SAchim Leubner
39*4e1bc9a0SAchim Leubner #ifdef OSLAYER_USE_HI_RES_TIMER
40*4e1bc9a0SAchim Leubner unsigned __int64
41*4e1bc9a0SAchim Leubner GetHiResTimeStamp(void);
42*4e1bc9a0SAchim Leubner #endif /* OSLAYER_USE_HI_RES_TIMER */
43*4e1bc9a0SAchim Leubner /*******************************************************************************/
44*4e1bc9a0SAchim Leubner /*******************************************************************************/
45*4e1bc9a0SAchim Leubner /* FUNCTIONS */
46*4e1bc9a0SAchim Leubner /*******************************************************************************/
47*4e1bc9a0SAchim Leubner mpiDebugObTrace_t obTraceData;
48*4e1bc9a0SAchim Leubner mpiDebugIbTrace_t ibTraceData;
49*4e1bc9a0SAchim Leubner
mpiTraceInit(void)50*4e1bc9a0SAchim Leubner void mpiTraceInit(void)
51*4e1bc9a0SAchim Leubner {
52*4e1bc9a0SAchim Leubner
53*4e1bc9a0SAchim Leubner SA_DBG1(("mpiTraceInit:obTraceData @ %p\n",&obTraceData ));
54*4e1bc9a0SAchim Leubner SA_DBG1(("mpiTraceInit:ibTraceData @ %p\n",&ibTraceData ));
55*4e1bc9a0SAchim Leubner SA_DBG1(("mpiTraceInit: num enties %d Ib Iomb size %d Ob Iomb size %d\n",
56*4e1bc9a0SAchim Leubner MPI_DEBUG_TRACE_BUFFER_MAX,
57*4e1bc9a0SAchim Leubner MPI_DEBUG_TRACE_IB_IOMB_SIZE,
58*4e1bc9a0SAchim Leubner MPI_DEBUG_TRACE_OB_IOMB_SIZE ));
59*4e1bc9a0SAchim Leubner
60*4e1bc9a0SAchim Leubner si_memset(&obTraceData, 0, sizeof(obTraceData));
61*4e1bc9a0SAchim Leubner si_memset(&ibTraceData, 0, sizeof(ibTraceData));
62*4e1bc9a0SAchim Leubner }
63*4e1bc9a0SAchim Leubner
mpiTraceAdd(bit32 q,bit32 pici,bit32 ib,void * iomb,bit32 numBytes)64*4e1bc9a0SAchim Leubner void mpiTraceAdd( bit32 q,bit32 pici,bit32 ib, void *iomb, bit32 numBytes)
65*4e1bc9a0SAchim Leubner {
66*4e1bc9a0SAchim Leubner bit32 curIdx;
67*4e1bc9a0SAchim Leubner mpiDebugIbTraceEntry_t *curIbTrace;
68*4e1bc9a0SAchim Leubner mpiDebugObTraceEntry_t *curObTrace;
69*4e1bc9a0SAchim Leubner
70*4e1bc9a0SAchim Leubner mpiDebugIbTrace_t * ibTrace = &ibTraceData;
71*4e1bc9a0SAchim Leubner mpiDebugObTrace_t * obTrace = &obTraceData;
72*4e1bc9a0SAchim Leubner
73*4e1bc9a0SAchim Leubner if (ib)
74*4e1bc9a0SAchim Leubner {
75*4e1bc9a0SAchim Leubner if(ibTrace->Idx >= MPI_DEBUG_TRACE_BUFFER_MAX)
76*4e1bc9a0SAchim Leubner {
77*4e1bc9a0SAchim Leubner ibTrace->Idx = 0;
78*4e1bc9a0SAchim Leubner }
79*4e1bc9a0SAchim Leubner curIdx = ibTrace->Idx;
80*4e1bc9a0SAchim Leubner
81*4e1bc9a0SAchim Leubner curIbTrace = &ibTrace->Data[curIdx];
82*4e1bc9a0SAchim Leubner curIbTrace->pEntry = iomb;
83*4e1bc9a0SAchim Leubner curIbTrace->QNum = q;
84*4e1bc9a0SAchim Leubner curIbTrace->pici = pici;
85*4e1bc9a0SAchim Leubner #ifdef OSLAYER_USE_HI_RES_TIMER
86*4e1bc9a0SAchim Leubner #ifdef SA_64BIT_TIMESTAMP
87*4e1bc9a0SAchim Leubner curIbTrace->Time = ossaTimeStamp64(agNULL);
88*4e1bc9a0SAchim Leubner #else /* SA_64BIT_TIMESTAMP */
89*4e1bc9a0SAchim Leubner curIbTrace->Time = ossaTimeStamp(agNULL);
90*4e1bc9a0SAchim Leubner #endif /* SA_64BIT_TIMESTAMP */
91*4e1bc9a0SAchim Leubner #else /* OSLAYER_USE_HI_RES_TIMER */
92*4e1bc9a0SAchim Leubner curIbTrace->Time = 0;
93*4e1bc9a0SAchim Leubner #endif
94*4e1bc9a0SAchim Leubner si_memcpy(curIbTrace->Iomb, iomb, MIN(numBytes, MPI_DEBUG_TRACE_IB_IOMB_SIZE));
95*4e1bc9a0SAchim Leubner ibTrace->Idx++;
96*4e1bc9a0SAchim Leubner }
97*4e1bc9a0SAchim Leubner else
98*4e1bc9a0SAchim Leubner {
99*4e1bc9a0SAchim Leubner if(obTrace->Idx >= MPI_DEBUG_TRACE_BUFFER_MAX )
100*4e1bc9a0SAchim Leubner {
101*4e1bc9a0SAchim Leubner obTrace->Idx = 0;
102*4e1bc9a0SAchim Leubner }
103*4e1bc9a0SAchim Leubner curIdx = obTrace->Idx;
104*4e1bc9a0SAchim Leubner curObTrace = &obTrace->Data[curIdx];
105*4e1bc9a0SAchim Leubner curObTrace->pEntry = iomb;
106*4e1bc9a0SAchim Leubner curObTrace->QNum = q;
107*4e1bc9a0SAchim Leubner curObTrace->pici = pici;
108*4e1bc9a0SAchim Leubner #ifdef OSLAYER_USE_HI_RES_TIMER
109*4e1bc9a0SAchim Leubner #ifdef SA_64BIT_TIMESTAMP
110*4e1bc9a0SAchim Leubner curObTrace->Time = ossaTimeStamp64(agNULL);
111*4e1bc9a0SAchim Leubner #else /* SA_64BIT_TIMESTAMP */
112*4e1bc9a0SAchim Leubner curObTrace->Time = ossaTimeStamp(agNULL);
113*4e1bc9a0SAchim Leubner #endif /* SA_64BIT_TIMESTAMP */
114*4e1bc9a0SAchim Leubner #else /* OSLAYER_USE_HI_RES_TIMER */
115*4e1bc9a0SAchim Leubner curObTrace->Time = 0;
116*4e1bc9a0SAchim Leubner #endif
117*4e1bc9a0SAchim Leubner si_memcpy(curObTrace->Iomb, iomb, MIN(numBytes, MPI_DEBUG_TRACE_OB_IOMB_SIZE));
118*4e1bc9a0SAchim Leubner obTrace->Idx++;
119*4e1bc9a0SAchim Leubner }
120*4e1bc9a0SAchim Leubner
121*4e1bc9a0SAchim Leubner
122*4e1bc9a0SAchim Leubner return;
123*4e1bc9a0SAchim Leubner }
124*4e1bc9a0SAchim Leubner
125*4e1bc9a0SAchim Leubner #endif /* MPI_DEBUG_TRACE_ENABLE */
126*4e1bc9a0SAchim Leubner
127*4e1bc9a0SAchim Leubner
128*4e1bc9a0SAchim Leubner
129*4e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
130*4e1bc9a0SAchim Leubner
131*4e1bc9a0SAchim Leubner /**
132*4e1bc9a0SAchim Leubner * fiEnableTracing
133*4e1bc9a0SAchim Leubner *
134*4e1bc9a0SAchim Leubner * This fucntion is called to initialize tracing of FC layer.
135*4e1bc9a0SAchim Leubner *
136*4e1bc9a0SAchim Leubner */
siEnableTracing(agsaRoot_t * agRoot)137*4e1bc9a0SAchim Leubner void siEnableTracing (agsaRoot_t *agRoot)
138*4e1bc9a0SAchim Leubner {
139*4e1bc9a0SAchim Leubner
140*4e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
141*4e1bc9a0SAchim Leubner agsaSwConfig_t *swC = &saRoot->swConfig;
142*4e1bc9a0SAchim Leubner bit32 count;
143*4e1bc9a0SAchim Leubner
144*4e1bc9a0SAchim Leubner OS_ASSERT(saRoot != NULL, "");
145*4e1bc9a0SAchim Leubner
146*4e1bc9a0SAchim Leubner if( saRoot->TraceBlockReInit != 0)
147*4e1bc9a0SAchim Leubner {
148*4e1bc9a0SAchim Leubner return;
149*4e1bc9a0SAchim Leubner }
150*4e1bc9a0SAchim Leubner
151*4e1bc9a0SAchim Leubner
152*4e1bc9a0SAchim Leubner /* Initialize tracing first */
153*4e1bc9a0SAchim Leubner
154*4e1bc9a0SAchim Leubner for (count = 0; count < 10; count++)
155*4e1bc9a0SAchim Leubner {
156*4e1bc9a0SAchim Leubner saRoot->traceBuffLookup[count] = (bit8)('0' + count);
157*4e1bc9a0SAchim Leubner }
158*4e1bc9a0SAchim Leubner for (count = 0; count < 6; count++)
159*4e1bc9a0SAchim Leubner {
160*4e1bc9a0SAchim Leubner saRoot->traceBuffLookup[(bitptr)count + 10] = (bit8)('a' + count);
161*4e1bc9a0SAchim Leubner }
162*4e1bc9a0SAchim Leubner
163*4e1bc9a0SAchim Leubner
164*4e1bc9a0SAchim Leubner saRoot->TraceDestination = swC->TraceDestination;
165*4e1bc9a0SAchim Leubner saRoot->TraceMask = swC->TraceMask;
166*4e1bc9a0SAchim Leubner saRoot->CurrentTraceIndexWrapCount = 0;
167*4e1bc9a0SAchim Leubner saRoot->CurrentTraceIndex = 0;
168*4e1bc9a0SAchim Leubner saRoot->TraceBlockReInit = 1;
169*4e1bc9a0SAchim Leubner
170*4e1bc9a0SAchim Leubner
171*4e1bc9a0SAchim Leubner SA_DBG1(("siEnableTracing: \n" ));
172*4e1bc9a0SAchim Leubner
173*4e1bc9a0SAchim Leubner SA_DBG1 ((" length = %08x\n", saRoot->TraceBufferLength ));
174*4e1bc9a0SAchim Leubner SA_DBG1 ((" virt = %p\n", saRoot->TraceBuffer ));
175*4e1bc9a0SAchim Leubner SA_DBG1 ((" traceMask = %08x @ %p\n", saRoot->TraceMask, &saRoot->TraceMask));
176*4e1bc9a0SAchim Leubner SA_DBG1 ((" last trace entry @ %p\n", &saRoot->CurrentTraceIndex));
177*4e1bc9a0SAchim Leubner SA_DBG1 ((" TraceWrapAround = %x\n", saRoot->TraceMask & hpDBG_TraceBufferWrapAround ? 1 : 0));
178*4e1bc9a0SAchim Leubner SA_DBG1 ((" da %p l %x\n",saRoot->TraceBuffer ,saRoot->TraceBufferLength));
179*4e1bc9a0SAchim Leubner
180*4e1bc9a0SAchim Leubner #ifdef SA_PRINTOUT_IN_WINDBG
181*4e1bc9a0SAchim Leubner #ifndef DBG
182*4e1bc9a0SAchim Leubner DbgPrint("siTraceEnable: \n" );
183*4e1bc9a0SAchim Leubner
184*4e1bc9a0SAchim Leubner DbgPrint(" length = %08x\n", saRoot->TraceBufferLength );
185*4e1bc9a0SAchim Leubner DbgPrint(" virt = %p\n", saRoot->TraceBuffer );
186*4e1bc9a0SAchim Leubner DbgPrint(" last trace entry @ %p\n", &saRoot->CurrentTraceIndex);
187*4e1bc9a0SAchim Leubner DbgPrint(" traceMask = %08x @ %p\n", saRoot->TraceMask, &saRoot->TraceMask);
188*4e1bc9a0SAchim Leubner DbgPrint(" da %p l %x\n",saRoot->TraceBuffer ,saRoot->TraceBufferLength);
189*4e1bc9a0SAchim Leubner #endif /* DBG */
190*4e1bc9a0SAchim Leubner #endif /* SA_PRINTOUT_IN_WINDBG */
191*4e1bc9a0SAchim Leubner /*
192*4e1bc9a0SAchim Leubner ** Init trace buffer with all spaces
193*4e1bc9a0SAchim Leubner */
194*4e1bc9a0SAchim Leubner for (count = 0; count < saRoot->TraceBufferLength; count++)
195*4e1bc9a0SAchim Leubner {
196*4e1bc9a0SAchim Leubner saRoot->TraceBuffer[count] = (bit8)' ';
197*4e1bc9a0SAchim Leubner }
198*4e1bc9a0SAchim Leubner
199*4e1bc9a0SAchim Leubner }
200*4e1bc9a0SAchim Leubner
201*4e1bc9a0SAchim Leubner
202*4e1bc9a0SAchim Leubner
203*4e1bc9a0SAchim Leubner /**
204*4e1bc9a0SAchim Leubner * IF_DO_TRACE
205*4e1bc9a0SAchim Leubner *
206*4e1bc9a0SAchim Leubner * PURPOSE: convenience macro for the "to output or not to output" logic
207*4e1bc9a0SAchim Leubner *
208*4e1bc9a0SAchim Leubner * PARAMETERS:
209*4e1bc9a0SAchim Leubner *
210*4e1bc9a0SAchim Leubner * CALLS:
211*4e1bc9a0SAchim Leubner *
212*4e1bc9a0SAchim Leubner * SIDE EFFECTS & CAVEATS:
213*4e1bc9a0SAchim Leubner *
214*4e1bc9a0SAchim Leubner * ALGORITHM:
215*4e1bc9a0SAchim Leubner *
216*4e1bc9a0SAchim Leubner *
217*4e1bc9a0SAchim Leubner *
218*4e1bc9a0SAchim Leubner * MODIFICATION HISTORY ***********************
219*4e1bc9a0SAchim Leubner *
220*4e1bc9a0SAchim Leubner * ENGINEER NAME DATE DESCRIPTION
221*4e1bc9a0SAchim Leubner * ------------- -------- -----------
222*4e1bc9a0SAchim Leubner */
223*4e1bc9a0SAchim Leubner
224*4e1bc9a0SAchim Leubner #define IF_DO_TRACE \
225*4e1bc9a0SAchim Leubner if ( (saRoot != NULL) && \
226*4e1bc9a0SAchim Leubner (saRoot->TraceDestination & siTraceDestMask) && \
227*4e1bc9a0SAchim Leubner (mask & saRoot->TraceMask) ) \
228*4e1bc9a0SAchim Leubner
229*4e1bc9a0SAchim Leubner
230*4e1bc9a0SAchim Leubner /* #define TRACE_ENTER_LOCK ossaSingleThreadedEnter(agRoot, LL_TRACE_LOCK); */
231*4e1bc9a0SAchim Leubner /* #define TRACE_LEAVE_LOCK ossaSingleThreadedLeave(agRoot, LL_TRACE_LOCK); */
232*4e1bc9a0SAchim Leubner #define TRACE_ENTER_LOCK
233*4e1bc9a0SAchim Leubner #define TRACE_LEAVE_LOCK
234*4e1bc9a0SAchim Leubner /**
235*4e1bc9a0SAchim Leubner * BUFFER_WRAP_CHECK
236*4e1bc9a0SAchim Leubner *
237*4e1bc9a0SAchim Leubner * PURPOSE: Checks if the tracing buffer tracing index is too high. If it is,
238*4e1bc9a0SAchim Leubner * the buffer index gets reset to 0 or tracing stops..
239*4e1bc9a0SAchim Leubner */
240*4e1bc9a0SAchim Leubner #define BUFFER_WRAP_CHECK \
241*4e1bc9a0SAchim Leubner if( (saRoot->CurrentTraceIndex + TMP_TRACE_BUFF_SIZE) \
242*4e1bc9a0SAchim Leubner >= saRoot->TraceBufferLength ) \
243*4e1bc9a0SAchim Leubner { \
244*4e1bc9a0SAchim Leubner /* Trace wrap-Around is enabled. */ \
245*4e1bc9a0SAchim Leubner if( saRoot->TraceMask & hpDBG_TraceBufferWrapAround ) \
246*4e1bc9a0SAchim Leubner { \
247*4e1bc9a0SAchim Leubner /* Fill the end of the buffer with spaces */ \
248*4e1bc9a0SAchim Leubner for( i = saRoot->CurrentTraceIndex; \
249*4e1bc9a0SAchim Leubner i < saRoot->TraceBufferLength; i++ ) \
250*4e1bc9a0SAchim Leubner { \
251*4e1bc9a0SAchim Leubner saRoot->TraceBuffer[i] = (bit8)' '; \
252*4e1bc9a0SAchim Leubner } \
253*4e1bc9a0SAchim Leubner /* Wrap the current trace index back to 0.. */ \
254*4e1bc9a0SAchim Leubner saRoot->CurrentTraceIndex = 0; \
255*4e1bc9a0SAchim Leubner saRoot->CurrentTraceIndexWrapCount++; \
256*4e1bc9a0SAchim Leubner } \
257*4e1bc9a0SAchim Leubner else \
258*4e1bc9a0SAchim Leubner { \
259*4e1bc9a0SAchim Leubner /* Don't do anything -- trace buffer is filled up */ \
260*4e1bc9a0SAchim Leubner return; \
261*4e1bc9a0SAchim Leubner } \
262*4e1bc9a0SAchim Leubner }
263*4e1bc9a0SAchim Leubner
264*4e1bc9a0SAchim Leubner /**
265*4e1bc9a0SAchim Leubner * LOCAL_OS_LOG_DEBUG_STRING
266*4e1bc9a0SAchim Leubner *
267*4e1bc9a0SAchim Leubner * PURPOSE: protects against a change in the api for this function
268*4e1bc9a0SAchim Leubner *
269*4e1bc9a0SAchim Leubner * PARAMETERS:
270*4e1bc9a0SAchim Leubner *
271*4e1bc9a0SAchim Leubner * CALLS:
272*4e1bc9a0SAchim Leubner *
273*4e1bc9a0SAchim Leubner * SIDE EFFECTS & CAVEATS:
274*4e1bc9a0SAchim Leubner *
275*4e1bc9a0SAchim Leubner * ALGORITHM:
276*4e1bc9a0SAchim Leubner *
277*4e1bc9a0SAchim Leubner *
278*4e1bc9a0SAchim Leubner *
279*4e1bc9a0SAchim Leubner * MODIFICATION HISTORY ***********************
280*4e1bc9a0SAchim Leubner *
281*4e1bc9a0SAchim Leubner * ENGINEER NAME DATE DESCRIPTION
282*4e1bc9a0SAchim Leubner * ------------- -------- -----------
283*4e1bc9a0SAchim Leubner * Laurent Chavey 03/09/00 - changed cast of 3rd parameter to (char *)
284*4e1bc9a0SAchim Leubner */
285*4e1bc9a0SAchim Leubner #define LOCAL_OS_LOG_DEBUG_STRING(H,S) \
286*4e1bc9a0SAchim Leubner osLogDebugString(H,hpDBG_ALWAYS,(char *)(S))
287*4e1bc9a0SAchim Leubner
288*4e1bc9a0SAchim Leubner /******************************************************************************
289*4e1bc9a0SAchim Leubner *******************************************************************************
290*4e1bc9a0SAchim Leubner **
291*4e1bc9a0SAchim Leubner ** copyHex
292*4e1bc9a0SAchim Leubner **
293*4e1bc9a0SAchim Leubner ** PURPOSE: Copies a hex version of a bit32 into a bit8 buffer
294*4e1bc9a0SAchim Leubner **
295*4e1bc9a0SAchim Leubner *******************************************************************************
296*4e1bc9a0SAchim Leubner ******************************************************************************/
297*4e1bc9a0SAchim Leubner #define copyHex(bit32Val, bitSize) \
298*4e1bc9a0SAchim Leubner { \
299*4e1bc9a0SAchim Leubner bit32 nibbleLen = bitSize / 4; \
300*4e1bc9a0SAchim Leubner bit32 scratch = 0; \
301*4e1bc9a0SAchim Leubner for( i = 0; i < nibbleLen; i++ ) \
302*4e1bc9a0SAchim Leubner { \
303*4e1bc9a0SAchim Leubner bPtr[pos++] = \
304*4e1bc9a0SAchim Leubner saRoot->traceBuffLookup[0xf & (bit32Val >> ((bitSize - 4) - (i << 2)))]; \
305*4e1bc9a0SAchim Leubner i++; \
306*4e1bc9a0SAchim Leubner bPtr[pos++] = \
307*4e1bc9a0SAchim Leubner saRoot->traceBuffLookup[0xf & (bit32Val >> ((bitSize - 4) - (i << 2)))]; \
308*4e1bc9a0SAchim Leubner /* Skip leading 0-s to save memory buffer space */ \
309*4e1bc9a0SAchim Leubner if( !scratch \
310*4e1bc9a0SAchim Leubner && (bPtr[pos-2] == '0') \
311*4e1bc9a0SAchim Leubner && (bPtr[pos-1] == '0') ) \
312*4e1bc9a0SAchim Leubner { \
313*4e1bc9a0SAchim Leubner pos -= 2; \
314*4e1bc9a0SAchim Leubner continue; \
315*4e1bc9a0SAchim Leubner } \
316*4e1bc9a0SAchim Leubner else \
317*4e1bc9a0SAchim Leubner { \
318*4e1bc9a0SAchim Leubner scratch = 1; \
319*4e1bc9a0SAchim Leubner } \
320*4e1bc9a0SAchim Leubner } \
321*4e1bc9a0SAchim Leubner if( scratch == 0 ) \
322*4e1bc9a0SAchim Leubner { \
323*4e1bc9a0SAchim Leubner /* The value is 0 and nothing got put in the buffer. Do */ \
324*4e1bc9a0SAchim Leubner /* print at least two zeros. */ \
325*4e1bc9a0SAchim Leubner bPtr[pos++] = '0'; \
326*4e1bc9a0SAchim Leubner bPtr[pos++] = '0'; \
327*4e1bc9a0SAchim Leubner } \
328*4e1bc9a0SAchim Leubner }
329*4e1bc9a0SAchim Leubner
330*4e1bc9a0SAchim Leubner
331*4e1bc9a0SAchim Leubner /**
332*4e1bc9a0SAchim Leubner * TRACE_OTHER_DEST
333*4e1bc9a0SAchim Leubner *
334*4e1bc9a0SAchim Leubner * PURPOSE: Check if any other destinations are enabled. If yes, use them
335*4e1bc9a0SAchim Leubner * for debug log.
336*4e1bc9a0SAchim Leubner */
337*4e1bc9a0SAchim Leubner #define TRACE_OTHER_DEST \
338*4e1bc9a0SAchim Leubner { \
339*4e1bc9a0SAchim Leubner bit32 bitptrscratch; \
340*4e1bc9a0SAchim Leubner if( saRoot->TraceDestination & smTraceDestDebugger ) \
341*4e1bc9a0SAchim Leubner { \
342*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)'\n'; \
343*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)0; \
344*4e1bc9a0SAchim Leubner LOCAL_OS_LOG_DEBUG_STRING(hpRoot, (char *)bPtr); \
345*4e1bc9a0SAchim Leubner } \
346*4e1bc9a0SAchim Leubner if( saRoot->TraceDestination & smTraceDestRegister ) \
347*4e1bc9a0SAchim Leubner { \
348*4e1bc9a0SAchim Leubner while( (pos & 0x3) != 0x3 ) \
349*4e1bc9a0SAchim Leubner { \
350*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)' '; \
351*4e1bc9a0SAchim Leubner } \
352*4e1bc9a0SAchim Leubner bPtr[pos] = ' '; \
353*4e1bc9a0SAchim Leubner for( i = 0; i < pos; i = i + 4 ) \
354*4e1bc9a0SAchim Leubner { \
355*4e1bc9a0SAchim Leubner bitptrscratch = bPtr[i+0]; \
356*4e1bc9a0SAchim Leubner bitptrscratch <<= 8; \
357*4e1bc9a0SAchim Leubner bitptrscratch |= bPtr[i+1]; \
358*4e1bc9a0SAchim Leubner bitptrscratch <<= 8; \
359*4e1bc9a0SAchim Leubner bitptrscratch |= bPtr[i+2]; \
360*4e1bc9a0SAchim Leubner bitptrscratch <<= 8; \
361*4e1bc9a0SAchim Leubner bitptrscratch |= bPtr[i+3]; \
362*4e1bc9a0SAchim Leubner osChipRegWrite(hpRoot, \
363*4e1bc9a0SAchim Leubner FC_rFMReceivedALPA, (bit32)bitptrscratch ); \
364*4e1bc9a0SAchim Leubner } \
365*4e1bc9a0SAchim Leubner } \
366*4e1bc9a0SAchim Leubner }
367*4e1bc9a0SAchim Leubner
368*4e1bc9a0SAchim Leubner
369*4e1bc9a0SAchim Leubner
370*4e1bc9a0SAchim Leubner /**
371*4e1bc9a0SAchim Leubner * siGetCurrentTraceIndex()
372*4e1bc9a0SAchim Leubner *
373*4e1bc9a0SAchim Leubner * PURPOSE: Returns the current tracing index ( if tracing buffer is
374*4e1bc9a0SAchim Leubner * used ).
375*4e1bc9a0SAchim Leubner *
376*4e1bc9a0SAchim Leubner * PARAMETERS:
377*4e1bc9a0SAchim Leubner *
378*4e1bc9a0SAchim Leubner * CALLS:
379*4e1bc9a0SAchim Leubner *
380*4e1bc9a0SAchim Leubner * SIDE EFFECTS & CAVEATS:
381*4e1bc9a0SAchim Leubner *
382*4e1bc9a0SAchim Leubner * ALGORITHM:
383*4e1bc9a0SAchim Leubner *
384*4e1bc9a0SAchim Leubner *
385*4e1bc9a0SAchim Leubner * MODIFICATION HISTORY ***********************
386*4e1bc9a0SAchim Leubner *
387*4e1bc9a0SAchim Leubner * ENGINEER NAME DATE DESCRIPTION
388*4e1bc9a0SAchim Leubner * ------------- -------- -----------
389*4e1bc9a0SAchim Leubner * Tom Nalepa 02/27/03
390*4e1bc9a0SAchim Leubner *
391*4e1bc9a0SAchim Leubner * @param hpRoot
392*4e1bc9a0SAchim Leubner *
393*4e1bc9a0SAchim Leubner * @return
394*4e1bc9a0SAchim Leubner */
siGetCurrentTraceIndex(agsaRoot_t * agRoot)395*4e1bc9a0SAchim Leubner GLOBAL bit32 siGetCurrentTraceIndex(agsaRoot_t *agRoot)
396*4e1bc9a0SAchim Leubner {
397*4e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
398*4e1bc9a0SAchim Leubner return(saRoot->CurrentTraceIndex);
399*4e1bc9a0SAchim Leubner }
400*4e1bc9a0SAchim Leubner
401*4e1bc9a0SAchim Leubner
402*4e1bc9a0SAchim Leubner
403*4e1bc9a0SAchim Leubner
404*4e1bc9a0SAchim Leubner /**
405*4e1bc9a0SAchim Leubner * siResetTraceBuffer
406*4e1bc9a0SAchim Leubner *
407*4e1bc9a0SAchim Leubner * PURPOSE: Sets saRoot->CurrentTraceIndex to 0.
408*4e1bc9a0SAchim Leubner *
409*4e1bc9a0SAchim Leubner * @param hpRoot
410*4e1bc9a0SAchim Leubner *
411*4e1bc9a0SAchim Leubner * @return
412*4e1bc9a0SAchim Leubner */
siResetTraceBuffer(agsaRoot_t * agRoot)413*4e1bc9a0SAchim Leubner GLOBAL void siResetTraceBuffer(agsaRoot_t *agRoot)
414*4e1bc9a0SAchim Leubner {
415*4e1bc9a0SAchim Leubner bit32 count;
416*4e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
417*4e1bc9a0SAchim Leubner saRoot->CurrentTraceIndex = 0;
418*4e1bc9a0SAchim Leubner
419*4e1bc9a0SAchim Leubner for ( count = 0; count < saRoot->TraceBufferLength; count++ )
420*4e1bc9a0SAchim Leubner {
421*4e1bc9a0SAchim Leubner saRoot->TraceBuffer[count] = (bit8)' ';
422*4e1bc9a0SAchim Leubner }
423*4e1bc9a0SAchim Leubner }
424*4e1bc9a0SAchim Leubner
425*4e1bc9a0SAchim Leubner
426*4e1bc9a0SAchim Leubner /**
427*4e1bc9a0SAchim Leubner * siTraceFuncEnter
428*4e1bc9a0SAchim Leubner *
429*4e1bc9a0SAchim Leubner * PURPOSE: Format a function entry trace and post it to the appropriate
430*4e1bc9a0SAchim Leubner * destination.
431*4e1bc9a0SAchim Leubner *
432*4e1bc9a0SAchim Leubner * PARAMETERS:
433*4e1bc9a0SAchim Leubner *
434*4e1bc9a0SAchim Leubner * CALLS:
435*4e1bc9a0SAchim Leubner *
436*4e1bc9a0SAchim Leubner * SIDE EFFECTS & CAVEATS:
437*4e1bc9a0SAchim Leubner *
438*4e1bc9a0SAchim Leubner * ALGORITHM:
439*4e1bc9a0SAchim Leubner *
440*4e1bc9a0SAchim Leubner * siTraceFuncEnter : _[Xxxxx_
441*4e1bc9a0SAchim Leubner * fileid---^ ^------funcid
442*4e1bc9a0SAchim Leubner *
443*4e1bc9a0SAchim Leubner *
444*4e1bc9a0SAchim Leubner * MODIFICATION HISTORY ***********************
445*4e1bc9a0SAchim Leubner *
446*4e1bc9a0SAchim Leubner * ENGINEER NAME DATE DESCRIPTION
447*4e1bc9a0SAchim Leubner * ------------- -------- -----------
448*4e1bc9a0SAchim Leubner *
449*4e1bc9a0SAchim Leubner * @param hpRoot
450*4e1bc9a0SAchim Leubner * @param mask
451*4e1bc9a0SAchim Leubner * @param fileid
452*4e1bc9a0SAchim Leubner * @param funcid
453*4e1bc9a0SAchim Leubner *
454*4e1bc9a0SAchim Leubner * @return
455*4e1bc9a0SAchim Leubner */
456*4e1bc9a0SAchim Leubner
457*4e1bc9a0SAchim Leubner #define TMP_TRACE_BUFF_SIZE 32
458*4e1bc9a0SAchim Leubner
459*4e1bc9a0SAchim Leubner
siTraceFuncEnter(agsaRoot_t * agRoot,bit32 mask,bit32 fileid,char * funcid)460*4e1bc9a0SAchim Leubner GLOBAL void siTraceFuncEnter( agsaRoot_t *agRoot,
461*4e1bc9a0SAchim Leubner bit32 mask,
462*4e1bc9a0SAchim Leubner bit32 fileid,
463*4e1bc9a0SAchim Leubner char * funcid)
464*4e1bc9a0SAchim Leubner {
465*4e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
466*4e1bc9a0SAchim Leubner bitptr i;
467*4e1bc9a0SAchim Leubner bit8 tmpB[TMP_TRACE_BUFF_SIZE];
468*4e1bc9a0SAchim Leubner bit8 *bPtr;
469*4e1bc9a0SAchim Leubner bit8 pos = 0;
470*4e1bc9a0SAchim Leubner
471*4e1bc9a0SAchim Leubner IF_DO_TRACE
472*4e1bc9a0SAchim Leubner {
473*4e1bc9a0SAchim Leubner TRACE_ENTER_LOCK
474*4e1bc9a0SAchim Leubner if ( saRoot->TraceDestination & smTraceDestBuffer )
475*4e1bc9a0SAchim Leubner {
476*4e1bc9a0SAchim Leubner BUFFER_WRAP_CHECK
477*4e1bc9a0SAchim Leubner bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
478*4e1bc9a0SAchim Leubner }
479*4e1bc9a0SAchim Leubner else
480*4e1bc9a0SAchim Leubner {
481*4e1bc9a0SAchim Leubner bPtr = tmpB;
482*4e1bc9a0SAchim Leubner }
483*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)'[';
484*4e1bc9a0SAchim Leubner
485*4e1bc9a0SAchim Leubner #ifndef FC_DO_NOT_INCLUDE_FILE_NAME_TAGS_IN_ENTER_EXIT_TRACE
486*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)fileid;
487*4e1bc9a0SAchim Leubner #endif
488*4e1bc9a0SAchim Leubner
489*4e1bc9a0SAchim Leubner for ( i=0; i<4; i++ )
490*4e1bc9a0SAchim Leubner {
491*4e1bc9a0SAchim Leubner if ( funcid[i] == 0 )
492*4e1bc9a0SAchim Leubner {
493*4e1bc9a0SAchim Leubner break;
494*4e1bc9a0SAchim Leubner }
495*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)funcid[i];
496*4e1bc9a0SAchim Leubner }
497*4e1bc9a0SAchim Leubner bPtr[pos++] = ' ';
498*4e1bc9a0SAchim Leubner if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
499*4e1bc9a0SAchim Leubner {
500*4e1bc9a0SAchim Leubner bPtr[pos++] = '\r';
501*4e1bc9a0SAchim Leubner bPtr[pos++] = '\n';
502*4e1bc9a0SAchim Leubner saRoot->traceLineFeedCnt = 0;
503*4e1bc9a0SAchim Leubner }
504*4e1bc9a0SAchim Leubner saRoot->CurrentTraceIndex += pos;
505*4e1bc9a0SAchim Leubner // TRACE_OTHER_DEST
506*4e1bc9a0SAchim Leubner TRACE_LEAVE_LOCK
507*4e1bc9a0SAchim Leubner
508*4e1bc9a0SAchim Leubner }
509*4e1bc9a0SAchim Leubner return;
510*4e1bc9a0SAchim Leubner }
511*4e1bc9a0SAchim Leubner
512*4e1bc9a0SAchim Leubner
513*4e1bc9a0SAchim Leubner /**
514*4e1bc9a0SAchim Leubner * siTraceFuncExit
515*4e1bc9a0SAchim Leubner *
516*4e1bc9a0SAchim Leubner * PURPOSE: Format a function exit trace and post it to the appropriate
517*4e1bc9a0SAchim Leubner * destination.
518*4e1bc9a0SAchim Leubner *
519*4e1bc9a0SAchim Leubner * PARAMETERS:
520*4e1bc9a0SAchim Leubner *
521*4e1bc9a0SAchim Leubner * CALLS:
522*4e1bc9a0SAchim Leubner *
523*4e1bc9a0SAchim Leubner * SIDE EFFECTS & CAVEATS:
524*4e1bc9a0SAchim Leubner *
525*4e1bc9a0SAchim Leubner * ALGORITHM:
526*4e1bc9a0SAchim Leubner *
527*4e1bc9a0SAchim Leubner * siTraceFuncExit _Xxxxx]_
528*4e1bc9a0SAchim Leubner * fileid---^ ^------funcid
529*4e1bc9a0SAchim Leubner *
530*4e1bc9a0SAchim Leubner *
531*4e1bc9a0SAchim Leubner * MODIFICATION HISTORY ***********************
532*4e1bc9a0SAchim Leubner *
533*4e1bc9a0SAchim Leubner * ENGINEER NAME DATE DESCRIPTION
534*4e1bc9a0SAchim Leubner * ------------- -------- -----------
535*4e1bc9a0SAchim Leubner *
536*4e1bc9a0SAchim Leubner * @param hpRoot
537*4e1bc9a0SAchim Leubner * @param mask
538*4e1bc9a0SAchim Leubner * @param fileid
539*4e1bc9a0SAchim Leubner * @param funcid
540*4e1bc9a0SAchim Leubner * @param exitId
541*4e1bc9a0SAchim Leubner *
542*4e1bc9a0SAchim Leubner * @return
543*4e1bc9a0SAchim Leubner */
siTraceFuncExit(agsaRoot_t * agRoot,bit32 mask,char fileid,char * funcid,char exitId)544*4e1bc9a0SAchim Leubner GLOBAL void siTraceFuncExit( agsaRoot_t *agRoot, bit32 mask, char fileid, char * funcid, char exitId )
545*4e1bc9a0SAchim Leubner {
546*4e1bc9a0SAchim Leubner bitptr i;
547*4e1bc9a0SAchim Leubner bit8 tmpB[TMP_TRACE_BUFF_SIZE];
548*4e1bc9a0SAchim Leubner bit8 *bPtr;
549*4e1bc9a0SAchim Leubner bit8 pos = 0;
550*4e1bc9a0SAchim Leubner
551*4e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
552*4e1bc9a0SAchim Leubner
553*4e1bc9a0SAchim Leubner IF_DO_TRACE
554*4e1bc9a0SAchim Leubner {
555*4e1bc9a0SAchim Leubner TRACE_ENTER_LOCK
556*4e1bc9a0SAchim Leubner if ( saRoot->TraceDestination & smTraceDestBuffer )
557*4e1bc9a0SAchim Leubner {
558*4e1bc9a0SAchim Leubner BUFFER_WRAP_CHECK
559*4e1bc9a0SAchim Leubner bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
560*4e1bc9a0SAchim Leubner }
561*4e1bc9a0SAchim Leubner else
562*4e1bc9a0SAchim Leubner {
563*4e1bc9a0SAchim Leubner bPtr = tmpB;
564*4e1bc9a0SAchim Leubner }
565*4e1bc9a0SAchim Leubner
566*4e1bc9a0SAchim Leubner #ifndef FC_DO_NOT_INCLUDE_FILE_NAME_TAGS_IN_ENTER_EXIT_TRACE
567*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)fileid;
568*4e1bc9a0SAchim Leubner #endif
569*4e1bc9a0SAchim Leubner
570*4e1bc9a0SAchim Leubner for ( i=0; i<4; i++ )
571*4e1bc9a0SAchim Leubner {
572*4e1bc9a0SAchim Leubner if ( funcid[i] == 0 )
573*4e1bc9a0SAchim Leubner {
574*4e1bc9a0SAchim Leubner break;
575*4e1bc9a0SAchim Leubner }
576*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)funcid[i];
577*4e1bc9a0SAchim Leubner }
578*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)exitId;
579*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)']';
580*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)' ';
581*4e1bc9a0SAchim Leubner if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
582*4e1bc9a0SAchim Leubner {
583*4e1bc9a0SAchim Leubner bPtr[pos++] = '\r';
584*4e1bc9a0SAchim Leubner bPtr[pos++] = '\n';
585*4e1bc9a0SAchim Leubner saRoot->traceLineFeedCnt = 0;
586*4e1bc9a0SAchim Leubner }
587*4e1bc9a0SAchim Leubner saRoot->CurrentTraceIndex += pos;
588*4e1bc9a0SAchim Leubner // TRACE_OTHER_DEST
589*4e1bc9a0SAchim Leubner TRACE_LEAVE_LOCK
590*4e1bc9a0SAchim Leubner }
591*4e1bc9a0SAchim Leubner return;
592*4e1bc9a0SAchim Leubner }
593*4e1bc9a0SAchim Leubner
594*4e1bc9a0SAchim Leubner /**
595*4e1bc9a0SAchim Leubner * siTraceListRemove
596*4e1bc9a0SAchim Leubner *
597*4e1bc9a0SAchim Leubner * PURPOSE: Adds a trace tag for an exchange that is removed from a list
598*4e1bc9a0SAchim Leubner *
599*4e1bc9a0SAchim Leubner * PARAMETERS:
600*4e1bc9a0SAchim Leubner *
601*4e1bc9a0SAchim Leubner * CALLS:
602*4e1bc9a0SAchim Leubner *
603*4e1bc9a0SAchim Leubner * SIDE EFFECTS & CAVEATS:
604*4e1bc9a0SAchim Leubner *
605*4e1bc9a0SAchim Leubner * ALGORITHM:
606*4e1bc9a0SAchim Leubner *
607*4e1bc9a0SAchim Leubner *
608*4e1bc9a0SAchim Leubner * MODIFICATION HISTORY ***********************
609*4e1bc9a0SAchim Leubner *
610*4e1bc9a0SAchim Leubner * ENGINEER NAME DATE DESCRIPTION
611*4e1bc9a0SAchim Leubner * ------------- -------- -----------
612*4e1bc9a0SAchim Leubner * Tom Nalepa 12/16/02 Initial Developmet
613*4e1bc9a0SAchim Leubner *
614*4e1bc9a0SAchim Leubner * @param hpRoot
615*4e1bc9a0SAchim Leubner * @param mask
616*4e1bc9a0SAchim Leubner * @param listId
617*4e1bc9a0SAchim Leubner * @param exchangeId
618*4e1bc9a0SAchim Leubner *
619*4e1bc9a0SAchim Leubner * @return
620*4e1bc9a0SAchim Leubner */
siTraceListRemove(agsaRoot_t * agRoot,bit32 mask,char listId,bitptr exchangeId)621*4e1bc9a0SAchim Leubner GLOBAL void siTraceListRemove(agsaRoot_t *agRoot,
622*4e1bc9a0SAchim Leubner bit32 mask,
623*4e1bc9a0SAchim Leubner char listId,
624*4e1bc9a0SAchim Leubner bitptr exchangeId)
625*4e1bc9a0SAchim Leubner {
626*4e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
627*4e1bc9a0SAchim Leubner bitptr i;
628*4e1bc9a0SAchim Leubner bit8 tmpB[TMP_TRACE_BUFF_SIZE];
629*4e1bc9a0SAchim Leubner bit8 *bPtr;
630*4e1bc9a0SAchim Leubner bit8 pos = 0;
631*4e1bc9a0SAchim Leubner
632*4e1bc9a0SAchim Leubner IF_DO_TRACE
633*4e1bc9a0SAchim Leubner {
634*4e1bc9a0SAchim Leubner TRACE_ENTER_LOCK
635*4e1bc9a0SAchim Leubner if ( saRoot->TraceDestination & smTraceDestBuffer )
636*4e1bc9a0SAchim Leubner {
637*4e1bc9a0SAchim Leubner BUFFER_WRAP_CHECK
638*4e1bc9a0SAchim Leubner bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
639*4e1bc9a0SAchim Leubner }
640*4e1bc9a0SAchim Leubner else
641*4e1bc9a0SAchim Leubner {
642*4e1bc9a0SAchim Leubner bPtr = tmpB;
643*4e1bc9a0SAchim Leubner }
644*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)'<';
645*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)listId;
646*4e1bc9a0SAchim Leubner copyHex(exchangeId, 32);
647*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)' ';
648*4e1bc9a0SAchim Leubner if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
649*4e1bc9a0SAchim Leubner {
650*4e1bc9a0SAchim Leubner bPtr[pos++] = '\r';
651*4e1bc9a0SAchim Leubner bPtr[pos++] = '\n';
652*4e1bc9a0SAchim Leubner saRoot->traceLineFeedCnt = 0;
653*4e1bc9a0SAchim Leubner }
654*4e1bc9a0SAchim Leubner saRoot->CurrentTraceIndex += pos;
655*4e1bc9a0SAchim Leubner // TRACE_OTHER_DEST
656*4e1bc9a0SAchim Leubner TRACE_LEAVE_LOCK
657*4e1bc9a0SAchim Leubner }
658*4e1bc9a0SAchim Leubner return;
659*4e1bc9a0SAchim Leubner }
660*4e1bc9a0SAchim Leubner
661*4e1bc9a0SAchim Leubner /**
662*4e1bc9a0SAchim Leubner * siTraceListAdd
663*4e1bc9a0SAchim Leubner *
664*4e1bc9a0SAchim Leubner * PURPOSE: Adds a trace tag for an exchange that is added to a list
665*4e1bc9a0SAchim Leubner *
666*4e1bc9a0SAchim Leubner * PARAMETERS:
667*4e1bc9a0SAchim Leubner *
668*4e1bc9a0SAchim Leubner * CALLS:
669*4e1bc9a0SAchim Leubner *
670*4e1bc9a0SAchim Leubner * SIDE EFFECTS & CAVEATS:
671*4e1bc9a0SAchim Leubner *
672*4e1bc9a0SAchim Leubner * ALGORITHM:
673*4e1bc9a0SAchim Leubner *
674*4e1bc9a0SAchim Leubner *
675*4e1bc9a0SAchim Leubner * MODIFICATION HISTORY ***********************
676*4e1bc9a0SAchim Leubner *
677*4e1bc9a0SAchim Leubner * ENGINEER NAME DATE DESCRIPTION
678*4e1bc9a0SAchim Leubner * ------------- -------- -----------
679*4e1bc9a0SAchim Leubner * Tom Nalepa 12/16/02 Initial Developmet
680*4e1bc9a0SAchim Leubner *
681*4e1bc9a0SAchim Leubner * @param hpRoot
682*4e1bc9a0SAchim Leubner * @param mask
683*4e1bc9a0SAchim Leubner * @param listId
684*4e1bc9a0SAchim Leubner * @param exchangeId
685*4e1bc9a0SAchim Leubner *
686*4e1bc9a0SAchim Leubner * @return
687*4e1bc9a0SAchim Leubner */
siTraceListAdd(agsaRoot_t * agRoot,bit32 mask,char listId,bitptr exchangeId)688*4e1bc9a0SAchim Leubner GLOBAL void siTraceListAdd(agsaRoot_t *agRoot,
689*4e1bc9a0SAchim Leubner bit32 mask,
690*4e1bc9a0SAchim Leubner char listId,
691*4e1bc9a0SAchim Leubner bitptr exchangeId)
692*4e1bc9a0SAchim Leubner {
693*4e1bc9a0SAchim Leubner
694*4e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
695*4e1bc9a0SAchim Leubner
696*4e1bc9a0SAchim Leubner bitptr i;
697*4e1bc9a0SAchim Leubner bit8 tmpB[TMP_TRACE_BUFF_SIZE];
698*4e1bc9a0SAchim Leubner bit8 *bPtr;
699*4e1bc9a0SAchim Leubner bit8 pos = 0;
700*4e1bc9a0SAchim Leubner
701*4e1bc9a0SAchim Leubner IF_DO_TRACE
702*4e1bc9a0SAchim Leubner {
703*4e1bc9a0SAchim Leubner if ( saRoot->TraceDestination & smTraceDestBuffer )
704*4e1bc9a0SAchim Leubner {
705*4e1bc9a0SAchim Leubner BUFFER_WRAP_CHECK
706*4e1bc9a0SAchim Leubner bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
707*4e1bc9a0SAchim Leubner }
708*4e1bc9a0SAchim Leubner else
709*4e1bc9a0SAchim Leubner {
710*4e1bc9a0SAchim Leubner bPtr = tmpB;
711*4e1bc9a0SAchim Leubner }
712*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)'>';
713*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)listId;
714*4e1bc9a0SAchim Leubner copyHex(exchangeId, 32);
715*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)' ';
716*4e1bc9a0SAchim Leubner if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
717*4e1bc9a0SAchim Leubner {
718*4e1bc9a0SAchim Leubner bPtr[pos++] = '\r';
719*4e1bc9a0SAchim Leubner bPtr[pos++] = '\n';
720*4e1bc9a0SAchim Leubner saRoot->traceLineFeedCnt = 0;
721*4e1bc9a0SAchim Leubner }
722*4e1bc9a0SAchim Leubner saRoot->CurrentTraceIndex += pos;
723*4e1bc9a0SAchim Leubner // TRACE_OTHER_DEST
724*4e1bc9a0SAchim Leubner }
725*4e1bc9a0SAchim Leubner return;
726*4e1bc9a0SAchim Leubner }
727*4e1bc9a0SAchim Leubner
728*4e1bc9a0SAchim Leubner /**
729*4e1bc9a0SAchim Leubner * siTrace64
730*4e1bc9a0SAchim Leubner *
731*4e1bc9a0SAchim Leubner * PURPOSE: Format a function parameter trace and post it to the appropriate
732*4e1bc9a0SAchim Leubner * destination.
733*4e1bc9a0SAchim Leubner *
734*4e1bc9a0SAchim Leubner * PARAMETERS:
735*4e1bc9a0SAchim Leubner *
736*4e1bc9a0SAchim Leubner * CALLS:
737*4e1bc9a0SAchim Leubner *
738*4e1bc9a0SAchim Leubner * SIDE EFFECTS & CAVEATS:
739*4e1bc9a0SAchim Leubner *
740*4e1bc9a0SAchim Leubner * ALGORITHM:
741*4e1bc9a0SAchim Leubner *
742*4e1bc9a0SAchim Leubner * siTrace : index is 0 for return value, 1 for first parm after "("
743*4e1bc9a0SAchim Leubner * produces: _nn" XXXXXXXXXX
744*4e1bc9a0SAchim Leubner * index-----^ value--^
745*4e1bc9a0SAchim Leubner *
746*4e1bc9a0SAchim Leubner *
747*4e1bc9a0SAchim Leubner * MODIFICATION HISTORY ***********************
748*4e1bc9a0SAchim Leubner *
749*4e1bc9a0SAchim Leubner * ENGINEER NAME DATE DESCRIPTION
750*4e1bc9a0SAchim Leubner * ------------- -------- -----------
751*4e1bc9a0SAchim Leubner *
752*4e1bc9a0SAchim Leubner * @param hpRoot
753*4e1bc9a0SAchim Leubner * @param mask
754*4e1bc9a0SAchim Leubner * @param uId
755*4e1bc9a0SAchim Leubner * @param value
756*4e1bc9a0SAchim Leubner *
757*4e1bc9a0SAchim Leubner * @return
758*4e1bc9a0SAchim Leubner */
siTrace64(agsaRoot_t * agRoot,bit32 mask,char * uId,bit64 value,bit32 dataSizeInBits)759*4e1bc9a0SAchim Leubner GLOBAL void siTrace64(agsaRoot_t *agRoot,
760*4e1bc9a0SAchim Leubner bit32 mask,
761*4e1bc9a0SAchim Leubner char * uId,
762*4e1bc9a0SAchim Leubner bit64 value,
763*4e1bc9a0SAchim Leubner bit32 dataSizeInBits)
764*4e1bc9a0SAchim Leubner {
765*4e1bc9a0SAchim Leubner
766*4e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
767*4e1bc9a0SAchim Leubner bitptr i;
768*4e1bc9a0SAchim Leubner bit8 tmpB[TMP_TRACE_BUFF_SIZE];
769*4e1bc9a0SAchim Leubner bit8 *bPtr;
770*4e1bc9a0SAchim Leubner bit8 pos = 0;
771*4e1bc9a0SAchim Leubner
772*4e1bc9a0SAchim Leubner IF_DO_TRACE
773*4e1bc9a0SAchim Leubner {
774*4e1bc9a0SAchim Leubner if ( saRoot->TraceDestination & smTraceDestBuffer )
775*4e1bc9a0SAchim Leubner {
776*4e1bc9a0SAchim Leubner BUFFER_WRAP_CHECK
777*4e1bc9a0SAchim Leubner bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
778*4e1bc9a0SAchim Leubner }
779*4e1bc9a0SAchim Leubner else
780*4e1bc9a0SAchim Leubner {
781*4e1bc9a0SAchim Leubner bPtr = tmpB;
782*4e1bc9a0SAchim Leubner }
783*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)'"';
784*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)uId[0];
785*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)uId[1];
786*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)':';
787*4e1bc9a0SAchim Leubner copyHex(value, dataSizeInBits);
788*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)' ';
789*4e1bc9a0SAchim Leubner if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
790*4e1bc9a0SAchim Leubner {
791*4e1bc9a0SAchim Leubner bPtr[pos++] = '\r';
792*4e1bc9a0SAchim Leubner bPtr[pos++] = '\n';
793*4e1bc9a0SAchim Leubner saRoot->traceLineFeedCnt = 0;
794*4e1bc9a0SAchim Leubner }
795*4e1bc9a0SAchim Leubner saRoot->CurrentTraceIndex += pos;
796*4e1bc9a0SAchim Leubner // TRACE_OTHER_DEST
797*4e1bc9a0SAchim Leubner }
798*4e1bc9a0SAchim Leubner return;
799*4e1bc9a0SAchim Leubner }
800*4e1bc9a0SAchim Leubner
801*4e1bc9a0SAchim Leubner
802*4e1bc9a0SAchim Leubner
803*4e1bc9a0SAchim Leubner /**
804*4e1bc9a0SAchim Leubner * siTrace
805*4e1bc9a0SAchim Leubner *
806*4e1bc9a0SAchim Leubner * PURPOSE: Format a function parameter trace and post it to the appropriate
807*4e1bc9a0SAchim Leubner * destination.
808*4e1bc9a0SAchim Leubner *
809*4e1bc9a0SAchim Leubner * PARAMETERS:
810*4e1bc9a0SAchim Leubner *
811*4e1bc9a0SAchim Leubner * CALLS:
812*4e1bc9a0SAchim Leubner *
813*4e1bc9a0SAchim Leubner * SIDE EFFECTS & CAVEATS:
814*4e1bc9a0SAchim Leubner *
815*4e1bc9a0SAchim Leubner * ALGORITHM:
816*4e1bc9a0SAchim Leubner *
817*4e1bc9a0SAchim Leubner * fiTrace : index is 0 for return value, 1 for first parm after "("
818*4e1bc9a0SAchim Leubner * produces: _nn" XXXXXXXXXX
819*4e1bc9a0SAchim Leubner * index-----^ value--^
820*4e1bc9a0SAchim Leubner *
821*4e1bc9a0SAchim Leubner *
822*4e1bc9a0SAchim Leubner * MODIFICATION HISTORY ***********************
823*4e1bc9a0SAchim Leubner *
824*4e1bc9a0SAchim Leubner * ENGINEER NAME DATE DESCRIPTION
825*4e1bc9a0SAchim Leubner * ------------- -------- -----------
826*4e1bc9a0SAchim Leubner *
827*4e1bc9a0SAchim Leubner * @param hpRoot
828*4e1bc9a0SAchim Leubner * @param mask
829*4e1bc9a0SAchim Leubner * @param uId
830*4e1bc9a0SAchim Leubner * @param value
831*4e1bc9a0SAchim Leubner *
832*4e1bc9a0SAchim Leubner * @return
833*4e1bc9a0SAchim Leubner */
siTrace(agsaRoot_t * agRoot,bit32 mask,char * uId,bit32 value,bit32 dataSizeInBits)834*4e1bc9a0SAchim Leubner GLOBAL void siTrace( agsaRoot_t *agRoot,
835*4e1bc9a0SAchim Leubner bit32 mask,
836*4e1bc9a0SAchim Leubner char * uId,
837*4e1bc9a0SAchim Leubner bit32 value,
838*4e1bc9a0SAchim Leubner bit32 dataSizeInBits)
839*4e1bc9a0SAchim Leubner {
840*4e1bc9a0SAchim Leubner
841*4e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
842*4e1bc9a0SAchim Leubner
843*4e1bc9a0SAchim Leubner bitptr i;
844*4e1bc9a0SAchim Leubner bit8 tmpB[TMP_TRACE_BUFF_SIZE];
845*4e1bc9a0SAchim Leubner bit8 *bPtr;
846*4e1bc9a0SAchim Leubner bit8 pos = 0;
847*4e1bc9a0SAchim Leubner
848*4e1bc9a0SAchim Leubner IF_DO_TRACE
849*4e1bc9a0SAchim Leubner {
850*4e1bc9a0SAchim Leubner if ( saRoot->TraceDestination & smTraceDestBuffer )
851*4e1bc9a0SAchim Leubner {
852*4e1bc9a0SAchim Leubner BUFFER_WRAP_CHECK
853*4e1bc9a0SAchim Leubner bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
854*4e1bc9a0SAchim Leubner }
855*4e1bc9a0SAchim Leubner else
856*4e1bc9a0SAchim Leubner {
857*4e1bc9a0SAchim Leubner bPtr = tmpB;
858*4e1bc9a0SAchim Leubner }
859*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)'"';
860*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)uId[0];
861*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)uId[1];
862*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)':';
863*4e1bc9a0SAchim Leubner copyHex(value, dataSizeInBits);
864*4e1bc9a0SAchim Leubner bPtr[pos++] = (bit8)' ';
865*4e1bc9a0SAchim Leubner if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
866*4e1bc9a0SAchim Leubner {
867*4e1bc9a0SAchim Leubner bPtr[pos++] = '\r';
868*4e1bc9a0SAchim Leubner bPtr[pos++] = '\n';
869*4e1bc9a0SAchim Leubner saRoot->traceLineFeedCnt = 0;
870*4e1bc9a0SAchim Leubner }
871*4e1bc9a0SAchim Leubner saRoot->CurrentTraceIndex += pos;
872*4e1bc9a0SAchim Leubner // TRACE_OTHER_DEST
873*4e1bc9a0SAchim Leubner }
874*4e1bc9a0SAchim Leubner return;
875*4e1bc9a0SAchim Leubner }
876*4e1bc9a0SAchim Leubner
877*4e1bc9a0SAchim Leubner
878*4e1bc9a0SAchim Leubner /*Set Wrap 0 for Wrapping non zero stops when full */
879*4e1bc9a0SAchim Leubner
880*4e1bc9a0SAchim Leubner
siTraceGetInfo(agsaRoot_t * agRoot,hpTraceBufferParms_t * pBParms)881*4e1bc9a0SAchim Leubner GLOBAL void siTraceGetInfo(agsaRoot_t *agRoot, hpTraceBufferParms_t * pBParms)
882*4e1bc9a0SAchim Leubner {
883*4e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)agRoot->sdkData;
884*4e1bc9a0SAchim Leubner
885*4e1bc9a0SAchim Leubner pBParms->TraceCompiled = TRUE;
886*4e1bc9a0SAchim Leubner
887*4e1bc9a0SAchim Leubner pBParms->TraceWrap = saRoot->TraceMask & 0x80000000;
888*4e1bc9a0SAchim Leubner pBParms->CurrentTraceIndexWrapCount = saRoot->CurrentTraceIndexWrapCount;
889*4e1bc9a0SAchim Leubner pBParms->BufferSize = saRoot->TraceBufferLength;
890*4e1bc9a0SAchim Leubner pBParms->CurrentIndex = saRoot->CurrentTraceIndex;
891*4e1bc9a0SAchim Leubner pBParms->pTrace = saRoot->TraceBuffer;
892*4e1bc9a0SAchim Leubner pBParms->pTraceIndexWrapCount = &saRoot->CurrentTraceIndexWrapCount;
893*4e1bc9a0SAchim Leubner pBParms->pTraceMask = &saRoot->TraceMask;
894*4e1bc9a0SAchim Leubner pBParms->pCurrentTraceIndex = &saRoot->CurrentTraceIndex;
895*4e1bc9a0SAchim Leubner }
896*4e1bc9a0SAchim Leubner /**/
897*4e1bc9a0SAchim Leubner
siTraceSetMask(agsaRoot_t * agRoot,bit32 TraceMask)898*4e1bc9a0SAchim Leubner GLOBAL void siTraceSetMask(agsaRoot_t *agRoot, bit32 TraceMask )
899*4e1bc9a0SAchim Leubner {
900*4e1bc9a0SAchim Leubner agsaLLRoot_t *saRoot = (agsaLLRoot_t *)agRoot->sdkData;
901*4e1bc9a0SAchim Leubner saRoot->TraceMask = TraceMask;
902*4e1bc9a0SAchim Leubner }
903*4e1bc9a0SAchim Leubner
904*4e1bc9a0SAchim Leubner
905*4e1bc9a0SAchim Leubner
906*4e1bc9a0SAchim Leubner #endif
907*4e1bc9a0SAchim Leubner
908*4e1bc9a0SAchim Leubner
909