Rev 498 | Rev 503 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
498 | giacomo | 1 | #include <FTrace_types.h> |
2 | #include <FTrace_OSD.h> |
||
3 | |||
501 | giacomo | 4 | #include <ll/i386/hw-instr.h> |
5 | |||
498 | giacomo | 6 | /* OSD_pointers |
7 | |||
501 | giacomo | 8 | 00 - Next pointer |
9 | |||
10 | 04 - Actual Chunk Position |
||
498 | giacomo | 11 | 08 - Actual Chunk Start |
501 | giacomo | 12 | 12 - Actual Chunk Size |
13 | 16 - Actual Chunk Emergency Size |
||
14 | 20 - Actual Chunk Flags |
||
498 | giacomo | 15 | |
501 | giacomo | 16 | 24 - Next1 Chunk Position |
17 | 28 - Next1 Chunk Start |
||
18 | 32 - Next1 Chunk Size |
||
19 | 36 - Next1 Chunk Emergency Size |
||
20 | 60 - Next1 Chunk Flags |
||
498 | giacomo | 21 | |
22 | */ |
||
23 | |||
501 | giacomo | 24 | void FTrace_safe_ipoint(WORD type, WORD par1, DWORD par2) |
498 | giacomo | 25 | { |
26 | |||
27 | extern BYTE OSD_pointers[FTRACE_OSD_CHUNK_HEAD]; |
||
28 | extern BYTE FTrace_enable; |
||
29 | |||
501 | giacomo | 30 | DWORD tsclow, tschigh; |
31 | DWORD next = *(DWORD *)(OSD_pointers); |
||
32 | DWORD current = *(DWORD *)(OSD_pointers + next); |
||
33 | DWORD start = *(DWORD *)(OSD_pointers + next + 4); |
||
34 | DWORD size = *(DWORD *)(OSD_pointers + next + 8); |
||
35 | DWORD flags = *(DWORD *)(OSD_pointers + next + 16); |
||
36 | |||
37 | SYS_FLAGS f; |
||
498 | giacomo | 38 | |
501 | giacomo | 39 | if (FTrace_enable) { |
40 | |||
41 | f = ll_fsave(); |
||
42 | |||
43 | if (type != FTrace_EVT_next_chunk) { |
||
44 | |||
45 | if ((flags & FTRACE_CHUNK_FLAG_FULL) == FTRACE_CHUNK_FLAG_FULL) { |
||
46 | ll_frestore(f); |
||
47 | return; |
||
48 | } |
||
49 | |||
50 | /* Cyclical Buffer */ |
||
51 | if (current + 16 >= (start + size)) { |
||
52 | if ((flags & 0x0C) == FTRACE_CHUNK_FLAG_CYC) { |
||
53 | current = start; |
||
54 | } else { |
||
55 | *(WORD *)(OSD_pointers + next + 16) &= FTRACE_CHUNK_FLAG_FULL; |
||
56 | if ((flags & 0x0C) == FTRACE_CHUNK_FLAG_JTN) { |
||
57 | *(DWORD *)(OSD_pointers) += 20; |
||
58 | next = *(DWORD *)(OSD_pointers); |
||
59 | } |
||
60 | } |
||
61 | } |
||
62 | |||
63 | __asm__("cpuid\n\t" |
||
64 | "rdtsc\n\t" |
||
65 | : "=a" (tsclow), "=b" (tschigh) : : "ecx","edx"); |
||
66 | |||
67 | *(DWORD *)current = (DWORD)(type << 16 | par1); |
||
68 | *(DWORD *)(current + 4) = tschigh; |
||
69 | *(DWORD *)(current + 8) = tsclow; |
||
70 | *(DWORD *)(current + 16) = par2; |
||
71 | |||
72 | *(DWORD *)(OSD_pointers + next) = current + 16; |
||
73 | |||
74 | } else { |
||
75 | |||
76 | *(WORD *)(OSD_pointers + next + 16) &= FTRACE_CHUNK_FLAG_FULL; |
||
77 | if ((flags & 0x0C) == FTRACE_CHUNK_FLAG_JTN) |
||
78 | *(DWORD *)(OSD_pointers) += 20; |
||
79 | |||
80 | } |
||
81 | |||
82 | ll_frestore(f); |
||
83 | |||
84 | } |
||
85 | |||
498 | giacomo | 86 | } |
87 | |||
501 | giacomo | 88 | void FTrace_unsafe_ipoint(WORD type, WORD par1) |
498 | giacomo | 89 | { |
90 | |||
91 | extern BYTE OSD_pointers[FTRACE_OSD_CHUNK_HEAD]; |
||
92 | |||
93 | __asm__("pushfl\n\t" /* Critical Section */ |
||
94 | "cli\n\t" |
||
95 | "cpuid\n\t" |
||
96 | "rdtsc\n\t" |
||
501 | giacomo | 97 | "movl (%%edi),%%ebx\n\t" |
98 | "movl %%esi,(%%ebx)\n\t" /* Save TYPE + WORD par1 */ |
||
99 | "movl %%edx,4(%%ebx)\n\t" /* Save TSC HIGH */ |
||
100 | "movl %%eax,8(%%ebx)\n\t" /* Save TSC LOW */ |
||
101 | "addl $12,(%%edi)\n\t" /* Inc Position */ |
||
498 | giacomo | 102 | "popfl\n\t" |
501 | giacomo | 103 | :: "D" ((DWORD *)(OSD_pointers)), "S" ((type | 0x8000) << 16 | par1)); |
498 | giacomo | 104 | |
105 | } |
||
106 |