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