Rev 366 |
Rev 369 |
Go to most recent revision |
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;
int TracerOutputType
= TRACER_NO_OUTPUT
;
unsigned long long TracerEventsRecorded
;
unsigned int TracerEventsSaved
;
extern unsigned int clk_per_msec
;
/* Initialize the tracer
*
* Return 0 => Success
* Return 1 => Fail
*/
int tracer_initialize
(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;
TracerEventsSaved
= 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
);
}
int send_udp_event
(void *p
, int size
);
/* Send NumberOfEvents out of the system
* If NumberOfEvents = -1 all the events will be sent */
int tracer_send_logged_events
(unsigned int NumberOfEvents
) {
void *p
;
int s
,err
;
SYS_FLAGS f
;
f
= ll_fsave
();
if (NumberOfEvents
== 0 || TracerEventsSaved
== 0) {
ll_frestore
(f
);
return 0;
}
p
= FirstTracerBuffer
;
s
= 0;
while(((p
== CurrentTracerBuffer
&& s
== 0) || p
!= CurrentTracerBuffer
) && s
!= NumberOfEvents
) {
switch (TracerOutputType
) {
case TRACER_NO_OUTPUT
:
cprintf
("Event Type %02x Sent To NULL\n",*(BYTE
*)(p
));
break;
case TRACER_UDP_OUTPUT
:
err
= send_udp_event
(p
,*(BYTE
*)(p
+ 9));
if (err
!= 0) {
ll_frestore
(f
);
return s
;
}
break;
default:
cprintf
("Error: Tracer Output Not Defined\n");
ll_frestore
(f
);
return -1;
break;
}
p
+= *(BYTE
*)(p
+ 9);
if (p
>= LastBeforeEndTracerBuffer
) p
= StartTracerBuffer
;
FirstTracerBuffer
= p
;
TracerEventsSaved
--;
s
++;
}
ll_frestore
(f
);
return s
;
}
void tracer_print_statistics
() {
SYS_FLAGS f
;
void *p
;
int i
,t
,s
;
f
= ll_fsave
();
cprintf
("\nStart 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
);
cprintf
("Total Saved Events: %d\n",TracerEventsSaved
);
if (TracerEventsSaved
== 0) return;
for (i
=0; i
<0xFF; i
++) {
p
= FirstTracerBuffer
;
t
= 0;
s
= 0;
while((p
== CurrentTracerBuffer
&& s
== 0) || p
!= CurrentTracerBuffer
) {
s
++;
if (*(BYTE
*)p
== i
) t
++;
p
+= *(BYTE
*)(p
+ 9);
if (p
>= LastBeforeEndTracerBuffer
) p
= StartTracerBuffer
;
}
if (t
!= 0)
cprintf
("Event type %02x => %d\n",i
,t
);
}
ll_frestore
(f
);
}