reactos/hal/halx86/apic/tsccal.S
2021-04-28 13:10:23 +02:00

106 lines
1.8 KiB
ArmAsm

#include <asm.inc>
#include "tsc.h"
.code
#ifdef _M_IX86
EXTERN _TscCalibrationPhase:BYTE
EXTERN _TscCalibrationArray:QWORD
EXTERN _HalpSendEOI@0:PROC
PUBLIC _TscCalibrationISR
_TscCalibrationISR:
push eax
push ecx
push edx
/* The first thing we do is read the current TSC value */
rdtsc
/* Read the current phase */
movzx ecx, byte ptr ds:[_TscCalibrationPhase]
/* Check if we're already done */
cmp cl, NUM_SAMPLES
jnb _CalibrationISR_Exit
/* Store the current value */
shl ecx, 3
mov dword ptr _TscCalibrationArray[ecx], eax
mov dword ptr _TscCalibrationArray[ecx + 4], edx
/* Advance phase */
inc byte ptr ds:[_TscCalibrationPhase]
_CalibrationISR_Exit:
/* Read CMOS register C */
mov al, HEX(0C)
out HEX(70), al
jmp $+2
in al, HEX(71)
jmp $+2
/* Send EOI */
call _HalpSendEOI@0
pop edx
pop ecx
pop eax
iretd
#else
EXTERN TscCalibrationPhase:BYTE
EXTERN TscCalibrationArray:DWORD
EXTERN HalpSendEOI:PROC
PUBLIC TscCalibrationISR
FUNC TscCalibrationISR
push rax
push rbx
push rcx
push rdx
.ENDPROLOG
/* The first thing we do is read the current TSC value */
rdtsc
/* Read the current phase */
movzx rcx, byte ptr [rip+TscCalibrationPhase]
/* Check if we're already done */
cmp cl, NUM_SAMPLES
jnb CalibrationISR_Exit
/* Store the current value */
shl rcx, 3
lea rbx, [rip+TscCalibrationArray]
mov dword ptr [rbx + rcx], eax
mov dword ptr [rbx + rcx + 4], edx
/* Advance phase */
inc byte ptr [rip+TscCalibrationPhase]
CalibrationISR_Exit:
/* Read CMOS register C */
mov al, HEX(0C)
out HEX(70), al
jmp $+2
in al, HEX(71)
jmp $+2
/* Send EOI */
call HalpSendEOI
pop rdx
pop rcx
pop rbx
pop rax
iretq
ENDFUNC
#endif
END