Rev 352 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
#include <stdlib.h>
#include <tracer.h>
void *StartTracerBuffer
; // Buffer Start
void *EndTracerBuffer
; // Buffer End
void *LastBeforeEndTracerBuffer
;
void *CurrentTracerBuffer
; //The Actual Write Point For The Next Event
void *FirstTracerBuffer
; //The First Valid Event
int TracerActive
= 0;
unsigned long long TracerEventsRecorded
;
extern unsigned int clk_per_msec
;
/* Initialize the tracer
*
* Return 0 => Success
* Return 1 => Fail
*/
int tracer_initialize
(int OutputType
, int MemorySize
)
{
SYS_FLAGS f
;
f
= ll_fsave
();
StartTracerBuffer
= malloc(MemorySize
);
if (!StartTracerBuffer
) {
ll_frestore
(f
);
return 1;
}
EndTracerBuffer
= StartTracerBuffer
+ MemorySize
- 1;
CurrentTracerBuffer
= StartTracerBuffer
;
FirstTracerBuffer
= StartTracerBuffer
;
LastBeforeEndTracerBuffer
= EndTracerBuffer
;
TracerActive
= 0;
TracerEventsRecorded
= 0;
ll_frestore
(f
);
return 0;
}
void tracer_enable
() {
SYS_FLAGS f
;
f
= ll_fsave
();
TracerActive
= 1;
ll_frestore
(f
);
}
void tracer_disable
() {
SYS_FLAGS f
;
f
= ll_fsave
();
TracerActive
= 0;
ll_frestore
(f
);
}
void tracer_print_statistics
() {
SYS_FLAGS f
;
void *p
;
int i
,t
;
f
= ll_fsave
();
cprintf
("Start Tracer Buffer: %08x\n",(int)StartTracerBuffer
);
cprintf
("End Tracer Buffer: %08x\n",(int)EndTracerBuffer
);
cprintf
("Current Tracer Buffer: %08x\n",(int)CurrentTracerBuffer
);
cprintf
("First Tracer Buffer: %08x\n",(int)FirstTracerBuffer
);
cprintf
("Last Before End Tracer Buffer: %08x\n\n",(int)LastBeforeEndTracerBuffer
);
cprintf
("Total Events: %d\n",(int)TracerEventsRecorded
);
for (i
=0; i
<0xFF; i
++) {
p
= FirstTracerBuffer
;
t
= 0;
while(p
!= CurrentTracerBuffer
) {
if (*(BYTE
*)p
== i
) t
++;
if (*(BYTE
*)p
!= 0) {
p
+= *(BYTE
*)(p
+ 9);
if (p
>= LastBeforeEndTracerBuffer
) p
= StartTracerBuffer
;
} else {
p
= StartTracerBuffer
;
}
}
if (t
!= 0)
cprintf
("Event type %02x => %d\n",i
,t
);
}
ll_frestore
(f
);
}