Rev 897 | Rev 1066 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 897 | Rev 928 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | 7 | ||
8 | $Revision: 897 $ |
8 | $Revision: 928 $ |
9 | 9 | ||
10 | 10 | ||
11 | align 4 |
11 | align 4 |
12 | proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword |
12 | proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword |
13 | push ebx |
13 | push ebx |
14 | mov eax, [phis_addr] |
14 | mov eax, [phis_addr] |
15 | and eax, not 0xFFF |
15 | and eax, not 0xFFF |
16 | or eax, [flags] |
16 | or eax, [flags] |
17 | mov ebx, [lin_addr] |
17 | mov ebx, [lin_addr] |
18 | shr ebx, 12 |
18 | shr ebx, 12 |
19 | mov [page_tabs+ebx*4], eax |
19 | mov [page_tabs+ebx*4], eax |
20 | mov eax, [lin_addr] |
20 | mov eax, [lin_addr] |
21 | invlpg [eax] |
21 | invlpg [eax] |
22 | pop ebx |
22 | pop ebx |
23 | ret |
23 | ret |
24 | endp |
24 | endp |
25 | 25 | ||
26 | align 4 |
26 | align 4 |
27 | map_space: ;not implemented |
27 | map_space: ;not implemented |
28 | 28 | ||
29 | 29 | ||
30 | ret |
30 | ret |
31 | 31 | ||
32 | align 4 |
32 | align 4 |
33 | _MapIoMem: |
33 | _MapIoMem: |
34 | proc map_io_mem stdcall, base:dword, size:dword, flags:dword |
34 | proc map_io_mem stdcall, base:dword, size:dword, flags:dword |
35 | 35 | ||
36 | push edi |
36 | push edi |
37 | 37 | ||
38 | mov ecx, [size] |
38 | mov ecx, [size] |
39 | add ecx, 4095 |
39 | add ecx, 4095 |
40 | and ecx, -4096 |
40 | and ecx, -4096 |
41 | mov [size], ecx |
41 | mov [size], ecx |
42 | xor edx, edx |
42 | xor edx, edx |
43 | call @mem_alloc@8 |
43 | call @mem_alloc@8 |
44 | test eax, eax |
44 | test eax, eax |
45 | jz .fail |
45 | jz .fail |
46 | 46 | ||
47 | mov edx, eax |
47 | mov edx, eax |
48 | mov edi, eax |
48 | mov edi, eax |
49 | shr edi, 10 |
49 | shr edi, 10 |
50 | add edi, page_tabs |
50 | add edi, page_tabs |
51 | 51 | ||
52 | mov ecx, [size] |
52 | mov ecx, [size] |
53 | shr ecx, 12 |
53 | shr ecx, 12 |
54 | mov eax, [base] |
54 | mov eax, [base] |
55 | and eax, -4096 |
55 | and eax, -4096 |
56 | or eax, [flags] |
56 | or eax, [flags] |
57 | @@: |
57 | @@: |
58 | stosd |
58 | stosd |
59 | add eax, 0x1000 |
59 | add eax, 0x1000 |
60 | loop @B |
60 | loop @B |
61 | 61 | ||
62 | mov eax, [base] |
62 | mov eax, [base] |
63 | and eax, 4095 |
63 | and eax, 4095 |
64 | add eax, edx |
64 | add eax, edx |
65 | .fail: |
65 | .fail: |
66 | pop edi |
66 | pop edi |
67 | ret |
67 | ret |
68 | endp |
68 | endp |
69 | 69 | ||
70 | ; param |
70 | ; param |
71 | ; eax= page base + page flags |
71 | ; eax= page base + page flags |
72 | ; ebx= linear address |
72 | ; ebx= linear address |
73 | ; ecx= count |
73 | ; ecx= count |
74 | 74 | ||
75 | align 4 |
75 | align 4 |
76 | _CommitPages: |
76 | _CommitPages: |
77 | commit_pages: |
77 | commit_pages: |
78 | push edi |
78 | push edi |
79 | test ecx, ecx |
79 | test ecx, ecx |
80 | jz .fail |
80 | jz .fail |
81 | 81 | ||
82 | mov edi, ebx |
82 | mov edi, ebx |
83 | mov ebx, pg_data.pg_mutex |
83 | mov ebx, pg_data.pg_mutex |
84 | call wait_mutex ;ebx |
84 | call wait_mutex ;ebx |
85 | 85 | ||
86 | mov edx, 0x1000 |
86 | mov edx, 0x1000 |
87 | mov ebx, edi |
87 | mov ebx, edi |
88 | shr ebx, 12 |
88 | shr ebx, 12 |
89 | @@: |
89 | @@: |
90 | mov [page_tabs+ebx*4], eax |
90 | mov [page_tabs+ebx*4], eax |
91 | ; push eax |
91 | ; push eax |
92 | ; invlpg [edi] |
92 | ; invlpg [edi] |
93 | ; pop eax |
93 | ; pop eax |
94 | add edi, edx |
94 | add edi, edx |
95 | add eax, edx |
95 | add eax, edx |
96 | inc ebx |
96 | inc ebx |
97 | dec ecx |
97 | dec ecx |
98 | jnz @B |
98 | jnz @B |
99 | mov [pg_data.pg_mutex],ecx |
99 | mov [pg_data.pg_mutex],ecx |
100 | .fail: |
100 | .fail: |
101 | pop edi |
101 | pop edi |
102 | ret |
102 | ret |
103 | 103 | ||
104 | 104 | ||
105 | ; param |
105 | ; param |
106 | ; eax= base |
106 | ; eax= base |
107 | ; ecx= count |
107 | ; ecx= count |
108 | 108 | ||
109 | align 4 |
109 | align 4 |
110 | release_pages: |
110 | release_pages: |
111 | 111 | ||
112 | pushad |
112 | pushad |
113 | mov ebx, pg_data.pg_mutex |
113 | mov ebx, pg_data.pg_mutex |
114 | call wait_mutex ;ebx |
114 | call wait_mutex ;ebx |
115 | 115 | ||
116 | mov esi, eax |
116 | mov esi, eax |
117 | mov edi, eax |
117 | mov edi, eax |
118 | 118 | ||
119 | shr esi, 10 |
119 | shr esi, 10 |
120 | add esi, page_tabs |
120 | add esi, page_tabs |
121 | 121 | ||
122 | @@: |
122 | @@: |
123 | xor eax, eax |
123 | xor eax, eax |
124 | xchg eax, [esi] |
124 | xchg eax, [esi] |
125 | push eax |
125 | push eax |
126 | invlpg [edi] |
126 | invlpg [edi] |
127 | pop eax |
127 | pop eax |
128 | .next: |
128 | .next: |
129 | add edi, 0x1000 |
129 | add edi, 0x1000 |
130 | add esi, 4 |
130 | add esi, 4 |
131 | dec ecx |
131 | dec ecx |
132 | jnz @B |
132 | jnz @B |
133 | and [pg_data.pg_mutex],0 |
133 | and [pg_data.pg_mutex],0 |
134 | popad |
134 | popad |
135 | ret |
135 | ret |
136 | 136 | ||
137 | ; param |
137 | ; param |
138 | ; eax= base |
138 | ; eax= base |
139 | ; ecx= count |
139 | ; ecx= count |
140 | 140 | ||
141 | align 4 |
141 | align 4 |
142 | _UnmapPages: |
142 | _UnmapPages: |
143 | unmap_pages: |
143 | unmap_pages: |
144 | 144 | ||
145 | push edi |
145 | push edi |
146 | 146 | ||
147 | mov edi, eax |
147 | mov edi, eax |
148 | mov edx, eax |
148 | mov edx, eax |
149 | 149 | ||
150 | shr edi, 10 |
150 | shr edi, 10 |
151 | add edi, page_tabs |
151 | add edi, page_tabs |
152 | 152 | ||
153 | xor eax, eax |
153 | xor eax, eax |
154 | @@: |
154 | @@: |
155 | stosd |
155 | stosd |
156 | invlpg [edx] |
156 | invlpg [edx] |
157 | add edx, 0x1000 |
157 | add edx, 0x1000 |
158 | loop @b |
158 | loop @b |
159 | 159 | ||
160 | pop edi |
160 | pop edi |
161 | ret |
161 | ret |
162 | 162 | ||
163 | 163 | ||
164 | align 4 |
164 | align 4 |
165 | proc map_page_table stdcall, lin_addr:dword, phis_addr:dword |
165 | proc map_page_table stdcall, lin_addr:dword, phis_addr:dword |
166 | push ebx |
166 | push ebx |
167 | mov ebx, [lin_addr] |
167 | mov ebx, [lin_addr] |
168 | shr ebx, 22 |
168 | shr ebx, 22 |
169 | mov eax, [phis_addr] |
169 | mov eax, [phis_addr] |
170 | and eax, not 0xFFF |
170 | and eax, not 0xFFF |
171 | or eax, PG_UW ;+PG_NOCACHE |
171 | or eax, PG_UW ;+PG_NOCACHE |
172 | mov dword [master_tab+ebx*4], eax |
172 | mov dword [master_tab+ebx*4], eax |
173 | mov eax, [lin_addr] |
173 | mov eax, [lin_addr] |
174 | shr eax, 10 |
174 | shr eax, 10 |
175 | add eax, page_tabs |
175 | add eax, page_tabs |
176 | invlpg [eax] |
176 | invlpg [eax] |
177 | pop ebx |
177 | pop ebx |
178 | ret |
178 | ret |
179 | endp |
179 | endp |
180 | - | ||
181 | align 4 |
- | |
182 | proc init_LFB |
- | |
183 | locals |
- | |
184 | pg_count dd ? |
- | |
185 | endl |
- | |
186 | - | ||
187 | cmp dword [LFBAddress], -1 |
- | |
188 | jne @f |
- | |
189 | mov [BOOT_VAR+0x901c],byte 2 |
- | |
190 | mov ecx, 0x280000 |
- | |
191 | mov edx, PG_SW |
- | |
192 | call @mem_alloc@8 |
- | |
193 | mov [LFBAddress], eax |
- | |
194 | ret |
- | |
195 | @@: |
- | |
196 | test [SCR_MODE],word 0100000000000000b |
- | |
197 | jnz @f |
- | |
198 | mov [BOOT_VAR+0x901c],byte 2 |
- | |
199 | ret |
- | |
200 | @@: |
- | |
201 | call init_mtrr |
- | |
202 | - | ||
203 | mov eax, [LFBAddress] |
- | |
204 | or eax, PG_LARGE+PG_UW |
- | |
205 | mov [_sys_pdbr+(LFB_BASE shr 20)], eax |
- | |
206 | add eax, 0x00400000 |
- | |
207 | mov [_sys_pdbr+4+(LFB_BASE shr 20)], eax |
- | |
208 | - | ||
209 | mov dword [exp_lfb+4], LFB_BASE |
- | |
210 | - | ||
211 | bt [cpu_caps], CAPS_PGE |
- | |
212 | jnc @F |
- | |
213 | or dword [_sys_pdbr+(LFB_BASE shr 20)], PG_GLOBAL |
- | |
214 | @@: |
- | |
215 | mov dword [LFBAddress], LFB_BASE |
- | |
216 | mov eax, cr3 ;flush TLB |
- | |
217 | mov cr3, eax |
- | |
218 | - | ||
219 | ret |
- | |
220 | endp |
180 | |
221 | 181 | ||
222 | align 4 |
182 | align 4 |
223 | proc new_mem_resize stdcall, new_size:dword |
183 | proc new_mem_resize stdcall, new_size:dword |
224 | 184 | ||
225 | mov ebx, pg_data.pg_mutex |
185 | mov ebx, pg_data.pg_mutex |
226 | call wait_mutex ;ebx |
186 | call wait_mutex ;ebx |
227 | 187 | ||
228 | mov edi, [new_size] |
188 | mov edi, [new_size] |
229 | add edi,4095 |
189 | add edi,4095 |
230 | and edi,not 4095 |
190 | and edi,not 4095 |
231 | mov [new_size], edi |
191 | mov [new_size], edi |
232 | 192 | ||
233 | mov edx,[current_slot] |
193 | mov edx,[current_slot] |
234 | cmp [edx+APPDATA.heap_base],0 |
194 | cmp [edx+APPDATA.heap_base],0 |
235 | jne .exit |
195 | jne .exit |
236 | 196 | ||
237 | mov esi, [edx+APPDATA.mem_size] |
197 | mov esi, [edx+APPDATA.mem_size] |
238 | add esi, 4095 |
198 | add esi, 4095 |
239 | and esi, not 4095 |
199 | and esi, not 4095 |
240 | 200 | ||
241 | cmp edi, esi |
201 | cmp edi, esi |
242 | jae .expand |
202 | jae .expand |
243 | 203 | ||
244 | shr edi, 12 |
204 | shr edi, 12 |
245 | shr esi, 12 |
205 | shr esi, 12 |
246 | @@: |
206 | @@: |
247 | mov ecx, [app_page_tabs+edi*4] |
207 | mov ecx, [app_page_tabs+edi*4] |
248 | test ecx, 1 |
208 | test ecx, 1 |
249 | jz .next |
209 | jz .next |
250 | 210 | ||
251 | mov dword [app_page_tabs+edi*4], 2 |
211 | mov dword [app_page_tabs+edi*4], 2 |
252 | mov ebx, edi |
212 | mov ebx, edi |
253 | shl ebx, 12 |
213 | shl ebx, 12 |
254 | invlpg [ebx] |
214 | invlpg [ebx] |
255 | call @core_free@4 |
215 | call @core_free@4 |
256 | .next: |
216 | .next: |
257 | add edi, 1 |
217 | add edi, 1 |
258 | cmp edi, esi |
218 | cmp edi, esi |
259 | jb @B |
219 | jb @B |
260 | 220 | ||
261 | .update_size: |
221 | .update_size: |
262 | mov ebx, [new_size] |
222 | mov ebx, [new_size] |
263 | call update_mem_size |
223 | call update_mem_size |
264 | 224 | ||
265 | xor eax, eax |
225 | xor eax, eax |
266 | dec [pg_data.pg_mutex] |
226 | dec [pg_data.pg_mutex] |
267 | ret |
227 | ret |
268 | .expand: |
228 | .expand: |
269 | 229 | ||
270 | push esi |
230 | push esi |
271 | push edi |
231 | push edi |
272 | 232 | ||
273 | add edi, 0x3FFFFF |
233 | add edi, 0x3FFFFF |
274 | and edi, not(0x3FFFFF) |
234 | and edi, not(0x3FFFFF) |
275 | add esi, 0x3FFFFF |
235 | add esi, 0x3FFFFF |
276 | and esi, not(0x3FFFFF) |
236 | and esi, not(0x3FFFFF) |
277 | 237 | ||
278 | cmp esi, edi |
238 | cmp esi, edi |
279 | jae .grow |
239 | jae .grow |
280 | 240 | ||
281 | xchg esi, edi |
241 | xchg esi, edi |
282 | 242 | ||
283 | @@: |
243 | @@: |
284 | call _alloc_page |
244 | call _alloc_page |
285 | test eax, eax |
245 | test eax, eax |
286 | jz .exit |
246 | jz .exit |
287 | 247 | ||
288 | stdcall map_page_table, edi, eax |
248 | stdcall map_page_table, edi, eax |
289 | 249 | ||
290 | push edi |
250 | push edi |
291 | shr edi, 10 |
251 | shr edi, 10 |
292 | add edi, page_tabs |
252 | add edi, page_tabs |
293 | mov ecx, 1024 |
253 | mov ecx, 1024 |
294 | xor eax, eax |
254 | xor eax, eax |
295 | cld |
255 | cld |
296 | rep stosd |
256 | rep stosd |
297 | pop edi |
257 | pop edi |
298 | 258 | ||
299 | add edi, 0x00400000 |
259 | add edi, 0x00400000 |
300 | cmp edi, esi |
260 | cmp edi, esi |
301 | jb @B |
261 | jb @B |
302 | .grow: |
262 | .grow: |
303 | pop edi |
263 | pop edi |
304 | pop esi |
264 | pop esi |
305 | @@: |
265 | @@: |
306 | call _alloc_page |
266 | call _alloc_page |
307 | test eax, eax |
267 | test eax, eax |
308 | jz .exit |
268 | jz .exit |
309 | stdcall map_page,esi,eax,dword PG_UW |
269 | stdcall map_page,esi,eax,dword PG_UW |
310 | 270 | ||
311 | push edi |
271 | push edi |
312 | mov edi, esi |
272 | mov edi, esi |
313 | xor eax, eax |
273 | xor eax, eax |
314 | mov ecx, 1024 |
274 | mov ecx, 1024 |
315 | cld |
275 | cld |
316 | rep stosd |
276 | rep stosd |
317 | pop edi |
277 | pop edi |
318 | 278 | ||
319 | add esi, 0x1000 |
279 | add esi, 0x1000 |
320 | cmp esi, edi |
280 | cmp esi, edi |
321 | jb @B |
281 | jb @B |
322 | 282 | ||
323 | jmp .update_size |
283 | jmp .update_size |
324 | .exit: |
284 | .exit: |
325 | xor eax, eax |
285 | xor eax, eax |
326 | inc eax |
286 | inc eax |
327 | dec [pg_data.pg_mutex] |
287 | dec [pg_data.pg_mutex] |
328 | ret |
288 | ret |
329 | endp |
289 | endp |
330 | 290 | ||
331 | update_mem_size: |
291 | update_mem_size: |
332 | ; in: edx = slot base |
292 | ; in: edx = slot base |
333 | ; ebx = new memory size |
293 | ; ebx = new memory size |
334 | ; destroys eax,ecx,edx |
294 | ; destroys eax,ecx,edx |
335 | 295 | ||
336 | mov [APPDATA.mem_size+edx],ebx |
296 | mov [APPDATA.mem_size+edx],ebx |
337 | ;search threads and update |
297 | ;search threads and update |
338 | ;application memory size infomation |
298 | ;application memory size infomation |
339 | mov ecx,[APPDATA.dir_table+edx] |
299 | mov ecx,[APPDATA.dir_table+edx] |
340 | mov eax,2 |
300 | mov eax,2 |
341 | 301 | ||
342 | .search_threads: |
302 | .search_threads: |
343 | ;eax = current slot |
303 | ;eax = current slot |
344 | ;ebx = new memory size |
304 | ;ebx = new memory size |
345 | ;ecx = page directory |
305 | ;ecx = page directory |
346 | cmp eax,[TASK_COUNT] |
306 | cmp eax,[TASK_COUNT] |
347 | jg .search_threads_end |
307 | jg .search_threads_end |
348 | mov edx,eax |
308 | mov edx,eax |
349 | shl edx,5 |
309 | shl edx,5 |
350 | cmp word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty? |
310 | cmp word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty? |
351 | jz .search_threads_next |
311 | jz .search_threads_next |
352 | shl edx,3 |
312 | shl edx,3 |
353 | cmp [SLOT_BASE+edx+APPDATA.dir_table],ecx ;if it is our thread? |
313 | cmp [SLOT_BASE+edx+APPDATA.dir_table],ecx ;if it is our thread? |
354 | jnz .search_threads_next |
314 | jnz .search_threads_next |
355 | mov [SLOT_BASE+edx+APPDATA.mem_size],ebx ;update memory size |
315 | mov [SLOT_BASE+edx+APPDATA.mem_size],ebx ;update memory size |
356 | .search_threads_next: |
316 | .search_threads_next: |
357 | inc eax |
317 | inc eax |
358 | jmp .search_threads |
318 | jmp .search_threads |
359 | .search_threads_end: |
319 | .search_threads_end: |
360 | ret |
320 | ret |
361 | 321 | ||
362 | ; param |
322 | ; param |
363 | ; eax= linear address |
323 | ; eax= linear address |
364 | ; |
324 | ; |
365 | ; retval |
325 | ; retval |
366 | ; eax= phisical page address |
326 | ; eax= phisical page address |
367 | 327 | ||
368 | align 4 |
328 | align 4 |
369 | _GetPgAddr: |
329 | _GetPgAddr: |
370 | get_pg_addr: |
330 | get_pg_addr: |
371 | 331 | ||
372 | cmp eax, OS_BASE |
332 | cmp eax, OS_BASE |
373 | jae @F |
333 | jae @F |
374 | 334 | ||
375 | shr eax, 12 |
335 | shr eax, 12 |
376 | mov eax, [page_tabs+eax*4] |
336 | mov eax, [page_tabs+eax*4] |
377 | and eax, 0xFFFFF000 |
337 | and eax, 0xFFFFF000 |
378 | ret |
338 | ret |
379 | @@: |
339 | @@: |
380 | sub eax, OS_BASE |
340 | sub eax, OS_BASE |
381 | and eax, 0xFFFFF000 |
341 | and eax, 0xFFFFF000 |
382 | ret |
342 | ret |
383 | 343 | ||
384 | align 4 |
344 | align 4 |
385 | proc page_fault_handler |
345 | proc page_fault_handler |
386 | 346 | ||
387 | test byte [esp+12+2], 2 |
347 | test byte [esp+12+2], 2 |
388 | jnz v86_page_fault |
348 | jnz v86_page_fault |
389 | 349 | ||
390 | .err_code equ ebp+32 |
350 | .err_code equ ebp+32 |
391 | .err_addr equ ebp-4 |
351 | .err_addr equ ebp-4 |
392 | 352 | ||
393 | pushad |
353 | pushad |
394 | mov ebp, esp |
354 | mov ebp, esp |
395 | mov eax, cr2 |
355 | mov eax, cr2 |
396 | push eax |
356 | push eax |
397 | 357 | ||
398 | mov ax, app_data |
358 | mov ax, sel_app_data |
399 | mov ds, ax |
359 | mov ds, ax |
400 | mov es, ax |
360 | mov es, ax |
401 | 361 | ||
402 | inc [pg_data.pages_faults] |
362 | inc [pg_data.pages_faults] |
403 | 363 | ||
404 | mov ebx, [.err_addr] |
364 | mov ebx, [.err_addr] |
405 | mov eax, [.err_code] |
365 | mov eax, [.err_code] |
406 | 366 | ||
407 | cmp ebx, HEAP_BASE |
367 | cmp ebx, HEAP_BASE |
408 | jb .user_space ;ñòðà Ãèöà â ïà ìÿòè ïðèëîæåÃèÿ ; |
368 | jb .user_space ;ñòðà Ãèöà â ïà ìÿòè ïðèëîæåÃèÿ ; |
409 | - | ||
410 | cmp ebx, LFB_BASE |
- | |
411 | jb .kernel_heap |
- | |
412 | 369 | ||
413 | cmp ebx, page_tabs |
370 | cmp ebx, page_tabs |
414 | jb .lfb |
371 | jb .kernel_heap |
415 | 372 | ||
416 | cmp ebx, heap_tabs |
373 | cmp ebx, heap_tabs |
417 | jb .user_tabs |
374 | jb .user_tabs |
418 | 375 | ||
419 | cmp ebx, OS_BASE |
376 | cmp ebx, LFB_BASE |
- | 377 | jb .heap_tab |
|
- | 378 | ||
420 | jb .heap_tab |
379 | cmp ebx, OS_BASE |
421 | 380 | jb .lfb |
|
422 | 381 | ||
423 | ; cmp ebx, kernel_tabs |
382 | ; cmp ebx, kernel_tabs |
424 | ; jb .alloc;.app_tabs ;òà áëèöû ñòðà Ãèö ïðèëîæåÃèÿ ; |
383 | ; jb .alloc;.app_tabs ;òà áëèöû ñòðà Ãèö ïðèëîæåÃèÿ ; |
425 | ;ïðîñòî ñîçäà äèì îäÃó |
384 | ;ïðîñòî ñîçäà äèì îäÃó |
426 | - | ||
427 | - | ||
428 | 385 | ||
429 | .lfb: |
386 | .lfb: |
430 | shr ebx, 22 |
387 | shr ebx, 22 |
431 | mov edx, [_sys_pdbr + ebx*4] |
388 | mov edx, [_sys_pdbr + ebx*4] |
432 | mov [master_tab + ebx*4], edx |
389 | mov [master_tab + ebx*4], edx |
433 | jmp .exit |
390 | jmp .exit |
434 | 391 | ||
435 | .user_tabs: |
392 | .user_tabs: |
436 | shr ebx, 12 |
393 | shr ebx, 12 |
437 | and ebx, 0x3FF |
394 | and ebx, 0x3FF |
438 | mov edx, [master_tab + ebx*4] |
395 | mov edx, [master_tab + ebx*4] |
439 | test edx, PG_MAP |
396 | test edx, PG_MAP |
440 | jnz .fail |
397 | jnz .fail |
441 | 398 | ||
442 | call _alloc_page |
399 | call _alloc_page |
443 | test eax, eax |
400 | test eax, eax |
444 | jz .fail |
401 | jz .fail |
445 | 402 | ||
446 | lea edx, [eax + PG_UW] |
403 | lea edx, [eax + PG_UW] |
447 | lea edi, [eax + OS_BASE] |
404 | lea edi, [eax + OS_BASE] |
448 | mov ecx, 1024 |
405 | mov ecx, 1024 |
449 | xor eax, eax |
406 | xor eax, eax |
450 | cld |
407 | cld |
451 | rep stosd |
408 | rep stosd |
452 | 409 | ||
453 | mov [master_tab + ebx*4], edx |
410 | mov [master_tab + ebx*4], edx |
454 | jmp .exit |
411 | jmp .exit |
455 | 412 | ||
456 | .heap_tab: |
413 | .heap_tab: |
457 | shr ebx, 12 |
414 | shr ebx, 12 |
458 | and ebx, 0x3FF |
415 | and ebx, 0x3FF |
459 | mov edx, [master_tab + ebx*4] |
416 | mov edx, [master_tab + ebx*4] |
460 | test edx, PG_MAP |
417 | test edx, PG_MAP |
461 | jz .check_ptab ;òà áëèöà ñòðà Ãèö ÃÃ¥ ñîçäà Ãà |
418 | jz .check_ptab ;òà áëèöà ñòðà Ãèö ÃÃ¥ ñîçäà Ãà |
462 | 419 | ||
463 | jmp .fail |
420 | jmp .fail |
464 | 421 | ||
465 | align 4 |
422 | align 4 |
466 | .kernel_heap: |
423 | .kernel_heap: |
467 | 424 | ||
468 | shr ebx, 22 |
425 | shr ebx, 22 |
469 | mov edx, [master_tab + ebx*4] |
426 | mov edx, [master_tab + ebx*4] |
470 | 427 | ||
471 | test edx, PG_MAP |
428 | test edx, PG_MAP |
472 | jz .check_ptab ;òà áëèöà ñòðà Ãèö ÃÃ¥ ñîçäà Ãà |
429 | jz .check_ptab ;òà áëèöà ñòðà Ãèö ÃÃ¥ ñîçäà Ãà |
473 | 430 | ||
474 | jmp .exit |
431 | jmp .exit |
475 | 432 | ||
476 | .check_ptab: |
433 | .check_ptab: |
477 | mov edx, [_sys_pdbr + ebx*4] |
434 | mov edx, [_sys_pdbr + ebx*4] |
478 | test edx, PG_MAP |
435 | test edx, PG_MAP |
479 | jnz @F |
436 | jnz @F |
480 | 437 | ||
481 | xor ecx, ecx |
438 | xor ecx, ecx |
482 | call @core_alloc@4 |
439 | call @core_alloc@4 |
483 | test eax, eax |
440 | test eax, eax |
484 | jz .fail |
441 | jz .fail |
485 | 442 | ||
486 | lea edx, [eax + PG_UW] |
443 | lea edx, [eax + PG_UW] |
487 | lea edi, [eax + OS_BASE] |
444 | lea edi, [eax + OS_BASE] |
488 | mov ecx, 1024 |
445 | mov ecx, 1024 |
489 | xor eax, eax |
446 | xor eax, eax |
490 | cld |
447 | cld |
491 | rep stosd |
448 | rep stosd |
492 | 449 | ||
493 | mov [_sys_pdbr + ebx*4], edx |
450 | mov [_sys_pdbr + ebx*4], edx |
494 | @@: |
451 | @@: |
495 | mov [master_tab + ebx*4], edx |
452 | mov [master_tab + ebx*4], edx |
496 | jmp .exit |
453 | jmp .exit |
497 | 454 | ||
498 | align 4 |
455 | align 4 |
499 | .user_space: |
456 | .user_space: |
500 | test eax, PG_MAP |
457 | test eax, PG_MAP |
501 | jnz .err_access ;Ñòðà Ãèöà ïðèñóòñòâóåò |
458 | jnz .err_access ;Ñòðà Ãèöà ïðèñóòñòâóåò |
502 | ;Îøèáêà äîñòóïà ? |
459 | ;Îøèáêà äîñòóïà ? |
503 | 460 | ||
504 | shr ebx, 12 |
461 | shr ebx, 12 |
505 | mov ecx, ebx |
462 | mov ecx, ebx |
506 | shr ecx, 10 |
463 | shr ecx, 10 |
507 | mov edx, [master_tab + ecx*4] |
464 | mov edx, [master_tab + ecx*4] |
508 | test edx, PG_MAP |
465 | test edx, PG_MAP |
509 | jz .fail ;òà áëèöà ñòðà Ãèö ÃÃ¥ ñîçäà Ãà |
466 | jz .fail ;òà áëèöà ñòðà Ãèö ÃÃ¥ ñîçäà Ãà |
510 | ;ÃåâåðÃûé à äðåñ â ïðîãðà ììå |
467 | ;ÃåâåðÃûé à äðåñ â ïðîãðà ììå |
511 | 468 | ||
512 | mov eax, [page_tabs+ebx*4] |
469 | mov eax, [page_tabs+ebx*4] |
513 | test eax, 2 |
470 | test eax, 2 |
514 | jz .fail ;à äðåñ ÃÃ¥ çà ðåçåðâèðîâà à äëÿ ; |
471 | jz .fail ;à äðåñ ÃÃ¥ çà ðåçåðâèðîâà à äëÿ ; |
515 | ;èñïîëüçîâà Ãèÿ. Îøèáêà |
472 | ;èñïîëüçîâà Ãèÿ. Îøèáêà |
516 | .alloc: |
473 | .alloc: |
517 | call _alloc_page |
474 | call _alloc_page |
518 | test eax, eax |
475 | test eax, eax |
519 | jz .fail |
476 | jz .fail |
520 | 477 | ||
521 | stdcall map_page,[ebp-4],eax,dword PG_UW |
478 | stdcall map_page,[ebp-4],eax,dword PG_UW |
522 | 479 | ||
523 | mov edi, [ebp-4] |
480 | mov edi, [ebp-4] |
524 | and edi, 0xFFFFF000 |
481 | and edi, 0xFFFFF000 |
525 | mov ecx, 1024 |
482 | mov ecx, 1024 |
526 | xor eax, eax |
483 | xor eax, eax |
527 | cld |
484 | cld |
528 | rep stosd |
485 | rep stosd |
529 | .exit: |
486 | .exit: |
530 | mov esp, ebp |
487 | mov esp, ebp |
531 | popad |
488 | popad |
532 | add esp, 4 |
489 | add esp, 4 |
533 | iretd |
490 | iretd |
534 | 491 | ||
535 | .err_access: |
492 | .err_access: |
536 | ;Ãèêîãäà ÃÃ¥ ïðîèñõîäèò |
493 | ;Ãèêîãäà ÃÃ¥ ïðîèñõîäèò |
537 | jmp .fail |
494 | jmp .fail |
538 | 495 | ||
539 | .kernel_space: |
496 | .kernel_space: |
540 | test eax, PG_MAP |
497 | test eax, PG_MAP |
541 | jz .fail ;ñòðà Ãèöà ÃÃ¥ ïðèñóòñòâóåò |
498 | jz .fail ;ñòðà Ãèöà ÃÃ¥ ïðèñóòñòâóåò |
542 | 499 | ||
543 | test eax, 4 ;U/S |
500 | test eax, 4 ;U/S |
544 | jnz .fail ;ïðèëîæåÃèå îáðà òèëîñü ê ïà ìÿòè |
501 | jnz .fail ;ïðèëîæåÃèå îáðà òèëîñü ê ïà ìÿòè |
545 | ;ÿäðà |
502 | ;ÿäðà |
546 | test eax, 8 |
503 | test eax, 8 |
547 | jnz .fail ;óñòà Ãîâëåà çà ðåçåðâèðîâà ÃÃûé áèò |
504 | jnz .fail ;óñòà Ãîâëåà çà ðåçåðâèðîâà ÃÃûé áèò |
548 | ;â òà áëèöà õ ñòðà Ãèö. äîáà âëåÃî â P4/Xeon |
505 | ;â òà áëèöà õ ñòðà Ãèö. äîáà âëåÃî â P4/Xeon |
549 | 506 | ||
550 | ;ïîïûòêà çà ïèñè â çà ùèù¸ÃÃóþ ñòðà Ãèöó ÿäðà |
507 | ;ïîïûòêà çà ïèñè â çà ùèù¸ÃÃóþ ñòðà Ãèöó ÿäðà |
551 | 508 | ||
552 | cmp ebx, tss._io_map_0 |
509 | cmp ebx, tss._io_map_0 |
553 | jb .fail |
510 | jb .fail |
554 | 511 | ||
555 | cmp ebx, tss._io_map_0+8192 |
512 | cmp ebx, tss._io_map_0+8192 |
556 | jae .fail |
513 | jae .fail |
557 | 514 | ||
558 | ; io permission map |
515 | ; io permission map |
559 | ; copy-on-write protection |
516 | ; copy-on-write protection |
560 | 517 | ||
561 | call _alloc_page |
518 | call _alloc_page |
562 | test eax, eax |
519 | test eax, eax |
563 | jz .fail |
520 | jz .fail |
564 | 521 | ||
565 | push eax |
522 | push eax |
566 | stdcall map_page,[ebp-4],eax,dword PG_SW |
523 | stdcall map_page,[ebp-4],eax,dword PG_SW |
567 | pop eax |
524 | pop eax |
568 | mov edi, [.err_addr] |
525 | mov edi, [.err_addr] |
569 | and edi, -4096 |
526 | and edi, -4096 |
570 | lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0 |
527 | lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0 |
571 | 528 | ||
572 | mov ebx, esi |
529 | mov ebx, esi |
573 | shr ebx, 12 |
530 | shr ebx, 12 |
574 | mov edx, [current_slot] |
531 | mov edx, [current_slot] |
575 | or eax, PG_SW |
532 | or eax, PG_SW |
576 | mov [edx+APPDATA.io_map+ebx*4], eax |
533 | mov [edx+APPDATA.io_map+ebx*4], eax |
577 | 534 | ||
578 | add esi, [default_io_map] |
535 | add esi, [default_io_map] |
579 | mov ecx, 4096/4 |
536 | mov ecx, 4096/4 |
580 | cld |
537 | cld |
581 | rep movsd |
538 | rep movsd |
582 | jmp .exit |
539 | jmp .exit |
583 | 540 | ||
584 | 541 | ||
585 | ;ÃÃ¥ îáðà áà òûâà åì. Îøèáêà |
542 | ;ÃÃ¥ îáðà áà òûâà åì. Îøèáêà |
586 | 543 | ||
587 | .fail: |
544 | .fail: |
588 | mov esp, ebp |
545 | mov esp, ebp |
589 | popad |
546 | popad |
590 | add esp, 4 |
547 | add esp, 4 |
591 | 548 | ||
592 | ; iretd |
549 | ; iretd |
593 | 550 | ||
594 | save_ring3_context ;debugger support |
551 | save_ring3_context ;debugger support |
595 | 552 | ||
596 | mov bl, 14 |
553 | mov bl, 14 |
597 | jmp exc_c |
554 | jmp exc_c |
598 | iretd |
555 | iretd |
599 | endp |
556 | endp |
600 | 557 | ||
601 | align 4 |
558 | align 4 |
602 | proc map_mem stdcall, lin_addr:dword,pdir:dword,\ |
559 | proc map_mem stdcall, lin_addr:dword,pdir:dword,\ |
603 | ofs:dword,buf_size:dword |
560 | ofs:dword,buf_size:dword |
604 | mov eax, [buf_size] |
561 | mov eax, [buf_size] |
605 | test eax, eax |
562 | test eax, eax |
606 | jz .exit |
563 | jz .exit |
607 | 564 | ||
608 | mov eax, [pdir] |
565 | mov eax, [pdir] |
609 | and eax, 0xFFFFF000 |
566 | and eax, 0xFFFFF000 |
610 | 567 | ||
611 | stdcall map_page,[ipc_pdir],eax,PG_UW |
568 | stdcall map_page,[ipc_pdir],eax,PG_UW |
612 | mov ebx, [ofs] |
569 | mov ebx, [ofs] |
613 | shr ebx, 22 |
570 | shr ebx, 22 |
614 | mov esi, [ipc_pdir] |
571 | mov esi, [ipc_pdir] |
615 | mov edi, [ipc_ptab] |
572 | mov edi, [ipc_ptab] |
616 | mov eax, [esi+ebx*4] |
573 | mov eax, [esi+ebx*4] |
617 | and eax, 0xFFFFF000 |
574 | and eax, 0xFFFFF000 |
618 | jz .exit |
575 | jz .exit |
619 | stdcall map_page,edi,eax,PG_UW |
576 | stdcall map_page,edi,eax,PG_UW |
620 | ; inc ebx |
577 | ; inc ebx |
621 | ; add edi, 0x1000 |
578 | ; add edi, 0x1000 |
622 | ; mov eax, [esi+ebx*4] |
579 | ; mov eax, [esi+ebx*4] |
623 | ; test eax, eax |
580 | ; test eax, eax |
624 | ; jz @f |
581 | ; jz @f |
625 | ; and eax, 0xFFFFF000 |
582 | ; and eax, 0xFFFFF000 |
626 | ; stdcall map_page, edi, eax |
583 | ; stdcall map_page, edi, eax |
627 | 584 | ||
628 | @@: mov edi, [lin_addr] |
585 | @@: mov edi, [lin_addr] |
629 | and edi, 0xFFFFF000 |
586 | and edi, 0xFFFFF000 |
630 | mov ecx, [buf_size] |
587 | mov ecx, [buf_size] |
631 | add ecx, 4095 |
588 | add ecx, 4095 |
632 | shr ecx, 12 |
589 | shr ecx, 12 |
633 | inc ecx |
590 | inc ecx |
634 | 591 | ||
635 | mov edx, [ofs] |
592 | mov edx, [ofs] |
636 | shr edx, 12 |
593 | shr edx, 12 |
637 | and edx, 0x3FF |
594 | and edx, 0x3FF |
638 | mov esi, [ipc_ptab] |
595 | mov esi, [ipc_ptab] |
639 | 596 | ||
640 | .map: mov eax, [esi+edx*4] |
597 | .map: mov eax, [esi+edx*4] |
641 | and eax, 0xFFFFF000 |
598 | and eax, 0xFFFFF000 |
642 | jz .exit |
599 | jz .exit |
643 | stdcall map_page,edi,eax,PG_UW |
600 | stdcall map_page,edi,eax,PG_UW |
644 | dec ecx |
601 | dec ecx |
645 | jz .exit |
602 | jz .exit |
646 | add edi, 0x1000 |
603 | add edi, 0x1000 |
647 | inc edx |
604 | inc edx |
648 | cmp edx, 0x400 |
605 | cmp edx, 0x400 |
649 | jnz .map |
606 | jnz .map |
650 | inc ebx |
607 | inc ebx |
651 | mov eax, [ipc_pdir] |
608 | mov eax, [ipc_pdir] |
652 | mov eax, [eax+ebx*4] |
609 | mov eax, [eax+ebx*4] |
653 | and eax, 0xFFFFF000 |
610 | and eax, 0xFFFFF000 |
654 | jz .exit |
611 | jz .exit |
655 | stdcall map_page,esi,eax,PG_UW |
612 | stdcall map_page,esi,eax,PG_UW |
656 | xor edx, edx |
613 | xor edx, edx |
657 | jmp .map |
614 | jmp .map |
658 | 615 | ||
659 | .exit: |
616 | .exit: |
660 | ret |
617 | ret |
661 | endp |
618 | endp |
662 | 619 | ||
663 | align 4 |
620 | align 4 |
664 | proc map_memEx stdcall, lin_addr:dword,pdir:dword,\ |
621 | proc map_memEx stdcall, lin_addr:dword,pdir:dword,\ |
665 | ofs:dword,buf_size:dword |
622 | ofs:dword,buf_size:dword |
666 | mov eax, [buf_size] |
623 | mov eax, [buf_size] |
667 | test eax, eax |
624 | test eax, eax |
668 | jz .exit |
625 | jz .exit |
669 | 626 | ||
670 | mov eax, [pdir] |
627 | mov eax, [pdir] |
671 | and eax, 0xFFFFF000 |
628 | and eax, 0xFFFFF000 |
672 | 629 | ||
673 | stdcall map_page,[proc_mem_pdir],eax,dword PG_UW |
630 | stdcall map_page,[proc_mem_pdir],eax,dword PG_UW |
674 | mov ebx, [ofs] |
631 | mov ebx, [ofs] |
675 | shr ebx, 22 |
632 | shr ebx, 22 |
676 | mov esi, [proc_mem_pdir] |
633 | mov esi, [proc_mem_pdir] |
677 | mov edi, [proc_mem_tab] |
634 | mov edi, [proc_mem_tab] |
678 | mov eax, [esi+ebx*4] |
635 | mov eax, [esi+ebx*4] |
679 | and eax, 0xFFFFF000 |
636 | and eax, 0xFFFFF000 |
680 | test eax, eax |
637 | test eax, eax |
681 | jz .exit |
638 | jz .exit |
682 | stdcall map_page,edi,eax,dword PG_UW |
639 | stdcall map_page,edi,eax,dword PG_UW |
683 | 640 | ||
684 | @@: mov edi, [lin_addr] |
641 | @@: mov edi, [lin_addr] |
685 | and edi, 0xFFFFF000 |
642 | and edi, 0xFFFFF000 |
686 | mov ecx, [buf_size] |
643 | mov ecx, [buf_size] |
687 | add ecx, 4095 |
644 | add ecx, 4095 |
688 | shr ecx, 12 |
645 | shr ecx, 12 |
689 | inc ecx |
646 | inc ecx |
690 | 647 | ||
691 | mov edx, [ofs] |
648 | mov edx, [ofs] |
692 | shr edx, 12 |
649 | shr edx, 12 |
693 | and edx, 0x3FF |
650 | and edx, 0x3FF |
694 | mov esi, [proc_mem_tab] |
651 | mov esi, [proc_mem_tab] |
695 | 652 | ||
696 | .map: mov eax, [esi+edx*4] |
653 | .map: mov eax, [esi+edx*4] |
697 | ; and eax, 0xFFFFF000 |
654 | ; and eax, 0xFFFFF000 |
698 | ; test eax, eax |
655 | ; test eax, eax |
699 | ; jz .exit |
656 | ; jz .exit |
700 | stdcall map_page,edi,eax,dword PG_UW |
657 | stdcall map_page,edi,eax,dword PG_UW |
701 | add edi, 0x1000 |
658 | add edi, 0x1000 |
702 | inc edx |
659 | inc edx |
703 | dec ecx |
660 | dec ecx |
704 | jnz .map |
661 | jnz .map |
705 | .exit: |
662 | .exit: |
706 | ret |
663 | ret |
707 | endp |
664 | endp |
708 | 665 | ||
709 | 666 | ||
710 | 667 | ||
711 | 668 | ||
712 | sys_IPC: |
669 | sys_IPC: |
713 | ;input: |
670 | ;input: |
714 | ; eax=1 - set ipc buffer area |
671 | ; eax=1 - set ipc buffer area |
715 | ; ebx=address of buffer |
672 | ; ebx=address of buffer |
716 | ; ecx=size of buffer |
673 | ; ecx=size of buffer |
717 | ; eax=2 - send message |
674 | ; eax=2 - send message |
718 | ; ebx=PID |
675 | ; ebx=PID |
719 | ; ecx=address of message |
676 | ; ecx=address of message |
720 | ; edx=size of message |
677 | ; edx=size of message |
721 | 678 | ||
722 | cmp eax,1 |
679 | cmp eax,1 |
723 | jne @f |
680 | jne @f |
724 | call set_ipc_buff |
681 | call set_ipc_buff |
725 | mov [esp+36], eax |
682 | mov [esp+36], eax |
726 | ret |
683 | ret |
727 | @@: |
684 | @@: |
728 | cmp eax, 2 |
685 | cmp eax, 2 |
729 | jne @f |
686 | jne @f |
730 | stdcall sys_ipc_send, ebx, ecx, edx |
687 | stdcall sys_ipc_send, ebx, ecx, edx |
731 | mov [esp+36], eax |
688 | mov [esp+36], eax |
732 | ret |
689 | ret |
733 | @@: |
690 | @@: |
734 | xor eax, eax |
691 | xor eax, eax |
735 | not eax |
692 | not eax |
736 | mov [esp+36], eax |
693 | mov [esp+36], eax |
737 | ret |
694 | ret |
738 | 695 | ||
739 | align 4 |
696 | align 4 |
740 | proc set_ipc_buff |
697 | proc set_ipc_buff |
741 | 698 | ||
742 | mov eax,[current_slot] |
699 | mov eax,[current_slot] |
743 | pushf |
700 | pushf |
744 | cli |
701 | cli |
745 | mov [eax+APPDATA.ipc_start],ebx ;set fields in extended information area |
702 | mov [eax+APPDATA.ipc_start],ebx ;set fields in extended information area |
746 | mov [eax+APPDATA.ipc_size],ecx |
703 | mov [eax+APPDATA.ipc_size],ecx |
747 | 704 | ||
748 | add ecx, ebx |
705 | add ecx, ebx |
749 | add ecx, 4095 |
706 | add ecx, 4095 |
750 | and ecx, not 4095 |
707 | and ecx, not 4095 |
751 | 708 | ||
752 | .touch: mov eax, [ebx] |
709 | .touch: mov eax, [ebx] |
753 | add ebx, 0x1000 |
710 | add ebx, 0x1000 |
754 | cmp ebx, ecx |
711 | cmp ebx, ecx |
755 | jb .touch |
712 | jb .touch |
756 | 713 | ||
757 | popf |
714 | popf |
758 | xor eax, eax |
715 | xor eax, eax |
759 | ret |
716 | ret |
760 | endp |
717 | endp |
761 | 718 | ||
762 | proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword |
719 | proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword |
763 | locals |
720 | locals |
764 | dst_slot dd ? |
721 | dst_slot dd ? |
765 | dst_offset dd ? |
722 | dst_offset dd ? |
766 | buf_size dd ? |
723 | buf_size dd ? |
767 | used_buf dd ? |
724 | used_buf dd ? |
768 | endl |
725 | endl |
769 | 726 | ||
770 | pushf |
727 | pushf |
771 | cli |
728 | cli |
772 | 729 | ||
773 | mov eax, [PID] |
730 | mov eax, [PID] |
774 | call pid_to_slot |
731 | call pid_to_slot |
775 | test eax,eax |
732 | test eax,eax |
776 | jz .no_pid |
733 | jz .no_pid |
777 | 734 | ||
778 | mov [dst_slot], eax |
735 | mov [dst_slot], eax |
779 | shl eax,8 |
736 | shl eax,8 |
780 | mov edi,[eax+SLOT_BASE+0xa0] ;is ipc area defined? |
737 | mov edi,[eax+SLOT_BASE+0xa0] ;is ipc area defined? |
781 | test edi,edi |
738 | test edi,edi |
782 | jz .no_ipc_area |
739 | jz .no_ipc_area |
783 | 740 | ||
784 | mov ebx, edi |
741 | mov ebx, edi |
785 | and ebx, 0xFFF |
742 | and ebx, 0xFFF |
786 | mov [dst_offset], ebx |
743 | mov [dst_offset], ebx |
787 | 744 | ||
788 | mov esi, [eax+SLOT_BASE+0xa4] |
745 | mov esi, [eax+SLOT_BASE+0xa4] |
789 | mov [buf_size], esi |
746 | mov [buf_size], esi |
790 | 747 | ||
791 | mov ecx, [ipc_tmp] |
748 | mov ecx, [ipc_tmp] |
792 | cmp esi, 0x40000-0x1000 ; size of [ipc_tmp] minus one page |
749 | cmp esi, 0x40000-0x1000 ; size of [ipc_tmp] minus one page |
793 | jbe @f |
750 | jbe @f |
794 | push eax |
751 | push eax |
795 | lea ecx, [esi+0x1000] |
752 | lea ecx, [esi+0x1000] |
796 | xor edx, edx |
753 | xor edx, edx |
797 | call @mem_alloc@8 |
754 | call @mem_alloc@8 |
798 | mov ecx, eax |
755 | mov ecx, eax |
799 | pop eax |
756 | pop eax |
800 | @@: |
757 | @@: |
801 | mov [used_buf], ecx |
758 | mov [used_buf], ecx |
802 | stdcall map_mem, ecx, [SLOT_BASE+eax+0xB8],\ |
759 | stdcall map_mem, ecx, [SLOT_BASE+eax+0xB8],\ |
803 | edi, esi |
760 | edi, esi |
804 | 761 | ||
805 | mov edi, [dst_offset] |
762 | mov edi, [dst_offset] |
806 | add edi, [used_buf] |
763 | add edi, [used_buf] |
807 | cmp dword [edi], 0 |
764 | cmp dword [edi], 0 |
808 | jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now |
765 | jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now |
809 | 766 | ||
810 | mov edx, dword [edi+4] |
767 | mov edx, dword [edi+4] |
811 | lea ebx, [edx+8] |
768 | lea ebx, [edx+8] |
812 | add ebx, [msg_size] |
769 | add ebx, [msg_size] |
813 | cmp ebx, [buf_size] |
770 | cmp ebx, [buf_size] |
814 | ja .buffer_overflow ;esi<0 - not enough memory in buffer |
771 | ja .buffer_overflow ;esi<0 - not enough memory in buffer |
815 | 772 | ||
816 | mov dword [edi+4], ebx |
773 | mov dword [edi+4], ebx |
817 | mov eax,[TASK_BASE] |
774 | mov eax,[TASK_BASE] |
818 | mov eax, [eax+0x04] ;eax - our PID |
775 | mov eax, [eax+0x04] ;eax - our PID |
819 | add edi, edx |
776 | add edi, edx |
820 | mov [edi], eax |
777 | mov [edi], eax |
821 | mov ecx, [msg_size] |
778 | mov ecx, [msg_size] |
822 | 779 | ||
823 | mov [edi+4], ecx |
780 | mov [edi+4], ecx |
824 | add edi, 8 |
781 | add edi, 8 |
825 | mov esi, [msg_addr] |
782 | mov esi, [msg_addr] |
826 | cld |
783 | cld |
827 | rep movsb |
784 | rep movsb |
828 | 785 | ||
829 | mov ebx, [ipc_tmp] |
786 | mov ebx, [ipc_tmp] |
830 | mov edx, ebx |
787 | mov edx, ebx |
831 | shr ebx, 12 |
788 | shr ebx, 12 |
832 | xor eax, eax |
789 | xor eax, eax |
833 | mov [page_tabs+ebx*4], eax |
790 | mov [page_tabs+ebx*4], eax |
834 | invlpg [edx] |
791 | invlpg [edx] |
835 | 792 | ||
836 | mov ebx, [ipc_pdir] |
793 | mov ebx, [ipc_pdir] |
837 | mov edx, ebx |
794 | mov edx, ebx |
838 | shr ebx, 12 |
795 | shr ebx, 12 |
839 | xor eax, eax |
796 | xor eax, eax |
840 | mov [page_tabs+ebx*4], eax |
797 | mov [page_tabs+ebx*4], eax |
841 | invlpg [edx] |
798 | invlpg [edx] |
842 | 799 | ||
843 | mov ebx, [ipc_ptab] |
800 | mov ebx, [ipc_ptab] |
844 | mov edx, ebx |
801 | mov edx, ebx |
845 | shr ebx, 12 |
802 | shr ebx, 12 |
846 | xor eax, eax |
803 | xor eax, eax |
847 | mov [page_tabs+ebx*4], eax |
804 | mov [page_tabs+ebx*4], eax |
848 | invlpg [edx] |
805 | invlpg [edx] |
849 | 806 | ||
850 | mov eax, [dst_slot] |
807 | mov eax, [dst_slot] |
851 | shl eax, 8 |
808 | shl eax, 8 |
852 | or [eax+SLOT_BASE+0xA8],dword 0x40 |
809 | or [eax+SLOT_BASE+0xA8],dword 0x40 |
853 | cmp dword [check_idle_semaphore],20 |
810 | cmp dword [check_idle_semaphore],20 |
854 | jge .ipc_no_cis |
811 | jge .ipc_no_cis |
855 | 812 | ||
856 | mov dword [check_idle_semaphore],5 |
813 | mov dword [check_idle_semaphore],5 |
857 | .ipc_no_cis: |
814 | .ipc_no_cis: |
858 | push 0 |
815 | push 0 |
859 | jmp .ret |
816 | jmp .ret |
860 | .no_pid: |
817 | .no_pid: |
861 | popf |
818 | popf |
862 | mov eax, 4 |
819 | mov eax, 4 |
863 | ret |
820 | ret |
864 | .no_ipc_area: |
821 | .no_ipc_area: |
865 | popf |
822 | popf |
866 | xor eax, eax |
823 | xor eax, eax |
867 | inc eax |
824 | inc eax |
868 | ret |
825 | ret |
869 | .ipc_blocked: |
826 | .ipc_blocked: |
870 | push 2 |
827 | push 2 |
871 | jmp .ret |
828 | jmp .ret |
872 | .buffer_overflow: |
829 | .buffer_overflow: |
873 | push 3 |
830 | push 3 |
874 | .ret: |
831 | .ret: |
875 | mov ecx, [used_buf] |
832 | mov ecx, [used_buf] |
876 | cmp ecx, [ipc_tmp] |
833 | cmp ecx, [ipc_tmp] |
877 | jz @f |
834 | jz @f |
878 | 835 | ||
879 | call @mem_free@4 |
836 | call @mem_free@4 |
880 | @@: |
837 | @@: |
881 | pop eax |
838 | pop eax |
882 | popf |
839 | popf |
883 | ret |
840 | ret |
884 | endp |
841 | endp |
885 | 842 | ||
886 | align 4 |
843 | align 4 |
887 | sysfn_meminfo: |
844 | sysfn_meminfo: |
888 | 845 | ||
889 | ; add ebx, new_app_base |
846 | ; add ebx, new_app_base |
890 | cmp ebx, OS_BASE |
847 | cmp ebx, OS_BASE |
891 | jae .fail |
848 | jae .fail |
892 | 849 | ||
893 | mov eax, [_mem_amount] |
850 | mov eax, [_mem_amount] |
894 | shr eax, 12 |
851 | shr eax, 12 |
895 | mov [ebx], eax |
852 | mov [ebx], eax |
896 | shl eax, 12 |
853 | shl eax, 12 |
897 | mov [esp+36], eax |
854 | mov [esp+36], eax |
898 | call _get_free_mem |
855 | call _get_free_mem |
899 | mov [ebx+4], eax |
856 | mov [ebx+4], eax |
900 | mov edx, [pg_data.pages_faults] |
857 | mov edx, [pg_data.pages_faults] |
901 | mov [ebx+8], edx |
858 | mov [ebx+8], edx |
902 | mov esi, [heap_size] |
859 | mov esi, [heap_size] |
903 | mov [ebx+12], esi |
860 | mov [ebx+12], esi |
904 | mov edi, [heap_free] |
861 | mov edi, [heap_free] |
905 | mov [ebx+16], edi |
862 | mov [ebx+16], edi |
906 | mov eax, [heap_blocks] |
863 | mov eax, [heap_blocks] |
907 | mov [ebx+20], eax |
864 | mov [ebx+20], eax |
908 | mov ecx, [free_blocks] |
865 | mov ecx, [free_blocks] |
909 | mov [ebx+24], ecx |
866 | mov [ebx+24], ecx |
910 | ret |
867 | ret |
911 | .fail: |
868 | .fail: |
912 | mov dword [esp+36], -1 |
869 | mov dword [esp+36], -1 |
913 | ret |
870 | ret |
914 | 871 | ||
915 | align 4 |
872 | align 4 |
916 | new_services: |
873 | new_services: |
917 | 874 | ||
918 | cmp eax,4 |
875 | cmp eax,4 |
919 | jle sys_sheduler |
876 | jle sys_sheduler |
920 | 877 | ||
921 | cmp eax, 11 |
878 | cmp eax, 11 |
922 | jb .fail |
879 | jb .fail |
923 | ja @f |
880 | ja @f |
924 | 881 | ||
925 | call init_heap |
882 | call init_heap |
926 | mov [esp+36], eax |
883 | mov [esp+36], eax |
927 | ret |
884 | ret |
928 | @@: |
885 | @@: |
929 | cmp eax, 12 |
886 | cmp eax, 12 |
930 | ja @f |
887 | ja @f |
931 | 888 | ||
932 | stdcall user_alloc, ebx |
889 | stdcall user_alloc, ebx |
933 | mov [esp+36], eax |
890 | mov [esp+36], eax |
934 | ret |
891 | ret |
935 | @@: |
892 | @@: |
936 | cmp eax, 13 |
893 | cmp eax, 13 |
937 | ja @f |
894 | ja @f |
938 | stdcall user_free, ebx |
895 | stdcall user_free, ebx |
939 | mov [esp+36], eax |
896 | mov [esp+36], eax |
940 | ret |
897 | ret |
941 | @@: |
898 | @@: |
942 | cmp eax, 14 |
899 | cmp eax, 14 |
943 | ja @f |
900 | ja @f |
944 | cmp ebx, OS_BASE |
901 | cmp ebx, OS_BASE |
945 | jae .fail |
902 | jae .fail |
946 | stdcall get_event_ex, ebx, ecx |
903 | stdcall get_event_ex, ebx, ecx |
947 | mov [esp+36], eax |
904 | mov [esp+36], eax |
948 | ret |
905 | ret |
949 | @@: |
906 | @@: |
950 | cmp eax, 15 |
907 | cmp eax, 15 |
951 | ja @f |
908 | ja @f |
952 | mov ecx, [current_slot] |
909 | mov ecx, [current_slot] |
953 | mov eax, [ecx+APPDATA.fpu_handler] |
910 | mov eax, [ecx+APPDATA.fpu_handler] |
954 | mov [ecx+APPDATA.fpu_handler], ebx |
911 | mov [ecx+APPDATA.fpu_handler], ebx |
955 | mov [esp+36], eax |
912 | mov [esp+36], eax |
956 | ret |
913 | ret |
957 | @@: |
914 | @@: |
958 | cmp eax, 16 |
915 | cmp eax, 16 |
959 | ja @f |
916 | ja @f |
960 | 917 | ||
961 | test ebx, ebx |
918 | test ebx, ebx |
962 | jz .fail |
919 | jz .fail |
963 | cmp ebx, OS_BASE |
920 | cmp ebx, OS_BASE |
964 | jae .fail |
921 | jae .fail |
965 | stdcall get_service, ebx |
922 | stdcall get_service, ebx |
966 | mov [esp+36], eax |
923 | mov [esp+36], eax |
967 | ret |
924 | ret |
968 | @@: |
925 | @@: |
969 | cmp eax, 17 |
926 | cmp eax, 17 |
970 | ja @f |
927 | ja @f |
971 | call srv_handlerEx ;ebx |
928 | call srv_handlerEx ;ebx |
972 | mov [esp+36], eax |
929 | mov [esp+36], eax |
973 | ret |
930 | ret |
974 | @@: |
931 | @@: |
975 | cmp eax, 18 |
932 | cmp eax, 18 |
976 | ja @f |
933 | ja @f |
977 | mov ecx, [current_slot] |
934 | mov ecx, [current_slot] |
978 | mov eax, [ecx+APPDATA.sse_handler] |
935 | mov eax, [ecx+APPDATA.sse_handler] |
979 | mov [ecx+APPDATA.sse_handler], ebx |
936 | mov [ecx+APPDATA.sse_handler], ebx |
980 | mov [esp+36], eax |
937 | mov [esp+36], eax |
981 | ret |
938 | ret |
982 | @@: |
939 | @@: |
983 | cmp eax, 19 |
940 | cmp eax, 19 |
984 | ja @f |
941 | ja @f |
985 | cmp ebx, OS_BASE |
942 | cmp ebx, OS_BASE |
986 | jae .fail |
943 | jae .fail |
987 | stdcall load_library, ebx |
944 | stdcall load_library, ebx |
988 | mov [esp+36], eax |
945 | mov [esp+36], eax |
989 | ret |
946 | ret |
990 | @@: |
947 | @@: |
991 | cmp eax, 20 |
948 | cmp eax, 20 |
992 | ja @F |
949 | ja @F |
993 | mov eax, ecx |
950 | mov eax, ecx |
994 | call user_realloc |
951 | call user_realloc |
995 | mov [esp+36], eax |
952 | mov [esp+36], eax |
996 | ret |
953 | ret |
997 | @@: |
954 | @@: |
998 | cmp eax, 21 ;for test purposes only |
955 | cmp eax, 21 ;for test purposes only |
999 | ja @f ;will be removed soon |
956 | ja .fail ;will be removed soon |
1000 | cmp ebx, OS_BASE |
957 | cmp ebx, OS_BASE |
1001 | jae .fail |
958 | jae .fail |
1002 | 959 | ||
1003 | mov ecx, ebx |
960 | mov ecx, ebx |
1004 | call @load_pe_driver@4 |
961 | call @load_pe_driver@4 |
1005 | mov [esp+36], eax |
962 | mov [esp+36], eax |
1006 | ret |
963 | ret |
1007 | 964 | ||
1008 | .fail: |
965 | .fail: |
1009 | xor eax, eax |
966 | xor eax, eax |
1010 | mov [esp+36], eax |
967 | mov [esp+36], eax |
1011 | ret |
968 | ret |
1012 | 969 | ||
1013 | align 4 |
970 | align 4 |
1014 | proc init_mtrr |
971 | proc init_mtrr |
1015 | 972 | ||
1016 | cmp [BOOT_VAR+0x901c],byte 2 |
973 | cmp [BOOT_VAR+0x901c],byte 2 |
1017 | je .exit |
974 | je .exit |
1018 | 975 | ||
1019 | bt [cpu_caps], CAPS_MTRR |
976 | bt [cpu_caps], CAPS_MTRR |
1020 | jnc .exit |
977 | jnc .exit |
1021 | 978 | ||
1022 | mov eax, cr0 |
979 | mov eax, cr0 |
1023 | or eax, 0x60000000 ;disable caching |
980 | or eax, 0x60000000 ;disable caching |
1024 | mov cr0, eax |
981 | mov cr0, eax |
1025 | wbinvd ;invalidate cache |
982 | wbinvd ;invalidate cache |
1026 | 983 | ||
1027 | mov ecx, 0x2FF |
984 | mov ecx, 0x2FF |
1028 | rdmsr ; |
985 | rdmsr ; |
1029 | push eax |
986 | push eax |
1030 | 987 | ||
1031 | xor edx, edx |
988 | xor edx, edx |
1032 | xor eax, eax |
989 | xor eax, eax |
1033 | mov ecx, 0x2FF |
990 | mov ecx, 0x2FF |
1034 | wrmsr ;disable all MTRR |
991 | wrmsr ;disable all MTRR |
1035 | 992 | ||
1036 | mov eax, [_mem_amount] |
993 | mov eax, [_mem_amount] |
1037 | ; round eax up to next power of 2 |
994 | ; round eax up to next power of 2 |
1038 | dec eax |
995 | dec eax |
1039 | bsr ecx, eax |
996 | bsr ecx, eax |
1040 | mov eax, 2 |
997 | mov eax, 2 |
1041 | shl eax, cl |
998 | shl eax, cl |
1042 | stdcall set_mtrr, edx,edx,eax,MEM_WB |
999 | stdcall set_mtrr, edx,edx,eax,MEM_WB |
1043 | stdcall set_mtrr, 1,[LFBAddress],[LFBSize],MEM_WC |
1000 | stdcall set_mtrr, 1,[LFBAddress],[LFBSize],MEM_WC |
1044 | xor edx, edx |
1001 | xor edx, edx |
1045 | xor eax, eax |
1002 | xor eax, eax |
1046 | mov ecx, 0x204 |
1003 | mov ecx, 0x204 |
1047 | mov ebx, 6 |
1004 | mov ebx, 6 |
1048 | @@: |
1005 | @@: |
1049 | wrmsr ;disable unused MTRR |
1006 | wrmsr ;disable unused MTRR |
1050 | inc ecx |
1007 | inc ecx |
1051 | wrmsr |
1008 | wrmsr |
1052 | inc ecx |
1009 | inc ecx |
1053 | dec ebx |
1010 | dec ebx |
1054 | jnz @b |
1011 | jnz @b |
1055 | 1012 | ||
1056 | wbinvd ;again invalidate |
1013 | wbinvd ;again invalidate |
1057 | 1014 | ||
1058 | pop eax |
1015 | pop eax |
1059 | or eax, 0x800 ;set default memtype to UC |
1016 | or eax, 0x800 ;set default memtype to UC |
1060 | and al, 0xF0 |
1017 | and al, 0xF0 |
1061 | mov ecx, 0x2FF |
1018 | mov ecx, 0x2FF |
1062 | wrmsr ;and enable MTRR |
1019 | wrmsr ;and enable MTRR |
1063 | 1020 | ||
1064 | mov eax, cr0 |
1021 | mov eax, cr0 |
1065 | and eax, not 0x60000000 |
1022 | and eax, not 0x60000000 |
1066 | mov cr0, eax ; enable caching |
1023 | mov cr0, eax ; enable caching |
1067 | .exit: |
1024 | .exit: |
1068 | ret |
1025 | ret |
1069 | endp |
1026 | endp |
1070 | 1027 | ||
1071 | align 4 |
1028 | align 4 |
1072 | proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword |
1029 | proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword |
1073 | 1030 | ||
1074 | xor edx, edx |
1031 | xor edx, edx |
1075 | mov eax, [base] |
1032 | mov eax, [base] |
1076 | or eax, [mem_type] |
1033 | or eax, [mem_type] |
1077 | mov ecx, [reg] |
1034 | mov ecx, [reg] |
1078 | lea ecx, [0x200+ecx*2] |
1035 | lea ecx, [0x200+ecx*2] |
1079 | wrmsr |
1036 | wrmsr |
1080 | 1037 | ||
1081 | mov ebx, [size] |
1038 | mov ebx, [size] |
1082 | dec ebx |
1039 | dec ebx |
1083 | mov eax, 0xFFFFFFFF |
1040 | mov eax, 0xFFFFFFFF |
1084 | mov edx, 0x0000000F |
1041 | mov edx, 0x0000000F |
1085 | sub eax, ebx |
1042 | sub eax, ebx |
1086 | sbb edx, 0 |
1043 | sbb edx, 0 |
1087 | or eax, 0x800 |
1044 | or eax, 0x800 |
1088 | inc ecx |
1045 | inc ecx |
1089 | wrmsr |
1046 | wrmsr |
1090 | ret |
1047 | ret |
1091 | endp |
1048 | endp |
1092 | 1049 | ||
1093 | align 4 |
1050 | align 4 |
1094 | proc stall stdcall, delay:dword |
1051 | proc stall stdcall, delay:dword |
1095 | push ecx |
1052 | push ecx |
1096 | push edx |
1053 | push edx |
1097 | push ebx |
1054 | push ebx |
1098 | push eax |
1055 | push eax |
1099 | 1056 | ||
1100 | mov eax, [delay] |
1057 | mov eax, [delay] |
1101 | mul [stall_mcs] |
1058 | mul [stall_mcs] |
1102 | mov ebx, eax ;low |
1059 | mov ebx, eax ;low |
1103 | mov ecx, edx ;high |
1060 | mov ecx, edx ;high |
1104 | rdtsc |
1061 | rdtsc |
1105 | add ebx, eax |
1062 | add ebx, eax |
1106 | adc ecx,edx |
1063 | adc ecx,edx |
1107 | @@: |
1064 | @@: |
1108 | rdtsc |
1065 | rdtsc |
1109 | sub eax, ebx |
1066 | sub eax, ebx |
1110 | sbb edx, ecx |
1067 | sbb edx, ecx |
1111 | jb @B |
1068 | jb @B |
1112 | 1069 | ||
1113 | pop eax |
1070 | pop eax |
1114 | pop ebx |
1071 | pop ebx |
1115 | pop edx |
1072 | pop edx |
1116 | pop ecx |
1073 | pop ecx |
1117 | ret |
1074 | ret |
1118 | endp |
1075 | endp |
1119 | 1076 | ||
1120 | align 4 |
1077 | align 4 |
1121 | _CreateRingBuffer: |
1078 | _CreateRingBuffer: |
1122 | proc create_ring_buffer stdcall, size:dword, flags:dword |
1079 | proc create_ring_buffer stdcall, size:dword, flags:dword |
1123 | locals |
1080 | locals |
1124 | buf_ptr dd ? |
1081 | buf_ptr dd ? |
1125 | endl |
1082 | endl |
1126 | 1083 | ||
1127 | mov ecx, [size] |
1084 | mov ecx, [size] |
1128 | test ecx, 4095 |
1085 | test ecx, 4095 |
1129 | jnz .fail |
1086 | jnz .fail |
1130 | 1087 | ||
1131 | add ecx, ecx |
1088 | add ecx, ecx |
1132 | xor edx, edx |
1089 | xor edx, edx |
1133 | call @mem_alloc@8 |
1090 | call @mem_alloc@8 |
1134 | test eax, eax |
1091 | test eax, eax |
1135 | mov [buf_ptr], eax |
1092 | mov [buf_ptr], eax |
1136 | jz .fail |
1093 | jz .fail |
1137 | 1094 | ||
1138 | push ebx |
1095 | push ebx |
1139 | 1096 | ||
1140 | xor ecx, ecx |
1097 | xor ecx, ecx |
1141 | mov edx, [size] |
1098 | mov edx, [size] |
1142 | shr edx, 12 |
1099 | shr edx, 12 |
1143 | mov ebx, edx |
1100 | mov ebx, edx |
1144 | dec edx |
1101 | dec edx |
1145 | bsr ecx, edx |
1102 | bsr ecx, edx |
1146 | inc ecx |
1103 | inc ecx |
1147 | 1104 | ||
1148 | call @core_alloc@4 |
1105 | call @core_alloc@4 |
1149 | test eax, eax |
1106 | test eax, eax |
1150 | jz .mm_fail |
1107 | jz .mm_fail |
1151 | 1108 | ||
1152 | or eax, [flags] |
1109 | or eax, [flags] |
1153 | mov edx, [buf_ptr] |
1110 | mov edx, [buf_ptr] |
1154 | lea ecx, [ebx*4] |
1111 | lea ecx, [ebx*4] |
1155 | shr edx, 10 |
1112 | shr edx, 10 |
1156 | @@: |
1113 | @@: |
1157 | mov [page_tabs+edx], eax |
1114 | mov [page_tabs+edx], eax |
1158 | mov [page_tabs+edx+ecx], eax |
1115 | mov [page_tabs+edx+ecx], eax |
1159 | add eax, 0x1000 |
1116 | add eax, 0x1000 |
1160 | add edx, 4 |
1117 | add edx, 4 |
1161 | dec ebx |
1118 | dec ebx |
1162 | jnz @B |
1119 | jnz @B |
1163 | 1120 | ||
1164 | mov eax, [buf_ptr] |
1121 | mov eax, [buf_ptr] |
1165 | pop ebx |
1122 | pop ebx |
1166 | ret |
1123 | ret |
1167 | .mm_fail: |
1124 | .mm_fail: |
1168 | mov ecx, [buf_ptr] |
1125 | mov ecx, [buf_ptr] |
1169 | call @mem_free@4 |
1126 | call @mem_free@4 |
1170 | pop ebx |
1127 | pop ebx |
1171 | xor eax, eax |
1128 | xor eax, eax |
1172 | .fail: |
1129 | .fail: |
1173 | ret |
1130 | ret |
1174 | endp |
1131 | endp |
1175 | 1132 | ||
1176 | 1133 | ||
1177 | align 4 |
1134 | align 4 |
1178 | _balloc: ; gcc fastcall |
1135 | _balloc: ; gcc fastcall |
1179 | @balloc@4: |
1136 | @balloc@4: |
1180 | - | ||
1181 | 1137 | ||
1182 | mov eax, [_pg_balloc] |
1138 | mov eax, [_pg_balloc] |
1183 | add ecx, 4095 |
1139 | add ecx, 4095 |
1184 | and ecx, -4096 |
1140 | and ecx, -4096 |
1185 | add ecx, eax |
1141 | add ecx, eax |
1186 | mov [_pg_balloc], ecx |
1142 | mov [_pg_balloc], ecx |
1187 | add eax, OS_BASE |
1143 | add eax, OS_BASE |
1188 | ret0>> |
1144 | ret0>> |