Author: sir_richard
Date: Mon Jan 25 02:26:53 2010
New Revision: 45241

URL: http://svn.reactos.org/svn/reactos?rev=45241&view=rev
Log:
[HAL]: Implement HalRequestSoftwareInterrupt in C instead of ASM. Remove 
deprecated ASM code that was unused.

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?rev=45241&r1=45240&r2=45241&view=diff
==============================================================================
--- trunk/reactos/hal/halx86/generic/irq.S [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/irq.S [iso-8859-1] Mon Jan 25 02:26:53 2010
@@ -50,40 +50,6 @@
     .long 0xFFFFFFFB                    /* IRQL 30 */
     .long 0xFFFFFFFB                    /* IRQL 31 */
 
-FindHigherIrqlMask:
-    .long 0xFFFFFFFE                    /* IRQL  0 */
-    .long 0xFFFFFFFC                    /* IRQL 1 */
-    .long 0xFFFFFFF8                    /* IRQL 2 */
-    .long 0xFFFFFFF0                    /* IRQL 3 */
-    .long 0x7FFFFF0                     /* IRQL 4 */
-    .long 0x3FFFFF0                     /* IRQL 5 */
-    .long 0x1FFFFF0                     /* IRQL 6 */
-    .long 0x0FFFFF0                     /* IRQL 7 */
-    .long 0x7FFFF0                      /* IRQL 8 */
-    .long 0x3FFFF0                      /* IRQL 9 */
-    .long 0x1FFFF0                      /* IRQL 10 */
-    .long 0x0FFFF0                      /* IRQL 11 */
-    .long 0x7FFF0                       /* IRQL 12 */
-    .long 0x3FFF0                       /* IRQL 13 */
-    .long 0x1FFF0                       /* IRQL 14 */
-    .long 0x0FFF0                       /* IRQL 15 */
-    .long 0x7FF0                        /* IRQL 16 */
-    .long 0x3FF0                        /* IRQL 17 */
-    .long 0x1FF0                        /* IRQL 18 */
-    .long 0x1FF0                        /* IRQL 19 */
-    .long 0x17F0                        /* IRQL 20 */
-    .long 0x13F0                        /* IRQL 21 */
-    .long 0x11F0                        /* IRQL 22 */
-    .long 0x10F0                        /* IRQL 23 */
-    .long 0x1070                        /* IRQL 24 */
-    .long 0x1030                        /* IRQL 25 */
-    .long 0x1010                        /* IRQL 26 */
-    .long 0x10                          /* IRQL 27 */
-    .long 0                             /* IRQL 28 */
-    .long 0                             /* IRQL 29 */
-    .long 0                             /* IRQL 30 */
-    .long 0                             /* IRQL 31 */
-
 SWInterruptLookUpTable:
     .byte PASSIVE_LEVEL                 /* IRR 0 */
     .byte PASSIVE_LEVEL                 /* IRR 1 */
@@ -109,75 +75,6 @@
 
 /* FUNCTIONS *****************************************************************/
 
-/* HAL interrupt handlers */
-GENERATE_HAL_INT_HANDLERS
-
-.globl _HalpHardwareInterruptLevel
-.func HalpHardwareInterruptLevel
-_HalpHardwareInterruptLevel:
-
-    /* Get IRQL and check for pending interrupts */
-    mov eax, PCR[KPCR_IRQL]
-    mov ecx, PCR[KPCR_IRR]
-    and ecx, FindHigherIrqlMask[eax*4]
-    jz NothingHardware
-
-    /* Check the active IRR */
-    test dword ptr PCR[KPCR_IRR_ACTIVE], 0xFFFFFFF0
-    jnz NothingHardware
-
-    /* Check for pending software interrupts */
-    mov eax, ecx
-    bsr ecx, eax
-    mov eax, 1
-    shl eax, cl
-
-    /* Clear IRR */
-    xor PCR[KPCR_IRR], eax
-
-    /* Now dispatch the interrupt */
-    call SWInterruptHandlerTable[ecx*4]
-
-NothingHardware:
-    ret
-.endfunc
-
-.globl @halrequestsoftwareinterr...@4
-.func @halrequestsoftwareinterr...@4, @halrequestsoftwareinterr...@4
-...@halrequestsoftwareinterrupt@4:
-
-    /* Get IRR mask */
-    mov eax, 1
-    shl eax, cl
-
-    /* Disable interrupts */
-    pushf
-    cli
-
-    /* Set IRR and get IRQL */
-    or PCR[KPCR_IRR], eax
-    mov ecx, PCR[KPCR_IRQL]
-
-    /* Get software IRR mask */
-    mov eax, PCR[KPCR_IRR]
-    and eax, 3
-
-    /* Get highest pending software interrupt and check if it's higher */
-    xor edx, edx
-    mov dl, SWInterruptLookUpTable[eax]
-    cmp dl, cl
-    jbe AfterCall
-
-    /* Call the pending interrupt */
-    call SWInterruptHandlerTable[edx*4]
-
-AfterCall:
-
-    /* Retore interrupts and return */
-    popf
-    ret
-.endfunc
-
 .globl _halendsysteminterr...@8
 .func halendsysteminterr...@8
 _halendsysteminterr...@8:

Modified: trunk/reactos/hal/halx86/generic/pic.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/pic.c?rev=45241&r1=45240&r2=45241&view=diff
==============================================================================
--- trunk/reactos/hal/halx86/generic/pic.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/pic.c [iso-8859-1] Mon Jan 25 02:26:53 2010
@@ -498,6 +498,32 @@
  */
 VOID
 FASTCALL
+HalRequestSoftwareInterrupt(IN KIRQL Irql)
+{
+    ULONG EFlags;
+    PKPCR Pcr = KeGetPcr();
+    KIRQL PendingIrql;
+    
+    /* Save EFlags and disable interrupts */
+    EFlags = __readeflags();
+    _disable();
+    
+    /* Mask out the requested bit */
+    Pcr->IRR |= (1 << Irql);
+
+    /* Check for pending software interrupts and compare with current IRQL */
+    PendingIrql = SWInterruptLookUpTable[Pcr->IRR & 3];
+    if (PendingIrql > Pcr->Irql) SWInterruptHandlerTable[PendingIrql]();
+    
+    /* Restore interrupt state */
+    __writeeflags(EFlags);
+}
+
+/*
+ * @implemented
+ */
+VOID
+FASTCALL
 HalClearSoftwareInterrupt(IN KIRQL Irql)
 {
     /* Mask out the requested bit */


Reply via email to