1,35 → 1,91 |
#include <FTrace_types.h> |
#include <FTrace_OSD.h> |
|
#include <ll/i386/hw-instr.h> |
|
/* OSD_pointers |
|
00 - Actual Chunk Event Pointer Delta |
04 - Actual Chunk Mask |
00 - Next pointer |
|
04 - Actual Chunk Position |
08 - Actual Chunk Start |
12 - Actual Chunk Flags |
16 - Actual Chunk Fast-Access-Pointer |
12 - Actual Chunk Size |
16 - Actual Chunk Emergency Size |
20 - Actual Chunk Flags |
|
20 - Delta (0 Actual, 24 Next) |
24 - Next1 Chunk Event Pointer Delta |
28 - Next1 Chunk Mask |
32 - Next1 Chunk Start |
36 - Next1 Chunk Flags |
40 - Next1 Chunk Fast-Access-Pointer |
|
44 - Delta |
24 - Next1 Chunk Position |
28 - Next1 Chunk Start |
32 - Next1 Chunk Size |
36 - Next1 Chunk Emergency Size |
60 - Next1 Chunk Flags |
|
*/ |
|
void FTrace_safe_ipoint(DWORD type, DWORD par1, DOWRD par2) |
void FTrace_safe_ipoint(WORD type, WORD par1, DWORD par2) |
{ |
|
extern BYTE OSD_pointers[FTRACE_OSD_CHUNK_HEAD]; |
extern BYTE FTrace_enable; |
|
DWORD tsclow, tschigh; |
DWORD next = *(DWORD *)(OSD_pointers); |
DWORD current = *(DWORD *)(OSD_pointers + next); |
DWORD start = *(DWORD *)(OSD_pointers + next + 4); |
DWORD size = *(DWORD *)(OSD_pointers + next + 8); |
DWORD flags = *(DWORD *)(OSD_pointers + next + 16); |
|
SYS_FLAGS f; |
|
if (FTrace_enable) { |
|
f = ll_fsave(); |
|
if (type != FTrace_EVT_next_chunk) { |
|
if ((flags & FTRACE_CHUNK_FLAG_FULL) == FTRACE_CHUNK_FLAG_FULL) { |
ll_frestore(f); |
return; |
} |
|
/* Cyclical Buffer */ |
if (current + 16 >= (start + size)) { |
if ((flags & 0x0C) == FTRACE_CHUNK_FLAG_CYC) { |
current = start; |
} else { |
*(WORD *)(OSD_pointers + next + 16) &= FTRACE_CHUNK_FLAG_FULL; |
if ((flags & 0x0C) == FTRACE_CHUNK_FLAG_JTN) { |
*(DWORD *)(OSD_pointers) += 20; |
next = *(DWORD *)(OSD_pointers); |
} |
} |
} |
|
__asm__("cpuid\n\t" |
"rdtsc\n\t" |
: "=a" (tsclow), "=b" (tschigh) : : "ecx","edx"); |
|
*(DWORD *)current = (DWORD)(type << 16 | par1); |
*(DWORD *)(current + 4) = tschigh; |
*(DWORD *)(current + 8) = tsclow; |
*(DWORD *)(current + 16) = par2; |
|
*(DWORD *)(OSD_pointers + next) = current + 16; |
|
} else { |
|
*(WORD *)(OSD_pointers + next + 16) &= FTRACE_CHUNK_FLAG_FULL; |
if ((flags & 0x0C) == FTRACE_CHUNK_FLAG_JTN) |
*(DWORD *)(OSD_pointers) += 20; |
|
} |
|
ll_frestore(f); |
|
} |
|
} |
|
void FTrace_unsafe_ipoint(DWORD type, DWORD par1, DWORD par2) |
void FTrace_unsafe_ipoint(WORD type, WORD par1) |
{ |
|
extern BYTE OSD_pointers[FTRACE_OSD_CHUNK_HEAD]; |
38,12 → 94,13 |
"cli\n\t" |
"cpuid\n\t" |
"rdtsc\n\t" |
"movl %%esi,(%%edi)\n\t" /* Save TYPE + WORD par2 */ |
"movl %%edx,4(%%edi)\n\t" /* Save TSC HIGH */ |
"movl %%eax,8(%%edi)\n\t" /* Save TSC LOW */ |
"addl $12,(%%edi)\n\t" /* Inc Fast-Access-Pointer */ |
"movl (%%edi),%%ebx\n\t" |
"movl %%esi,(%%ebx)\n\t" /* Save TYPE + WORD par1 */ |
"movl %%edx,4(%%ebx)\n\t" /* Save TSC HIGH */ |
"movl %%eax,8(%%ebx)\n\t" /* Save TSC LOW */ |
"addl $12,(%%edi)\n\t" /* Inc Position */ |
"popfl\n\t" |
:: "D" (*(DWORD * )(OSD_pointers+16)), "S" (type)); |
:: "D" ((DWORD *)(OSD_pointers)), "S" ((type | 0x8000) << 16 | par1)); |
|
} |
|