/shark/trunk/tracer/include/FTrace_OSD.h |
---|
5,12 → 5,8 |
#include <FTrace_types.h> |
#define FTRACE_OSD_CHUNK_HEAD 68 |
#define FTRACE_OSD_CHUNK_HEAD 24 |
#define FTRACE_OSD_NEXT1 1 |
#define FTRACE_OSD_NEXT2 2 |
#define FTRACE_OSD_NEXT3 3 |
#define FTrace_printf cprintf |
void FTrace_OSD_save_event(WORD type, WORD par1); |
24,14 → 20,8 |
int FTrace_OSD_update_chunk_flags(FTrace_Chunk_Ptr c); |
/* OSD Chunk Link */ |
int FTrace_OSD_chunk_link(FTrace_Chunk_Ptr a, FTrace_Chunk_Ptr b, int osd_flags); |
int FTrace_OSD_chunk_link(FTrace_Chunk_Ptr a, FTrace_Chunk_Ptr b); |
/* OSD Save Global Pointers */ |
int FTrace_OSD_save_pointers(); |
/* OSD Load Global Pointers */ |
int FTrace_OSD_load_pointers(); |
/* OSD Chunk compress function */ |
int FTrace_OSD_compress_chunk(int number, void *temp_data, int *data_size); |
/shark/trunk/tracer/include/FTrace_chunk.h |
---|
20,8 → 20,8 |
int FTrace_enable(); |
int FTrace_disable(); |
/* Create n chunks of specified size (normal/emergency) */ |
int FTrace_chunk_create(int n, int normal_size, int emergency_size, FTrace_flags flags); |
/* Create a chunk of specified size (normal/emergency) */ |
int FTrace_chunk_create(int normal_size, int emergency_size, FTrace_flags flags); |
/* Delete a Chunk */ |
int FTrace_chunk_delete(int number); |
36,7 → 36,7 |
int FTrace_actual_chunk_select(int number); |
/* Link two chunks */ |
int FTrace_chunk_link(int chunk_A, int chunk_B, int osd_flags); |
int FTrace_chunk_link(int chunk_A, int chunk_B); |
/* Find the first chunk with specific flags*/ |
int FTrace_get_first_chunk(FTrace_flags flags); |
/shark/trunk/tracer/newtrace/FTrace_OSD_ll.c |
---|
5,38 → 5,23 |
/* OSD_pointers |
00 - Next pointer |
00 - Actual Chunk Position |
04 - Actual Chunk Start |
08 - Actual Chunk Size |
12 - Actual Chunk Emergency Size |
16 - Actual Chunk Flags |
04 - Actual Chunk Position |
08 - Actual Chunk Start |
12 - Actual Chunk Size |
16 - Actual Chunk Emergency Size |
20 - Actual Chunk Flags |
20 - Next OSD pointer |
24 - Next1 Chunk Position |
28 - Next1 Chunk Start |
32 - Next1 Chunk Size |
36 - Next1 Chunk Emergency Size |
40 - Next1 Chunk Flags |
44 - Next1 Chunk Position |
48 - Next1 Chunk Start |
52 - Next1 Chunk Size |
56 - Next1 Chunk Emergency Size |
60 - Next1 Chunk Flags |
64 - Fast_Access |
*/ |
void FTrace_safe_ipoint(WORD type, WORD par1, DWORD par2) |
{ |
extern BYTE OSD_pointers[FTRACE_OSD_CHUNK_HEAD]; |
extern void *OSD_current_pointer; |
extern BYTE FTrace_enable; |
DWORD tsclow, tschigh; |
DWORD next; |
DWORD current; |
DWORD start; |
DWORD size; |
48,11 → 33,10 |
if (FTrace_enable) { |
next = *(DWORD *)(OSD_pointers); |
current = *(DWORD *)(OSD_pointers + next); |
start = *(DWORD *)(OSD_pointers + next + 4); |
size = *(DWORD *)(OSD_pointers + next + 8); |
flags = *(DWORD *)(OSD_pointers + next + 16); |
current = *(DWORD *)(OSD_current_pointer); |
start = *(DWORD *)(OSD_current_pointer + 4); |
size = *(DWORD *)(OSD_current_pointer + 8); |
flags = *(DWORD *)(OSD_current_pointer + 16); |
if (current == NULL) { |
ll_frestore(f); |
71,10 → 55,11 |
if ((flags & 0x0C) == FTRACE_CHUNK_FLAG_CYC) { |
current = start; |
} else { |
*(WORD *)(OSD_pointers + next + 16) |= FTRACE_CHUNK_FLAG_FULL; |
*(DWORD *)(OSD_current_pointer + 16) |= FTRACE_CHUNK_FLAG_FULL; |
if ((flags & 0x0C) == FTRACE_CHUNK_FLAG_JTN) { |
*(DWORD *)(OSD_pointers) += 20; |
next = *(DWORD *)(OSD_pointers); |
OSD_current_pointer = (void *)(*(DWORD *)(OSD_current_pointer + 20)); |
ll_frestore(f); |
return; |
} |
} |
} |
83,18 → 68,19 |
"rdtsc\n\t" |
: "=a" (tsclow), "=d" (tschigh) : : "ecx","ebx"); |
*(DWORD *)current = (DWORD)(type << 16 | par1); |
*(DWORD *)current = (DWORD)(par1 << 16 | type); |
*(DWORD *)(current + 4) = tschigh; |
*(DWORD *)(current + 8) = tsclow; |
*(DWORD *)(current + 16) = par2; |
*(DWORD *)(OSD_pointers + 64) = *(DWORD *)(OSD_pointers + next) = current + 16; |
*(DWORD *)(OSD_current_pointer) = current + 16; |
} else { |
*(WORD *)(OSD_pointers + next + 16) |= FTRACE_CHUNK_FLAG_FULL; |
*(DWORD *)(OSD_pointers) += 20; |
*(DWORD *)(OSD_pointers + 64) = *(DWORD *)(OSD_pointers + *(DWORD *)(OSD_pointers) + 4); //Fast Access |
*(WORD *)(OSD_current_pointer + 16) |= FTRACE_CHUNK_FLAG_FULL; |
OSD_current_pointer = (void *)(*(DWORD *)(OSD_current_pointer + 20)); |
ll_frestore(f); |
return; |
} |
120,7 → 106,7 |
"movl %%eax,12(%%ebx)\n\t" /* DWORD par2 */ |
"addl $16,(%%edi)\n\t" /* Inc Position */ |
"popfl\n\t" |
:: "D" ((DWORD *)(OSD_pointers+64)), "S" ((type | 0x8000) << 16 | par1)); |
:: "D" ((DWORD *)(OSD_pointers)), "S" (par1 << 16 | (type | 0x8000))); |
} |
/shark/trunk/tracer/newtrace/FTrace.c |
---|
9,8 → 9,8 |
FTrace_Chunk_Ptr ChunkTable[MAX_CHUNK]; /* Chunk array */ |
FTrace_Chunk_Ptr ActualChunk = NULL; /* Actual Chunk */ |
/* Global Pointers */ |
BYTE OSD_pointers[FTRACE_OSD_CHUNK_HEAD]; |
/* OSD Pointer */ |
void *OSD_current_pointer; |
int FTraceInit = 0; |
int FTraceEnable = 0; |
63,7 → 63,7 |
FTrace_lock(); |
memset(OSD_pointers,0,sizeof(OSD_pointers)); |
OSD_current_pointer = NULL; |
for (i = 0;i < MAX_CHUNK;i++) |
ChunkTable[i] = NULL; |
114,11 → 114,11 |
} |
int FTrace_chunk_create(int n, int size, int emergency_size, FTrace_flags flags) |
int FTrace_chunk_create(int size, int emergency_size, FTrace_flags flags) |
{ |
FTrace_Chunk_Ptr FT_temp; |
int i, number, err; |
int number, err; |
FTrace_lock(); |
133,48 → 133,44 |
} |
} |
for (i = 0;i < n;i++) { |
number = FTrace_find_free_slot(); |
if (number == -1) { |
#ifdef FTRACE_DEBUG |
FTrace_printf("FTrace Error: cannot find free slot for chunk\n"); |
#endif |
FTrace_unlock(); |
return -1; |
} |
number = FTrace_find_free_slot(); |
if (number == -1) { |
#ifdef FTRACE_DEBUG |
FTrace_printf("FTrace Error: cannot find free slot for chunk\n"); |
#endif |
FTrace_unlock(); |
return -1; |
} |
FT_temp = (FTrace_Chunk_Ptr)FTrace_malloc(sizeof(struct FTrace_Chunk) + FTRACE_OSD_CHUNK_HEAD + size + emergency_size); |
if (FT_temp == NULL) { |
#ifdef FTRACE_DEBUG |
FTrace_printf("FTrace Error: cannot allocate memory for chunk\n"); |
#endif |
FTrace_unlock(); |
return -1; |
} |
FT_temp = (FTrace_Chunk_Ptr)FTrace_malloc(sizeof(struct FTrace_Chunk) + FTRACE_OSD_CHUNK_HEAD + size + emergency_size); |
if (FT_temp == NULL) { |
#ifdef FTRACE_DEBUG |
FTrace_printf("FTrace Error: cannot allocate memory for chunk\n"); |
#endif |
FTrace_unlock(); |
return -1; |
} |
memset(FT_temp,0,sizeof(struct FTrace_Chunk) + FTRACE_OSD_CHUNK_HEAD + size + emergency_size); |
memset(FT_temp,0,sizeof(struct FTrace_Chunk) + FTRACE_OSD_CHUNK_HEAD + size + emergency_size); |
err = FTrace_chunk_init(FT_temp, number, size, emergency_size, flags); |
if (err != 0) { |
#ifdef FTRACE_DEBUG |
FTrace_printf("FTrace Error: cannot initialized the new chunk\n"); |
#endif |
FTrace_unlock(); |
return -1; |
} |
err = FTrace_chunk_init(FT_temp, number, size, emergency_size, flags); |
if (err != 0) { |
#ifdef FTRACE_DEBUG |
FTrace_printf("FTrace Error: cannot initialized the new chunk\n"); |
#endif |
FTrace_unlock(); |
return -1; |
} |
/* Set the ChunkTable */ |
ChunkTable[number] = FT_temp; |
/* Set the ChunkTable */ |
ChunkTable[number] = FT_temp; |
#ifdef FTRACE_DEBUG |
FTrace_printf("FTrace Debug: Chunk %d created at addr %x\n",number,(int)FT_temp); |
#endif |
#ifdef FTRACE_DEBUG |
FTrace_printf("FTrace Debug: Chunk %d created at addr %x\n",number,(int)FT_temp); |
#endif |
} |
FTrace_unlock(); |
return 0; |
return number; |
} |
269,9 → 265,11 |
FTrace_unlock(); |
return -1; |
} |
*flags = FT_temp->flags; |
FTrace_OSD_update_chunk_flags(FT_temp); *flags = FT_temp->flags; |
FTrace_unlock(); |
return 0; |
} |
308,9 → 306,8 |
/* Update the actual_chunk and OSD_pointers */ |
FTrace_fsave(); |
FTrace_OSD_save_pointers(); |
ActualChunk = FT_temp; |
FTrace_OSD_load_pointers(); |
OSD_current_pointer = (void *)FT_temp->osd; |
FTrace_frestore(); |
} else { |
369,7 → 366,7 |
} |
/* Link two chunks */ |
int FTrace_chunk_link(int chunk_A, int chunk_B, int osd_flags) |
int FTrace_chunk_link(int chunk_A, int chunk_B) |
{ |
FTrace_Chunk_Ptr ckA = ChunkTable[chunk_A]; |
415,9 → 412,7 |
/* FTrace Low Level Blocking Part */ |
FTrace_fsave(); |
FTrace_OSD_save_pointers(); |
err = FTrace_OSD_chunk_link(ckA,ckB,osd_flags); |
err = FTrace_OSD_chunk_link(ckA,ckB); |
if (err != 0) { |
#ifdef FTRACE_DEBUG |
FTrace_printf("FTrace Error: Cannot link the chunks\n"); |
424,8 → 419,6 |
#endif |
return -1; |
} |
FTrace_OSD_load_pointers(); |
FTrace_frestore(); |
FTrace_unlock(); |
434,25 → 427,6 |
} |
/* Update the OSD of actual chunk */ |
int FTrace_update_actual_chunk() |
{ |
FTrace_lock(); |
if (ActualChunk == NULL) return 0; |
FTrace_fsave(); |
FTrace_OSD_save_pointers(); |
FTrace_frestore(); |
FTrace_unlock(); |
return 0; |
} |
/* Create a new memory region where the compressed data are stored */ |
int FTrace_compress_chunk(int number, FTrace_flags new_flags) |
{ |
581,11 → 555,7 |
void FTrace_chunk_dump(int number) { |
FTrace_Chunk_Ptr FT_temp = ChunkTable[number]; |
int i,t; |
DWORD p; |
FTrace_update_actual_chunk(); |
cprintf("ID = %x\n",FT_temp->id); |
cprintf("NUM = %d\n",FT_temp->number); |
cprintf("FLAGS = %d\n",FT_temp->flags); |
592,25 → 562,5 |
cprintf("SIZE = %d\n",FT_temp->size); |
cprintf("EMERG = %d\n",FT_temp->emergency_size); |
for (i=0; i<0xFF; i++) { |
p = *(DWORD *)(FT_temp->osd + 8); |
t = 0; |
while((p + 16) < *(DWORD *)(FT_temp->osd + 8) + *(DWORD *)(FT_temp->osd + 12)) { |
if (*(WORD *)(p+2) == i) t++; |
p += 16; |
} |
if (t != 0) |
cprintf("Event type %02x => %d\n",i,t); |
} |
} |
void FTrace_OSD_dump() { |
void *p = OSD_pointers; |
int i; |
for (i=0;i<FTRACE_OSD_CHUNK_HEAD;i+=4) |
cprintf("DATA %d = %x\n",i,*(unsigned int *)(p+i)); |
} |
/shark/trunk/tracer/newtrace/FTrace_OSD.c |
---|
8,7 → 8,7 |
SYS_FLAGS FTracef; |
extern FTrace_Chunk_Ptr ActualChunk; |
extern BYTE OSD_pointers[FTRACE_OSD_CHUNK_HEAD]; |
extern void *OSD_current_pointer; |
void FTrace_fsave() |
{ |
56,7 → 56,9 |
} |
/* OSD_pointers |
00 - Fast Access |
04 - Actual Chunk Position |
08 - Actual Chunk Start |
12 - Actual Chunk Size |
63,11 → 65,7 |
16 - Actual Chunk Emergency Size |
20 - Actual Chunk Flags |
24 - Next1 Chunk Position |
28 - Next1 Chunk Start |
32 - Next1 Chunk Size |
36 - Next1 Chunk Emergency Size |
40 - Next1 Chunk Flags |
24 - Next Chunk OSD Pointer |
*/ |
74,7 → 72,7 |
int FTrace_OSD_chunk_init(FTrace_Chunk_Ptr c, int size, int emergency_size, FTrace_flags flags) |
{ |
*(DWORD *)(c->osd) = 4; |
*(DWORD *)(c->osd) = (DWORD)(c->osd + FTRACE_OSD_CHUNK_HEAD); |
*(DWORD *)(c->osd + 4) = (DWORD)(c->osd + FTRACE_OSD_CHUNK_HEAD); |
*(DWORD *)(c->osd + 8) = (DWORD)(c->osd + FTRACE_OSD_CHUNK_HEAD); |
83,36 → 81,17 |
*(DWORD *)(c->osd + 20) = (DWORD)(c->flags); |
*(DWORD *)(c->osd + 24) = 0; |
*(DWORD *)(c->osd + 28) = 0; |
*(DWORD *)(c->osd + 32) = 0; |
*(DWORD *)(c->osd + 36) = 0; |
*(DWORD *)(c->osd + 40) = 0; |
*(DWORD *)(c->osd + 44) = 0; |
*(DWORD *)(c->osd + 48) = 0; |
*(DWORD *)(c->osd + 52) = 0; |
*(DWORD *)(c->osd + 56) = 0; |
*(DWORD *)(c->osd + 60) = 0; |
return 0; |
} |
/* OSD Chunk Link */ |
int FTrace_OSD_chunk_link(FTrace_Chunk_Ptr a, FTrace_Chunk_Ptr b, int osd_flags) |
int FTrace_OSD_chunk_link(FTrace_Chunk_Ptr a, FTrace_Chunk_Ptr b) |
{ |
int delta = 0; |
*(DWORD *)(a->osd + 24) = (DWORD)(b->osd); |
if (osd_flags == FTRACE_OSD_NEXT1) |
delta = 24; |
if (osd_flags == FTRACE_OSD_NEXT2) |
delta = 44; |
if (delta == 0) return -1; |
memcpy((void *)(a->osd+delta),(void *)(b->osd+4),20); |
return 0; |
} |
126,28 → 105,6 |
} |
int FTrace_OSD_load_pointers() |
{ |
if (ActualChunk == NULL) return -1; |
memcpy((void *)OSD_pointers,(void *)ActualChunk->osd,FTRACE_OSD_CHUNK_HEAD); |
return 0; |
} |
int FTrace_OSD_save_pointers() |
{ |
if (ActualChunk == NULL) return -1; |
memcpy((void *)ActualChunk->osd,(void *)OSD_pointers,FTRACE_OSD_CHUNK_HEAD); |
return 0; |
} |
int FTrace_OSD_compress_chunk(int number, void *temp_data, int *data_size) |
{ |