Rev 6317 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6317 | Rev 6339 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2015. 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: 6317 $ |
8 | $Revision: 6339 $ |
9 | 9 | ||
Line 129... | Line 129... | ||
129 | mov eax, [esp+12] ; phis_addr |
129 | mov eax, [esp+12] ; phis_addr |
130 | or eax, [esp+16] ; flags |
130 | or eax, [esp+16] ; flags |
131 | and eax, [pte_valid_mask] |
131 | and eax, [pte_valid_mask] |
132 | mov ebx, [esp+8] ; lin_addr |
132 | mov ebx, [esp+8] ; lin_addr |
133 | shr ebx, 12 |
133 | shr ebx, 12 |
134 | mov [page_tabs+ebx*4], eax |
134 | mov [page_tabs+ebx*8], eax |
135 | mov eax, [esp+8] ; lin_addr |
135 | mov eax, [esp+8] ; lin_addr |
136 | pop ebx |
136 | pop ebx |
137 | invlpg [eax] |
137 | invlpg [eax] |
138 | ret 12 |
138 | ret 12 |
Line 192... | Line 192... | ||
192 | shr eax, 12 |
192 | shr eax, 12 |
193 | shr ecx, 12 |
193 | shr ecx, 12 |
194 | or edx, [flags] |
194 | or edx, [flags] |
195 | and edx, [pte_valid_mask] |
195 | and edx, [pte_valid_mask] |
196 | @@: |
196 | @@: |
197 | mov [page_tabs+eax*4], edx |
197 | mov [page_tabs+eax*8], edx |
- | 198 | mov [page_tabs+eax*8+4], dword 0 |
|
198 | invlpg [ebx] |
199 | invlpg [ebx] |
199 | inc eax |
200 | inc eax |
200 | add ebx, edi |
201 | add ebx, edi |
201 | add edx, edi |
202 | add edx, edi |
202 | loop @B |
203 | loop @B |
Line 230... | Line 231... | ||
230 | pop eax |
231 | pop eax |
Line 231... | Line 232... | ||
231 | 232 | ||
232 | and eax, [pte_valid_mask ] |
233 | and eax, [pte_valid_mask ] |
233 | mov edi, ebx |
234 | mov edi, ebx |
234 | shr edi, 12 |
235 | shr edi, 12 |
235 | lea edi, [page_tabs+edi*4] |
236 | lea edi, [page_tabs+edi*8] |
236 | @@: |
237 | @@: |
- | 238 | mov [edi], eax |
|
237 | stosd |
239 | mov [edi+4], dword 0 |
238 | invlpg [ebx] |
240 | invlpg [ebx] |
239 | add eax, 0x1000 |
241 | add eax, 0x1000 |
- | 242 | add ebx, 0x1000 |
|
240 | add ebx, 0x1000 |
243 | add edi, 8 |
Line 241... | Line 244... | ||
241 | loop @B |
244 | loop @B |
Line 242... | Line 245... | ||
242 | 245 | ||
Line 262... | Line 265... | ||
262 | 265 | ||
263 | mov esi, eax |
266 | mov esi, eax |
Line 264... | Line 267... | ||
264 | mov edi, eax |
267 | mov edi, eax |
265 | 268 | ||
Line 266... | Line 269... | ||
266 | shr esi, 12 |
269 | shr esi, 12 |
267 | lea esi, [page_tabs+esi*4] |
270 | lea esi, [page_tabs+esi*8] |
268 | 271 | ||
269 | push ecx |
272 | push ecx |
Line 293... | Line 296... | ||
293 | jae .next |
296 | jae .next |
Line 294... | Line 297... | ||
294 | 297 | ||
295 | mov ebx, eax |
298 | mov ebx, eax |
296 | .next: |
299 | .next: |
297 | add edi, 0x1000 |
300 | add edi, 0x1000 |
298 | add esi, 4 |
301 | add esi, 8 |
Line 299... | Line 302... | ||
299 | loop @B |
302 | loop @B |
300 | 303 | ||
301 | mov [pg_data.pages_free], ebp |
304 | mov [pg_data.pages_free], ebp |
Line 318... | Line 321... | ||
318 | push edi |
321 | push edi |
Line 319... | Line 322... | ||
319 | 322 | ||
320 | mov edi, eax |
323 | mov edi, eax |
Line 321... | Line 324... | ||
321 | mov edx, eax |
324 | mov edx, eax |
322 | 325 | ||
Line 323... | Line 326... | ||
323 | shr edi, 10 |
326 | shr edi, 9 |
324 | add edi, page_tabs |
327 | add edi, page_tabs |
325 | 328 | ||
- | 329 | xor eax, eax |
|
326 | xor eax, eax |
330 | @@: |
327 | @@: |
331 | stosd |
328 | stosd |
332 | stosd |
Line 329... | Line 333... | ||
329 | invlpg [edx] |
333 | invlpg [edx] |
Line 336... | Line 340... | ||
336 | 340 | ||
337 | align 4 |
341 | align 4 |
338 | proc map_page_table stdcall, lin_addr:dword, phis_addr:dword |
342 | proc map_page_table stdcall, lin_addr:dword, phis_addr:dword |
339 | push ebx |
343 | push ebx |
340 | mov ebx, [lin_addr] |
344 | mov ebx, [lin_addr] |
341 | shr ebx, 22 |
345 | shr ebx, 21 |
342 | mov eax, [phis_addr] |
346 | mov eax, [phis_addr] |
343 | and eax, not 0xFFF |
347 | and eax, not 0xFFF |
344 | or eax, PG_UWR |
348 | or eax, PG_UWR |
- | 349 | mov [master_tab+ebx*8], eax |
|
345 | mov dword [master_tab+ebx*4], eax |
350 | mov [master_tab+ebx*8+4], dword 0 |
346 | mov eax, [lin_addr] |
351 | mov eax, [lin_addr] |
347 | shr eax, 10 |
352 | shr eax, 9 |
348 | add eax, page_tabs |
353 | add eax, page_tabs |
349 | invlpg [eax] |
354 | invlpg [eax] |
350 | pop ebx |
355 | pop ebx |
351 | ret |
356 | ret |
Line 435... | Line 440... | ||
435 | shr esi, 12 |
440 | shr esi, 12 |
Line 436... | Line 441... | ||
436 | 441 | ||
437 | mov ecx, pg_data.mutex |
442 | mov ecx, pg_data.mutex |
438 | call mutex_lock |
443 | call mutex_lock |
439 | @@: |
444 | @@: |
440 | mov eax, [app_page_tabs+edi*4] |
445 | mov eax, [app_page_tabs+edi*8] |
441 | test eax, 1 |
446 | test eax, 1 |
Line 442... | Line 447... | ||
442 | jz .next |
447 | jz .next |
443 | 448 | ||
444 | mov dword [app_page_tabs+edi*4], 0 |
449 | mov dword [app_page_tabs+edi*8], 0 |
Line 445... | Line 450... | ||
445 | invlpg [ebx] |
450 | invlpg [ebx] |
446 | call free_page |
451 | call free_page |
Line 474... | Line 479... | ||
474 | xchg esi, edi |
479 | xchg esi, edi |
Line 475... | Line 480... | ||
475 | 480 | ||
476 | push esi ;new size |
481 | push esi ;new size |
Line 477... | Line 482... | ||
477 | push edi ;old size |
482 | push edi ;old size |
478 | 483 | ||
479 | add edi, 0x3FFFFF |
484 | add edi, 0x1FFFFF |
480 | and edi, not(0x3FFFFF) |
485 | and edi, not(0x1FFFFF) |
Line 481... | Line 486... | ||
481 | add esi, 0x3FFFFF |
486 | add esi, 0x1FFFFF |
482 | and esi, not(0x3FFFFF) |
487 | and esi, not(0x1FFFFF) |
483 | 488 | ||
484 | cmp edi, esi |
489 | cmp edi, esi |
Line 489... | Line 494... | ||
489 | jz .exit_fail |
494 | jz .exit_fail |
Line 490... | Line 495... | ||
490 | 495 | ||
Line 491... | Line 496... | ||
491 | stdcall map_page_table, edi, eax |
496 | stdcall map_page_table, edi, eax |
492 | 497 | ||
493 | push edi |
498 | push edi |
494 | shr edi, 10 |
499 | shr edi, 9 |
495 | add edi, page_tabs |
500 | add edi, page_tabs |
496 | mov ecx, 1024 |
501 | mov ecx, 1024 |
497 | xor eax, eax |
502 | xor eax, eax |
498 | cld |
503 | cld |
Line 499... | Line 504... | ||
499 | rep stosd |
504 | rep stosd |
500 | pop edi |
505 | pop edi |
501 | 506 | ||
502 | add edi, 0x00400000 |
507 | add edi, 0x00200000 |
503 | cmp edi, esi |
508 | cmp edi, esi |
504 | jb @B |
509 | jb @B |
Line 544... | Line 549... | ||
544 | get_pg_addr: |
549 | get_pg_addr: |
545 | sub eax, OS_BASE |
550 | sub eax, OS_BASE |
546 | cmp eax, 0x400000 |
551 | cmp eax, 0x400000 |
547 | jb @f |
552 | jb @f |
548 | shr eax, 12 |
553 | shr eax, 12 |
549 | mov eax, [page_tabs+(eax+(OS_BASE shr 12))*4] |
554 | mov eax, [page_tabs+(eax+(OS_BASE shr 12))*8] |
550 | @@: |
555 | @@: |
551 | and eax, 0xFFFFF000 |
556 | and eax, 0xFFFFF000 |
552 | ret |
557 | ret |
Line 586... | Line 591... | ||
586 | jnz .err_access ;Страница присутствует |
591 | jnz .err_access ;Страница присутствует |
587 | ;Ошибка доступа ? |
592 | ;Ошибка доступа ? |
Line 588... | Line 593... | ||
588 | 593 | ||
589 | shr ebx, 12 |
594 | shr ebx, 12 |
590 | mov ecx, ebx |
595 | mov ecx, ebx |
591 | shr ecx, 10 |
596 | shr ecx, 9 |
592 | mov edx, [master_tab+ecx*4] |
597 | mov edx, [master_tab+ecx*8] |
593 | test edx, PG_READ |
598 | test edx, PG_READ |
594 | jz .fail ;таблица страниц не создана |
599 | jz .fail ;таблица страниц не создана |
Line 595... | Line 600... | ||
595 | ;неверный адрес в программе |
600 | ;неверный адрес в программе |
596 | 601 | ||
597 | mov eax, [page_tabs+ebx*4] |
602 | mov eax, [page_tabs+ebx*8] |
598 | test eax, 2 |
603 | test eax, 2 |
599 | jz .fail ;адрес не зарезервирован для ; |
604 | jz .fail ;адрес не зарезервирован для ; |
600 | ;использования. Ошибка |
605 | ;использования. Ошибка |
Line 701... | Line 706... | ||
701 | ofs:dword,buf_size:dword,req_access:dword |
706 | ofs:dword,buf_size:dword,req_access:dword |
702 | locals |
707 | locals |
703 | count dd ? |
708 | count dd ? |
704 | process dd ? |
709 | process dd ? |
705 | endl |
710 | endl |
706 | 711 | xchg bx, bx |
|
707 | mov [count], 0 |
712 | mov [count], 0 |
708 | cmp [buf_size], 0 |
713 | cmp [buf_size], 0 |
709 | jz .exit |
714 | jz .exit |
Line 710... | Line 715... | ||
710 | 715 | ||
Line 827... | Line 832... | ||
827 | ; in: [slot], [req_access], [ofs] on the stack |
832 | ; in: [slot], [req_access], [ofs] on the stack |
828 | ; in: edi = linear address to map |
833 | ; in: edi = linear address to map |
829 | ; out: CF cleared <=> failed |
834 | ; out: CF cleared <=> failed |
830 | ; destroys: only eax |
835 | ; destroys: only eax |
831 | proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword |
836 | proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword |
832 | mov eax, [esi+edx*4] |
837 | mov eax, [esi+edx*8] |
833 | test al, PG_READ |
838 | test al, PG_READ |
834 | jz .not_present |
839 | jz .not_present |
835 | test al, PG_WRITE |
840 | test al, PG_WRITE |
836 | jz .resolve_readonly |
841 | jz .resolve_readonly |
837 | ; normal case: writable page, just map with requested access |
842 | ; normal case: writable page, just map with requested access |
Line 849... | Line 854... | ||
849 | call alloc_page |
854 | call alloc_page |
850 | pop ecx |
855 | pop ecx |
851 | test eax, eax |
856 | test eax, eax |
852 | jz .fail |
857 | jz .fail |
853 | or al, PG_UWR |
858 | or al, PG_UWR |
854 | mov [esi+edx*4], eax |
859 | mov [esi+edx*8], eax |
855 | jmp .map |
860 | jmp .map |
856 | .resolve_readonly: |
861 | .resolve_readonly: |
857 | ; readonly page, probably copy-on-write |
862 | ; readonly page, probably copy-on-write |
858 | ; check: readonly request of readonly page is ok |
863 | ; check: readonly request of readonly page is ok |
859 | test [req_access], PG_WRITE |
864 | test [req_access], PG_WRITE |
Line 891... | Line 896... | ||
891 | add ebx, [eax+DLLDESCR.data] |
896 | add ebx, [eax+DLLDESCR.data] |
892 | call alloc_page |
897 | call alloc_page |
893 | test eax, eax |
898 | test eax, eax |
894 | jz .no_hdll |
899 | jz .no_hdll |
895 | or al, PG_UWR |
900 | or al, PG_UWR |
896 | mov [esi+edx*4], eax |
901 | mov [esi+edx*8], eax |
897 | stdcall map_page, edi, eax, [req_access] |
902 | stdcall map_page, edi, eax, [req_access] |
898 | push esi edi |
903 | push esi edi |
899 | mov esi, ebx |
904 | mov esi, ebx |
900 | mov ecx, 4096/4 |
905 | mov ecx, 4096/4 |
901 | rep movsd |
906 | rep movsd |
Line 1022... | Line 1027... | ||
1022 | 1027 | ||
1023 | mov ebx, [ipc_tmp] |
1028 | mov ebx, [ipc_tmp] |
1024 | mov edx, ebx |
1029 | mov edx, ebx |
1025 | shr ebx, 12 |
1030 | shr ebx, 12 |
1026 | xor eax, eax |
1031 | xor eax, eax |
- | 1032 | mov [page_tabs+ebx*8], eax |
|
1027 | mov [page_tabs+ebx*4], eax |
1033 | mov [page_tabs+ebx*8+4], eax |
Line 1028... | Line 1034... | ||
1028 | invlpg [edx] |
1034 | invlpg [edx] |
1029 | 1035 | ||
1030 | mov ebx, [ipc_pdir] |
1036 | mov ebx, [ipc_pdir] |
1031 | mov edx, ebx |
1037 | mov edx, ebx |
1032 | shr ebx, 12 |
1038 | shr ebx, 12 |
- | 1039 | xor eax, eax |
|
1033 | xor eax, eax |
1040 | mov [page_tabs+ebx*8], eax |
Line 1034... | Line 1041... | ||
1034 | mov [page_tabs+ebx*4], eax |
1041 | mov [page_tabs+ebx*8+4], eax |
1035 | invlpg [edx] |
1042 | invlpg [edx] |
1036 | 1043 | ||
1037 | mov ebx, [ipc_ptab] |
1044 | mov ebx, [ipc_ptab] |
1038 | mov edx, ebx |
1045 | mov edx, ebx |
- | 1046 | shr ebx, 12 |
|
1039 | shr ebx, 12 |
1047 | xor eax, eax |
Line 1040... | Line 1048... | ||
1040 | xor eax, eax |
1048 | mov [page_tabs+ebx*8], eax |
1041 | mov [page_tabs+ebx*4], eax |
1049 | mov [page_tabs+ebx*8+4], eax |
1042 | invlpg [edx] |
1050 | invlpg [edx] |