Implement RtlInterlockedPopEntrySList, RtlInterlockedPushEntrySList and RtlInterlockedFlushSList in assembly. Based on the ExInterlocked functions in ntoskrnl.

svn path=/trunk/; revision=39636
This commit is contained in:
Timo Kreuzer
2009-02-17 03:45:27 +00:00
parent 65920de80b
commit d90c846eed
3 changed files with 149 additions and 25 deletions
+148
View File
@@ -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
-25
View File
@@ -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,
+1
View File
@@ -12,6 +12,7 @@
<file>debug_asm.S</file>
<file>except_asm.s</file>
<file>except.c</file>
<file>interlck.S</file>
<file>random_asm.S</file>
<file>rtlswap.S</file>
<file>rtlmem.s</file>