Subversion Repositories shark

Rev

Rev 1676 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1676 tullio 1
\documentclass[english]{report}
2
\usepackage[T1]{fontenc}
3
\usepackage[latin1]{inputenc}
4
\usepackage{geometry}
5
\geometry{verbose,a4paper}
6
\usepackage{float}
7
\usepackage{makeidx}
8
\makeindex
9
\usepackage{graphicx}
10
 
11
\makeatletter
12
 
13
\newenvironment{intest}{\noindent\large\bf\hspace*{1pt}}
14
{\vspace*{-5pt}\\\line(1,0){433}}
15
 
16
\usepackage{babel}
17
\makeatother
18
\begin{document}
19
\thispagestyle{empty}
20
 
21
\begin{center}{\LARGE S.Ha.R.K. User Manual}\end{center}{\LARGE \par}
22
\vfill{}
23
 
24
\begin{center}Volume V\end{center}
25
\begin{center}The S.Ha.R.K. New Tracer\end{center} \vfill{}
26
\begin{center}Written by\end{center}
27
\begin{center}Tullio Facchinetti (tullio.facchinetti at unipv.it)\end{center} \vfill{}
28
\begin{center}\includegraphics[width=2cm]{../common/sssup.ps}\end{center}
29
\begin{center}Scuola Superiore di Studi e Perfezionamento S. Anna\end{center}
30
\begin{center}RETIS Lab\end{center}
31
\begin{center}Via Carducci, 40 - 56100 Pisa\end{center}
32
 
33
\pagebreak
34
 
35
\tableofcontents{}
36
 
37
 
38
\chapter{The S.Ha.R.K. tracer}
39
 
40
The new Tracer is a powerful tool to understand what happens while a
41
S.Ha.R.K. \cite{Gai01} application is executed. The Tracer logs
42
a set of events corresponding with the most important activities
43
within the kernel, such as preemptions, interrupt activations,
44
mutexes blocks and releases, and much more.
45
 
46
During the execution, the kernel logs the sequence of events in
47
memory; such events are then written to disk or sent through the
48
network, typically at the end of the application execution. Each
49
event is made by: a high resolution timestamp (TSC, Time Stamp
50
Counter) corresponding to the instant at which the event has been
51
logged; the event type; 2 optional parameters to add additional
52
information to the event.
53
 
54
The Tracer can also be used to log custom events, since it
55
reserves a number of free event types for user events.
56
 
57
To use the features made available by the Tracer, the Tracer
58
functions must be enabled into the kernel by specifying
59
 
60
~
61
 
62
TRACER = NEW
63
 
64
~
65
 
66
into the \textit{shark.cfg} configuration file. The S.Ha.R.K.
67
kernel must be built with this option set.
68
 
69
%----------------------------------------------------------------------------
70
\chapter{Primitives}
71
%----------------------------------------------------------------------------
72
 
73
\vspace{7mm}
74
 
75
%------------------------------------------------------------
76
\begin{intest}
77
FTrace\_enable \index{FTrace\_enable}
78
\end{intest}
79
 
80
\begin{description}
81
\item [\textbf{int FTrace\_enable();}]
82
\item [\textbf{Description:}] Enable the Tracer. When this function is called, the Tracer starts
83
the event logging.
84
\end{description}
85
 
86
%------------------------------------------------------------
87
\begin{intest}
88
FTrace\_disable \index{FTrace\_disable}
89
\end{intest}
90
 
91
\begin{description}
92
\item [\textbf{int FTrace\_disable();}]
93
\item [\textbf{Description:}] Disable the Tracer. When this function is called, the Tracer stops
94
the event logging.
95
\end{description}
96
 
97
%------------------------------------------------------------
98
\begin{intest}
99
FTrace\_chunk\_create \index{FTrace\_chunk\_create}
100
\end{intest}
101
 
102
\begin{description}
103
\item [\textbf{int FTrace\_chunk\_create(int normal\_size, int emergency\_size, FTrace\_flags flags);}]
104
\item [\textbf{Description:}] Create a new chunk.
105
\end{description}
106
 
107
%------------------------------------------------------------
108
\begin{intest}
109
FTrace\_chunk\_delete \index{FTrace\_chunk\_delete}
110
\end{intest}
111
 
112
\begin{description}
113
\item [\textbf{int FTrace\_chunk\_delete(int number);}]
114
\item [\textbf{Description:}] Delete a Chunk.
115
\end{description}
116
 
