Author: sir_richard
Date: Mon Jan 25 00:14:08 2010
New Revision: 45234
URL:
http://svn.reactos.org/svn/reactos?rev=45234&view=rev
Log:
[HAL]: Implement KeGetCurrentIrql, KeRaiseIrqlToDpcLevel, KeRaiseIrqlToSynchLevel,
HalClearSoftwareInterrupt in C instead of ASM.
Modified:
trunk/reactos/hal/halx86/generic/irq.S
trunk/reactos/hal/halx86/generic/pic.c
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 [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/irq.S [iso-8859-1] Mon Jan 25 00:14:08 2010
@@ -174,20 +174,6 @@
ret
.endfunc
-.globl @HalClearSoftwareInterrupt@4
-.func @HalClearSoftwareInterrupt@4, @HalClearSoftwareInterrupt@4
-@HalClearSoftwareInterrupt@4:
-
- /* Get IRR mask */
- mov eax, 1
- shl eax, cl
- not eax
-
- /* Set IRR */
- and PCR[KPCR_IRR], eax
- ret
-.endfunc
-
.globl @HalRequestSoftwareInterrupt@4
.func @HalRequestSoftwareInterrupt@4, @HalRequestSoftwareInterrupt@4
@HalRequestSoftwareInterrupt@4:
@@ -699,73 +685,6 @@
#endif
.endfunc
-.globl _KeGetCurrentIrql@0
-.func KeGetCurrentIrql@0
-_KeGetCurrentIrql@0:
-
- /* Return the IRQL */
- mov eax, PCR[KPCR_IRQL]
- ret
-.endfunc
-
-.globl _KeRaiseIrqlToDpcLevel@0
-.func KeRaiseIrqlToDpcLevel@0
-_KeRaiseIrqlToDpcLevel@0:
-
- /* Get the current IRQL */
- mov eax, PCR[KPCR_IRQL]
-
- /* Set DISPATCH_LEVEL */
- mov dword ptr PCR[KPCR_IRQL], DISPATCH_LEVEL
-
-#if DBG
- /* Make sure we were not higher then synch */
- cmp eax, DISPATCH_LEVEL
- ja InvalidRaise
-#endif
- ret
-
-#if DBG
-InvalidRaise:
- /* Bugcheck the system */
- push 1
- push 0
- push DISPATCH_LEVEL
- push eax
- push IRQL_NOT_GREATER_OR_EQUAL
- call _KeBugCheckEx@20
-#endif
-.endfunc
-
-.globl _KeRaiseIrqlToSynchLevel@0
-.func KeRaiseIrqlToSynchLevel@0
-_KeRaiseIrqlToSynchLevel@0:
-
- /* Get the current IRQL */
- mov eax, PCR[KPCR_IRQL]
-
- /* Set SYNCH_LEVEL */
- mov dword ptr PCR[KPCR_IRQL], SYNCH_LEVEL
-
-#if DBG
- /* Make sure we were not higher then dispatch */
- cmp eax, SYNCH_LEVEL
- ja InvalidSyRaise
-#endif
- ret
-
-#if DBG
-InvalidSyRaise:
- /* Bugcheck the system */
- push 2
- push 0
- push SYNCH_LEVEL
- push eax
- push IRQL_NOT_GREATER_OR_EQUAL
- call _KeBugCheckEx@20
-#endif
-.endfunc
-
.globl _HalpApcInterrupt
.func HalpApcInterrupt
TRAP_FIXUPS hapc_a, hapc_t, DoFixupV86, DoFixupAbios
Modified: trunk/reactos/hal/halx86/generic/pic.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/pic.c?r…
==============================================================================
--- trunk/reactos/hal/halx86/generic/pic.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/pic.c [iso-8859-1] Mon Jan 25 00:14:08 2010
@@ -116,3 +116,91 @@
__writeeflags(EFlags);
}
+/* IRQL MANAGEMENT ************************************************************/
+
+/*
+ * @implemented
+ */
+KIRQL
+NTAPI
+KeGetCurrentIrql(VOID)
+{
+ /* Return the IRQL */
+ return KeGetPcr()->Irql;
+}
+
+/*
+ * @implemented
+ */
+KIRQL
+NTAPI
+KeRaiseIrqlToDpcLevel(VOID)
+{
+ PKPCR Pcr = KeGetPcr();
+ KIRQL CurrentIrql;
+
+ /* Save and update IRQL */
+ CurrentIrql = Pcr->Irql;
+ Pcr->Irql = DISPATCH_LEVEL;
+
+#ifdef IRQL_DEBUG
+ /* Validate correct raise */
+ if (CurrentIrql > DISPATCH_LEVEL)
+ {
+ /* Crash system */
+ KeBugCheckEx(IRQL_NOT_GREATER_OR_EQUAL,
+ CurrentIrql,
+ DISPATCH_LEVEL,
+ 0,
+ 1);
+ }
+#endif
+
+ /* Return the previous value */
+ return CurrentIrql;
+}
+
+/*
+ * @implemented
+ */
+KIRQL
+NTAPI
+KeRaiseIrqlToSynchLevel(VOID)
+{
+ PKPCR Pcr = KeGetPcr();
+ KIRQL CurrentIrql;
+
+ /* Save and update IRQL */
+ CurrentIrql = Pcr->Irql;
+ Pcr->Irql = SYNCH_LEVEL;
+
+#ifdef IRQL_DEBUG
+ /* Validate correct raise */
+ if (CurrentIrql > SYNCH_LEVEL)
+ {
+ /* Crash system */
+ KeBugCheckEx(IRQL_NOT_GREATER_OR_EQUAL,
+ CurrentIrql,
+ SYNCH_LEVEL,
+ 0,
+ 1);
+ }
+#endif
+
+ /* Return the previous value */
+ return CurrentIrql;
+}
+
+
+/* SOFTWARE INTERRUPTS ********************************************************/
+
+/*
+ * @implemented
+ */
+VOID
+FASTCALL
+HalClearSoftwareInterrupt(IN KIRQL Irql)
+{
+ /* Mask out the requested bit */
+ KeGetPcr()->IRR &= ~(1 << Irql);
+}