Rev 364 | Rev 366 | Go to most recent revision | 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; |
364 | giacomo | 13 | unsigned int TracerEventsSaved; |
352 | giacomo | 14 | extern unsigned int clk_per_msec; |
15 | |||
16 | /* Initialize the tracer |
||
17 | * |
||
18 | * Return 0 => Success |
||
19 | * Return 1 => Fail |
||
20 | */ |
||
365 | giacomo | 21 | int tracer_initialize(int MemorySize) |
352 | giacomo | 22 | { |
23 | |||
24 | SYS_FLAGS f; |
||
25 | |||
26 | f = ll_fsave(); |
||
27 | |||
28 | StartTracerBuffer = malloc(MemorySize); |
||
29 | if (!StartTracerBuffer) { |
||
30 | ll_frestore(f); |
||
31 | return 1; |
||
32 | } |
||
33 | |||
34 | EndTracerBuffer = StartTracerBuffer + MemorySize - 1; |
||
35 | CurrentTracerBuffer = StartTracerBuffer; |
||
362 | giacomo | 36 | FirstTracerBuffer = StartTracerBuffer; |
37 | LastBeforeEndTracerBuffer = EndTracerBuffer; |
||
352 | giacomo | 38 | |
39 | TracerActive = 0; |
||
40 | TracerEventsRecorded = 0; |
||
364 | giacomo | 41 | TracerEventsSaved = 0; |
352 | giacomo | 42 | |
43 | ll_frestore(f); |
||
44 | return 0; |
||
45 | |||
46 | } |
||
47 | |||
48 | void tracer_enable() { |
||
49 | |||
50 | SYS_FLAGS f; |
||
51 | |||
52 | f = ll_fsave(); |
||
53 | |||
54 | TracerActive = 1; |
||
55 | |||
56 | ll_frestore(f); |
||
57 | |||
58 | } |
||
59 | |||
60 | void tracer_disable() { |
||
61 | |||
62 | SYS_FLAGS f; |
||
63 | |||
64 | f = ll_fsave(); |
||
65 | |||
66 | TracerActive = 0; |
||
67 | |||
68 | ll_frestore(f); |
||
69 | |||
70 | } |
||
71 | |||
364 | giacomo | 72 | int send_udp_event(void *p, int size); |
73 | |||
74 | /* Send NumberOfEvents out of the system |
||
75 | * If NumberOfEvents = -1 all the events will be sent */ |
||
76 | int send_logged_data(unsigned int NumberOfEvents) { |
||
77 | |||
78 | void *p; |
||
79 | int s,err; |
||
80 | |||
81 | SYS_FLAGS f; |
||
82 | |||
83 | f = ll_fsave(); |
||
84 | |||
85 | if (NumberOfEvents == 0 || TracerEventsSaved == 0) { |
||
86 | ll_frestore(f); |
||
87 | return 0; |
||
88 | } |
||
89 | |||
90 | p = FirstTracerBuffer; |
||
91 | s = 0; |
||
92 | while(((p == CurrentTracerBuffer && s == 0) || p != CurrentTracerBuffer) && s != NumberOfEvents) { |
||
93 | |||
94 | switch (TracerOutputType) { |
||
95 | case TRACER_NO_OUTPUT: |
||
96 | break; |
||
97 | case TRACER_UDP_OUTPUT: |
||
98 | err = send_udp_event(p,*(BYTE *)(p + 9)); |
||
99 | if (err != 0) { |
||
100 | ll_frestore(f); |
||
101 | return s; |
||
102 | } |
||
103 | break; |
||
104 | default: |
||
105 | cprintf("Error: Tracer Output Not Defined\n"); |
||
106 | ll_frestore(f); |
||
107 | return -1; |
||
108 | break; |
||
109 | } |
||
110 | |||
111 | p += *(BYTE *)(p + 9); |
||
112 | if (p >= LastBeforeEndTracerBuffer) p = StartTracerBuffer; |
||
113 | |||
114 | FirstTracerBuffer = p; |
||
115 | TracerEventsSaved--; |
||
116 | |||
117 | s++; |
||
118 | |||
119 | } |
||
120 | |||
121 | ll_frestore(f); |
||
122 | return s; |
||
123 | |||
124 | } |
||
125 | |||
352 | giacomo | 126 | void tracer_print_statistics() { |
127 | |||
128 | SYS_FLAGS f; |
||
129 | void *p; |
||
363 | giacomo | 130 | int i,t,s; |
352 | giacomo | 131 | |
362 | giacomo | 132 | f = ll_fsave(); |
352 | giacomo | 133 | |
363 | giacomo | 134 | cprintf("\nStart Tracer Buffer: %08x\n",(int)StartTracerBuffer); |
362 | giacomo | 135 | cprintf("End Tracer Buffer: %08x\n",(int)EndTracerBuffer); |
136 | cprintf("Current Tracer Buffer: %08x\n",(int)CurrentTracerBuffer); |
||
137 | cprintf("First Tracer Buffer: %08x\n",(int)FirstTracerBuffer); |
||
138 | cprintf("Last Before End Tracer Buffer: %08x\n\n",(int)LastBeforeEndTracerBuffer); |
||
352 | giacomo | 139 | |
362 | giacomo | 140 | cprintf("Total Events: %d\n",(int)TracerEventsRecorded); |
364 | giacomo | 141 | cprintf("Total Saved Events: %d\n",TracerEventsSaved); |
352 | giacomo | 142 | |
143 | for (i=0; i<0xFF; i++) { |
||
362 | giacomo | 144 | p = FirstTracerBuffer; |
352 | giacomo | 145 | t = 0; |
363 | giacomo | 146 | s = 0; |
147 | while((p == CurrentTracerBuffer && s == 0) || p != CurrentTracerBuffer) { |
||
148 | s++; |
||
352 | giacomo | 149 | if (*(BYTE *)p == i) t++; |
363 | giacomo | 150 | p += *(BYTE *)(p + 9); |
151 | if (p >= LastBeforeEndTracerBuffer) p = StartTracerBuffer; |
||
352 | giacomo | 152 | } |
153 | if (t != 0) |
||
154 | cprintf("Event type %02x => %d\n",i,t); |
||
155 | } |
||
156 | |||
157 | ll_frestore(f); |
||
158 | |||
159 | } |