Subversion Repositories shark

Rev

Rev 369 | 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;
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
}