117
%------------------------------------------------------------
118
\begin{intest}
119
FTrace\_set\_chunk\_flags \index{FTrace\_set\_chunk\_flags}
120
\end{intest}
121
 
122
\begin{description}
123
\item [\textbf{int FTrace\_set\_chunk\_flags(int number, FTrace\_flags flags);}]
124
\item [\textbf{Description:}] Set the chunk flags.
125
\end{description}
126
 
127
%------------------------------------------------------------
128
\begin{intest}
129
FTrace\_get\_chunk\_flags \index{FTrace\_get\_chunk\_flags}
130
\end{intest}
131
 
132
\begin{description}
133
\item [\textbf{int FTrace\_get\_chunk\_flags(int number, FTrace\_flags *flags);}]
134
\item [\textbf{Description:}] Returns chunk flags.
135
\end{description}
136
 
137
%------------------------------------------------------------
138
\begin{intest}
139
FTrace\_actual\_chunk\_select \index{FTrace\_actual\_chunk\_select}
140
\end{intest}
141
 
142
\begin{description}
143
\item [\textbf{int FTrace\_actual\_chunk\_select(int number);}]
144
\item [\textbf{Description:}] Select the actual chunk.
145
\end{description}
146
 
147
%------------------------------------------------------------
148
\begin{intest}
149
FTrace\_chunk\_link \index{FTrace\_chunk\_link}
150
\end{intest}
151
 
152
\begin{description}
153
\item [\textbf{int FTrace\_chunk\_link(int chunk\_A, int chunk\_B);}]
154
\item [\textbf{Description:}] Link two chunks.
155
\end{description}
156
 
157
%------------------------------------------------------------
158
\begin{intest}
159
FTrace\_get\_first\_chunk \index{FTrace\_get\_first\_chunk}
160
\end{intest}
161
 
162
\begin{description}
163
\item [\textbf{int FTrace\_get\_first\_chunk(FTrace\_flags flags);}]
164
\item [\textbf{Description:}] Find the first chunk with specific flags.
165
\end{description}
166
 
167
%------------------------------------------------------------
168
\begin{intest}
169
FTrace\_get\_chunk\_table \index{FTrace\_get\_chunk\_table}
170
\end{intest}
171
 
172
\begin{description}
173
\item [\textbf{FTrace\_Chunk\_Ptr *FTrace\_get\_chunk\_table();}]
174
\item [\textbf{Description:}] Get chunks status.
175
\end{description}
176
 
177
%------------------------------------------------------------
178
\begin{intest}
179
FTrace\_compress\_chunk \index{FTrace\_compress\_chunk}
180
\end{intest}
181
 
182
\begin{description}
183
\item [\textbf{int FTrace\_compress\_chunk(int number, FTrace\_flags new\_flags);}]
184
\item [\textbf{Description:}] Create a new memory region where the compressed data are stored.
185
\end{description}
186
 
187
%------------------------------------------------------------
188
\begin{intest}
189
FTrace\_send\_chunk \index{FTrace\_send\_chunk}
190
\end{intest}
191
 
192
\begin{description}
193
\item [\textbf{int FTrace\_send\_chunk(int number, int osd\_flags,
194
FTrace\_flags new\_flags);}]
195
\item [\textbf{Description:}] Send the chunk out from the memory.
196
\end{description}
197
 
198
%------------------------------------------------------------
199
\begin{intest}
200
FTrace\_init\_disk\_writer \index{FTrace\_init\_disk\_writer}
201
\end{intest}
202
 
203
\begin{description}
204
\item [\textbf{int FTrace\_init\_disk\_writer(char *fname, int flag,
205
char *l\_ip, char *t\_ip);}]
206
\item [\textbf{Description:}] Initialize the disk Tracer chunk dumper. It sets
207
the internal chunk sender to the function that writes chunks on disk. It
208
initializes the filename that will be used to open the file for saving chunks.
209
\end{description}
210
 
211
%------------------------------------------------------------
212
\begin{intest}
213
FTrace\_disk\_writer \index{FTrace\_disk\_writer}
214
\end{intest}
215
 
