Congrats on once again breaking another key part of Windows compatibility.

This function is DOCUMENTED to tear. It was DESIGNED that way on purpose.

Utter failure, once more.

Best regards,
Alex Ionescu


On Sat, May 14, 2011 at 12:29 PM, <[email protected]> wrote:

> Author: tkreuzer
> Date: Sat May 14 19:29:42 2011
> New Revision: 51748
>
> URL: http://svn.reactos.org/svn/reactos?rev=51748&view=rev
> Log:
> [NTOSKRNL]
> Patch by Paolo Bonzini <bonzini [at] gnu [dot] org>
> Fix implementation of ExInterlockedAddLargeStatistic
> The old version wasn't really atomic.
>
> See issue #6223 for more details.
>
> Modified:
>    trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S
>
> Modified: trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S?rev=51748&r1=51747&r2=51748&view=diff
>
> ==============================================================================
> --- trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S [iso-8859-1]
> (original)
> +++ trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S [iso-8859-1] Sat May
> 14 19:29:42 2011
> @@ -4,8 +4,9 @@
>  * FILE:            ntoskrnl/ex/i386/fastinterlck_asm.S
>  * PURPOSE:         FASTCALL Interlocked Functions
>  * PROGRAMMERS:     Alex Ionescu ([email protected])
> - */
> -
> + *                  Paolo Bonzini <bonzini [at] gnu [dot] org>
> + */
> +
>  /* INCLUDES
> ******************************************************************/
>
>  #include <asm.inc>
> @@ -31,25 +32,55 @@
>  */
>  PUBLIC @ExInterlockedAddLargeStatistic@8
>  @ExInterlockedAddLargeStatistic@8:
> -
> -#ifdef CONFIG_SMP
> -    /* Do the addition */
> -    lock add [ecx], edx
> -
> -    /* Check for carry bit and return */
> -    jb .l1
> -    ret
> -
> -.l1:
> -    /* Add carry */
> -    lock adc dword ptr [ecx+4], 0
> -#else
> -    /* Do the addition and add the carry */
> -    add dword ptr [ecx], edx
> -    adc dword ptr [ecx+4], 0
> -#endif
> -    /* Return */
> -    ret
> +    push ebp
> +    push ebx
> +    mov  ebp, ecx
> +
> +Again:
> +    /* Load comparand in eax for cmpxchg */
> +    mov  eax, [ebp]
> +
> +    /* Compute low word of the result in ebx */
> +    mov  ebx, edx
> +    add  ebx, eax
> +
> +    /* Carry needs cmpxchg8b */
> +    jc   Slow
> +
> +    /* Fast path still needs to be atomic, so use cmpxchg and retry if it
> fails
> +     * Hopefully it will still get through this path :) */
> +    LOCK cmpxchg [ecx], ebx
> +    jnz  Again
> +
> +    /* Thats it */
> +    pop  ebx
> +    pop  ebp
> +    ret
> +
> +Slow:
> +    /* Save increment across cmpxchg8b */
> +    push edx
> +
> +    /* Finish loading comparand in edx:eax */
> +    mov  edx, [ebp+4]
> +
> +    /* Result in ecx:ebx (we know there's carry) */
> +    lea  ecx, [edx+1]
> +
> +    /* Do a full exchange */
> +    LOCK cmpxchg8b [ebp]
> +
> +    /* restore increment */
> +    pop  edx
> +
> +    /* Need to retry */
> +    jnz  Again
> +
> +    /* Thats it */
> +    pop  ebx
> +    pop  ebp
> +    ret
> +
>
>  /*ULONG
>  *FASTCALL
>
>
>
_______________________________________________
Ros-dev mailing list
[email protected]
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to