--- /dev/null
+/*
+ * FILE: hal/halx86/up/pic.S
+ * COPYRIGHT: See COPYING in the top level directory
+ * PURPOSE: HAL PIC Management and Control Code
+ * PROGRAMMER: Thomas Faber (thomas.faber@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <asm.inc>
+
+#include <ks386.inc>
+
+EXTERN _HalpEndSoftwareInterrupt2@8:PROC
+
+/* GLOBALS *******************************************************************/
+
+.data
+ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING
+
+/* FUNCTIONS *****************************************************************/
+
+.code
+PUBLIC _HalpEndSoftwareInterrupt@8
+.PROC _HalpEndSoftwareInterrupt@8
+ FPO 0, 2, 0, 0, 0, FRAME_FPO
+
+ /* Call the C function with the same arguments we got */
+ push [esp+8]
+ push [esp+8]
+ call _HalpEndSoftwareInterrupt2@8
+
+ /* Check if we got a pointer back */
+ test eax, eax
+ jnz CallIntHandler
+
+ /* No? Just return */
+ ret 8
+
+CallIntHandler:
+ /* We got a pointer to call. Since it won't return, free up our stack
+ space, or we could end up with some nasty deep recursion */
+ mov ecx, [esp+8]
+ add esp, 12
+ jmp eax
+.ENDP
+
+END
#define NDEBUG
#include <debug.h>
+VOID
+NTAPI
+HalpEndSoftwareInterrupt(IN KIRQL OldIrql,
+ IN PKTRAP_FRAME TrapFrame);
+
/* GLOBALS ********************************************************************/
#ifndef _MINIHAL_
* so it will always preempt until we reach PROFILE_LEVEL.
*/
0b00000000000000000001011111110000, /* IRQL 20 */
- 0b00000000000000000001001111110000, /* IRQL 20 */
+ 0b00000000000000000001001111110000, /* IRQL 21 */
0b00000000000000000001000111110000, /* IRQL 22 */
0b00000000000000000001000011110000, /* IRQL 23 */
0b00000000000000000001000001110000, /* IRQL 24 */
KeGetPcr()->IRR &= ~(1 << Irql);
}
-VOID
+PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY
NTAPI
-HalpEndSoftwareInterrupt(IN KIRQL OldIrql,
- IN PKTRAP_FRAME TrapFrame)
+HalpEndSoftwareInterrupt2(IN KIRQL OldIrql,
+ IN PKTRAP_FRAME TrapFrame)
{
ULONG PendingIrql, PendingIrqlMask, PendingIrqMask;
PKPCR Pcr = KeGetPcr();
PIC_MASK Mask;
+ UNREFERENCED_PARAMETER(TrapFrame);
+
/* Set old IRQL */
Pcr->Irql = OldIrql;
{
/* Check for pending software interrupts and compare with current IRQL */
PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[OldIrql];
- if (!PendingIrqlMask) return;
+ if (!PendingIrqlMask) return NULL;
/* Check for in-service delayed interrupt */
- if (Pcr->IrrActive & 0xFFFFFFF0) return;
+ if (Pcr->IrrActive & 0xFFFFFFF0) return NULL;
/* Check if pending IRQL affects hardware state */
BitScanReverse(&PendingIrql, PendingIrqlMask);
else
{
/* No need to loop checking for hardware interrupts */
- SWInterruptHandlerTable2[PendingIrql](TrapFrame);
- UNREACHABLE;
+ return SWInterruptHandlerTable2[PendingIrql];
}
}
+
+ return NULL;
}
/* EDGE INTERRUPT DISMISSAL FUNCTIONS *****************************************/