216
\begin{description}
217
\item [\textbf{void FTrace\_disk\_writer(FTrace\_Chunk\_Ptr c);}]
218
\item [\textbf{Description:}] This function is called by the application when it
219
asks to write chunk c on disk. It saves the chunk data into the chunk\_to\_disk
220
array. At the runlevel after the exit, all the saved chunks will be written to
221
disk.
222
\end{description}
223
 
224
%------------------------------------------------------------
225
\begin{intest}
226
FTrace\_OSD\_init\_udp \index{FTrace\_OSD\_init\_udp}
227
\end{intest}
228
 
229
\begin{description}
230
\item [\textbf{int FTrace\_OSD\_init\_udp(int flag, char *l\_ip, char *t\_ip);}]
231
\item [\textbf{Description:}] Initialize the Tracer chunk network sender using
232
the UDP protocol supported by S.Ha.R.K. If flag = 1 initializes the network
233
driver, otherwise it considers that the network layer has already been
234
initialized. It also sets the internal chunk sender to the function that
235
initializes the task for sending the chunk.
236
\end{description}
237
 
238
%------------------------------------------------------------
239
\begin{intest}
240
FTrace\_set\_filter \index{FTrace\_set\_filter}
241
\end{intest}
242
 
243
\begin{description}
244
\item [\textbf{void FTrace\_set\_filter(BYTE family, int status);}]
245
\item [\textbf{Description:}] Set the filter for a specific family of events
246
(see Table \ref{tab:filter-events} for a list of all the event families). When
247
the filter is enabled for a given family of events, all the events belonging to
248
that family are not logged.\\
249
While \texttt{status} set to 1 enables the filter, \texttt{status}
250
set to 0 disables the filter.
251
\end{description}
252
 
253
%------------------------------------------------------------
254
\begin{intest}
255
TRACER\_LOGEVENT \index{TRACER\_LOGEVENT}
256
\end{intest}
257
 
258
\begin{description}
259
\item [\textbf{TRACER\_LOGEVENT(WORD type, WORD par1, DWORD par2);}]
260
\item [\textbf{Description:}] Stores a new event of \texttt{type} type into the
261
current chunk, together with the 2 parameters \texttt{par1} (2 bytes) and
262
\texttt{par2} (4 bytes).
263
\end{description}
264
 
265
%----------------------------------------------------------------------------
266
\chapter{Event types description}
267
\label{ch:Event-types-description}
268
%----------------------------------------------------------------------------
269
 
270
This Chapter reports all the available event type codes currently
271
supported by S.Ha.R.K.
272
 
273
\begin{table}
274
\begin{center}
275
\begin{tabular}{|l|c|c|c|}
276
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
277
\hline FTrace\_EVT\_empty & 0x00 & . & . \\
278
\hline FTrace\_EVT\_cycles\_per\_msec & 0x10 & .& [clk/msec] \\
279
\hline FTrace\_EVT\_trace\_start& 0x20 & . & . \\
280
\hline FTrace\_EVT\_trace\_stop & 0x30& . & . \\
281
\hline FTrace\_EVT\_blackout\_start & 0x40 & .& . \\
282
\hline FTrace\_EVT\_blackout\_end & 0x50 & .& . \\
283
\hline FTrace\_EVT\_id & 0x60 & context& pid \\
284
\hline FTrace\_EVT\_numevents & 0x70 & .& . \\
285
\hline
286
\end{tabular}
287
\end{center}
288
\caption{General trace events.}
289
\end{table}
290
 
291
 
292
\begin{table}
293
\begin{center}
294
\begin{tabular}{|l|c|c|c|}
295
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
296
\hline FTrace\_EVT\_ipoint & 0x01 & number & . \\ \hline
297
\end{tabular}
298
\end{center}
299
\caption{Lightweight tracing events.}
300
\end{table}
301
 
302
 
