[HAL]
[reactos.git] / reactos / hal / halx86 / apic / tsccal.S
1
2 #include <asm.inc>
3 #include "tsc.h"
4
5 .code
6
7 #ifdef _M_IX86
8
9 EXTERN _TscCalibrationPhase:BYTE
10 EXTERN _TscCalibrationArray:QWORD
11
12 PUBLIC _TscCalibrationISR
13 _TscCalibrationISR:
14 push eax
15 push ecx
16 push edx
17
18 /* The first thing we do is read the current TSC value */
19 rdtsc
20
21 /* Read the current phase */
22 movzx ecx, byte ptr ds:[_TscCalibrationPhase]
23
24 /* Check if we're already done */
25 cmp cl, NUM_SAMPLES
26 jnb _CalibrationISR_Exit
27
28 /* Store the current value */
29 mov dword ptr _TscCalibrationArray[ecx * 2], eax
30 mov dword ptr _TscCalibrationArray[ecx * 2 + 4], edx
31
32 /* Advance phase */
33 inc byte ptr ds:[_TscCalibrationPhase]
34
35 _CalibrationISR_Exit:
36 pop edx
37 pop ecx
38 pop eax
39 iretd
40
41 #else
42
43 EXTERN TscCalibrationPhase:BYTE
44 EXTERN TscCalibrationArray:DWORD
45
46 PUBLIC TscCalibrationISR
47 FUNC TscCalibrationISR
48 push rax
49 push rcx
50 push rdx
51 .ENDPROLOG
52
53 /* The first thing we do is read the current TSC value */
54 rdtsc
55
56 /* Read the current phase */
57 movzx rcx, byte ptr [TscCalibrationPhase]
58
59 /* Check if we're already done */
60 cmp cl, NUM_SAMPLES
61 jnb CalibrationISR_Exit
62
63 /* Store the current value */
64 shl rcx, 1
65 lea rax, [TscCalibrationArray]
66 mov dword ptr [rax + rcx], eax
67 mov dword ptr [rax + rcx + 4], edx
68
69 /* Advance phase */
70 inc byte ptr [TscCalibrationPhase]
71
72 CalibrationISR_Exit:
73 pop rdx
74 pop rcx
75 pop rax
76 iretq
77 ENDFUNC TscCalibrationISR
78 #endif
79
80 END