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