Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 361 → Rev 362

/shark/trunk/tracer/newtrace/tracer.c
1,9 → 1,12
#include <stdlib.h>
#include <tracer.h>
 
void *StartTracerBuffer;
void *EndTracerBuffer;
void *CurrentTracerBuffer;
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;
28,6 → 31,8
 
EndTracerBuffer = StartTracerBuffer + MemorySize - 1;
CurrentTracerBuffer = StartTracerBuffer;
FirstTracerBuffer = StartTracerBuffer;
LastBeforeEndTracerBuffer = EndTracerBuffer;
 
TracerActive = 0;
TracerEventsRecorded = 0;
65,66 → 70,34
 
SYS_FLAGS f;
void *p;
int i,t,ctx,pid,ctx_current;
unsigned long long ck,delta;
unsigned long long last_clk;
int i,t;
struct exec_proc {
int ctx;
unsigned long long total_clk;
unsigned long long start_clk;
};
f = ll_fsave();
 
struct exec_proc *ec;
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);
 
f = ll_fsave();
cprintf("Total Events: %d\n",(int)TracerEventsRecorded);
 
cprintf("Total Events %d\n",(int)TracerEventsRecorded);
 
for (i=0; i<0xFF; i++) {
p = StartTracerBuffer;
p = FirstTracerBuffer;
t = 0;
while(p < CurrentTracerBuffer) {
while(p != CurrentTracerBuffer) {
if (*(BYTE *)p == i) t++;
p += *(BYTE *)(p + 9);
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);
}
 
ec = malloc(sizeof(struct exec_proc) * MAX_PROC);
ctx_current = 0;
last_clk = 0;
 
cprintf("Context Switch Analisys\n");
p = StartTracerBuffer;
while(p < CurrentTracerBuffer) {
pid = *(int *)(p + 10);
ctx = *(int *)(p + 14);
ck = (unsigned long long)(*(unsigned int *)(p + 1)) << 32;
ck |= *(unsigned int *)(p + 5);
if (*(BYTE *)p == FTrace_EVT_task_create) {
cprintf("Task Create %d %d\n",pid,ctx);
ec[pid].ctx = ctx;
ec[pid].total_clk = 0;
ec[pid].start_clk = ck;
}
if (*(BYTE *)p == FTrace_EVT_context_switch ||
*(BYTE *)p == FTrace_EVT_timer_wakeup_end) {
ctx = *(int *)(p + 10);
if (ctx_current == 0) {
ctx_current = ctx;
last_clk = ck;
} else {
delta = ck - last_clk;
cprintf("Delta Ctx %d = %d us\n",ctx_current,(int)(delta * 1000000 / clk_per_msec / 1000));
last_clk = ck;
ctx_current = ctx;
}
}
p += *(BYTE *)(p + 9);
}
 
ll_frestore(f);
 
}