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?re... ============================================================================== --- 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 @HalRequestSoftwareInterrupt@4 -.func @HalRequestSoftwareInterrupt@4, @HalRequestSoftwareInterrupt@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 _HalEndSystemInterrupt@8 .func HalEndSystemInterrupt@8 _HalEndSystemInterrupt@8:
Modified: trunk/reactos/hal/halx86/generic/pic.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/pic.c?re... ============================================================================== --- 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 */