Author: ion
Date: Mon Nov 27 22:16:24 2006
New Revision: 24870
URL:
http://svn.reactos.org/svn/reactos?rev=24870&view=rev
Log:
- Fix some bugs in the newer IRQL implementation for the HAL (that's still not used
because it caused regressions).
Modified:
trunk/reactos/hal/halx86/generic/irq.S
Modified: trunk/reactos/hal/halx86/generic/irq.S
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/irq.S?r…
==============================================================================
--- trunk/reactos/hal/halx86/generic/irq.S (original)
+++ trunk/reactos/hal/halx86/generic/irq.S Mon Nov 27 22:16:24 2006
@@ -1,5 +1,5 @@
/*
- * FILE: hal/halx86/generic/irql.S
+ * FILE: hal/halx86/generic/irq.S
* COPYRIGHT: See COPYING in the top level directory
* PURPOSE: Software, System and Hardware IRQ Management
* PROGRAMMER: Alex Ionescu (alex(a)relsoft.net)
@@ -77,6 +77,8 @@
.long IRQ15 /* IRQ 15 */
.rept 20
.long GenericIRQ /* IRQ 16-35 */
+.rept 172
+ .long InvalidIRQ /* IRQ 36-207 */
.endr
SoftIntByteTable:
@@ -140,7 +142,6 @@
jnz InitLoop
/* Restore interrupts and return */
- or dword ptr [esp], EFLAGS_INTERRUPT_MASK
popf
pop esi
ret
@@ -161,7 +162,7 @@
/* Set IRR and get IRQL */
or [fs:KPCR_IRR], eax
- mov cl, [fs:KPCR_IRQL]
+ mov ecx, [fs:KPCR_IRQL]
/* Get software IRR mask */
mov eax, [fs:KPCR_IRR]
@@ -265,7 +266,7 @@
and [fs:KPCR_IDR], eax
/* Get the current IRQL and mask the IRQs in the PIC */
- movzx eax, byte ptr [fs:KPCR_IRQL]
+ mov eax, [fs:KPCR_IRQL]
mov eax, KiI8259MaskTable[eax*4]
or eax, [fs:KPCR_IDR]
out 0x21, al
@@ -280,6 +281,7 @@
Invalid:
/* Fail, invalid IRQ */
+ int 3
xor eax, eax
ret 12
.endfunc
@@ -297,6 +299,7 @@
/* This is IRQ 15, check if it's spurious */
mov al, 0xB
out 0xA0, al
+ jmp $+2
in al, 0xA0
test al, 0x80
jnz GenericIRQ
@@ -311,6 +314,7 @@
/* This is IRQ 7, check if it's spurious */
mov al, 0xB
out 0x20, al
+ jmp $+2
in al, 0x20
test al, 0x80
jnz GenericIRQ
@@ -322,12 +326,12 @@
GenericIRQ:
/* Return the current IRQL */
mov eax, [esp+12]
- movzx ecx, byte ptr [fs:KPCR_IRQL]
+ mov ecx, [fs:KPCR_IRQL]
mov [eax], cl
/* Set the new IRQL */
movzx eax, byte ptr [esp+4]
- mov [fs:KPCR_IRQL], al
+ mov [fs:KPCR_IRQL], eax
/* Set IRQ mask in the PIC */
mov eax, KiI8259MaskTable[eax*4]
@@ -337,7 +341,7 @@
out 0xA1, al
/* Check to which PIC the EOI was sent */
- mov eax, edx
+ mov eax, ebx
cmp eax, 8
jnb Pic1
@@ -359,6 +363,11 @@
sti
mov eax, 1
ret 12
+
+InvalidIRQ:
+ /* Dismiss it */
+ mov eax, 0
+ ret 12
.endfunc
.globl _HalEndSystemInterrupt@8
@@ -367,7 +376,7 @@
/* Get the IRQL and check if it's a software interrupt */
movzx ecx, byte ptr [esp+4]
- cmp byte ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
+ cmp dword ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
jbe SkipMask2
/* Hardware interrupt, mask the appropriate IRQs in the PIC */
@@ -380,7 +389,7 @@
SkipMask2:
/* Set IRQL and check if there are pending software interrupts */
- mov [fs:KPCR_IRQL], cl
+ mov [fs:KPCR_IRQL], ecx
mov eax, [fs:KPCR_IRR]
mov al, SoftIntByteTable[eax]
cmp al, cl
@@ -404,7 +413,7 @@
/* Disable interrupts and check if IRQL is below DISPATCH_LEVEL */
movzx ecx, cl
- cmp byte ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
+ cmp dword ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
cli
jbe SkipMask
@@ -418,16 +427,18 @@
SkipMask:
/* Set the new IRQL and check if there's a pending software interrupt */
- mov [fs:KPCR_IRQL], cl
+ mov [fs:KPCR_IRQL], ecx
mov eax, [fs:KPCR_IRR]
mov al, SoftIntByteTable[eax]
cmp al, cl
- jbe DoCall3
-
+ ja DoCall3
+
+ /* Restore interrupts and return */
+ popf
+ ret
+DoCall3:
/* There is, call it */
call SoftIntHandlerTable[eax*4]
-
-DoCall3:
/* Restore interrupts and return */
popf
@@ -440,10 +451,9 @@
@KfRaiseIrql@4:
/* Get the IRQL and check if it's Software level only */
- xor eax, eax
- mov al, [fs:KPCR_IRQL]
+ mov eax, [fs:KPCR_IRQL]
movzx ecx, cl
- cmp cl, DISPATCH_LEVEL
+ cmp ecx, DISPATCH_LEVEL
jbe SetIrql
/* Save the current IRQL */
@@ -471,7 +481,7 @@
SetIrql:
/* Set the IRQL and return */
- mov [fs:KPCR_IRQL], cl
+ mov [fs:KPCR_IRQL], ecx
ret
.endfunc
@@ -480,7 +490,7 @@
_KeGetCurrentIrql@0:
/* Return the IRQL */
- movzx eax, word ptr [fs:KPCR_IRQL]
+ mov eax, [fs:KPCR_IRQL]
ret
.endfunc
@@ -489,11 +499,10 @@
_KeRaiseIrqlToDpcLevel@0:
/* Get the current IRQL */
- xor eax, eax
- mov al, [fs:KPCR_IRQL]
+ mov eax, [fs:KPCR_IRQL]
/* Set DISPATCH_LEVEL */
- mov byte ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
+ mov dword ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
ret
.endfunc
@@ -513,8 +522,8 @@
out 0xA1, al
/* Return the old IRQL, enable interrupts and set to DISPATCH */
- mov al, [fs:KPCR_IRQL]
- mov byte ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
+ mov eax, [fs:KPCR_IRQL]
+ mov dword ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
popf
ret
.endfunc
@@ -539,7 +548,7 @@
/* Save current IRQL and set to APC level */
push [fs:KPCR_IRQL]
- mov byte ptr [fs:KPCR_IRQL], APC_LEVEL
+ mov dword ptr [fs:KPCR_IRQL], APC_LEVEL
and dword ptr [fs:KPCR_IRR], ~(1 << APC_LEVEL)
/* Enable interrupts and check if we came from User/V86 mode */
@@ -586,7 +595,7 @@
/* Save current IRQL and set to DPC level */
push [fs:KPCR_IRQL]
- mov byte ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
+ mov dword ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
and dword ptr [fs:KPCR_IRR], ~(1 << DISPATCH_LEVEL)
/* Enable interrupts and let the kernel handle this */
@@ -605,7 +614,7 @@
/* Get the IRQL and check if we're in the software region */
movzx ecx, byte ptr [esp+4]
- cmp byte ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
+ cmp dword ptr [fs:KPCR_IRQL], DISPATCH_LEVEL
jbe SoftwareInt
/* Set the right mask in the PIC for the hardware IRQ */
@@ -617,7 +626,7 @@
SoftwareInt:
/* Check if there are pending software interrupts */
- mov [fs:KPCR_IRQL], cl
+ mov [fs:KPCR_IRQL], ecx
mov eax, [fs:KPCR_IRR]
mov al, SoftIntByteTable[eax]
cmp al, cl