mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 07:03:10 +00:00
Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers into modules, and delete rossubsys.
This commit is contained in:
parent
b94e2d8ca0
commit
c2c66aff7d
24198 changed files with 0 additions and 37285 deletions
153
sdk/lib/rtl/i386/interlck.S
Normal file
153
sdk/lib/rtl/i386/interlck.S
Normal file
|
@ -0,0 +1,153 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <asm.inc>
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
.code
|
||||
|
||||
/* PSLIST_ENTRY
|
||||
* NTAPI
|
||||
* RtlInterlockedPopEntrySList(
|
||||
* IN PSLIST_HEADER ListHead);
|
||||
*/
|
||||
PUBLIC _ExpInterlockedPopEntrySListResume@0
|
||||
PUBLIC _ExpInterlockedPopEntrySListEnd@0
|
||||
PUBLIC _ExpInterlockedPopEntrySListFault@0
|
||||
PUBLIC _RtlInterlockedPopEntrySList@4
|
||||
_RtlInterlockedPopEntrySList@4:
|
||||
|
||||
/* Save registers */
|
||||
push ebx
|
||||
push ebp
|
||||
|
||||
/* Load ListHead into ebp */
|
||||
mov ebp, [esp + 12]
|
||||
_ExpInterlockedPopEntrySListResume@0:
|
||||
/* Load ListHead->Next into eax */
|
||||
mov eax, [ebp]
|
||||
|
||||
/* Load ListHead->Depth and ListHead->Sequence into edx */
|
||||
mov edx, [ebp + 4]
|
||||
|
||||
/* Check if ListHead->Next is NULL */
|
||||
or eax, eax
|
||||
jz _ExpInterlockedPopEntrySList2
|
||||
|
||||
/* Copy Depth and Sequence number and adjust Depth */
|
||||
lea ecx, [edx - 1]
|
||||
|
||||
_ExpInterlockedPopEntrySListFault@0:
|
||||
/* Get next pointer */
|
||||
mov ebx, [eax]
|
||||
_ExpInterlockedPopEntrySListEnd@0:
|
||||
/* If [ebp] equals edx:eax, exchange it with ecx:ebx */
|
||||
LOCK cmpxchg8b qword ptr [ebp]
|
||||
|
||||
/* If not equal, retry with edx:eax, being the content of [ebp] now */
|
||||
jnz _ExpInterlockedPopEntrySListResume@0
|
||||
|
||||
/* Restore registers and return */
|
||||
_ExpInterlockedPopEntrySList2:
|
||||
pop ebp
|
||||
pop ebx
|
||||
ret 4
|
||||
|
||||
|
||||
/* PSLIST_ENTRY
|
||||
* NTAPI
|
||||
* RtlInterlockedPushEntrySList(
|
||||
* IN PSLIST_HEADER ListHead,
|
||||
* IN PSLIST_ENTRY ListEntry);
|
||||
*/
|
||||
PUBLIC _RtlInterlockedPushEntrySList@8
|
||||
_RtlInterlockedPushEntrySList@8:
|
||||
|
||||
/* Save registers */
|
||||
push ebx
|
||||
push ebp
|
||||
|
||||
/* Load ListHead into ebp */
|
||||
mov ebp, [esp + 12]
|
||||
|
||||
/* Load ListEntry into ebx */
|
||||
mov ebx, [esp + 16]
|
||||
|
||||
/* Load ListHead->Next into eax */
|
||||
mov eax, [ebp]
|
||||
|
||||
/* Load ListHead->Depth and ListHead->Sequence into edx */
|
||||
mov edx, [ebp + 4]
|
||||
|
||||
_RtlpInterlockedPushEntrySListResume:
|
||||
/* Set ListEntry->Next to ListHead->Next */
|
||||
mov [ebx], eax
|
||||
|
||||
/* Copy ListHead->Depth and ListHead->Sequence and adjust them */
|
||||
lea ecx, [edx + HEX(10001)]
|
||||
|
||||
/* If [ebp] equals edx:eax, exchange it with ecx:ebx */
|
||||
LOCK cmpxchg8b qword ptr [ebp]
|
||||
|
||||
/* If not equal, retry with edx:eax, being the content of [ebp] now */
|
||||
jnz _RtlpInterlockedPushEntrySListResume
|
||||
|
||||
/* Restore registers and return */
|
||||
pop ebp
|
||||
pop ebx
|
||||
ret 8
|
||||
|
||||
|
||||
/* PSLIST_ENTRY
|
||||
* NTAPI
|
||||
* RtlInterlockedFlushSList(
|
||||
* IN PSINGLE_LIST_ENTRY ListHead);
|
||||
*/
|
||||
PUBLIC _RtlInterlockedFlushSList@4
|
||||
_RtlInterlockedFlushSList@4:
|
||||
|
||||
/* Save registers */
|
||||
push ebx
|
||||
push ebp
|
||||
|
||||
/* Clear ebx */
|
||||
xor ebx, ebx
|
||||
|
||||
/* Load ListHead into ebp */
|
||||
mov ebp, [esp + 12]
|
||||
|
||||
/* Load ListHead->Next into eax */
|
||||
mov eax, [ebp]
|
||||
|
||||
/* Load ListHead->Depth and ListHead->Sequence into edx */
|
||||
mov edx, [ebp + 4]
|
||||
|
||||
_RtlpInterlockedFlushSListResume:
|
||||
/* Check if ListHead->Next is NULL */
|
||||
or eax, eax
|
||||
jz _RtlpInterlockedFlushSListEnd
|
||||
|
||||
/* 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 qword ptr [ebp]
|
||||
|
||||
/* If not equal, retry with edx:eax, being the content of [ebp] now */
|
||||
jnz _RtlpInterlockedFlushSListResume
|
||||
|
||||
/* Restore registers and return */
|
||||
_RtlpInterlockedFlushSListEnd:
|
||||
pop ebp
|
||||
pop ebx
|
||||
ret 4
|
||||
|
||||
END
|
Loading…
Add table
Add a link
Reference in a new issue