303
\begin{table}
304
\begin{center}
305
\begin{tabular}{|l|c|c|c|}
306
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
307
\hline FTrace\_EVT\_task\_create & 0x02 & context& pid \\
308
\hline FTrace\_EVT\_task\_activate & 0x12 & context & . \\
309
\hline FTrace\_EVT\_task\_dispatch & 0x22 & . & . \\
310
\hline FTrace\_EVT\_task\_epilogue & 0x32 & . & . \\
311
\hline FTrace\_EVT\_task\_end & 0x42 & context & pid \\
312
\hline FTrace\_EVT\_task\_begin\_cycle & 0x52 & . & . \\
313
\hline FTrace\_EVT\_task\_end\_cycle & 0x62 & context & level \\
314
\hline FTrace\_EVT\_task\_sleep & 0x72 & . & . \\
315
\hline FTrace\_EVT\_task\_schedule & 0x82 & exec\_shadow.context & exec.context \\
316
\hline FTrace\_EVT\_task\_timer & 0x92 & context & level \\
317
\hline FTrace\_EVT\_task\_disable& 0xA2 & . & . \\
318
\hline FTrace\_EVT\_task\_deadline\_miss & 0xB2 & context & . \\
319
\hline FTrace\_EVT\_task\_wcet\_violation & 0xC2 & context& . \\
320
\hline
321
\end{tabular}
322
\end{center}
323
\caption{Task related events.}
324
\end{table}
325
 
326
\begin{table}
327
\begin{center}
328
\begin{tabular}{|l|c|c|c|}
329
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
330
\hline FTrace\_EVT\_interrupt\_start & 0x03 & int & . \\
331
\hline FTrace\_EVT\_interrupt\_end & 0x13 & int & . \\
332
\hline FTrace\_EVT\_interrupt\_hit & 0x23 &
333
\multicolumn{2}{c|}{Instant where interrupt was hit (no end)} \\
334
\hline FTrace\_EVT\_interrupt\_count & 0x33 &
335
\multicolumn{2}{c|}{Number of interrupts raised since last interrupt\_count} \\
336
\hline
337
\end{tabular}
338
\end{center}
339
\caption{Interrupt events, even more lightweight than ipoints.}
340
\end{table}
341
 
342
\begin{table}
343
\begin{center}
344
\begin{tabular}{|l|c|c|c|}
345
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
346
\hline FTrace\_EVT\_to\_real\_mode & 0x04 & . & . \\
347
\hline FTrace\_EVT\_to\_protected\_mode & 0x14 & . & . \\
348
\hline FTrace\_EVT\_CLI & 0x24 & . & . \\ \hline
349
FTrace\_EVT\_STI & 0x34 & . & . \\ \hline
350
\end{tabular}
351
\end{center}
352
\caption{Other CPU specific events.}
353
\end{table}
354
 
355
\begin{table}
356
\begin{center}
357
\begin{tabular}{|l|c|c|c|}
358
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
359
\hline FTrace\_EVT\_set\_priority & 0x05 & . & . \\
360
\hline FTrace\_EVT\_context\_switch & 0x15 & context& . \\
361
\hline FTrace\_EVT\_inheritance & 0x25 & exec\_shadow.context & exec.context \\
362
\hline
363
\end{tabular}
364
\end{center}
365
\caption{Changes on task attributes and state.}
366
\end{table}
367
 
368
\begin{table}
369
\begin{center}
370
\begin{tabular}{|l|c|c|c|}
371
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
372
\hline FTrace\_EVT\_set\_mutex\_create & 0x06 & . & . \\
373
\hline FTrace\_EVT\_set\_mutex\_lock & 0x16 & context& mutex \\
374
\hline FTrace\_EVT\_set\_mutex\_inherit & 0x26 & . & . \\
375
\hline FTrace\_EVT\_set\_mutex\_unlock & 0x43 & context & mutex \\
376
\hline FTrace\_EVT\_set\_mutex\_wait & 0x46 & context & mutex \\
377
\hline FTrace\_EVT\_set\_mutex\_post & 0x56 & context& mutex \\
378
\hline
379
\end{tabular}
380
\end{center}
381
\caption{Mutex events.}
382
\end{table}
383
 
384
\begin{table}
385
\begin{center}
386
\begin{tabular}{|l|c|c|c|}
387
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
388
\hline FTrace\_EVT\_signal & 0x07 & . & . \\
389
\hline
390
\end{tabular}
391
\end{center}
392
\caption{Signal events.}
393
\end{table}
394
 
395
\begin{table}
396
\begin{center}
397
\begin{tabular}{|l|c|c|c|}
398
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
399
\hline FTrace\_EVT\_server\_create & 0x08 & . & server \\
400
\hline FTrace\_EVT\_server\_replenish & 0x18 & .& server \\
401
\hline FTrace\_EVT\_server\_exhaust & 0x28 & . & server \\
402
\hline FTrace\_EVT\_server\_reclaiming & 0x38 & . & server \\
403
\hline FTrace\_EVT\_server\_remove & 0x48 & . & server \\
404
\hline FTrace\_EVT\_server\_active & 0x58 & . & server \\
405
\hline FTrace\_EVT\_server\_using\_rec & 0x68 & reclaiming & server \\
406
\hline
407
\end{tabular}
408
\end{center}
409
\caption{Specific server events.}
410
\end{table}
411
 
