Rev 2217 | Rev 2441 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2217 | Rev 2434 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2009. 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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 2217 $ |
8 | $Revision: 2434 $ |
9 | 9 | ||
Line 10... | Line 10... | ||
10 | 10 | ||
11 | align 4 |
11 | align 4 |
12 | proc alloc_page |
12 | proc alloc_page |
13 | 13 | ||
14 | pushfd |
14 | pushfd |
15 | cli |
15 | cli |
16 | push ebx |
16 | push ebx |
Line 17... | Line 17... | ||
17 | ;//- |
17 | ;//- |
18 | cmp [pg_data.pages_free], 1 |
18 | cmp [pg_data.pages_free], 1 |
19 | jle .out_of_memory |
19 | jle .out_of_memory |
20 | ;//- |
20 | ;//- |
21 | 21 | ||
22 | mov ebx, [page_start] |
22 | mov ebx, [page_start] |
23 | mov ecx, [page_end] |
23 | mov ecx, [page_end] |
24 | .l1: |
24 | .l1: |
25 | bsf eax,[ebx]; |
25 | bsf eax, [ebx]; |
26 | jnz .found |
26 | jnz .found |
27 | add ebx,4 |
27 | add ebx, 4 |
28 | cmp ebx, ecx |
28 | cmp ebx, ecx |
29 | jb .l1 |
29 | jb .l1 |
30 | pop ebx |
30 | pop ebx |
31 | popfd |
31 | popfd |
32 | xor eax,eax |
32 | xor eax, eax |
33 | ret |
33 | ret |
34 | .found: |
34 | .found: |
35 | ;//- |
35 | ;//- |
36 | dec [pg_data.pages_free] |
36 | dec [pg_data.pages_free] |
37 | jz .out_of_memory |
37 | jz .out_of_memory |
38 | ;//- |
38 | ;//- |
39 | btr [ebx], eax |
39 | btr [ebx], eax |
40 | mov [page_start],ebx |
40 | mov [page_start], ebx |
41 | sub ebx, sys_pgmap |
41 | sub ebx, sys_pgmap |
42 | lea eax, [eax+ebx*8] |
42 | lea eax, [eax+ebx*8] |
43 | shl eax, 12 |
43 | shl eax, 12 |
44 | ;//- dec [pg_data.pages_free] |
44 | ;//- dec [pg_data.pages_free] |
45 | pop ebx |
45 | pop ebx |
46 | popfd |
46 | popfd |
47 | ret |
47 | ret |
48 | ;//- |
48 | ;//- |
49 | .out_of_memory: |
49 | .out_of_memory: |
50 | mov [pg_data.pages_free], 1 |
50 | mov [pg_data.pages_free], 1 |
51 | xor eax, eax |
51 | xor eax, eax |
Line 52... | Line 52... | ||
52 | pop ebx |
52 | pop ebx |
53 | popfd |
53 | popfd |
54 | ret |
54 | ret |
55 | ;//- |
55 | ;//- |
56 | endp |
56 | endp |
57 | 57 | ||
58 | align 4 |
58 | align 4 |
59 | proc alloc_pages stdcall, count:dword |
59 | proc alloc_pages stdcall, count:dword |
60 | pushfd |
60 | pushfd |
61 | push ebx |
61 | push ebx |
62 | push edi |
62 | push edi |
63 | cli |
63 | cli |
64 | mov eax, [count] |
64 | mov eax, [count] |
65 | add eax, 7 |
65 | add eax, 7 |
66 | shr eax, 3 |
66 | shr eax, 3 |
67 | mov [count], eax |
67 | mov [count], eax |
68 | ;//- |
68 | ;//- |
69 | mov ebx, [pg_data.pages_free] |
69 | mov ebx, [pg_data.pages_free] |
70 | sub ebx, 9 |
70 | sub ebx, 9 |
71 | js .out_of_memory |
71 | js .out_of_memory |
72 | shr ebx, 3 |
72 | shr ebx, 3 |
73 | cmp eax, ebx |
73 | cmp eax, ebx |
74 | jg .out_of_memory |
74 | jg .out_of_memory |
75 | ;//- |
75 | ;//- |
76 | mov ecx, [page_start] |
76 | mov ecx, [page_start] |
77 | mov ebx, [page_end] |
77 | mov ebx, [page_end] |
78 | .find: |
78 | .find: |
79 | mov edx, [count] |
79 | mov edx, [count] |
80 | mov edi, ecx |
80 | mov edi, ecx |
81 | .match: |
81 | .match: |
82 | cmp byte [ecx], 0xFF |
82 | cmp byte [ecx], 0xFF |
83 | jne .next |
83 | jne .next |
84 | dec edx |
84 | dec edx |
85 | jz .ok |
85 | jz .ok |
86 | inc ecx |
86 | inc ecx |
87 | cmp ecx,ebx |
87 | cmp ecx, ebx |
88 | jb .match |
88 | jb .match |
89 | .out_of_memory: |
89 | .out_of_memory: |
90 | .fail: |
90 | .fail: |
91 | xor eax, eax |
91 | xor eax, eax |
92 | pop edi |
92 | pop edi |
93 | pop ebx |
93 | pop ebx |
94 | popfd |
94 | popfd |
95 | ret |
95 | ret |
96 | .next: |
96 | .next: |
97 | inc ecx |
97 | inc ecx |
98 | cmp ecx, ebx |
98 | cmp ecx, ebx |
99 | jb .find |
99 | jb .find |
100 | pop edi |
100 | pop edi |
101 | pop ebx |
101 | pop ebx |
102 | popfd |
102 | popfd |
103 | xor eax, eax |
103 | xor eax, eax |
104 | ret |
104 | ret |
105 | .ok: |
105 | .ok: |
106 | sub ecx, edi |
106 | sub ecx, edi |
107 | inc ecx |
107 | inc ecx |
108 | push esi |
108 | push esi |
109 | mov esi, edi |
109 | mov esi, edi |
110 | xor eax, eax |
110 | xor eax, eax |
111 | rep stosb |
111 | rep stosb |
112 | sub esi, sys_pgmap |
112 | sub esi, sys_pgmap |
113 | shl esi, 3+12 |
113 | shl esi, 3+12 |
114 | mov eax, esi |
114 | mov eax, esi |
115 | mov ebx, [count] |
115 | mov ebx, [count] |
116 | shl ebx, 3 |
116 | shl ebx, 3 |
117 | sub [pg_data.pages_free], ebx |
117 | sub [pg_data.pages_free], ebx |
Line 118... | Line 118... | ||
118 | pop esi |
118 | pop esi |
119 | pop edi |
119 | pop edi |
120 | pop ebx |
120 | pop ebx |
121 | popfd |
121 | popfd |
122 | ret |
122 | ret |
123 | endp |
123 | endp |
124 | 124 | ||
125 | align 4 |
125 | align 4 |
126 | proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword |
126 | proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword |
127 | push ebx |
127 | push ebx |
128 | mov eax, [phis_addr] |
128 | mov eax, [phis_addr] |
129 | and eax, not 0xFFF |
129 | and eax, not 0xFFF |
130 | or eax, [flags] |
130 | or eax, [flags] |
131 | mov ebx, [lin_addr] |
131 | mov ebx, [lin_addr] |
Line 132... | Line 132... | ||
132 | shr ebx, 12 |
132 | shr ebx, 12 |
133 | mov [page_tabs+ebx*4], eax |
133 | mov [page_tabs+ebx*4], eax |
Line 134... | Line 134... | ||
134 | mov eax, [lin_addr] |
134 | mov eax, [lin_addr] |
Line 135... | Line 135... | ||
135 | invlpg [eax] |
135 | invlpg [eax] |
136 | pop ebx |
136 | pop ebx |
137 | ret |
137 | ret |
138 | endp |
138 | endp |
139 | 139 | ||
140 | align 4 |
140 | align 4 |
141 | map_space: ;not implemented |
141 | map_space: ;not implemented |
142 | 142 | ||
143 | 143 | ||
144 | ret |
144 | ret |
145 | 145 | ||
146 | 146 | ||
147 | align 4 |
147 | align 4 |
148 | proc free_page |
148 | proc free_page |
149 | ;arg: eax page address |
149 | ;arg: eax page address |
150 | pushfd |
150 | pushfd |
151 | cli |
151 | cli |
152 | shr eax, 12 ;page index |
152 | shr eax, 12 ;page index |
153 | bts dword [sys_pgmap], eax ;that's all! |
153 | bts dword [sys_pgmap], eax ;that's all! |
154 | cmc |
154 | cmc |
155 | adc [pg_data.pages_free], 0 |
155 | adc [pg_data.pages_free], 0 |
Line -... | Line 156... | ||
- | 156 | shr eax, 3 |
|
156 | shr eax, 3 |
157 | and eax, not 3 ;dword offset from page_map |
Line 157... | Line 158... | ||
157 | and eax, not 3 ;dword offset from page_map |
158 | add eax, sys_pgmap |
158 | add eax, sys_pgmap |
159 | cmp [page_start], eax |
159 | cmp [page_start], eax |
160 | ja @f |
160 | ja @f |
161 | popfd |
161 | popfd |
162 | ret |
162 | ret |
163 | @@: |
163 | @@: |
164 | mov [page_start], eax |
164 | mov [page_start], eax |
165 | popfd |
165 | popfd |
166 | ret |
166 | ret |
167 | endp |
167 | endp |
168 | |
168 | 169 | align 4 |
|
169 | proc map_io_mem stdcall, base:dword, size:dword, flags:dword |
170 | proc map_io_mem stdcall, base:dword, size:dword, flags:dword |
170 | 171 | ||
171 | push ebx |
172 | push ebx |
172 | push edi |
173 | push edi |
173 | mov eax, [size] |
174 | mov eax, [size] |
174 | add eax, [base] |
175 | add eax, [base] |
175 | add eax, 4095 |
176 | add eax, 4095 |
176 | and eax, -4096 |
177 | and eax, -4096 |
177 | mov ecx, [base] |
178 | mov ecx, [base] |
178 | and ecx, -4096 |
179 | and ecx, -4096 |
179 | sub eax, ecx |
180 | sub eax, ecx |
180 | mov [size], eax |
181 | mov [size], eax |
181 | 182 | ||
182 | stdcall alloc_kernel_space, eax |
183 | stdcall alloc_kernel_space, eax |
183 | test eax, eax |
184 | test eax, eax |
184 | jz .fail |
185 | jz .fail |
185 | push eax |
186 | push eax |
186 | 187 | ||
187 | mov edi, 0x1000 |
188 | mov edi, 0x1000 |
188 | mov ebx, eax |
189 | mov ebx, eax |
189 | mov ecx,[size] |
190 | mov ecx, [size] |
190 | mov edx, [base] |
191 | mov edx, [base] |
191 | shr eax, 12 |
192 | shr eax, 12 |
192 | shr ecx, 12 |
193 | shr ecx, 12 |
193 | and edx, -4096 |
194 | and edx, -4096 |
194 | or edx, [flags] |
195 | or edx, [flags] |
195 | @@: |
196 | @@: |
196 | mov [page_tabs+eax*4], edx |
197 | mov [page_tabs+eax*4], edx |
197 | invlpg [ebx] |
198 | invlpg [ebx] |
Line 198... | Line 199... | ||
198 | inc eax |
199 | inc eax |
199 | add ebx, edi |
200 | add ebx, edi |
200 | add edx, edi |
201 | add edx, edi |
201 | loop @B |
202 | loop @B |
Line 202... | Line 203... | ||
202 | 203 | ||
203 | pop eax |
204 | pop eax |
204 | mov edx, [base] |
205 | mov edx, [base] |
205 | and edx, 4095 |
206 | and edx, 4095 |
Line 206... | Line 207... | ||
206 | add eax, edx |
207 | add eax, edx |
207 | .fail: |
208 | .fail: |
208 | pop edi |
209 | pop edi |
209 | pop ebx |
210 | pop ebx |
210 | ret |
211 | ret |
211 | endp |
212 | endp |
212 | 213 | ||
213 | ; param |
214 | ; param |
214 | ; eax= page base + page flags |
215 | ; eax= page base + page flags |
215 | ; ebx= linear address |
216 | ; ebx= linear address |
216 | ; ecx= count |
217 | ; ecx= count |
217 | 218 | ||
218 | align 4 |
219 | align 4 |
219 | commit_pages: |
220 | commit_pages: |
220 | test ecx, ecx |
221 | test ecx, ecx |
221 | jz .fail |
222 | jz .fail |
222 | 223 | ||
Line 223... | Line 224... | ||
223 | push edi |
224 | push edi |
Line 224... | Line 225... | ||
224 | push eax |
225 | push eax |
225 | push ecx |
226 | push ecx |
226 | mov ecx, pg_data.mutex |
227 | mov ecx, pg_data.mutex |
227 | call mutex_lock |
228 | call mutex_lock |
Line 228... | Line 229... | ||
228 | pop ecx |
229 | pop ecx |
229 | pop eax |
230 | pop eax |
230 | 231 | ||
Line 231... | Line 232... | ||
231 | mov edi, ebx |
232 | mov edi, ebx |
232 | shr edi, 12 |
233 | shr edi, 12 |
Line 233... | Line 234... | ||
233 | lea edi, [page_tabs+edi*4] |
234 | lea edi, [page_tabs+edi*4] |
234 | @@: |
235 | @@: |
235 | stosd |
236 | stosd |
236 | invlpg [ebx] |
237 | invlpg [ebx] |
237 | add eax, 0x1000 |
238 | add eax, 0x1000 |
238 | add ebx, 0x1000 |
239 | add ebx, 0x1000 |
239 | loop @B |
240 | loop @B |
240 | 241 | ||
241 | pop edi |
242 | pop edi |
242 | 243 | ||
243 | mov ecx, pg_data.mutex |
244 | mov ecx, pg_data.mutex |
244 | call mutex_unlock |
245 | call mutex_unlock |
245 | .fail: |
246 | .fail: |
246 | ret |
247 | ret |
247 | 248 | ||
248 | 249 | ||
249 | ; param |
250 | ; param |
250 | ; eax= base |
251 | ; eax= base |
251 | ; ecx= count |
252 | ; ecx= count |
252 | 253 | ||
253 | align 4 |
254 | align 4 |
254 | release_pages: |
255 | release_pages: |
255 | 256 | ||
256 | push ebp |
- | |
257 | push esi |
- | |
258 | push edi |
- | |
259 | push ebx |
- | |
260 | - | ||
261 | mov esi, eax |
- | |
262 | mov edi, eax |
- | |
263 | - | ||
264 | shr esi, 12 |
- | |
265 | lea esi, [page_tabs+esi*4] |
- | |
266 | - | ||
267 | push ecx |
- | |
268 | mov ecx, pg_data.mutex |
- | |
Line -... | Line 257... | ||
- | 257 | push ebp |
|
- | 258 | push esi |
|
- | 259 | push edi |
|
- | 260 | push ebx |
|
- | 261 | ||
- | 262 | mov esi, eax |
|
- | 263 | mov edi, eax |
|
- | 264 | ||
- | 265 | shr esi, 12 |
|
- | 266 | lea esi, [page_tabs+esi*4] |
|
- | 267 | ||
- | 268 | push ecx |
|
- | 269 | mov ecx, pg_data.mutex |
|
269 | call mutex_lock |
270 | call mutex_lock |
270 | pop ecx |
271 | pop ecx |
271 | 272 | ||
272 | mov ebp, [pg_data.pages_free] |
273 | mov ebp, [pg_data.pages_free] |
273 | mov ebx, [page_start] |
274 | mov ebx, [page_start] |
274 | mov edx, sys_pgmap |
275 | mov edx, sys_pgmap |
275 | @@: |
276 | @@: |
276 | xor eax, eax |
277 | xor eax, eax |
277 | xchg eax, [esi] |
278 | xchg eax, [esi] |
278 | invlpg [edi] |
279 | invlpg [edi] |
279 | 280 | ||
280 | test eax, 1 |
281 | test eax, 1 |
281 | jz .next |
282 | jz .next |
282 | 283 | ||
283 | shr eax, 12 |
284 | shr eax, 12 |
Line 284... | Line 285... | ||
284 | bts [edx], eax |
285 | bts [edx], eax |
285 | cmc |
286 | cmc |
286 | adc ebp, 0 |
287 | adc ebp, 0 |
Line 287... | Line 288... | ||
287 | shr eax, 3 |
288 | shr eax, 3 |
288 | and eax, -4 |
289 | and eax, -4 |
Line 289... | Line 290... | ||
289 | add eax, edx |
290 | add eax, edx |
Line 290... | Line 291... | ||
290 | cmp eax, ebx |
291 | cmp eax, ebx |
291 | jae .next |
292 | jae .next |
Line 292... | Line 293... | ||
292 | 293 | ||
293 | mov ebx, eax |
294 | mov ebx, eax |
Line 294... | Line 295... | ||
294 | .next: |
295 | .next: |
295 | add edi, 0x1000 |
296 | add edi, 0x1000 |
296 | add esi, 4 |
297 | add esi, 4 |
297 | loop @B |
298 | loop @B |
298 | 299 | ||
299 | mov [pg_data.pages_free], ebp |
300 | mov [pg_data.pages_free], ebp |
Line 300... | Line 301... | ||
300 | mov ecx, pg_data.mutex |
301 | mov ecx, pg_data.mutex |
301 | call mutex_unlock |
302 | call mutex_unlock |
Line 302... | Line 303... | ||
302 | 303 | ||
303 | pop ebx |
304 | pop ebx |
304 | pop edi |
305 | pop edi |
305 | pop esi |
306 | pop esi |
306 | pop ebp |
307 | pop ebp |
307 | ret |
308 | ret |
308 | 309 | ||
309 | ; param |
310 | ; param |
310 | ; eax= base |
311 | ; eax= base |
311 | ; ecx= count |
312 | ; ecx= count |
312 | 313 | ||
313 | align 4 |
314 | align 4 |
314 | unmap_pages: |
315 | unmap_pages: |
315 | 316 | ||
316 | push edi |
317 | push edi |
317 | 318 | ||
Line 318... | Line 319... | ||
318 | mov edi, eax |
319 | mov edi, eax |
319 | mov edx, eax |
320 | mov edx, eax |
320 | 321 | ||
321 | shr edi, 10 |
322 | shr edi, 10 |
322 | add edi, page_tabs |
323 | add edi, page_tabs |
Line 323... | Line 324... | ||
323 | 324 | ||
324 | xor eax, eax |
325 | xor eax, eax |
325 | @@: |
326 | @@: |
- | 327 | stosd |
|
- | 328 | invlpg [edx] |
|
326 | stosd |
329 | add edx, 0x1000 |
327 | invlpg [edx] |
330 | loop @b |
328 | add edx, 0x1000 |
331 | |
329 | loop @b |
332 | pop edi |
330 | 333 | ret |
|
331 | pop edi |
334 | |
332 | ret |
335 | |
333 | 336 | align 4 |
|
- | 337 | proc map_page_table stdcall, lin_addr:dword, phis_addr:dword |
|
- | 338 | push ebx |
|
334 | 339 | mov ebx, [lin_addr] |
|
335 | align 4 |
340 | shr ebx, 22 |
336 | proc map_page_table stdcall, lin_addr:dword, phis_addr:dword |
341 | mov eax, [phis_addr] |
337 | push ebx |
342 | and eax, not 0xFFF |
338 | mov ebx, [lin_addr] |
343 | or eax, PG_UW ;+PG_NOCACHE |
339 | shr ebx, 22 |
344 | mov dword [master_tab+ebx*4], eax |
340 | mov eax, [phis_addr] |
345 | mov eax, [lin_addr] |
341 | and eax, not 0xFFF |
346 | shr eax, 10 |
342 | or eax, PG_UW ;+PG_NOCACHE |
347 | add eax, page_tabs |
343 | mov dword [master_tab+ebx*4], eax |
348 | invlpg [eax] |
344 | mov eax, [lin_addr] |
349 | pop ebx |
345 | shr eax, 10 |
350 | ret |
346 | add eax, page_tabs |
351 | endp |
347 | invlpg [eax] |
352 | |
348 | pop ebx |
353 | align 4 |
349 | ret |
354 | proc init_LFB |
350 | endp |
355 | locals |
351 | 356 | pg_count dd ? |
|
352 | align 4 |
357 | endl |
353 | proc init_LFB |
358 | |
354 | locals |
359 | cmp dword [LFBAddress], -1 |
355 | pg_count dd ? |
360 | jne @f |
356 | endl |
361 | mov [BOOT_VAR+0x901c], byte 2 |
357 | 362 | ; max VGA=640*480*4=1228800 bytes |
|
358 | cmp dword [LFBAddress], -1 |
363 | ; + 32*640*4=81920 bytes for mouse pointer |
359 | jne @f |
364 | stdcall alloc_pages, ((1228800+81920)/4096) |
360 | mov [BOOT_VAR+0x901c],byte 2 |
365 | |
361 | stdcall alloc_pages, (0x280000 / 4096) |
366 | push eax |
362 | 367 | call alloc_page |
|
363 | push eax |
368 | stdcall map_page_table, LFB_BASE, eax |
364 | call alloc_page |
369 | pop eax |
365 | stdcall map_page_table, LFB_BASE, eax |
370 | or eax, PG_UW |
366 | pop eax |
371 | mov ebx, LFB_BASE |
367 | or eax, PG_UW |
372 | ; max VGA=640*480*4=1228800 bytes |
368 | mov ebx, LFB_BASE |
373 | ; + 32*640*4=81920 bytes for mouse pointer |
369 | mov ecx, 0x280000 / 4096 |
374 | mov ecx, (1228800+81920)/4096 |
370 | call commit_pages |
375 | call commit_pages |
371 | mov [LFBAddress], dword LFB_BASE |
376 | mov [LFBAddress], dword LFB_BASE |
372 | ret |
377 | ret |
373 | @@: |
378 | @@: |
Line 374... | Line 379... | ||
374 | test [SCR_MODE],word 0100000000000000b |
379 | test [SCR_MODE], word 0100000000000000b |
Line 375... | Line 380... | ||
375 | jnz @f |
380 | jnz @f |
376 | mov [BOOT_VAR+0x901c],byte 2 |
381 | mov [BOOT_VAR+0x901c], byte 2 |
377 | ret |
382 | ret |
378 | @@: |
383 | @@: |
379 | call init_mtrr |
384 | call init_mtrr |
380 | 385 | ||
381 | mov edx, LFB_BASE |
386 | mov edx, LFB_BASE |
382 | mov esi, [LFBAddress] |
387 | mov esi, [LFBAddress] |
383 | mov edi, 0x00C00000 |
388 | mov edi, 0x00C00000 |
384 | mov dword [exp_lfb+4], edx |
389 | mov dword [exp_lfb+4], edx |
385 | 390 | ||
386 | shr edi, 12 |
391 | shr edi, 12 |
387 | mov [pg_count], edi |
392 | mov [pg_count], edi |
388 | shr edi, 10 |
393 | shr edi, 10 |
389 | 394 | ||
390 | bt [cpu_caps], CAPS_PSE |
395 | bt [cpu_caps], CAPS_PSE |
391 | jnc .map_page_tables |
396 | jnc .map_page_tables |
392 | or esi, PG_LARGE+PG_UW |
397 | or esi, PG_LARGE+PG_UW |
393 | mov edx, sys_pgdir+(LFB_BASE shr 20) |
398 | mov edx, sys_pgdir+(LFB_BASE shr 20) |
394 | @@: |
399 | @@: |
395 | mov [edx], esi |
400 | mov [edx], esi |
Line 396... | Line 401... | ||
396 | add edx, 4 |
401 | add edx, 4 |
397 | add esi, 0x00400000 |
402 | add esi, 0x00400000 |
Line 398... | Line 403... | ||
398 | dec edi |
403 | dec edi |
399 | jnz @B |
404 | jnz @B |
Line 400... | Line 405... | ||
400 | 405 | ||
401 | bt [cpu_caps], CAPS_PGE |
406 | bt [cpu_caps], CAPS_PGE |
- | 407 | jnc @F |
|
- | 408 | or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL |
|
- | 409 | @@: |
|
- | 410 | mov dword [LFBAddress], LFB_BASE |
|
- | 411 | mov eax, cr3 ;flush TLB |
|
- | 412 | mov cr3, eax |
|
- | 413 | ret |
|
- | 414 | ||
- | 415 | .map_page_tables: |
|
- | 416 | ||
- | 417 | @@: |
|
- | 418 | call alloc_page |
|
- | 419 | stdcall map_page_table, edx, eax |
|
- | 420 | add edx, 0x00400000 |
|
- | 421 | dec edi |
|
- | 422 | jnz @B |
|
- | 423 | ||
- | 424 | mov eax, [LFBAddress] |
|
- | 425 | mov edi, page_tabs + (LFB_BASE shr 10) |
|
- | 426 | or eax, PG_UW |
|
- | 427 | mov ecx, [pg_count] |
|
- | 428 | cld |
|
- | 429 | @@: |
|
- | 430 | stosd |
|
- | 431 | add eax, 0x1000 |
|
- | 432 | dec ecx |
|
- | 433 | jnz @B |
|
- | 434 | ||
- | 435 | mov dword [LFBAddress], LFB_BASE |
|
- | 436 | mov eax, cr3 ;flush TLB |
|
Line 402... | Line -... | ||
402 | jnc @F |
- | |
403 | or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL |
- | |
404 | @@: |
- | |
405 | mov dword [LFBAddress], LFB_BASE |
- | |
406 | mov eax, cr3 ;flush TLB |
- | |
407 | mov cr3, eax |
- | |
408 | ret |
- | |
409 | - | ||
410 | .map_page_tables: |
- | |
411 | - | ||
412 | @@: |
- | |
413 | call alloc_page |
- | |
414 | stdcall map_page_table, edx, eax |
- | |
415 | add edx, 0x00400000 |
- | |
416 | dec edi |
- | |
417 | jnz @B |
- | |
418 | - | ||
419 | mov eax, [LFBAddress] |
- | |
420 | mov edi, page_tabs + (LFB_BASE shr 10) |
437 | mov cr3, eax |
421 | or eax, PG_UW |
- | |
422 | mov ecx, [pg_count] |
- | |
423 | cld |
- | |
424 | @@: |
- | |
425 | stosd |
- | |
426 | add eax, 0x1000 |
438 | |
427 | dec ecx |
- | |
428 | jnz @B |
- | |
429 | - | ||
430 | mov dword [LFBAddress], LFB_BASE |
- | |
431 | mov eax, cr3 ;flush TLB |
- | |
432 | mov cr3, eax |
- | |
433 | 439 | ret |
|
434 | ret |
440 | endp |
Line 435... | Line 441... | ||
435 | endp |
441 | |
436 | 442 | align 4 |
|
437 | align 4 |
443 | proc new_mem_resize stdcall, new_size:dword |
Line 438... | Line 444... | ||
438 | proc new_mem_resize stdcall, new_size:dword |
444 | |
439 | 445 | mov ecx, pg_data.mutex |
|
Line 440... | Line 446... | ||
440 | mov ecx, pg_data.mutex |
446 | call mutex_lock |
441 | call mutex_lock |
447 | |
442 | 448 | mov edi, [new_size] |
|
Line 443... | Line 449... | ||
443 | mov edi, [new_size] |
449 | add edi, 4095 |
444 | add edi,4095 |
450 | and edi, not 4095 |
- | 451 | mov [new_size], edi |
|
- | 452 | ||
- | 453 | mov edx, [current_slot] |
|
- | 454 | cmp [edx+APPDATA.heap_base], 0 |
|
- | 455 | jne .exit |
|
- | 456 | ||
- | 457 | mov esi, [edx+APPDATA.mem_size] |
|
- | 458 | add esi, 4095 |
|
- | 459 | and esi, not 4095 |
|
- | 460 | ||
Line 445... | Line -... | ||
445 | and edi,not 4095 |
- | |
446 | mov [new_size], edi |
- | |
447 | - | ||
448 | mov edx,[current_slot] |
- | |
449 | cmp [edx+APPDATA.heap_base],0 |
- | |
450 | jne .exit |
- | |
451 | - | ||
452 | mov esi, [edx+APPDATA.mem_size] |
- | |
453 | add esi, 4095 |
- | |
454 | and esi, not 4095 |
- | |
455 | 461 | cmp edi, esi |
|
456 | cmp edi, esi |
462 | jae .expand |
457 | jae .expand |
463 | |
458 | 464 | shr edi, 12 |
|
459 | shr edi, 12 |
465 | shr esi, 12 |
460 | shr esi, 12 |
466 | @@: |
461 | @@: |
467 | mov eax, [app_page_tabs+edi*4] |
462 | mov eax, [app_page_tabs+edi*4] |
468 | test eax, 1 |
463 | test eax, 1 |
469 | jz .next |
464 | jz .next |
470 | mov dword [app_page_tabs+edi*4], 2 |
465 | mov dword [app_page_tabs+edi*4], 2 |
471 | mov ebx, edi |
466 | mov ebx, edi |
472 | shl ebx, 12 |
467 | shl ebx, 12 |
473 | push eax |
468 | push eax |
474 | invlpg [ebx] |
469 | invlpg [ebx] |
475 | pop eax |
470 | pop eax |
476 | call free_page |
471 | call free_page |
477 | |
472 | 478 | .next: |
|
473 | .next: add edi, 1 |
479 | add edi, 1 |
474 | cmp edi, esi |
480 | cmp edi, esi |
475 | jb @B |
481 | jb @B |
476 | 482 | ||
477 | .update_size: |
483 | .update_size: |
478 | mov ebx, [new_size] |
484 | mov ebx, [new_size] |
479 | call update_mem_size |
485 | call update_mem_size |
480 | 486 | ||
481 | mov ecx, pg_data.mutex |
487 | mov ecx, pg_data.mutex |
482 | call mutex_unlock |
488 | call mutex_unlock |
483 | 489 | ||
484 | xor eax, eax |
490 | xor eax, eax |
485 | ret |
491 | ret |
486 | .expand: |
492 | .expand: |
487 | 493 | ||
488 | push esi |
494 | push esi |
489 | push edi |
495 | push edi |
490 | 496 | ||
491 | add edi, 0x3FFFFF |
497 | add edi, 0x3FFFFF |
492 | and edi, not(0x3FFFFF) |
498 | and edi, not(0x3FFFFF) |
493 | add esi, 0x3FFFFF |
499 | add esi, 0x3FFFFF |
494 | and esi, not(0x3FFFFF) |
500 | and esi, not(0x3FFFFF) |
495 | 501 | ||
496 | cmp esi, edi |
502 | cmp esi, edi |
497 | jae .grow |
503 | jae .grow |
498 | 504 | ||
499 | xchg esi, edi |
505 | xchg esi, edi |
500 | 506 | ||
501 | @@: |
507 | @@: |
502 | call alloc_page |
508 | call alloc_page |
Line 503... | Line 509... | ||
503 | test eax, eax |
509 | test eax, eax |
504 | jz .exit_pop |
510 | jz .exit_pop |
505 | 511 | ||
506 | stdcall map_page_table, edi, eax |
512 | stdcall map_page_table, edi, eax |
507 | 513 | ||
508 | push edi |
514 | push edi |
509 | shr edi, 10 |
515 | shr edi, 10 |
510 | add edi, page_tabs |
516 | add edi, page_tabs |
511 | mov ecx, 1024 |
517 | mov ecx, 1024 |
512 | xor eax, eax |
518 | xor eax, eax |
Line 513... | Line 519... | ||
513 | cld |
519 | cld |
514 | rep stosd |
520 | rep stosd |
515 | pop edi |
521 | pop edi |
516 | 522 | ||
Line 517... | Line 523... | ||
517 | add edi, 0x00400000 |
523 | add edi, 0x00400000 |
518 | cmp edi, esi |
524 | cmp edi, esi |
519 | jb @B |
525 | jb @B |
520 | .grow: |
526 | .grow: |
Line 521... | Line 527... | ||
521 | ;//- |
527 | ;//- |
522 | pop edi |
528 | pop edi |
523 | push edi |
529 | push edi |
524 | mov esi, [pg_data.pages_free] |
530 | mov esi, [pg_data.pages_free] |
525 | sub esi, 1 |
531 | sub esi, 1 |
Line 526... | Line 532... | ||
526 | shr edi, 12 |
532 | shr edi, 12 |
527 | cmp esi, edi |
533 | cmp esi, edi |
528 | jle .out_of_memory |
534 | jle .out_of_memory |
529 | ;//- |
535 | ;//- |
530 | pop edi |
536 | pop edi |
531 | pop esi |
537 | pop esi |
532 | @@: |
538 | @@: |
533 | call alloc_page |
539 | call alloc_page |
534 | test eax, eax |
540 | test eax, eax |
535 | jz .exit |
541 | jz .exit |
536 | stdcall map_page,esi,eax,dword PG_UW |
542 | stdcall map_page, esi, eax, dword PG_UW |
537 | 543 | ||
538 | push edi |
544 | push edi |
539 | mov edi, esi |
545 | mov edi, esi |
540 | xor eax, eax |
546 | xor eax, eax |
541 | mov ecx, 1024 |
547 | mov ecx, 1024 |
542 | cld |
548 | cld |
543 | rep stosd |
549 | rep stosd |
544 | pop edi |
550 | pop edi |
Line 545... | Line 551... | ||
545 | 551 | ||
546 | add esi, 0x1000 |
552 | add esi, 0x1000 |
547 | cmp esi, edi |
553 | cmp esi, edi |
548 | jb @B |
554 | jb @B |
549 | 555 | ||
Line 550... | Line 556... | ||
550 | jmp .update_size |
556 | jmp .update_size |
551 | ;//- |
557 | ;//- |
552 | .exit_pop: |
558 | .exit_pop: |
553 | .out_of_memory: |
559 | .out_of_memory: |
554 | ;//- |
560 | ;//- |
555 | pop edi |
561 | pop edi |
Line 556... | Line 562... | ||
556 | pop esi |
562 | pop esi |
557 | .exit: |
563 | .exit: |
558 | mov ecx, pg_data.mutex |
564 | mov ecx, pg_data.mutex |
Line 671... | Line 677... | ||
671 | .alloc: |
677 | .alloc: |
672 | call alloc_page |
678 | call alloc_page |
673 | test eax, eax |
679 | test eax, eax |
674 | jz .fail |
680 | jz .fail |
Line 675... | Line 681... | ||
675 | 681 | ||
Line 676... | Line 682... | ||
676 | stdcall map_page,[.err_addr],eax,PG_UW |
682 | stdcall map_page, [.err_addr], eax, PG_UW |
677 | 683 | ||
678 | mov edi, [.err_addr] |
684 | mov edi, [.err_addr] |
679 | and edi, 0xFFFFF000 |
685 | and edi, 0xFFFFF000 |
680 | mov ecx, 1024 |
686 | mov ecx, 1024 |
681 | xor eax, eax |
687 | xor eax, eax |
682 | ;cld ;caller is duty for this |
688 | ;cld ;caller is duty for this |
683 | rep stosd |
689 | rep stosd |
684 | .exit: ;iret with repeat fault instruction |
690 | .exit: ;iret with repeat fault instruction |
685 | add esp,12 ;clear in stack: locals(.err_addr) + #PF + ret_to_caller |
691 | add esp, 12;clear in stack: locals(.err_addr) + #PF + ret_to_caller |
Line 686... | Line 692... | ||
686 | restore_ring3_context |
692 | restore_ring3_context |
687 | iretd |
693 | iretd |
Line 709... | Line 715... | ||
709 | .fault_in_hdll: |
715 | .fault_in_hdll: |
710 | ; allocate new page, map it as rw and copy data |
716 | ; allocate new page, map it as rw and copy data |
711 | call alloc_page |
717 | call alloc_page |
712 | test eax, eax |
718 | test eax, eax |
713 | jz .fail |
719 | jz .fail |
714 | stdcall map_page,ebx,eax,PG_UW |
720 | stdcall map_page, ebx, eax, PG_UW |
715 | mov edi, ebx |
721 | mov edi, ebx |
716 | mov ecx, 1024 |
722 | mov ecx, 1024 |
717 | sub ebx, [esi+HDLL.base] |
723 | sub ebx, [esi+HDLL.base] |
718 | mov esi, [esi+HDLL.parent] |
724 | mov esi, [esi+HDLL.parent] |
719 | mov esi, [esi+DLLDESCR.data] |
725 | mov esi, [esi+DLLDESCR.data] |
720 | add esi, ebx |
726 | add esi, ebx |
721 | rep movsd |
727 | rep movsd |
722 | jmp .exit |
728 | jmp .exit |
Line 723... | Line 729... | ||
723 | 729 | ||
724 | .kernel_space: |
730 | .kernel_space: |
725 | test eax, PG_MAP |
731 | test eax, PG_MAP |
Line 726... | Line 732... | ||
726 | jz .fail ;ñòðà Ãèöà ÃÃ¥ ïðèñóòñòâóåò |
732 | jz .fail ;ñòðà Ãèöà ÃÃ¥ ïðèñóòñòâóåò |
727 | 733 | ||
728 | test eax,12 ;U/S (+below) |
734 | test eax, 12 ;U/S (+below) |
729 | jnz .fail ;ïðèëîæåÃèå îáðà òèëîñü ê ïà ìÿòè |
735 | jnz .fail ;ïðèëîæåÃèå îáðà òèëîñü ê ïà ìÿòè |
730 | ;ÿäðà |
736 | ;ÿäðà |
731 | ;test eax, 8 |
737 | ;test eax, 8 |
Line 746... | Line 752... | ||
746 | call alloc_page |
752 | call alloc_page |
747 | test eax, eax |
753 | test eax, eax |
748 | jz .fail |
754 | jz .fail |
Line 749... | Line 755... | ||
749 | 755 | ||
750 | push eax |
756 | push eax |
751 | stdcall map_page,[.err_addr],eax,dword PG_SW |
757 | stdcall map_page, [.err_addr], eax, dword PG_SW |
752 | pop eax |
758 | pop eax |
753 | mov edi, [.err_addr] |
759 | mov edi, [.err_addr] |
754 | and edi, -4096 |
760 | and edi, -4096 |
Line 761... | Line 767... | ||
761 | mov [edx+APPDATA.io_map+ebx*4], eax |
767 | mov [edx+APPDATA.io_map+ebx*4], eax |
Line 762... | Line 768... | ||
762 | 768 | ||
763 | add esi, [default_io_map] |
769 | add esi, [default_io_map] |
764 | mov ecx, 4096/4 |
770 | mov ecx, 4096/4 |
765 | ;cld ;caller is duty for this |
771 | ;cld ;caller is duty for this |
766 | rep movsd |
772 | rep movsd |
767 | jmp .exit |
773 | jmp .exit |
Line 768... | Line 774... | ||
768 | endp |
774 | endp |
769 | 775 | ||
770 | ; returns number of mapped bytes |
776 | ; returns number of mapped bytes |
771 | proc map_mem stdcall, lin_addr:dword,slot:dword,\ |
777 | proc map_mem stdcall, lin_addr:dword,slot:dword,\ |
Line 772... | Line 778... | ||
772 | ofs:dword,buf_size:dword,req_access:dword |
778 | ofs:dword,buf_size:dword,req_access:dword |
773 | push 0 ; initialize number of mapped bytes |
779 | push 0 ; initialize number of mapped bytes |
Line 774... | Line 780... | ||
774 | 780 | ||
775 | cmp [buf_size], 0 |
781 | cmp [buf_size], 0 |
776 | jz .exit |
782 | jz .exit |
777 | 783 | ||
778 | mov eax, [slot] |
784 | mov eax, [slot] |
779 | shl eax, 8 |
785 | shl eax, 8 |
780 | mov eax, [SLOT_BASE+eax+APPDATA.dir_table] |
786 | mov eax, [SLOT_BASE+eax+APPDATA.dir_table] |
781 | and eax, 0xFFFFF000 |
787 | and eax, 0xFFFFF000 |
782 | 788 | ||
783 | stdcall map_page,[ipc_pdir],eax,PG_UW |
789 | stdcall map_page, [ipc_pdir], eax, PG_UW |
784 | mov ebx, [ofs] |
790 | mov ebx, [ofs] |
785 | shr ebx, 22 |
791 | shr ebx, 22 |
786 | mov esi, [ipc_pdir] |
792 | mov esi, [ipc_pdir] |
787 | mov edi, [ipc_ptab] |
793 | mov edi, [ipc_ptab] |
788 | mov eax, [esi+ebx*4] |
794 | mov eax, [esi+ebx*4] |
789 | and eax, 0xFFFFF000 |
795 | and eax, 0xFFFFF000 |
790 | jz .exit |
796 | jz .exit |
791 | stdcall map_page,edi,eax,PG_UW |
797 | stdcall map_page, edi, eax, PG_UW |
792 | ; inc ebx |
798 | ; inc ebx |
793 | ; add edi, 0x1000 |
799 | ; add edi, 0x1000 |
794 | ; mov eax, [esi+ebx*4] |
800 | ; mov eax, [esi+ebx*4] |
Line -... | Line 801... | ||
- | 801 | ; test eax, eax |
|
795 | ; test eax, eax |
802 | ; jz @f |
796 | ; jz @f |
803 | ; and eax, 0xFFFFF000 |
797 | ; and eax, 0xFFFFF000 |
804 | ; stdcall map_page, edi, eax |
798 | ; stdcall map_page, edi, eax |
805 | |
799 | 806 | @@: |
|
800 | @@: mov edi, [lin_addr] |
807 | mov edi, [lin_addr] |
801 | and edi, 0xFFFFF000 |
808 | and edi, 0xFFFFF000 |
802 | mov ecx, [buf_size] |
809 | mov ecx, [buf_size] |
803 | add ecx, 4095 |
810 | add ecx, 4095 |
804 | shr ecx, 12 |
811 | shr ecx, 12 |
805 | inc ecx |
812 | inc ecx |
Line 806... | Line 813... | ||
806 | 813 | ||
807 | mov edx, [ofs] |
814 | mov edx, [ofs] |
808 | shr edx, 12 |
815 | shr edx, 12 |
809 | and edx, 0x3FF |
816 | and edx, 0x3FF |
810 | mov esi, [ipc_ptab] |
817 | mov esi, [ipc_ptab] |
811 | 818 | ||
812 | .map: |
819 | .map: |
813 | stdcall safe_map_page,[slot],[req_access],[ofs] |
820 | stdcall safe_map_page, [slot], [req_access], [ofs] |
814 | jnc .exit |
821 | jnc .exit |
815 | add dword [ebp-4], 4096 |
822 | add dword [ebp-4], 4096 |
816 | add [ofs], 4096 |
823 | add [ofs], 4096 |
817 | dec ecx |
824 | dec ecx |
818 | jz .exit |
825 | jz .exit |
819 | add edi, 0x1000 |
826 | add edi, 0x1000 |
820 | inc edx |
827 | inc edx |
821 | cmp edx, 0x400 |
828 | cmp edx, 0x400 |
822 | jnz .map |
829 | jnz .map |
823 | inc ebx |
830 | inc ebx |
824 | mov eax, [ipc_pdir] |
831 | mov eax, [ipc_pdir] |
Line 825... | Line 832... | ||
825 | mov eax, [eax+ebx*4] |
832 | mov eax, [eax+ebx*4] |
826 | and eax, 0xFFFFF000 |
833 | and eax, 0xFFFFF000 |
827 | jz .exit |
834 | jz .exit |
828 | stdcall map_page,esi,eax,PG_UW |
835 | stdcall map_page, esi, eax, PG_UW |
Line 829... | Line 836... | ||
829 | xor edx, edx |
836 | xor edx, edx |
830 | jmp .map |
837 | jmp .map |
831 | 838 | ||
- | 839 | .exit: |
|
- | 840 | pop eax |
|
- | 841 | ret |
|
Line -... | Line 842... | ||
- | 842 | endp |
|
- | 843 | ||
- | 844 | proc map_memEx stdcall, lin_addr:dword,slot:dword,\ |
|
- | 845 | ofs:dword,buf_size:dword,req_access:dword |
|
- | 846 | push 0 ; initialize number of mapped bytes |
|
- | 847 | ||
- | 848 | cmp [buf_size], 0 |
|
- | 849 | jz .exit |
|
- | 850 | ||
- | 851 | mov eax, [slot] |
|
832 | .exit: |
852 | shl eax, 8 |
- | 853 | mov eax, [SLOT_BASE+eax+APPDATA.dir_table] |
|
- | 854 | and eax, 0xFFFFF000 |
|
833 | pop eax |
855 | |
- | 856 | stdcall map_page, [proc_mem_pdir], eax, PG_UW |
|
Line 834... | Line -... | ||
834 | ret |
- | |
835 | endp |
- | |
836 | - | ||
837 | proc map_memEx stdcall, lin_addr:dword,slot:dword,\ |
- | |
838 | ofs:dword,buf_size:dword,req_access:dword |
857 | mov ebx, [ofs] |
839 | push 0 ; initialize number of mapped bytes |
- | |
840 | - | ||
841 | cmp [buf_size], 0 |
- | |
842 | jz .exit |
- | |
843 | - | ||
844 | mov eax, [slot] |
- | |
845 | shl eax, 8 |
- | |
846 | mov eax, [SLOT_BASE+eax+APPDATA.dir_table] |
- | |
847 | and eax, 0xFFFFF000 |
- | |
848 | - | ||
849 | stdcall map_page,[proc_mem_pdir],eax,PG_UW |
- | |
850 | mov ebx, [ofs] |
858 | shr ebx, 22 |
851 | shr ebx, 22 |
859 | mov esi, [proc_mem_pdir] |
852 | mov esi, [proc_mem_pdir] |
860 | mov edi, [proc_mem_tab] |
853 | mov edi, [proc_mem_tab] |
861 | mov eax, [esi+ebx*4] |
854 | mov eax, [esi+ebx*4] |
862 | and eax, 0xFFFFF000 |
855 | and eax, 0xFFFFF000 |
863 | test eax, eax |
856 | test eax, eax |
864 | jz .exit |
857 | jz .exit |
865 | stdcall map_page, edi, eax, PG_UW |
858 | stdcall map_page,edi,eax,PG_UW |
866 | |
859 | 867 | @@: |
|
860 | @@: mov edi, [lin_addr] |
868 | mov edi, [lin_addr] |
Line 861... | Line 869... | ||
861 | and edi, 0xFFFFF000 |
869 | and edi, 0xFFFFF000 |
862 | mov ecx, [buf_size] |
870 | mov ecx, [buf_size] |
863 | add ecx, 4095 |
871 | add ecx, 4095 |
864 | shr ecx, 12 |
872 | shr ecx, 12 |
865 | inc ecx |
873 | inc ecx |
866 | 874 | ||
867 | mov edx, [ofs] |
875 | mov edx, [ofs] |
868 | shr edx, 12 |
876 | shr edx, 12 |
869 | and edx, 0x3FF |
877 | and edx, 0x3FF |
870 | mov esi, [proc_mem_tab] |
878 | mov esi, [proc_mem_tab] |
871 | 879 | ||
872 | .map: |
880 | .map: |
873 | stdcall safe_map_page,[slot],[req_access],[ofs] |
881 | stdcall safe_map_page, [slot], [req_access], [ofs] |
Line 874... | Line 882... | ||
874 | jnc .exit |
882 | jnc .exit |
875 | add dword [ebp-4], 0x1000 |
883 | add dword [ebp-4], 0x1000 |
876 | add edi, 0x1000 |
884 | add edi, 0x1000 |
877 | add [ofs], 0x1000 |
885 | add [ofs], 0x1000 |
878 | inc edx |
886 | inc edx |
879 | dec ecx |
887 | dec ecx |
880 | jnz .map |
888 | jnz .map |
881 | .exit: |
889 | .exit: |
882 | pop eax |
890 | pop eax |
883 | ret |
891 | ret |
884 | endp |
892 | endp |
885 | 893 | ||
886 | ; in: esi+edx*4 = pointer to page table entry |
894 | ; in: esi+edx*4 = pointer to page table entry |
887 | ; in: [slot], [req_access], [ofs] on the stack |
895 | ; in: [slot], [req_access], [ofs] on the stack |
888 | ; in: edi = linear address to map |
896 | ; in: edi = linear address to map |
889 | ; out: CF cleared <=> failed |
897 | ; out: CF cleared <=> failed |
890 | ; destroys: only eax |
898 | ; destroys: only eax |
891 | proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword |
899 | proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword |
892 | mov eax, [esi+edx*4] |
900 | mov eax, [esi+edx*4] |
893 | test al, PG_MAP |
901 | test al, PG_MAP |
894 | jz .not_present |
902 | jz .not_present |
895 | test al, PG_WRITE |
903 | test al, PG_WRITE |
896 | jz .resolve_readonly |
904 | jz .resolve_readonly |
897 | ; normal case: writable page, just map with requested access |
905 | ; normal case: writable page, just map with requested access |
898 | .map: |
906 | .map: |
899 | stdcall map_page, edi, eax, [req_access] |
907 | stdcall map_page, edi, eax, [req_access] |
900 | stc |
908 | stc |
901 | .fail: |
909 | .fail: |
902 | ret |
910 | ret |
903 | .not_present: |
911 | .not_present: |
904 | ; check for alloc-on-demand page |
912 | ; check for alloc-on-demand page |
905 | test al, 2 |
913 | test al, 2 |
906 | jz .fail |
914 | jz .fail |
907 | ; allocate new page, save it to source page table |
915 | ; allocate new page, save it to source page table |
908 | push ecx |
916 | push ecx |
909 | call alloc_page |
917 | call alloc_page |
910 | pop ecx |
918 | pop ecx |
911 | test eax, eax |
919 | test eax, eax |
912 | jz .fail |
920 | jz .fail |
913 | or al, PG_UW |
921 | or al, PG_UW |
914 | mov [esi+edx*4], eax |
922 | mov [esi+edx*4], eax |
915 | jmp .map |
923 | jmp .map |
916 | .resolve_readonly: |
924 | .resolve_readonly: |
917 | ; readonly page, probably copy-on-write |
925 | ; readonly page, probably copy-on-write |
918 | ; check: readonly request of readonly page is ok |
926 | ; check: readonly request of readonly page is ok |
919 | test [req_access], PG_WRITE |
927 | test [req_access], PG_WRITE |
920 | jz .map |
928 | jz .map |
921 | ; find control structure for this page |
929 | ; find control structure for this page |
922 | pushf |
930 | pushf |
923 | cli |
931 | cli |
924 | cld |
932 | cld |
925 | push ebx ecx |
933 | push ebx ecx |
926 | mov eax, [slot] |
934 | mov eax, [slot] |
927 | shl eax, 8 |
935 | shl eax, 8 |
928 | mov eax, [SLOT_BASE+eax+APPDATA.dlls_list_ptr] |
936 | mov eax, [SLOT_BASE+eax+APPDATA.dlls_list_ptr] |
929 | test eax, eax |
937 | test eax, eax |
930 | jz .no_hdll |
938 | jz .no_hdll |
931 | mov ecx, [eax+HDLL.fd] |
939 | mov ecx, [eax+HDLL.fd] |
932 | .scan_hdll: |
940 | .scan_hdll: |
933 | cmp ecx, eax |
941 | cmp ecx, eax |
934 | jz .no_hdll |
942 | jz .no_hdll |
935 | mov ebx, [ofs] |
943 | mov ebx, [ofs] |
936 | and ebx, not 0xFFF |
944 | and ebx, not 0xFFF |
937 | sub ebx, [ecx+HDLL.base] |
945 | sub ebx, [ecx+HDLL.base] |
938 | cmp ebx, [ecx+HDLL.size] |
946 | cmp ebx, [ecx+HDLL.size] |
939 | jb .hdll_found |
947 | jb .hdll_found |
940 | mov ecx, [ecx+HDLL.fd] |
948 | mov ecx, [ecx+HDLL.fd] |
941 | jmp .scan_hdll |
949 | jmp .scan_hdll |
942 | .no_hdll: |
950 | .no_hdll: |
943 | pop ecx ebx |
951 | pop ecx ebx |
944 | popf |
952 | popf |
945 | clc |
953 | clc |
946 | ret |
954 | ret |
947 | .hdll_found: |
955 | .hdll_found: |
948 | ; allocate page, save it in page table, map it, copy contents from base |
956 | ; allocate page, save it in page table, map it, copy contents from base |
949 | mov eax, [ecx+HDLL.parent] |
957 | mov eax, [ecx+HDLL.parent] |
950 | add ebx, [eax+DLLDESCR.data] |
958 | add ebx, [eax+DLLDESCR.data] |
951 | call alloc_page |
959 | call alloc_page |
952 | test eax, eax |
960 | test eax, eax |
953 | jz .no_hdll |
961 | jz .no_hdll |
954 | or al, PG_UW |
962 | or al, PG_UW |
Line 955... | Line 963... | ||
955 | mov [esi+edx*4], eax |
963 | mov [esi+edx*4], eax |
956 | stdcall map_page, edi, eax, [req_access] |
964 | stdcall map_page, edi, eax, [req_access] |
957 | push esi edi |
965 | push esi edi |
Line 973... | Line 981... | ||
973 | ; eax=2 - send message |
981 | ; eax=2 - send message |
974 | ; ebx=PID |
982 | ; ebx=PID |
975 | ; ecx=address of message |
983 | ; ecx=address of message |
976 | ; edx=size of message |
984 | ; edx=size of message |
Line 977... | Line 985... | ||
977 | 985 | ||
978 | dec ebx |
986 | dec ebx |
Line 979... | Line 987... | ||
979 | jnz @f |
987 | jnz @f |
980 | 988 | ||
981 | mov eax,[current_slot] |
989 | mov eax, [current_slot] |
982 | pushf |
990 | pushf |
983 | cli |
991 | cli |
Line 984... | Line 992... | ||
984 | mov [eax+APPDATA.ipc_start],ecx ;set fields in extended information area |
992 | mov [eax+APPDATA.ipc_start], ecx ;set fields in extended information area |
985 | mov [eax+APPDATA.ipc_size],edx |
993 | mov [eax+APPDATA.ipc_size], edx |
986 | 994 | ||
987 | add edx, ecx |
995 | add edx, ecx |
- | 996 | add edx, 4095 |
|
988 | add edx, 4095 |
997 | and edx, not 4095 |
989 | and edx, not 4095 |
998 | |
990 | 999 | .touch: |
|
991 | .touch: mov eax, [ecx] |
1000 | mov eax, [ecx] |
Line 992... | Line 1001... | ||
992 | add ecx, 0x1000 |
1001 | add ecx, 0x1000 |
993 | cmp ecx, edx |
1002 | cmp ecx, edx |
994 | jb .touch |
1003 | jb .touch |
Line 995... | Line 1004... | ||
995 | 1004 | ||
996 | popf |
1005 | popf |
997 | mov [esp+32], ebx ;ebx=0 |
1006 | mov [esp+32], ebx ;ebx=0 |
998 | ret |
1007 | ret |
999 | 1008 | ||
Line 1000... | Line 1009... | ||
1000 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1009 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1001 | ;2 |
1010 | ;2 |
1002 | @@: |
1011 | @@: |
1003 | dec ebx |
1012 | dec ebx |
1004 | jnz @f |
1013 | jnz @f |
1005 | 1014 | ||
1006 | stdcall sys_ipc_send, ecx, edx, esi |
1015 | stdcall sys_ipc_send, ecx, edx, esi |
Line 1007... | Line 1016... | ||
1007 | mov [esp+32], eax |
1016 | mov [esp+32], eax |
1008 | ret |
1017 | ret |
Line 1040... | Line 1049... | ||
1040 | dst_offset dd ? |
1049 | dst_offset dd ? |
1041 | buf_size dd ? |
1050 | buf_size dd ? |
1042 | used_buf dd ? |
1051 | used_buf dd ? |
1043 | endl |
1052 | endl |
Line 1044... | Line 1053... | ||
1044 | 1053 | ||
1045 | pushf |
1054 | pushf |
- | 1055 | cli |
|
- | 1056 | ||
- | 1057 | mov eax, [PID] |
|
- | 1058 | call pid_to_slot |
|
- | 1059 | test eax, eax |
|
Line 1046... | Line -... | ||
1046 | cli |
- | |
1047 | - | ||
1048 | mov eax, [PID] |
- | |
1049 | call pid_to_slot |
- | |
1050 | test eax,eax |
- | |
1051 | jz .no_pid |
1060 | jz .no_pid |
1052 | 1061 | ||
1053 | mov [dst_slot], eax |
1062 | mov [dst_slot], eax |
1054 | shl eax,8 |
1063 | shl eax, 8 |
1055 | mov edi,[eax+SLOT_BASE+0xa0] ;is ipc area defined? |
1064 | mov edi, [eax+SLOT_BASE+0xa0] ;is ipc area defined? |
1056 | test edi,edi |
1065 | test edi, edi |
1057 | jz .no_ipc_area |
1066 | jz .no_ipc_area |
1058 | 1067 | ||
1059 | mov ebx, edi |
1068 | mov ebx, edi |
1060 | and ebx, 0xFFF |
1069 | and ebx, 0xFFF |
1061 | mov [dst_offset], ebx |
1070 | mov [dst_offset], ebx |
1062 | 1071 | ||
1063 | mov esi, [eax+SLOT_BASE+0xa4] |
1072 | mov esi, [eax+SLOT_BASE+0xa4] |
1064 | mov [buf_size], esi |
1073 | mov [buf_size], esi |
1065 | 1074 | ||
1066 | mov ecx, [ipc_tmp] |
1075 | mov ecx, [ipc_tmp] |
1067 | cmp esi, 0x40000-0x1000 ; size of [ipc_tmp] minus one page |
1076 | cmp esi, 0x40000-0x1000; size of [ipc_tmp] minus one page |
1068 | jbe @f |
1077 | jbe @f |
1069 | push esi edi |
1078 | push esi edi |
1070 | add esi,0x1000 |
1079 | add esi, 0x1000 |
1071 | stdcall alloc_kernel_space,esi |
1080 | stdcall alloc_kernel_space, esi |
1072 | mov ecx, eax |
1081 | mov ecx, eax |
1073 | pop edi esi |
1082 | pop edi esi |
1074 | @@: |
1083 | @@: |
1075 | mov [used_buf], ecx |
1084 | mov [used_buf], ecx |
1076 | stdcall map_mem, ecx, [dst_slot],\ |
1085 | stdcall map_mem, ecx, [dst_slot], \ |
1077 | edi, esi, PG_SW |
1086 | edi, esi, PG_SW |
1078 | 1087 | ||
1079 | mov edi, [dst_offset] |
1088 | mov edi, [dst_offset] |
1080 | add edi, [used_buf] |
1089 | add edi, [used_buf] |
1081 | cmp dword [edi], 0 |
1090 | cmp dword [edi], 0 |
1082 | jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now |
1091 | jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now |
1083 | 1092 | ||
1084 | mov edx, dword [edi+4] |
1093 | mov edx, dword [edi+4] |
1085 | lea ebx, [edx+8] |
1094 | lea ebx, [edx+8] |
1086 | add ebx, [msg_size] |
1095 | add ebx, [msg_size] |
1087 | cmp ebx, [buf_size] |
1096 | cmp ebx, [buf_size] |
1088 | ja .buffer_overflow ;esi<0 - not enough memory in buffer |
1097 | ja .buffer_overflow ;esi<0 - not enough memory in buffer |
1089 | 1098 | ||
1090 | mov dword [edi+4], ebx |
1099 | mov dword [edi+4], ebx |
1091 | mov eax,[TASK_BASE] |
1100 | mov eax, [TASK_BASE] |
1092 | mov eax, [eax+0x04] ;eax - our PID |
1101 | mov eax, [eax+0x04] ;eax - our PID |
1093 | add edi, edx |
1102 | add edi, edx |
1094 | mov [edi], eax |
1103 | mov [edi], eax |
1095 | mov ecx, [msg_size] |
1104 | mov ecx, [msg_size] |
1096 | 1105 | ||
1097 | mov [edi+4], ecx |
1106 | mov [edi+4], ecx |
1098 | add edi, 8 |
1107 | add edi, 8 |
1099 | mov esi, [msg_addr] |
1108 | mov esi, [msg_addr] |
1100 | ; add esi, new_app_base |
1109 | ; add esi, new_app_base |
Line 1101... | Line 1110... | ||
1101 | cld |
1110 | cld |
1102 | rep movsb |
- | |
1103 | - | ||
1104 | mov ebx, [ipc_tmp] |
- | |
1105 | mov edx, ebx |
- | |
1106 | shr ebx, 12 |
- | |
1107 | xor eax, eax |
- | |
1108 | mov [page_tabs+ebx*4], eax |
- | |
1109 | invlpg [edx] |
- | |
1110 | - | ||
1111 | mov ebx, [ipc_pdir] |
- | |
1112 | mov edx, ebx |
- | |
1113 | shr ebx, 12 |
- | |
1114 | xor eax, eax |
- | |
1115 | mov [page_tabs+ebx*4], eax |
- | |
1116 | invlpg [edx] |
1111 | rep movsb |
1117 | 1112 | ||
1118 | mov ebx, [ipc_ptab] |
1113 | mov ebx, [ipc_tmp] |
1119 | mov edx, ebx |
1114 | mov edx, ebx |
1120 | shr ebx, 12 |
1115 | shr ebx, 12 |
1121 | xor eax, eax |
- | |
1122 | mov [page_tabs+ebx*4], eax |
- | |
1123 | invlpg [edx] |
- | |
1124 | - | ||
1125 | mov eax, [dst_slot] |
- | |
1126 | shl eax, 8 |
- | |
Line -... | Line 1116... | ||
- | 1116 | xor eax, eax |
|
- | 1117 | mov [page_tabs+ebx*4], eax |
|
- | 1118 | invlpg [edx] |
|
- | 1119 | ||
- | 1120 | mov ebx, [ipc_pdir] |
|
- | 1121 | mov edx, ebx |
|
- | 1122 | shr ebx, 12 |
|
- | 1123 | xor eax, eax |
|
- | 1124 | mov [page_tabs+ebx*4], eax |
|
- | 1125 | invlpg [edx] |
|
- | 1126 | ||
- | 1127 | mov ebx, [ipc_ptab] |
|
- | 1128 | mov edx, ebx |
|
- | 1129 | shr ebx, 12 |
|
- | 1130 | xor eax, eax |
|
- | 1131 | mov [page_tabs+ebx*4], eax |
|
- | 1132 | invlpg [edx] |
|
- | 1133 | ||
- | 1134 | mov eax, [dst_slot] |
|
- | 1135 | shl eax, 8 |
|
1127 | or [eax+SLOT_BASE+0xA8],dword 0x40 |
1136 | or [eax+SLOT_BASE+0xA8], dword 0x40 |
1128 | cmp dword [check_idle_semaphore],20 |
1137 | cmp dword [check_idle_semaphore], 20 |
1129 | jge .ipc_no_cis |
1138 | jge .ipc_no_cis |
1130 | 1139 | ||
1131 | mov dword [check_idle_semaphore],5 |
1140 | mov dword [check_idle_semaphore], 5 |
1132 | .ipc_no_cis: |
1141 | .ipc_no_cis: |
1133 | push 0 |
1142 | push 0 |
1134 | jmp .ret |
1143 | jmp .ret |
1135 | .no_pid: |
1144 | .no_pid: |
1136 | popf |
1145 | popf |
1137 | mov eax, 4 |
1146 | mov eax, 4 |
1138 | ret |
1147 | ret |
1139 | .no_ipc_area: |
1148 | .no_ipc_area: |
1140 | popf |
1149 | popf |
1141 | xor eax, eax |
1150 | xor eax, eax |
1142 | inc eax |
1151 | inc eax |
1143 | ret |
1152 | ret |
1144 | .ipc_blocked: |
1153 | .ipc_blocked: |
1145 | push 2 |
1154 | push 2 |
1146 | jmp .ret |
1155 | jmp .ret |
1147 | .buffer_overflow: |
1156 | .buffer_overflow: |
1148 | push 3 |
1157 | push 3 |
1149 | .ret: |
1158 | .ret: |
1150 | mov eax, [used_buf] |
1159 | mov eax, [used_buf] |
1151 | cmp eax, [ipc_tmp] |
1160 | cmp eax, [ipc_tmp] |
1152 | jz @f |
1161 | jz @f |
1153 | stdcall free_kernel_space,eax |
1162 | stdcall free_kernel_space, eax |
1154 | @@: |
1163 | @@: |
Line 1155... | Line 1164... | ||
1155 | pop eax |
1164 | pop eax |
1156 | popf |
1165 | popf |
Line 1157... | Line 1166... | ||
1157 | ret |
1166 | ret |
1158 | endp |
1167 | endp |
1159 | 1168 | ||
Line 1160... | Line 1169... | ||
1160 | align 4 |
1169 | align 4 |
1161 | sysfn_meminfo: |
1170 | sysfn_meminfo: |
1162 | 1171 | ||
1163 | ; add ecx, new_app_base |
1172 | ; add ecx, new_app_base |
1164 | cmp ecx, OS_BASE |
1173 | cmp ecx, OS_BASE |
1165 | jae .fail |
1174 | jae .fail |
1166 | 1175 | ||
1167 | mov eax, [pg_data.pages_count] |
1176 | mov eax, [pg_data.pages_count] |
1168 | mov [ecx], eax |
1177 | mov [ecx], eax |
1169 | shl eax, 12 |
1178 | shl eax, 12 |
1170 | mov [esp+32], eax |
1179 | mov [esp+32], eax |
1171 | mov eax, [pg_data.pages_free] |
1180 | mov eax, [pg_data.pages_free] |
1172 | mov [ecx+4], eax |
1181 | mov [ecx+4], eax |
1173 | mov eax, [pg_data.pages_faults] |
1182 | mov eax, [pg_data.pages_faults] |
1174 | mov [ecx+8], eax |
1183 | mov [ecx+8], eax |
1175 | mov eax, [heap_size] |
1184 | mov eax, [heap_size] |
1176 | mov [ecx+12], eax |
1185 | mov [ecx+12], eax |
1177 | mov eax, [heap_free] |
1186 | mov eax, [heap_free] |
1178 | mov [ecx+16], eax |
1187 | mov [ecx+16], eax |
1179 | mov eax, [heap_blocks] |
1188 | mov eax, [heap_blocks] |
Line 1180... | Line 1189... | ||
1180 | mov [ecx+20], eax |
1189 | mov [ecx+20], eax |
1181 | mov eax, [free_blocks] |
1190 | mov eax, [free_blocks] |
1182 | mov [ecx+24], eax |
1191 | mov [ecx+24], eax |
1183 | ret |
1192 | ret |
Line 1184... | Line 1193... | ||
1184 | .fail: |
1193 | .fail: |
1185 | or dword [esp+32], -1 |
1194 | or dword [esp+32], -1 |
Line 1186... | Line 1195... | ||
1186 | ret |
1195 | ret |
1187 | 1196 | ||
Line 1188... | Line 1197... | ||
1188 | align 4 |
1197 | align 4 |
1189 | f68: |
1198 | f68: |
1190 | cmp ebx,4 |
1199 | cmp ebx, 4 |
1191 | jbe sys_sheduler |
1200 | jbe sys_sheduler |
1192 | 1201 | ||
1193 | cmp ebx, 11 |
1202 | cmp ebx, 11 |
1194 | jb .fail |
1203 | jb .fail |
1195 | 1204 | ||
1196 | cmp ebx, 25 |
1205 | cmp ebx, 25 |
1197 | ja .fail |
1206 | ja .fail |
1198 | 1207 | ||
1199 | jmp dword [f68call+ebx*4-11*4] |
1208 | jmp dword [f68call+ebx*4-11*4] |
1200 | .11: |
1209 | .11: |
1201 | call init_heap |
1210 | call init_heap |
1202 | mov [esp+32], eax |
1211 | mov [esp+32], eax |
1203 | ret |
1212 | ret |
1204 | .12: |
1213 | .12: |
1205 | stdcall user_alloc, ecx |
1214 | stdcall user_alloc, ecx |
1206 | mov [esp+32], eax |
1215 | mov [esp+32], eax |
1207 | ret |
1216 | ret |
1208 | .13: |
1217 | .13: |
1209 | stdcall user_free, ecx |
1218 | stdcall user_free, ecx |
1210 | mov [esp+32], eax |
1219 | mov [esp+32], eax |
1211 | ret |
1220 | ret |
1212 | .14: |
1221 | .14: |
1213 | cmp ecx, OS_BASE |
1222 | cmp ecx, OS_BASE |
1214 | jae .fail |
1223 | jae .fail |
1215 | mov edi,ecx |
1224 | mov edi, ecx |
1216 | call get_event_ex |
1225 | call get_event_ex |
1217 | mov [esp+32], eax |
1226 | mov [esp+32], eax |
1218 | ret |
1227 | ret |
1219 | .16: |
1228 | .16: |
1220 | test ecx, ecx |
1229 | test ecx, ecx |
1221 | jz .fail |
1230 | jz .fail |
1222 | cmp ecx, OS_BASE |
1231 | cmp ecx, OS_BASE |
1223 | jae .fail |
1232 | jae .fail |
1224 | stdcall get_service, ecx |
1233 | stdcall get_service, ecx |
1225 | mov [esp+32], eax |
1234 | mov [esp+32], eax |
1226 | ret |
1235 | ret |
1227 | .17: |
1236 | .17: |
1228 | call srv_handlerEx ;ecx |
1237 | call srv_handlerEx ;ecx |
1229 | mov [esp+32], eax |
1238 | mov [esp+32], eax |
1230 | ret |
1239 | ret |
1231 | .19: |
1240 | .19: |
1232 | cmp ecx, OS_BASE |
1241 | cmp ecx, OS_BASE |
1233 | jae .fail |
1242 | jae .fail |
1234 | stdcall load_library, ecx |
1243 | stdcall load_library, ecx |
Line 1235... | Line 1244... | ||
1235 | mov [esp+32], eax |
1244 | mov [esp+32], eax |
1236 | ret |
1245 | ret |
Line 1237... | Line 1246... | ||
1237 | .20: |
1246 | .20: |
1238 | mov eax, edx |
1247 | mov eax, edx |
1239 | mov ebx, ecx |
1248 | mov ebx, ecx |
1240 | call user_realloc ;in: eax = pointer, ebx = new size |
- | |
1241 | mov [esp+32], eax |
- | |
1242 | ret |
- | |
1243 | .21: |
- | |
1244 | cmp ecx, OS_BASE |
- | |
1245 | jae .fail |
- | |
1246 | - | ||
1247 | cmp ebx, OS_BASE |
1249 | call user_realloc ;in: eax = pointer, ebx = new size |
1248 | jae .fail |
1250 | mov [esp+32], eax |
Line -... | Line 1251... | ||
- | 1251 | ret |
|
- | 1252 | .21: |
|
- | 1253 | cmp ecx, OS_BASE |
|
- | 1254 | jae .fail |
|
- | 1255 | ||
- | 1256 | cmp ebx, OS_BASE |
|
- | 1257 | jae .fail |
|
1249 | 1258 | ||
Line 1250... | Line 1259... | ||
1250 | mov edi, edx |
1259 | mov edi, edx |
1251 | stdcall load_PE, ecx |
1260 | stdcall load_PE, ecx |
1252 | mov esi, eax |
1261 | mov esi, eax |
1253 | test eax, eax |
1262 | test eax, eax |
1254 | jz @F |
1263 | jz @F |
1255 | 1264 | ||
Line 1256... | Line 1265... | ||
1256 | push edi |
1265 | push edi |
1257 | push DRV_ENTRY |
1266 | push DRV_ENTRY |
1258 | call eax |
1267 | call eax |
1259 | add esp, 8 |
1268 | add esp, 8 |
Line 1260... | Line 1269... | ||
1260 | test eax, eax |
1269 | test eax, eax |
1261 | jz @F |
1270 | jz @F |
1262 | 1271 | ||
Line 1263... | Line 1272... | ||
1263 | mov [eax+SRV.entry], esi |
1272 | mov [eax+SRV.entry], esi |
1264 | 1273 | ||
1265 | @@: |
1274 | @@: |
1266 | mov [esp+32], eax |
1275 | mov [esp+32], eax |
1267 | ret |
1276 | ret |
1268 | .22: |
1277 | .22: |
1269 | cmp ecx, OS_BASE |
1278 | cmp ecx, OS_BASE |
1270 | jae .fail |
1279 | jae .fail |
1271 | 1280 | ||
1272 | stdcall shmem_open, ecx, edx, esi |
1281 | stdcall shmem_open, ecx, edx, esi |
1273 | mov [esp+24], edx |
1282 | mov [esp+24], edx |
1274 | mov [esp+32], eax |
1283 | mov [esp+32], eax |
1275 | ret |
1284 | ret |
1276 | 1285 | ||
1277 | .23: |
1286 | .23: |
1278 | cmp ecx, OS_BASE |
1287 | cmp ecx, OS_BASE |
1279 | jae .fail |
1288 | jae .fail |
1280 | 1289 | ||
1281 | stdcall shmem_close, ecx |
1290 | stdcall shmem_close, ecx |
1282 | mov [esp+32], eax |
1291 | mov [esp+32], eax |
- | 1292 | ret |
|
- | 1293 | .24: |
|
- | 1294 | mov eax, [current_slot] |
|
- | 1295 | xchg ecx, [eax+APPDATA.exc_handler] |
|
- | 1296 | xchg edx, [eax+APPDATA.except_mask] |
|
Line 1283... | Line 1297... | ||
1283 | ret |
1297 | mov [esp+32], ecx ; reg_eax+8 |
1284 | .24: |
1298 | mov [esp+20], edx ; reg_ebx+8 |
1285 | mov eax, [current_slot] |
1299 | ret |
1286 | xchg ecx, [eax+APPDATA.exc_handler] |
1300 | .25: |
Line 1287... | Line 1301... | ||
1287 | xchg edx, [eax+APPDATA.except_mask] |
1301 | cmp ecx, 32 |
1288 | mov [esp+32], ecx ; reg_eax+8 |
1302 | jae .fail |
Line 1319... | Line 1333... | ||
1319 | dd f68.19 ; load_dll |
1333 | dd f68.19 ; load_dll |
1320 | dd f68.20 ; user_realloc |
1334 | dd f68.20 ; user_realloc |
1321 | dd f68.21 ; load_driver |
1335 | dd f68.21 ; load_driver |
1322 | dd f68.22 ; shmem_open |
1336 | dd f68.22 ; shmem_open |
1323 | dd f68.23 ; shmem_close |
1337 | dd f68.23 ; shmem_close |
- | 1338 | dd f68.24 ; set exception handler |
|
1324 | dd f68.24 |
1339 | dd f68.25 ; unmask exception |
1325 | dd f68.25 |
1340 | dd f68.26 ; user_unmap |
Line 1326... | Line 1341... | ||
1326 | 1341 | ||
1327 | 1342 | ||
Line 1328... | Line 1343... | ||
1328 | align 4 |
1343 | align 4 |
1329 | proc load_pe_driver stdcall, file:dword |
- | |
1330 | - | ||
1331 | stdcall load_PE, [file] |
- | |
1332 | test eax, eax |
- | |
1333 | jz .fail |
- | |
1334 | 1344 | proc load_pe_driver stdcall, file:dword |
|
1335 | mov esi, eax |
1345 | |
Line -... | Line 1346... | ||
- | 1346 | stdcall load_PE, [file] |
|
- | 1347 | test eax, eax |
|
- | 1348 | jz .fail |
|
- | 1349 | ||
- | 1350 | mov esi, eax |
|
1336 | stdcall eax, DRV_ENTRY |
1351 | stdcall eax, DRV_ENTRY |
1337 | test eax, eax |
1352 | test eax, eax |
Line 1338... | Line 1353... | ||
1338 | jz .fail |
1353 | jz .fail |
1339 | 1354 | ||
1340 | mov [eax+SRV.entry], esi |
1355 | mov [eax+SRV.entry], esi |
1341 | ret |
1356 | ret |
Line 1342... | Line 1357... | ||
1342 | 1357 | ||
1343 | .fail: |
1358 | .fail: |
Line 1344... | Line 1359... | ||
1344 | xor eax, eax |
1359 | xor eax, eax |
1345 | ret |
1360 | ret |
Line 1346... | Line 1361... | ||
1346 | endp |
1361 | endp |
1347 | 1362 | ||
Line 1348... | Line 1363... | ||
1348 | 1363 | ||
1349 | align 4 |
1364 | align 4 |
1350 | proc init_mtrr |
1365 | proc init_mtrr |
1351 | 1366 | ||
Line 1352... | Line 1367... | ||
1352 | cmp [BOOT_VAR+0x901c],byte 2 |
1367 | cmp [BOOT_VAR+0x901c], byte 2 |
1353 | je .exit |
1368 | je .exit |
1354 | 1369 | ||
1355 | bt [cpu_caps], CAPS_MTRR |
1370 | bt [cpu_caps], CAPS_MTRR |
1356 | jnc .exit |
1371 | jnc .exit |
1357 | 1372 | ||
1358 | mov eax, cr0 |
1373 | mov eax, cr0 |
1359 | or eax, 0x60000000 ;disable caching |
1374 | or eax, 0x60000000 ;disable caching |
Line 1360... | Line 1375... | ||
1360 | mov cr0, eax |
1375 | mov cr0, eax |
1361 | wbinvd ;invalidate cache |
1376 | wbinvd ;invalidate cache |
1362 | 1377 | ||
1363 | mov ecx, 0x2FF |
1378 | mov ecx, 0x2FF |
1364 | rdmsr ; |
1379 | rdmsr ; |
1365 | ; has BIOS already initialized MTRRs? |
1380 | ; has BIOS already initialized MTRRs? |
1366 | test ah, 8 |
1381 | test ah, 8 |
1367 | jnz .skip_init |
1382 | jnz .skip_init |
1368 | ; rarely needed, so mainly placeholder |
1383 | ; rarely needed, so mainly placeholder |
1369 | ; main memory - cached |
1384 | ; main memory - cached |
1370 | push eax |
1385 | push eax |
1371 | 1386 | ||
1372 | mov eax, [MEM_AMOUNT] |
1387 | mov eax, [MEM_AMOUNT] |
1373 | ; round eax up to next power of 2 |
1388 | ; round eax up to next power of 2 |
1374 | dec eax |
1389 | dec eax |
1375 | bsr ecx, eax |
1390 | bsr ecx, eax |
1376 | mov ebx, 2 |
1391 | mov ebx, 2 |
1377 | shl ebx, cl |
1392 | shl ebx, cl |
1378 | dec ebx |
1393 | dec ebx |
1379 | ; base of memory range = 0, type of memory range = MEM_WB |
1394 | ; base of memory range = 0, type of memory range = MEM_WB |
1380 | xor edx, edx |
1395 | xor edx, edx |
1381 | mov eax, MEM_WB |
1396 | mov eax, MEM_WB |
1382 | mov ecx, 0x200 |
1397 | mov ecx, 0x200 |
1383 | wrmsr |
1398 | wrmsr |
1384 | ; mask of memory range = 0xFFFFFFFFF - (size - 1), ebx = size - 1 |
1399 | ; mask of memory range = 0xFFFFFFFFF - (size - 1), ebx = size - 1 |
1385 | mov eax, 0xFFFFFFFF |
1400 | mov eax, 0xFFFFFFFF |
1386 | mov edx, 0x0000000F |
1401 | mov edx, 0x0000000F |
1387 | sub eax, ebx |
1402 | sub eax, ebx |
1388 | sbb edx, 0 |
1403 | sbb edx, 0 |
1389 | or eax, 0x800 |
1404 | or eax, 0x800 |
1390 | inc ecx |
1405 | inc ecx |
1391 | wrmsr |
1406 | wrmsr |
1392 | ; clear unused MTRRs |
1407 | ; clear unused MTRRs |
1393 | xor eax, eax |
1408 | xor eax, eax |
1394 | xor edx, edx |
1409 | xor edx, edx |
1395 | @@: |
1410 | @@: |
Line 1396... | Line 1411... | ||
1396 | wrmsr |
1411 | wrmsr |
Line 1397... | Line 1412... | ||
1397 | inc ecx |
1412 | inc ecx |
1398 | cmp ecx, 0x210 |
1413 | cmp ecx, 0x210 |
1399 | jb @b |
1414 | jb @b |
1400 | ; enable MTRRs |
1415 | ; enable MTRRs |
1401 | pop eax |
1416 | pop eax |
1402 | or ah, 8 |
1417 | or ah, 8 |
Line 1403... | Line 1418... | ||
1403 | and al, 0xF0 ; default memtype = UC |
1418 | and al, 0xF0; default memtype = UC |
1404 | mov ecx, 0x2FF |
1419 | mov ecx, 0x2FF |
1405 | wrmsr |
1420 | wrmsr |
1406 | .skip_init: |
1421 | .skip_init: |
1407 | stdcall set_mtrr, [LFBAddress],[LFBSize],MEM_WC |
1422 | stdcall set_mtrr, [LFBAddress], [LFBSize], MEM_WC |
1408 | 1423 | ||
1409 | wbinvd ;again invalidate |
1424 | wbinvd ;again invalidate |
1410 | 1425 | ||
1411 | mov eax, cr0 |
1426 | mov eax, cr0 |
1412 | and eax, not 0x60000000 |
1427 | and eax, not 0x60000000 |
1413 | mov cr0, eax ; enable caching |
1428 | mov cr0, eax ; enable caching |
1414 | .exit: |
1429 | .exit: |
1415 | ret |
1430 | ret |
1416 | endp |
1431 | endp |
1417 | 1432 | ||
1418 | align 4 |
1433 | align 4 |
1419 | proc set_mtrr stdcall, base:dword,size:dword,mem_type:dword |
1434 | proc set_mtrr stdcall, base:dword,size:dword,mem_type:dword |
1420 | ; find unused register |
1435 | ; find unused register |
1421 | mov ecx, 0x201 |
1436 | mov ecx, 0x201 |
1422 | @@: |
1437 | @@: |
1423 | rdmsr |
1438 | rdmsr |
1424 | dec ecx |
1439 | dec ecx |
1425 | test ah, 8 |
1440 | test ah, 8 |
1426 | jz .found |
1441 | jz .found |
1427 | rdmsr |
1442 | rdmsr |
1428 | mov al, 0 ; clear memory type field |
1443 | mov al, 0; clear memory type field |
1429 | cmp eax, [base] |
1444 | cmp eax, [base] |
1430 | jz .ret |
1445 | jz .ret |
1431 | add ecx, 3 |
1446 | add ecx, 3 |
1432 | cmp ecx, 0x210 |
1447 | cmp ecx, 0x210 |
1433 | jb @b |
1448 | jb @b |
1434 | ; no free registers, ignore the call |
1449 | ; no free registers, ignore the call |
1435 | .ret: |
1450 | .ret: |
1436 | ret |
1451 | ret |
1437 | .found: |
1452 | .found: |
1438 | ; found, write values |
1453 | ; found, write values |
1439 | xor edx, edx |
1454 | xor edx, edx |
Line 1440... | Line 1455... | ||
1440 | mov eax, [base] |
1455 | mov eax, [base] |
1441 | or eax, [mem_type] |
1456 | or eax, [mem_type] |
1442 | wrmsr |
1457 | wrmsr |
1443 | 1458 | ||
1444 | mov ebx, [size] |
1459 | mov ebx, [size] |
1445 | dec ebx |
1460 | dec ebx |
1446 | mov eax, 0xFFFFFFFF |
1461 | mov eax, 0xFFFFFFFF |
1447 | mov edx, 0x00000000 |
1462 | mov edx, 0x00000000 |
1448 | sub eax, ebx |
1463 | sub eax, ebx |
1449 | sbb edx, 0 |
1464 | sbb edx, 0 |
1450 | or eax, 0x800 |
1465 | or eax, 0x800 |
1451 | inc ecx |
1466 | inc ecx |
1452 | wrmsr |
1467 | wrmsr |
1453 | ret |
1468 | ret |
1454 | endp |
1469 | endp |
1455 | 1470 | ||
1456 | align 4 |
1471 | align 4 |
1457 | proc stall stdcall, delay:dword |
1472 | proc stall stdcall, delay:dword |
1458 | push ecx |
1473 | push ecx |
1459 | push edx |
1474 | push edx |
1460 | push ebx |
1475 | push ebx |
1461 | push eax |
1476 | push eax |
1462 | 1477 | ||
1463 | mov eax, [delay] |
1478 | mov eax, [delay] |
1464 | mul [stall_mcs] |
1479 | mul [stall_mcs] |
1465 | mov ebx, eax ;low |
1480 | mov ebx, eax ;low |
Line 1466... | Line 1481... | ||
1466 | mov ecx, edx ;high |
1481 | mov ecx, edx ;high |
1467 | rdtsc |
1482 | rdtsc |
1468 | add ebx, eax |
1483 | add ebx, eax |
1469 | adc ecx,edx |
1484 | adc ecx, edx |
1470 | @@: |
1485 | @@: |
Line 1471... | Line 1486... | ||
1471 | rdtsc |
1486 | rdtsc |
1472 | sub eax, ebx |
1487 | sub eax, ebx |
1473 | sbb edx, ecx |
1488 | sbb edx, ecx |
1474 | jb @B |
1489 | jb @B |
1475 | 1490 | ||
1476 | pop eax |
1491 | pop eax |
1477 | pop ebx |
1492 | pop ebx |
1478 | pop edx |
1493 | pop edx |
1479 | pop ecx |
1494 | pop ecx |
1480 | ret |
1495 | ret |
1481 | endp |
1496 | endp |
1482 | 1497 | ||
1483 | align 4 |
1498 | align 4 |
1484 | proc create_ring_buffer stdcall, size:dword, flags:dword |
1499 | proc create_ring_buffer stdcall, size:dword, flags:dword |
1485 | locals |
1500 | locals |
1486 | buf_ptr dd ? |
1501 | buf_ptr dd ? |
1487 | endl |
1502 | endl |
1488 | 1503 | ||
1489 | mov eax, [size] |
1504 | mov eax, [size] |
1490 | test eax, eax |
1505 | test eax, eax |
1491 | jz .fail |
1506 | jz .fail |
1492 | 1507 | ||
1493 | add eax, eax |
1508 | add eax, eax |
1494 | stdcall alloc_kernel_space, eax |
1509 | stdcall alloc_kernel_space, eax |
1495 | test eax, eax |
1510 | test eax, eax |
1496 | jz .fail |
1511 | jz .fail |
1497 | 1512 | ||
1498 | push ebx |
1513 | push ebx |
1499 | 1514 | ||
1500 | mov [buf_ptr], eax |
1515 | mov [buf_ptr], eax |
1501 | 1516 | ||
1502 | mov ebx, [size] |
1517 | mov ebx, [size] |
1503 | shr ebx, 12 |
1518 | shr ebx, 12 |
1504 | push ebx |
1519 | push ebx |
1505 | 1520 | ||
1506 | stdcall alloc_pages, ebx |
1521 | stdcall alloc_pages, ebx |
1507 | pop ecx |
1522 | pop ecx |
1508 | 1523 | ||
1509 | test eax, eax |
1524 | test eax, eax |
1510 | jz .mm_fail |
1525 | jz .mm_fail |
1511 | 1526 | ||
1512 | push edi |
1527 | push edi |
1513 | 1528 | ||
1514 | or eax, [flags] |
1529 | or eax, [flags] |
1515 | mov edi, [buf_ptr] |
1530 | mov edi, [buf_ptr] |
1516 | mov ebx, [buf_ptr] |
1531 | mov ebx, [buf_ptr] |
1517 | mov edx, ecx |
1532 | mov edx, ecx |
1518 | shl edx, 2 |
1533 | shl edx, 2 |
1519 | shr edi, 10 |
1534 | shr edi, 10 |
1520 | @@: |
1535 | @@: |
1521 | mov [page_tabs+edi], eax |
1536 | mov [page_tabs+edi], eax |
1522 | mov [page_tabs+edi+edx], eax |
1537 | mov [page_tabs+edi+edx], eax |
1523 | invlpg [ebx] |
1538 | invlpg [ebx] |