/shark/trunk/tracer/include/tracer.h |
---|
65,6 → 65,11 |
#define TRACER_LOGEVENT fast_logevent |
int tracer_initialize(int OutputType, int MemorySize); |
void tracer_enable(); |
void tracer_disable(); |
void tracer_print_statistics(); |
#define TRACER_SERIALIZE |
/* Save bytes => 1(type) + 4(tsc_high) + 4(tsc_low) + 1(size) |
79,7 → 84,10 |
extern void *StartTracerBuffer; |
extern void *EndTracerBuffer; |
extern void *LastBeforeEndTracerBuffer; |
extern void *CurrentTracerBuffer; |
extern void *FirstTracerBuffer; |
extern int TracerActive; |
extern unsigned long long TracerEventsRecorded; |
111,6 → 119,15 |
if (flag & 1) size += 4; |
if (flag & 3) size += 4; |
// Adjust FirstTracerBuffer |
if (FirstTracerBuffer != StartTracerBuffer) { |
while ((CurrentTracerBuffer + size - 1) > FirstTracerBuffer) { |
FirstTracerBuffer += *(BYTE *)(FirstTracerBuffer + 9); |
if (FirstTracerBuffer > LastBeforeEndTracerBuffer) FirstTracerBuffer = StartTracerBuffer; |
} |
} |
// Check if we overcome EndTracerBuffer |
if ((CurrentTracerBuffer + size - 1) > EndTracerBuffer) { |
int i; |
//Clear remain memory |
117,9 → 134,13 |
for (i=0;i<(EndTracerBuffer-CurrentTracerBuffer+1);i++) |
*(BYTE *)(CurrentTracerBuffer + i) = 0; |
//Cyclical Buffer implementation |
LastBeforeEndTracerBuffer = CurrentTracerBuffer; |
CurrentTracerBuffer = StartTracerBuffer; |
//Set the First Event |
FirstTracerBuffer = StartTracerBuffer + *(BYTE *)(StartTracerBuffer + 9); |
} |
// Add the new event |
*(BYTE *)CurrentTracerBuffer = type; |
CurrentTracerBuffer++; |
*(DWORD *)(CurrentTracerBuffer) = tsc_high; |
/shark/trunk/tracer/include/FTrace.h |
---|
70,6 → 70,7 |
#define FTrace_EVT_server_create 0x08 |
#define FTrace_EVT_server_replenish 0x18 |
#define FTrace_EVT_server_exhaust 0x28 |
#define FTrace_EVT_server_reclaiming 0x38 |
// user defined events |
#define FTrace_EVT_user_event_0 0x09 |
/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); |
} |
/shark/trunk/config/mk/gnu.mk |
---|
13,13 → 13,6 |
endif |
endif |
ifeq ($(findstring NEW,$(TRACER)) , NEW) |
CFG_OPT += -D__NEW_TRACER__ |
endif |
ifeq ($(findstring OLD,$(TRACER)) , OLD) |
CFG_OPT += -D__OLD_TRACER__ |
endif |
INCL = $(BASE)/include |
LIB_PATH = $(BASE)/lib |
OSLIB = $(BASE)/oslib |
34,6 → 27,15 |
#LIBRARYDIR= $(subst /,\,$(LIB_PATH)) |
#LIBRARYOBJS= $(subst /,\,$(LIB_OBJS)) |
ifeq ($(findstring NEW,$(TRACER)) , NEW) |
CFG_OPT += -D__NEW_TRACER__ |
INCL += -I$(BASE)/tracer/include |
endif |
ifeq ($(findstring OLD,$(TRACER)) , OLD) |
CFG_OPT += -D__OLD_TRACER__ |
INCL += -I$(BASE)/tracer/include |
endif |
C_WARN = -Wimplicit-function-declaration -Wall |
C_FLAGS = -O -fno-builtin -nostdinc |
C_INC = -I$(INCL) $(OTHERINCL) -I$(OSLIB) |
/shark/trunk/config/mk/linux.mk |
---|
25,9 → 25,11 |
ifeq ($(findstring NEW,$(TRACER)) , NEW) |
CFG_OPT += -D__NEW_TRACER__ |
INCL += -I$(BASE)/tracer/include |
endif |
ifeq ($(findstring OLD,$(TRACER)) , OLD) |
CFG_OPT += -D__OLD_TRACER__ |
INCL += -I$(BASE)/tracer/include |
endif |
C_WARN = -Wimplicit-function-declaration -Wall |