diff --git a/reactos/lib/rtl/i386/interlck.S b/reactos/lib/rtl/i386/interlck.S new file mode 100644 index 00000000000..27aa6ae9ad2 --- /dev/null +++ b/reactos/lib/rtl/i386/interlck.S @@ -0,0 +1,148 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/rtl/i386/interlck.S + * PURPOSE: Rtl Interlocked Functions for x86 + * PROGRAMMERS: Timo Kreuzer + */ + +.intel_syntax noprefix + +/* FUNCTIONS ****************************************************************/ + + +/* PSLIST_ENTRY + * NTAPI + * RtlInterlockedPopEntrySList( + * IN PSLIST_HEADER ListHead); + */ +.global _RtlInterlockedPopEntrySList@4 +_RtlInterlockedPopEntrySList@4: + + /* Save registers */ + push ebx + push ebp + + /* Load ListHead into ebp */ + mov ebp, [esp + 8] + + /* Load ListHead->Next into eax */ + mov eax, [ebp] + + /* Load ListHead->Depth and ListHead->Sequence into edx */ + mov edx, [ebp+4] + +1: + /* Check if ListHead->Next is NULL */ + or eax, eax + jz 2f + + /* Copy Depth and Sequence number and adjust Depth */ + lea ecx, [edx - 1] + + /* Get next pointer */ + mov ebx, [eax] + + /* If [ebp] equals edx:eax, exchange it with ecx:ebx */ + lock cmpxchg8b [ebp] + + /* If not equal, retry with edx:eax, being the content of [ebp] now */ + jnz 1b + + /* Restore registers and return */ +2: + pop ebp + pop ebx + ret 4 + + +/* PSLIST_ENTRY + * NTAPI + * RtlInterlockedPushEntrySList( + * IN PSLIST_HEADER ListHead, + * IN PSLIST_ENTRY ListEntry); + */ +.global _RtlInterlockedPushEntrySList@8 +_RtlInterlockedPushEntrySList@8: + + /* Save registers */ + push ebx + push ebp + + /* Load ListHead into ebp */ + mov ebp, [esp + 4] + + /* Load ListEntry into ebx */ + mov ebx, [esp + 12] + + /* Load ListHead->Next into eax */ + mov eax, [ebp] + + /* Load ListHead->Depth and ListHead->Sequence into edx */ + mov edx, [ebp + 4] + +1: + /* Set ListEntry->Next to ListHead->Next */ + mov [ebx], eax + + /* Copy ListHead->Depth and ListHead->Sequence and adjust them */ + lea ecx, [edx + 0x10001] + + /* If [ebp] equals edx:eax, exchange it with ecx:ebx */ + lock cmpxchg8b [ebp] + + /* If not equal, retry with edx:eax, being the content of [ebp] now */ + jnz 1b + + /* Restore registers and return */ + pop ebp + pop ebx + ret 8 + + +/* PSLIST_ENTRY + * NTAPI + * RtlInterlockedFlushSList( + * IN PSINGLE_LIST_ENTRY ListHead); + */ +.global _RtlInterlockedFlushSList@4 +_RtlInterlockedFlushSList@4: + + /* Save registers */ + push ebx + push ebp + + /* Clear ebx */ + xor ebx, ebx + + /* Load ListHead into ebp */ + mov ebp, [esp + 4] + + /* Load ListHead->Next into eax */ + mov eax, [ebp] + + /* Load ListHead->Depth and ListHead->Sequence into edx */ + mov edx, [ebp + 4] + +1: + /* Check if ListHead->Next is NULL */ + or eax, eax + jz 2f + + /* Copy Depth and Sequence number to ecx */ + mov ecx, edx + + /* Clear Depth in cx */ + xor cx, cx + + /* If [ebp] equals edx:eax, exchange it with ecx:ebx */ + lock cmpxchg8b [ebp] + + /* If not equal, retry with edx:eax, being the content of [ebp] now */ + jnz 1b + + /* Restore registers and return */ +2: + pop ebp + pop ebx + ret 4 diff --git a/reactos/lib/rtl/interlck.c b/reactos/lib/rtl/interlck.c index 81479b4738d..291706f67ae 100644 --- a/reactos/lib/rtl/interlck.c +++ b/reactos/lib/rtl/interlck.c @@ -15,31 +15,6 @@ /* FUNCTIONS ***************************************************************/ -PSLIST_ENTRY -NTAPI -RtlInterlockedPopEntrySList(IN PSLIST_HEADER ListHead) -{ - UNIMPLEMENTED; - return NULL; -} - -PSLIST_ENTRY -NTAPI -RtlInterlockedPushEntrySList(IN PSLIST_HEADER ListHead, - IN PSLIST_ENTRY ListEntry) -{ - UNIMPLEMENTED; - return NULL; -} - -PSLIST_ENTRY -NTAPI -RtlInterlockedFlushSList(IN PSLIST_HEADER ListHead) -{ - UNIMPLEMENTED; - return NULL; -} - PSLIST_ENTRY NTAPI RtlInterlockedPushListSList(IN PSLIST_HEADER ListHead, diff --git a/reactos/lib/rtl/rtl.rbuild b/reactos/lib/rtl/rtl.rbuild index bce20a98520..4636e1a375f 100644 --- a/reactos/lib/rtl/rtl.rbuild +++ b/reactos/lib/rtl/rtl.rbuild @@ -12,6 +12,7 @@ debug_asm.S except_asm.s except.c + interlck.S random_asm.S rtlswap.S rtlmem.s