[ros-dev] [ros-diffs] [cgutman] 54418: [HALX86] - Do not allow software interrupts to preempt code running with interrupts disabled during KfLowerIrql

Aleksey Bragin aleksey at reactos.org
Sat Nov 19 10:17:04 UTC 2011


I would like to ask our kernel gurus if this one is correct.

WBR,
Aleksey Bragin.

On 18.11.2011 22:53, cgutman at svn.reactos.org wrote:
> Author: cgutman
> Date: Fri Nov 18 18:53:41 2011
> New Revision: 54418
>
> URL: http://svn.reactos.org/svn/reactos?rev=54418&view=rev
> Log:
> [HALX86]
> - Do not allow software interrupts to preempt code running with interrupts disabled during KfLowerIrql
>
> Modified:
>      trunk/reactos/hal/halx86/up/pic.c
>
> Modified: trunk/reactos/hal/halx86/up/pic.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/up/pic.c?rev=54418&r1=54417&r2=54418&view=diff
> ==============================================================================
> --- trunk/reactos/hal/halx86/up/pic.c [iso-8859-1] (original)
> +++ trunk/reactos/hal/halx86/up/pic.c [iso-8859-1] Fri Nov 18 18:53:41 2011
> @@ -665,26 +665,30 @@
>
>       /* Set old IRQL */
>       Pcr->Irql = OldIrql;
> -
> -    /* Check for pending software interrupts and compare with current IRQL */
> -    PendingIrqlMask = Pcr->IRR&  FindHigherIrqlMask[OldIrql];
> -    if (PendingIrqlMask)
> -    {
> -        /* Check if pending IRQL affects hardware state */
> -        BitScanReverse(&PendingIrql, PendingIrqlMask);
> -        if (PendingIrql>  DISPATCH_LEVEL)
> +
> +    /* Make sure interrupts were enabled */
> +    if (EFlags&  EFLAGS_INTERRUPT_MASK)
> +    {
> +        /* Check for pending software interrupts and compare with current IRQL */
> +        PendingIrqlMask = Pcr->IRR&  FindHigherIrqlMask[OldIrql];
> +        if (PendingIrqlMask)
>           {
> -            /* Set new PIC mask */
> -            Mask.Both = Pcr->IDR;
> -            __outbyte(PIC1_DATA_PORT, Mask.Master);
> -            __outbyte(PIC2_DATA_PORT, Mask.Slave);
> -
> -            /* Clear IRR bit */
> -            Pcr->IRR ^= (1<<  PendingIrql);
> +            /* Check if pending IRQL affects hardware state */
> +            BitScanReverse(&PendingIrql, PendingIrqlMask);
> +            if (PendingIrql>  DISPATCH_LEVEL)
> +            {
> +                /* Set new PIC mask */
> +                Mask.Both = Pcr->IDR;
> +                __outbyte(PIC1_DATA_PORT, Mask.Master);
> +                __outbyte(PIC2_DATA_PORT, Mask.Slave);
> +
> +                /* Clear IRR bit */
> +                Pcr->IRR ^= (1<<  PendingIrql);
> +            }
> +
> +            /* Now handle pending interrupt */
> +            SWInterruptHandlerTable[PendingIrql]();
>           }
> -
> -        /* Now handle pending interrupt */
> -        SWInterruptHandlerTable[PendingIrql]();
>       }
>
>       /* Restore interrupt state */
>
>




More information about the Ros-dev mailing list