412
\begin{table}
413
\begin{center}
414
\begin{tabular}{|l|c|c|c|}
415
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
416
\hline FTrace\_EVT\_user\_event\_0 & 0x09 & free & free \\
417
\hline FTrace\_EVT\_user\_event\_1 & 0x19 & free & free \\
418
\hline FTrace\_EVT\_user\_event\_2 & 0x29 & free & free \\
419
\hline FTrace\_EVT\_user\_event\_3 & 0x39 & free & free \\
420
\hline FTrace\_EVT\_user\_event\_4 & 0x49 & free & free \\
421
\hline FTrace\_EVT\_user\_event\_5 & 0x59 & free & free \\
422
\hline FTrace\_EVT\_user\_event\_6 & 0x69 & free & free \\
423
\hline FTrace\_EVT\_user\_event\_7 & 0x79 & free & free \\
424
\hline FTrace\_EVT\_user\_event\_8 & 0x89 & free & free \\
425
\hline FTrace\_EVT\_user\_event\_9 & 0x99 & free & free \\
426
\hline FTrace\_EVT\_user\_event\_10 & 0xA9 & free & free \\
427
\hline FTrace\_EVT\_user\_event\_11 & 0xB9 & free & free \\
428
\hline FTrace\_EVT\_user\_event\_12 & 0xC9 & free & free \\
429
\hline FTrace\_EVT\_user\_event\_13 & 0xD9 & free & free \\
430
\hline FTrace\_EVT\_user\_event\_14 & 0xE9 & free & free \\
431
\hline
432
\end{tabular}
433
\end{center}
434
\caption{User defined events.}
435
\end{table}
436
 
437
\begin{table}
438
\begin{center}
439
\begin{tabular}{|l|c|c|c|}
440
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
441
\hline FTrace\_EVT\_timer\_post & 0x0B & . & . \\
442
\hline FTrace\_EVT\_timer\_delete & 0x1B & . & . \\
443
\hline FTrace\_EVT\_timer\_wakeup\_start & 0x2B & . & . \\
444
\hline FTrace\_EVT\_timer\_wakeup\_end & 0x3B & context & . \\
445
\hline
446
\end{tabular}
447
\end{center}
448
\caption{Timer events.}
449
\end{table}
450
 
451
\begin{table}
452
\begin{center}
453
\begin{tabular}{|l|c|c|c|}
454
\hline Name & Code & Parameter 1 & Parameter 2 \\ \hline
455
\cline{1-1} \cline{2-2} FTrace\_EVT\_data\_pointer & 0x1A &
456
\multicolumn{2}{c|}{holds a pointer of data from} \\
457
\cline{1-1} \cline{2-2} FTrace\_EVT\_next\_chunk & 0xFF &
458
\multicolumn{2}{c|}{previous event} \\
459
\hline
460
\end{tabular}
461
\end{center}
462
\caption{Generic data events.}
463
\end{table}
464
 
465
\begin{table}
466
\begin{center}
467
\begin{tabular}{|l|c|}
468
\hline Name & Code \\ \hline
469
\hline FTrace\_filter\_trace\_Events & 0xF0 \\
470
\hline FTrace\_filter\_ipoint & 0xF1 \\
471
\hline FTrace\_filter\_task & 0xF2 \\
472
\hline FTrace\_filter\_interrupt & 0xF3 \\
473
\hline FTrace\_filter\_CPU & 0xF4 \\
474
\hline FTrace\_filter\_priority & 0xF5 \\
475
\hline FTrace\_filter\_mutex & 0xF6 \\
476
\hline FTrace\_filter\_signal & 0xF7 \\
477
\hline FTrace\_filter\_server & 0xF8 \\
478
\hline FTrace\_filter\_user & 0xF9 \\
479
\hline FTrace\_filter\_data & 0xFA \\
480
\hline FTrace\_filter\_timer & 0xFB \\
481
\hline FTrace\_family\_mask & 0x0F \\
482
\hline
483
\end{tabular}
484
\end{center}
485
\caption{Filter management.}
486
\label{tab:filter-events}
487
\end{table}
488
 
