Wait, are you saying that Timo didn't discover this obvious bug for years?
Best regards,
Alex Ionescu


On Mon, May 16, 2016 at 4:06 PM, Timo Kreuzer <timo.kreu...@web.de> wrote:
> Wait, are you suggesting that "doing everything the same as MS does" and
> "I don't need to care for C standards, I have a huge epeen!" and
> "OnlyOnePersonCanWriteHalCode AndItsNotYou".... doesn't work? :O
>
>
> Best regards,
> Timo Kreuzer
>
>
> Am 10.05.2016 um 17:03 schrieb tfa...@svn.reactos.org:
>>
>> Author: tfaber
>> Date: Tue May 10 15:03:56 2016
>> New Revision: 71307
>>
>> URL: http://svn.reactos.org/svn/reactos?rev=71307&view=rev
>> Log:
>> [HAL]
>> - Create a wrapper version of HalpEndSoftwareInterrupt that frees its
>> stack before calling the noreturn version of the next software interrupt
>> handler. Fixes excessive stack usage when DPCs are queued in quick
>> succession.
>> CORE-11123 #resolve
>>
>> Added:
>>      trunk/reactos/hal/halx86/up/pic.S   (with props)
>> Modified:
>>      trunk/reactos/hal/halx86/pic.cmake
>>      trunk/reactos/hal/halx86/up/pic.c
>>
>> Modified: trunk/reactos/hal/halx86/pic.cmake
>> URL:
>> http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/pic.cmake?rev=71307&r1=71306&r2=71307&view=diff
>>
>> ==============================================================================
>> --- trunk/reactos/hal/halx86/pic.cmake  [iso-8859-1] (original)
>> +++ trunk/reactos/hal/halx86/pic.cmake  [iso-8859-1] Tue May 10 15:03:56
>> 2016
>> @@ -1,7 +1,8 @@
>>     list(APPEND HAL_PIC_ASM_SOURCE
>>       generic/systimer.S
>> -    generic/trap.S)
>> +    generic/trap.S
>> +    up/pic.S)
>>     list(APPEND HAL_PIC_SOURCE
>>       generic/profil.c
>>
>> Added: trunk/reactos/hal/halx86/up/pic.S
>> URL:
>> http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/up/pic.S?rev=71307
>>
>> ==============================================================================
>> --- trunk/reactos/hal/halx86/up/pic.S   (added)
>> +++ trunk/reactos/hal/halx86/up/pic.S   [iso-8859-1] Tue May 10 15:03:56
>> 2016
>> @@ -0,0 +1,48 @@
>> +/*
>> + * 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.fa...@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
>>
>> Propchange: trunk/reactos/hal/halx86/up/pic.S
>>
>> ------------------------------------------------------------------------------
>>      svn:eol-style = native
>>
>> Modified: trunk/reactos/hal/halx86/up/pic.c
>> URL:
>> http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/up/pic.c?rev=71307&r1=71306&r2=71307&view=diff
>>
>> ==============================================================================
>> --- trunk/reactos/hal/halx86/up/pic.c   [iso-8859-1] (original)
>> +++ trunk/reactos/hal/halx86/up/pic.c   [iso-8859-1] Tue May 10 15:03:56
>> 2016
>> @@ -11,6 +11,11 @@
>>   #include <hal.h>
>>   #define NDEBUG
>>   #include <debug.h>
>> +
>> +VOID
>> +NTAPI
>> +HalpEndSoftwareInterrupt(IN KIRQL OldIrql,
>> +                         IN PKTRAP_FRAME TrapFrame);
>>     /* GLOBALS
>> ********************************************************************/
>>   @@ -263,7 +268,7 @@
>>        * 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 */
>> @@ -732,15 +737,17 @@
>>       KeGetPcr()->IRR &= ~(1 << Irql);
>>   }
>>   -VOID
>> -NTAPI
>> -HalpEndSoftwareInterrupt(IN KIRQL OldIrql,
>> -                         IN PKTRAP_FRAME TrapFrame)
>> +PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY
>> +NTAPI
>> +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;
>>   @@ -749,10 +756,10 @@
>>       {
>>           /* 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);
>> @@ -777,10 +784,11 @@
>>           else
>>           {
>>               /* No need to loop checking for hardware interrupts */
>> -            SWInterruptHandlerTable2[PendingIrql](TrapFrame);
>> -            UNREACHABLE;
>> +            return SWInterruptHandlerTable2[PendingIrql];
>>           }
>>       }
>> +
>> +    return NULL;
>>   }
>>     /* EDGE INTERRUPT DISMISSAL FUNCTIONS
>> *****************************************/
>>
>>
>>
>
>
>
> _______________________________________________
> Ros-dev mailing list
> Ros-dev@reactos.org
> http://www.reactos.org/mailman/listinfo/ros-dev

_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to