Author: tkreuzer
Date: Mon Nov 1 16:42:53 2010
New Revision: 49408
URL:
http://svn.reactos.org/svn/reactos?rev=49408&view=rev
Log:
[HAL]
Make systimer.S ML compatible. Replace most hardcoded numerical values with proper
symbolic constants.
Modified:
branches/cmake-bringup/hal/halx86/generic/i386/systimer.S
Modified: branches/cmake-bringup/hal/halx86/generic/i386/systimer.S
URL:
http://svn.reactos.org/svn/reactos/branches/cmake-bringup/hal/halx86/generi…
==============================================================================
--- branches/cmake-bringup/hal/halx86/generic/i386/systimer.S [iso-8859-1] (original)
+++ branches/cmake-bringup/hal/halx86/generic/i386/systimer.S [iso-8859-1] Mon Nov 1
16:42:53 2010
@@ -7,12 +7,41 @@
/* INCLUDES ******************************************************************/
-#include <asm.h>
-.intel_syntax noprefix
+#include <reactos/asm.h>
+#include <ndk/asm.h>
+
+EXTERN _HalpAcquireSystemHardwareSpinLock@0:PROC
+EXTERN _HalpReleaseCmosSpinLock@0:PROC
+EXTERN _DbgBreakPoint@0:PROC
+EXTERN _HalpCurrentRollOver:DWORD
+EXTERN _HalpPerfCounterCutoff:DWORD
+
+#define PIC1_BASE HEX(20) /* IO base address for master PIC */
+#define PIC2_BASE HEX(A0) /* IO base address for slave PIC */
+#define PIC1_COMMAND PIC1_BASE
+#define PIC1_DATA (PIC1_BASE+1)
+#define PIC2_COMMAND PIC2_BASE
+#define PIC2_DATA (PIC2_BASE+1)
+#define PIC_EOI HEX(20)
+#define PIC_SPECIFIC_EOI2 HEX(62)
+
+#define CMOS_ADDR HEX(70)
+#define CMOS_DATA HEX(71)
+#define CMOS_REGISTER_A HEX(0A)
+#define CMOS_REGISTER_B HEX(0B)
+#define CMOS_REGISTER_C HEX(0C)
+#define CMOS_REGISTER_D HEX(0D)
+
+#define PIT_CH0 HEX(40)
+#define PIT_MODE HEX(43)
+#define SYSTEM_CTRL_PORT_A HEX(92)
/* GLOBALS *******************************************************************/
-.globl _HalpPerfCounter
+.data
+ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING
+
+PUBLIC _HalpPerfCounter
_HalpLastPerfCounterLow: .long 0
_HalpLastPerfCounterHigh: .long 0
_HalpPerfCounter:
@@ -22,8 +51,8 @@
/* FUNCTIONS *****************************************************************/
-.global _HalpCalibrateStallExecution@0
-.func HalpCalibrateStallExecution@0
+.code
+PUBLIC _HalpCalibrateStallExecution@0
_HalpCalibrateStallExecution@0:
/* Setup the stack frame */
@@ -37,27 +66,27 @@
/* Get the current interrupt mask on the PICs */
xor eax, eax
- in al, 0xA1
+ in al, PIC2_DATA
shl eax, 8
- in al, 0x21
+ in al, PIC1_DATA
/* Save it */
push eax
/* Now mask everything except the RTC and PIC 2 chain-interrupt */
- mov eax, ~((1 << 2) | (1 << 8))
+ mov eax, NOT (HEX(04) OR HEX(100))
/* Program the PICs */
- out 0x21, al
+ out PIC1_DATA, al
shr eax, 8
- out 0xA1, al
+ out PIC2_DATA, al
/* Now get the IDT */
sidt [ebp-8]
mov ecx, [ebp-6]
/* Get the IDT entry for the RTC */
- mov eax, 0x38
+ mov eax, HEX(38)
shl eax, 3
add ecx, eax
@@ -70,7 +99,7 @@
mov eax, offset OnlyOnePersonCanWriteHalCode
mov [ecx], ax
mov word ptr [ecx+2], KGDT_R0_CODE
- mov word ptr [ecx+4], 0x8E00
+ mov word ptr [ecx+4], HEX(08E00)
shr eax, 16
mov [ecx+6], ax
@@ -81,18 +110,18 @@
call _HalpAcquireSystemHardwareSpinLock@0
/* Now initialize register A on the CMOS */
- mov ax, (0x2D << 8) | 0xA
- out 0x70, al
+ mov ax, HEX(2D00) OR CMOS_REGISTER_A
+ out CMOS_ADDR, al
jmp $+2
mov al, ah
- out 0x71, al
+ out CMOS_DATA, al
jmp $+2
/* Read register B */
- mov ax, 0xB
- out 0x70, al
- jmp $+2
- in al, 0x71
+ mov ax, CMOS_REGISTER_B
+ out CMOS_ADDR, al
+ jmp $+2
+ in al, CMOS_DATA
jmp $+2
/* Don't touch the LastKnownGoodConfig hack */
@@ -100,28 +129,28 @@
mov ah, al
/* Enable the interrupt */
- or ah, 0x42
+ or ah, HEX(42)
/* Now write the register B */
- mov al, 0xB
- out 0x70, al
+ mov al, CMOS_REGISTER_B
+ out CMOS_ADDR, al
jmp $+2
mov al, ah
- out 0x71, al
+ out CMOS_DATA, al
jmp $+2
/* Read register C */
- mov al, 0xC
- out 0x70, al
- jmp $+2
- in al, 0x71
+ mov al, CMOS_REGISTER_C
+ out CMOS_ADDR, al
+ jmp $+2
+ in al, CMOS_DATA
jmp $+2
/* Read register D */
- mov al, 0xD
- out 0x70, al
- jmp $+2
- in al, 0x71
+ mov al, CMOS_REGISTER_D
+ out CMOS_ADDR, al
+ jmp $+2
+ in al, CMOS_DATA
jmp $+2
/* Release CMOS lock */
@@ -169,18 +198,18 @@
call _HalpAcquireSystemHardwareSpinLock@0
/* Now initialize register A on the CMOS */
- mov ax, (0x2D << 8) | 0xA
- out 0x70, al
+ mov ax, HEX(2D00) OR CMOS_REGISTER_A
+ out CMOS_ADDR, al
jmp $+2
mov al, ah
- out 0x71, al
+ out CMOS_DATA, al
jmp $+2
/* Read register B */
- mov ax, 0xB
- out 0x70, al
- jmp $+2
- in al, 0x71
+ mov ax, CMOS_REGISTER_B
+ out CMOS_ADDR, al
+ jmp $+2
+ in al, CMOS_DATA
jmp $+2
/* Don't touch the LastKnownGoodConfig hack */
@@ -188,38 +217,38 @@
mov ah, al
/* Enable the interrupt */
- or ah, 0x42
+ or ah, HEX(42)
/* Now write the register B */
- mov al, 0xB
- out 0x70, al
+ mov al, CMOS_REGISTER_B
+ out CMOS_ADDR, al
jmp $+2
mov al, ah
- out 0x71, al
+ out CMOS_DATA, al
jmp $+2
/* Read register C */
- mov al, 0xC
- out 0x70, al
- jmp $+2
- in al, 0x71
+ mov al, CMOS_REGISTER_C
+ out CMOS_ADDR, al
+ jmp $+2
+ in al, CMOS_DATA
jmp $+2
/* Read register D */
- mov al, 0xD
- out 0x70, al
- jmp $+2
- in al, 0x71
+ mov al, CMOS_REGISTER_D
+ out CMOS_ADDR, al
+ jmp $+2
+ in al, CMOS_DATA
jmp $+2
/* Release CMOS lock */
call _HalpReleaseCmosSpinLock@0
/* Dismiss the interrupt */
- mov al, 0x20
- out 0xA0, al
- mov al, 0x62
- out 0x20, al
+ mov al, PIC_EOI
+ out PIC2_COMMAND, al
+ mov al, PIC_SPECIFIC_EOI2
+ out PIC1_COMMAND, al
/* Reset the counter and return back to the looper */
xor eax, eax
@@ -248,24 +277,24 @@
/* Prepare for interrupt return */
pop eax
push offset AndItsNotYou
- mov eax, 0x13
+ mov eax, HEX(13)
/* Acquire CMOS lock */
call _HalpAcquireSystemHardwareSpinLock@0
/* Now initialize register A on the CMOS */
- mov ax, (0x2D << 8) | 0xA
- out 0x70, al
+ mov ax, HEX(2D00) OR CMOS_REGISTER_A
+ out CMOS_ADDR, al
jmp $+2
mov al, ah
- out 0x71, al
+ out CMOS_DATA, al
jmp $+2
/* Read register B */
- mov ax, 0xB
- out 0x70, al
- jmp $+2
- in al, 0x71
+ mov ax, CMOS_REGISTER_B
+ out CMOS_ADDR, al
+ jmp $+2
+ in al, CMOS_DATA
jmp $+2
/* Don't touch the LastKnownGoodConfig hack */
@@ -273,34 +302,34 @@
mov ah, al
/* Disable the interrupt */
- or ah, 0x2
+ or ah, 2
/* Now write the register B */
- mov al, 0xB
- out 0x70, al
+ mov al, CMOS_REGISTER_B
+ out CMOS_ADDR, al
jmp $+2
mov al, ah
- out 0x71, al
+ out CMOS_DATA, al
jmp $+2
/* Read register C */
- mov al, 0xC
- out 0x70, al
- jmp $+2
- in al, 0x71
+ mov al, CMOS_REGISTER_C
+ out CMOS_ADDR, al
+ jmp $+2
+ in al, CMOS_DATA
jmp $+2
/* Release CMOS lock */
call _HalpReleaseCmosSpinLock@0
/* Dismiss the interrupt */
- mov al, 0x20
- out 0xA0, al
- mov al, 0x62
- out 0x20, al
+ mov al, PIC_EOI
+ out PIC2_COMMAND, al
+ mov al, PIC_SPECIFIC_EOI2
+ out PIC1_COMMAND, al
/* Disable interrupts on return */
- and word ptr [esp+8], ~EFLAGS_INTERRUPT_MASK
+ and word ptr [esp+8], NOT EFLAGS_INTERRUPT_MASK
iretd
/************************* WE ARE BACK FROM RTC ***************************/
@@ -313,9 +342,9 @@
/* Restore the mask */
pop eax
- out 0x21, al
+ out PIC1_DATA, al
shr eax, 8
- out 0xA1, al
+ out PIC2_DATA, al
/* Restore EFLAGS */
popf
@@ -324,11 +353,10 @@
mov esp, ebp
pop ebp
ret
-.endfunc
+
#ifndef _MINIHAL_
-.globl _KeStallExecutionProcessor@4
-.func KeStallExecutionProcessor@4
+PUBLIC _KeStallExecutionProcessor@4
_KeStallExecutionProcessor@4:
/* Get the number of microseconds required */
@@ -356,11 +384,9 @@
Done:
/* Return */
ret 4
-.endfunc
#endif
-.global _KeQueryPerformanceCounter@4
-.func KeQueryPerformanceCounter@4
+PUBLIC _KeQueryPerformanceCounter@4
_KeQueryPerformanceCounter@4:
/* Check if we were called too early */
@@ -380,20 +406,20 @@
LoopPostInt:
/* Get the current value */
- mov ebx, _HalpPerfCounterLow
- mov esi, _HalpPerfCounterHigh
+ mov ebx, dword ptr _HalpPerfCounterLow
+ mov esi, dword ptr _HalpPerfCounterHigh
/* Read 8254 timer */
- mov al, 0
- out 0x43, al
- in al, 0x92
- or al, _HalpPerfCounterCutoff
- out 0x92, al
- jmp $+2
- in al, 0x40
+ mov al, 0 /* Interrupt on terminal count */
+ out PIT_MODE, al
+ in al, SYSTEM_CTRL_PORT_A
+ or al, byte ptr _HalpPerfCounterCutoff
+ out SYSTEM_CTRL_PORT_A, al
+ jmp $+2
+ in al, PIT_CH0
jmp $+2
movzx ecx, al
- in al, 0x40
+ in al, PIT_CH0
mov ch, al
/* Enable interrupts and do a short wait */
@@ -406,8 +432,8 @@
cli
/* Get the counter value again */
- mov eax, _HalpPerfCounterLow
- mov edx, _HalpPerfCounterHigh
+ mov eax, dword ptr _HalpPerfCounterLow
+ mov edx, dword ptr _HalpPerfCounterHigh
/* Check if someone updated the counter */
cmp eax, ebx
@@ -417,7 +443,7 @@
/* Check if the current 8254 value causes rollover */
neg ecx
- add ecx, _HalpCurrentRollOver
+ add ecx, dword ptr _HalpCurrentRollOver
jnb DoRollOver
SetSum:
@@ -427,19 +453,19 @@
adc edx, 0
/* Check if we're above or below the last high value */
- cmp edx, _HalpLastPerfCounterHigh
+ cmp edx, dword ptr _HalpLastPerfCounterHigh
jb short BelowHigh
jnz short BelowLow
/* Check if we're above or below the last low value */
- cmp eax, _HalpLastPerfCounterLow
+ cmp eax, dword ptr _HalpLastPerfCounterLow
jb BelowHigh
BelowLow:
/* Update the last value and bring back interrupts */
- mov _HalpLastPerfCounterLow, eax
- mov _HalpLastPerfCounterHigh, edx
+ mov dword ptr _HalpLastPerfCounterLow, eax
+ mov dword ptr _HalpLastPerfCounterHigh, edx
popf
/* Check if caller wants frequency */
@@ -469,7 +495,7 @@
/* We might have an incoming interrupt, save EFLAGS and reset rollover */
mov esi, [esp]
- mov ecx, _HalpCurrentRollOver
+ mov ecx, dword ptr _HalpCurrentRollOver
popf
/* Check if interrupts were enabled and try again */
@@ -483,8 +509,8 @@
BelowHigh:
/* Get the last counter values */
- mov ebx, _HalpLastPerfCounterLow
- mov esi, _HalpLastPerfCounterHigh
+ mov ebx, dword ptr _HalpLastPerfCounterLow
+ mov esi, dword ptr _HalpLastPerfCounterHigh
/* Check if the previous value was 0 and go back if yes */
mov ecx, ebx
@@ -495,7 +521,7 @@
sub ebx, eax
sbb esi, edx
jnz InvalidCount
- cmp ebx, _HalpCurrentRollOver
+ cmp ebx, dword ptr _HalpCurrentRollOver
jg InvalidCount
/* Fixup the count with the last known value */
@@ -517,7 +543,8 @@
InvalidCount:
popf
xor eax, eax
- mov _HalpLastPerfCounterLow, eax
- mov _HalpLastPerfCounterHigh, eax
+ mov dword ptr _HalpLastPerfCounterLow, eax
+ mov dword ptr _HalpLastPerfCounterHigh, eax
jmp LoopPreInt
-.endfunc
+
+END