Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 531 → Rev 532

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