Rev 369 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
352 | giacomo | 1 | #include <stdlib.h> |
2 | #include <tracer.h> |
||
3 | |||
362 | giacomo | 4 | void *StartTracerBuffer; // Buffer Start |
5 | void *EndTracerBuffer; // Buffer End |
||
6 | void *LastBeforeEndTracerBuffer; |
||
7 | void *CurrentTracerBuffer; //The Actual Write Point For The Next Event |
||
8 | void *FirstTracerBuffer; //The First Valid Event |
||
9 | |||
352 | giacomo | 10 | int TracerActive = 0; |
364 | giacomo | 11 | int TracerOutputType = TRACER_NO_OUTPUT; |
352 | giacomo | 12 | unsigned long long TracerEventsRecorded; |
369 | giacomo | 13 | unsigned int TracerEventsPresent; |
352 | giacomo | 14 | extern unsigned int clk_per_msec; |
15 | |||
369 | giacomo | 16 | #define TRACER_DEBUG |
17 | |||
352 | giacomo | 18 | /* Initialize the tracer |
19 | * |
||
20 | * Return 0 => Success |
||
21 | * Return 1 => Fail |
||
22 | */ |
||
365 | giacomo | 23 | int tracer_initialize(int MemorySize) |
352 | giacomo | 24 | { |
25 | |||
26 | SYS_FLAGS f; |
||
27 | |||
28 | f = ll_fsave(); |
||
29 | |||
30 | StartTracerBuffer = malloc(MemorySize); |
||
31 | if (!StartTracerBuffer) { |
||
32 | ll_frestore(f); |
||
33 | return 1; |
||
34 | } |
||
35 | |||
36 | EndTracerBuffer = StartTracerBuffer + MemorySize - 1; |
||
37 | CurrentTracerBuffer = StartTracerBuffer; |
||
362 | giacomo | 38 | FirstTracerBuffer = StartTracerBuffer; |
39 | LastBeforeEndTracerBuffer = EndTracerBuffer; |
||
352 | giacomo | 40 | |
41 | TracerActive = 0; |
||
42 | TracerEventsRecorded = 0; |
||
369 | giacomo | 43 | TracerEventsPresent = 0; |
352 | giacomo | 44 | |
45 | ll_frestore(f); |
||
46 | return 0; |
||
47 | |||
48 | } |
||
49 | |||
50 | void tracer_enable() { |
||
51 | |||
52 | SYS_FLAGS f; |
||
53 | |||
54 | f = ll_fsave(); |
||
55 | |||
56 | TracerActive = 1; |
||
57 | |||
58 | ll_frestore(f); |
||
59 | |||
60 | } |
||
61 | |||
62 | void tracer_disable() { |
||
63 | |||
64 | SYS_FLAGS f; |
||
65 | |||
66 | f = ll_fsave(); |
||
67 | |||
68 | TracerActive = 0; |
||
69 | |||
70 | ll_frestore(f); |
||
71 | |||
72 | } |
||
73 | |||
364 | giacomo | 74 | int send_udp_event(void *p, int size); |
369 | giacomo | 75 | void send_remaining_udp_buffer(); |
364 | giacomo | 76 | |
77 | /* Send NumberOfEvents out of the system |
||
78 | * If NumberOfEvents = -1 all the events will be sent */ |
||
374 | giacomo | 79 | int tracer_send_logged_events(int NumberOfEvents) { |
364 | giacomo | 80 | |
81 | void *p; |
||
82 | int s,err; |
||
83 | |||
84 | SYS_FLAGS f; |
||
85 | |||
86 | f = ll_fsave(); |
||
87 | |||
369 | giacomo | 88 | if (NumberOfEvents == 0 || TracerEventsPresent == 0) { |
364 | giacomo | 89 | ll_frestore(f); |
90 | return 0; |
||
91 | } |
||
92 | |||
93 | p = FirstTracerBuffer; |
||
94 | s = 0; |
||
95 | while(((p == CurrentTracerBuffer && s == 0) || p != CurrentTracerBuffer) && s != NumberOfEvents) { |
||
96 | |||
97 | switch (TracerOutputType) { |
||
98 | case TRACER_NO_OUTPUT: |
||
369 | giacomo | 99 | #ifdef TRACER_DEBUG |
100 | cprintf("Event Type %02x Sent To NULL\n",*(BYTE *)(p)); |
||
101 | #endif |
||
364 | giacomo | 102 | break; |
103 | case TRACER_UDP_OUTPUT: |
||
104 | err = send_udp_event(p,*(BYTE *)(p + 9)); |
||
105 | if (err != 0) { |
||
106 | ll_frestore(f); |
||
107 | return s; |
||
108 | } |
||
109 | break; |
||
110 | default: |
||
369 | giacomo | 111 | #ifdef TRACER_DEBUG |
112 | cprintf("Error: Tracer Output Not Defined\n"); |
||
113 | #endif |
||
114 | ll_frestore(f); |
||
364 | giacomo | 115 | return -1; |
116 | break; |
||
117 | } |
||
118 | |||
119 | p += *(BYTE *)(p + 9); |
||
120 | if (p >= LastBeforeEndTracerBuffer) p = StartTracerBuffer; |
||
121 | |||
122 | FirstTracerBuffer = p; |
||
369 | giacomo | 123 | TracerEventsPresent--; |
364 | giacomo | 124 | |
125 | s++; |
||
126 | |||
127 | } |
||
128 | |||
129 | ll_frestore(f); |
||
130 | return s; |
||
131 | |||
132 | } |
||
133 | |||
369 | giacomo | 134 | //Flush the events that are ready to send |
135 | void tracer_flush_sent_events() { |
||
136 | |||
137 | switch (TracerOutputType) { |
||
138 | case TRACER_UDP_OUTPUT: |
||
139 | send_remaining_udp_buffer(); |
||
140 | break; |
||
141 | } |
||
142 | |||
143 | } |
||
144 | |||
352 | giacomo | 145 | void tracer_print_statistics() { |
146 | |||
147 | SYS_FLAGS f; |
||
148 | void *p; |
||
363 | giacomo | 149 | int i,t,s; |
352 | giacomo | 150 | |
362 | giacomo | 151 | f = ll_fsave(); |
352 | giacomo | 152 | |
363 | giacomo | 153 | cprintf("\nStart Tracer Buffer: %08x\n",(int)StartTracerBuffer); |
362 | giacomo | 154 | cprintf("End Tracer Buffer: %08x\n",(int)EndTracerBuffer); |
155 | cprintf("Current Tracer Buffer: %08x\n",(int)CurrentTracerBuffer); |
||
156 | cprintf("First Tracer Buffer: %08x\n",(int)FirstTracerBuffer); |
||
157 | cprintf("Last Before End Tracer Buffer: %08x\n\n",(int)LastBeforeEndTracerBuffer); |
||
352 | giacomo | 158 | |
369 | giacomo | 159 | cprintf("Events Logged: %d\n",(int)TracerEventsRecorded); |
160 | cprintf("Events Present: %d\n",TracerEventsPresent); |
||
352 | giacomo | 161 | |
369 | giacomo | 162 | if (TracerEventsPresent == 0) { |
163 | ll_frestore(f); |
||
164 | return; |
||
165 | } |
||
367 | giacomo | 166 | |
352 | giacomo | 167 | for (i=0; i<0xFF; i++) { |
362 | giacomo | 168 | p = FirstTracerBuffer; |
352 | giacomo | 169 | t = 0; |
363 | giacomo | 170 | s = 0; |
171 | while((p == CurrentTracerBuffer && s == 0) || p != CurrentTracerBuffer) { |
||
172 | s++; |
||
352 | giacomo | 173 | if (*(BYTE *)p == i) t++; |
363 | giacomo | 174 | p += *(BYTE *)(p + 9); |
175 | if (p >= LastBeforeEndTracerBuffer) p = StartTracerBuffer; |
||
352 | giacomo | 176 | } |
177 | if (t != 0) |
||
178 | cprintf("Event type %02x => %d\n",i,t); |
||
179 | } |
||
180 | |||
181 | ll_frestore(f); |
||
182 | |||
183 | } |