489
%----------------------------------------------------------------------------
490
\chapter{Example of Tracer usage}
491
%----------------------------------------------------------------------------
492
 
493
\begin{verbatim}
494
/* Declarations */
495
int a,b,c;
496
SYS_FLAGS f;
497
 
498
/* Create 3 chunks for storing the tracer events. */
499
a = FTrace_chunk_create(1000000, 1000000, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_CYC);
500
b = FTrace_chunk_create(1000000, 1000000, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_JTN);
501
c = FTrace_chunk_create(1000000, 1000000, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_CYC);
502
 
503
FTrace_chunk_link(a,b);
504
FTrace_chunk_link(b,c);
505
 
506
/* Select the first chunk for saving the events. */
507
FTrace_actual_chunk_select(a);
508
 
509
/* Start the tracer. */
510
FTrace_enable();
511
 
512
/* Enable filtering for timer related events. */
513
FTrace_set_filter(FTrace_filter_timer, 1);
514
TRACER_LOGEVENT(FTrace_EVT_trace_start, proc_table[exec_shadow].context, clk_per_msec);
515
 
516
for (i = 0; i < 10; i++)
517
  if (proc_table[i].context != 0)
518
    TRACER_LOGEVENT(FTrace_EVT_id, (unsigned short int)proc_table[i].context, i);
519
 
520
/* do something */
521
 
522
/** Enable filtering for timer related events. */
523
FTrace_set_filter(FTrace_filter_timer, 0);
524
 
525
/** Change the chunk where the events are stored. */
526
TRACER_LOGEVENT(FTrace_EVT_next_chunk, 0, 0);
527
TRACER_LOGEVENT(FTrace_EVT_ipoint, 6000, 0);
528
 
529
/* do something */
530
 
531
/* Store a TFrace stop event. */
532
TRACER_LOGEVENT(FTrace_EVT_trace_stop, 0, 0);
533
 
534
/* Stop the tracer. */
535
FTrace_disable();
536
 
537
/* Initialize the network for remotely saving the trace. */
538
FTrace_OSD_init_udp(1, "192.168.1.10", "192.168.1.1");
539
 
540
/*
541
 * If want to save the events to disk, simply change
542
 * the network initialization instruction with the following line:
543
 * FTrace_init_disk_writer("trace.dat", 0, NULL, NULL);
544
 *
545
 */
546
 
547
/* Save the chunk. */
548
FTrace_send_chunk(a, 0, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_CYC);
549
FTrace_send_chunk(b, 0, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_JTN);
550
\end{verbatim}
551
 
552
%----------------------------------------------------------------------------
553
\chapter{Tracer output}
554
%----------------------------------------------------------------------------
555
 
556
When the trace is saved, locally or remotely, into a file, the
557
resulting binary file appears as a sequence of bytes where each
558
event stored within the trace output file is 16 bytes long. The
559
format of each single event is depicted in Table \ref{tab:format}.
560
 
561
The fields have the following meaning:
562
 
563
\begin{itemize}
564
\item Code represents the event type (see Chapter
565
\ref{ch:Event-types-description} for the full list);
566
\item Parameter 1 and 2 are the parameters used when \texttt{TRACER\_LOGEVENT}
567
is invoked;
568
\item TSC is the Time Stamp Counter associated with the event;
569
\end{itemize}
570
 
571
If \texttt{ptr} points to the first byte of an event, the correct TSC value
572
can be obtained with the following instructions:
573
 
574
\begin{verbatim}
575
unsigned long long tsc_value;
576
tsc_value = (unsigned long long)(*(unsigned int *)(ptr + 4)) << 32;
577
tsc_value += (unsigned long long)(*(unsigned int *)(ptr + 8));
578
\end{verbatim}
579
 
580
\begin{table}
581
\begin{center}\begin{tabular}{|c|c|c|c|c|}
582
\hline Code & Parameter 1 & TSC (high part) & TSC (low part) & Parameter 2 \\
583
\hline 2 bytes & 2 bytes & 4 bytes & 4 bytes & 4 bytes \\
584
\hline
585
\end{tabular}\end{center}
586
\caption{Event output file format.}
587
\label{tab:format}
588
\end{table}
589
 
590
\printindex{}
591
 
592
\bibliographystyle{alpha}
593
\bibliography{../common/biblio}
594
 
595
\end{document}