[MS] Add messages 2200-2249 and 3502-3507 to netmsg.dll.
[reactos.git] / ntoskrnl / ex / i386 / fastinterlck_asm.S
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/ex/i386/fastinterlck_asm.S
5 * PURPOSE: FASTCALL Interlocked Functions
6 * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include <asm.inc>
12 #include <ks386.inc>
13 #include <internal/i386/asmmacro.S>
14
15 /* FUNCTIONS ****************************************************************/
16
17 .code32
18
19 /*
20 * NOTE: These functions must obey the following rules:
21 * - Acquire locks only on MP systems.
22 * - Be safe at HIGH_LEVEL (no paged access).
23 * - Preserve flags.
24 * - Disable interrups.
25 */
26
27 /*VOID
28 *FASTCALL
29 *ExInterlockedAddLargeStatistic(IN PLARGE_INTEGER Addend,
30 * IN ULONG Increment)
31 */
32 PUBLIC @ExInterlockedAddLargeStatistic@8
33 @ExInterlockedAddLargeStatistic@8:
34
35 #ifdef CONFIG_SMP
36 /* Do the addition */
37 lock add [ecx], edx
38
39 /* Check for carry bit and return */
40 jc .l1
41 ret
42
43 .l1:
44 /* Add carry */
45 lock adc dword ptr [ecx+4], 0
46 #else
47 /* Do the addition and add the carry */
48 add dword ptr [ecx], edx
49 adc dword ptr [ecx+4], 0
50 #endif
51 /* Return */
52 ret
53
54
55
56 /*PSINGLE_LIST_ENTRY
57 *FASTCALL
58 *ExInterlockedPopEntrySList(IN PSINGLE_LIST_ENTRY ListHead,
59 * IN PKSPIN_LOCK Lock)
60 */
61 PUBLIC @ExInterlockedPopEntrySList@8
62 PUBLIC @InterlockedPopEntrySList@4
63 PUBLIC _ExpInterlockedPopEntrySListResume@0
64 PUBLIC _ExpInterlockedPopEntrySListFault@0
65 PUBLIC _ExpInterlockedPopEntrySListEnd@0
66 @ExInterlockedPopEntrySList@8:
67 @InterlockedPopEntrySList@4:
68
69 /* Save registers */
70 push ebx
71 push ebp
72
73 /* Pointer to list */
74 mov ebp, ecx
75
76 /* Get sequence number and link pointer */
77 _ExpInterlockedPopEntrySListResume@0:
78 mov edx, [ebp+4]
79 mov eax, [ebp]
80
81 /* Check if the list is empty */
82 or eax, eax
83 jz .l7
84
85 /* Copy depth and adjust it */
86 lea ecx, [edx-1]
87
88 /* Get next pointer and do the exchange */
89 _ExpInterlockedPopEntrySListFault@0:
90 mov ebx, [eax]
91 _ExpInterlockedPopEntrySListEnd@0:
92 LOCK cmpxchg8b qword ptr [ebp]
93 jnz _ExpInterlockedPopEntrySListResume@0
94
95 /* Restore registers and return */
96 .l7:
97 pop ebp
98 pop ebx
99 ret
100
101 /*PSINGLE_LIST_ENTRY
102 *FASTCALL
103 *ExInterlockedPushEntrySList(IN PSINGLE_LIST_ENTRY ListHead,
104 * IN PSINGLE_LIST_ENTRY ListEntry,
105 * IN PKSPIN_LOCK Lock)
106 */
107 PUBLIC @ExInterlockedPushEntrySList@12
108 @ExInterlockedPushEntrySList@12:
109
110 /* So we can fall through below */
111 pop [esp]
112
113 PUBLIC @InterlockedPushEntrySList@8
114 @InterlockedPushEntrySList@8:
115
116 /* Save registers */
117 push ebx
118 push ebp
119
120 /* Pointer to list */
121 mov ebp, ecx
122 mov ebx, edx
123
124 /* Get sequence number and link pointer */
125 mov edx, [ebp+4]
126 mov eax, [ebp]
127
128 .l8:
129 /* Set link pointer */
130 mov [ebx], eax
131
132 /* Copy sequence number and adjust it */
133 lea ecx, [edx + HEX(10001)]
134
135 /* Do the exchange */
136 LOCK cmpxchg8b qword ptr [ebp]
137 jnz .l8
138
139 /* Restore registers and return */
140 pop ebp
141 pop ebx
142 ret
143
144 /*PSINGLE_LIST_ENTRY
145 *FASTCALL
146 *ExInterlockedFlushSList(IN PSINGLE_LIST_ENTRY ListHead)
147 */
148 PUBLIC @ExInterlockedFlushSList@4
149 @ExInterlockedFlushSList@4:
150
151 /* Save registers */
152 push ebx
153 push ebp
154
155 /* Clear ebx */
156 xor ebx, ebx
157
158 /* Pointer to list */
159 mov ebp, ecx
160
161 /* Get sequence number and link pointer */
162 mov edx, [ebp+4]
163 mov eax, [ebp]
164
165 .l9:
166 /* Check if the list is empty */
167 or eax, eax
168 jz .l10
169
170 /* Clear depth and pointer */
171 mov ecx, edx
172 mov cx, bx
173
174 /* Do the exchange */
175 LOCK cmpxchg8b qword ptr [ebp]
176 jnz .l9
177
178 /* Restore registers and return */
179 .l10:
180 pop ebp
181 pop ebx
182 ret
183
184 END
185 /* EOF */