Subversion Repositories shark

Rev

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);

}