Rev 5201 | Rev 5585 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5201 | Rev 5565 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2012. 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: 5201 $ |
8 | $Revision: 5565 $ |
9 | 9 | ||
Line 125... | Line 125... | ||
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 | map_page: |
127 | map_page: |
128 | push ebx |
128 | push ebx |
129 | mov eax, [esp+12] ; phis_addr |
129 | mov eax, [esp+12] ; phis_addr |
130 | and eax, not 0xFFF |
- | |
131 | or eax, [esp+16] ; flags |
130 | or eax, [esp+16] ; flags |
- | 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*4], eax |
135 | mov eax, [esp+8] ; lin_addr |
135 | mov eax, [esp+8] ; lin_addr |
136 | pop ebx |
136 | pop ebx |
Line 189... | Line 189... | ||
189 | mov ebx, eax |
189 | mov ebx, eax |
190 | mov ecx, [size] |
190 | mov ecx, [size] |
191 | mov edx, [base] |
191 | mov edx, [base] |
192 | shr eax, 12 |
192 | shr eax, 12 |
193 | shr ecx, 12 |
193 | shr ecx, 12 |
194 | and edx, -4096 |
- | |
195 | or edx, [flags] |
194 | or edx, [flags] |
- | 195 | and edx, [pte_valid_mask] |
|
196 | @@: |
196 | @@: |
197 | mov [page_tabs+eax*4], edx |
197 | mov [page_tabs+eax*4], edx |
198 | invlpg [ebx] |
198 | invlpg [ebx] |
199 | inc eax |
199 | inc eax |
200 | add ebx, edi |
200 | add ebx, edi |
Line 227... | Line 227... | ||
227 | mov ecx, pg_data.mutex |
227 | mov ecx, pg_data.mutex |
228 | call mutex_lock |
228 | call mutex_lock |
229 | pop ecx |
229 | pop ecx |
230 | pop eax |
230 | pop eax |
Line -... | Line 231... | ||
- | 231 | ||
231 | 232 | and eax, [pte_valid_mask ] |
|
232 | mov edi, ebx |
233 | mov edi, ebx |
233 | shr edi, 12 |
234 | shr edi, 12 |
234 | lea edi, [page_tabs+edi*4] |
235 | lea edi, [page_tabs+edi*4] |
235 | @@: |
236 | @@: |
Line 338... | Line 339... | ||
338 | push ebx |
339 | push ebx |
339 | mov ebx, [lin_addr] |
340 | mov ebx, [lin_addr] |
340 | shr ebx, 22 |
341 | shr ebx, 22 |
341 | mov eax, [phis_addr] |
342 | mov eax, [phis_addr] |
342 | and eax, not 0xFFF |
343 | and eax, not 0xFFF |
343 | or eax, PG_UW ;+PG_NOCACHE |
344 | or eax, PG_UWR |
344 | mov dword [master_tab+ebx*4], eax |
345 | mov dword [master_tab+ebx*4], eax |
345 | mov eax, [lin_addr] |
346 | mov eax, [lin_addr] |
346 | shr eax, 10 |
347 | shr eax, 10 |
347 | add eax, page_tabs |
348 | add eax, page_tabs |
348 | invlpg [eax] |
349 | invlpg [eax] |
Line 418... | Line 419... | ||
418 | 419 | ||
419 | push eax |
420 | push eax |
420 | call alloc_page |
421 | call alloc_page |
421 | stdcall map_page_table, LFB_BASE, eax |
422 | stdcall map_page_table, LFB_BASE, eax |
422 | pop eax |
423 | pop eax |
423 | or eax, PG_UW |
424 | or eax, PG_UWR |
424 | mov ebx, LFB_BASE |
425 | mov ebx, LFB_BASE |
425 | ; max VGA=640*480*4=1228800 bytes |
426 | ; max VGA=640*480*4=1228800 bytes |
426 | ; + 32*640*4=81920 bytes for mouse pointer |
427 | ; + 32*640*4=81920 bytes for mouse pointer |
427 | mov ecx, (1228800+81920)/4096 |
428 | mov ecx, (1228800+81920)/4096 |
Line 445... | Line 446... | ||
445 | mov [pg_count], edi |
446 | mov [pg_count], edi |
446 | shr edi, 10 |
447 | shr edi, 10 |
Line 447... | Line 448... | ||
447 | 448 | ||
448 | bt [cpu_caps], CAPS_PSE |
449 | bt [cpu_caps], CAPS_PSE |
449 | jnc .map_page_tables |
450 | jnc .map_page_tables |
450 | or esi, PG_LARGE+PG_UW |
451 | or esi, PDE_LARGE+PG_UWR |
451 | mov edx, sys_proc+PROC.pdt_0+(LFB_BASE shr 20) |
452 | mov edx, sys_proc+PROC.pdt_0+(LFB_BASE shr 20) |
452 | @@: |
453 | @@: |
453 | mov [edx], esi |
454 | mov [edx], esi |
454 | add edx, 4 |
455 | add edx, 4 |
Line 474... | Line 475... | ||
474 | dec edi |
475 | dec edi |
475 | jnz @B |
476 | jnz @B |
Line 476... | Line 477... | ||
476 | 477 | ||
477 | mov eax, [LFBAddress] |
478 | mov eax, [LFBAddress] |
478 | mov edi, page_tabs + (LFB_BASE shr 10) |
479 | mov edi, page_tabs + (LFB_BASE shr 10) |
- | 480 | or eax, PG_GLOBAL+PG_UWR |
|
479 | or eax, PG_UW |
481 | and eax, [pte_valid_mask] |
480 | mov ecx, [pg_count] |
482 | mov ecx, [pg_count] |
481 | cld |
483 | cld |
482 | @@: |
484 | @@: |
483 | stosd |
485 | stosd |
484 | add eax, 0x1000 |
- | |
485 | dec ecx |
486 | add eax, 0x1000 |
Line 486... | Line 487... | ||
486 | jnz @B |
487 | loop @B |
487 | 488 | ||
488 | mov dword [LFBAddress], LFB_BASE |
489 | mov dword [LFBAddress], LFB_BASE |
Line 677... | Line 678... | ||
677 | mov esp, ebp |
678 | mov esp, ebp |
678 | pop ebx ;restore exception number (#PF) |
679 | pop ebx ;restore exception number (#PF) |
679 | ret |
680 | ret |
Line 680... | Line 681... | ||
680 | 681 | ||
681 | .user_space: |
682 | .user_space: |
682 | test eax, PG_MAP |
683 | test eax, PG_READ |
683 | jnz .err_access ;Страница присутствует |
684 | jnz .err_access ;Страница присутствует |
Line 684... | Line 685... | ||
684 | ;Ошибка доступа ? |
685 | ;Ошибка доступа ? |
685 | 686 | ||
686 | shr ebx, 12 |
687 | shr ebx, 12 |
687 | mov ecx, ebx |
688 | mov ecx, ebx |
688 | shr ecx, 10 |
689 | shr ecx, 10 |
689 | mov edx, [master_tab+ecx*4] |
690 | mov edx, [master_tab+ecx*4] |
690 | test edx, PG_MAP |
691 | test edx, PG_READ |
Line 691... | Line 692... | ||
691 | jz .fail ;таблица страниц не создана |
692 | jz .fail ;таблица страниц не создана |
692 | ;неверный адрес в программе |
693 | ;неверный адрес в программе |
Line 698... | Line 699... | ||
698 | .alloc: |
699 | .alloc: |
699 | call alloc_page |
700 | call alloc_page |
700 | test eax, eax |
701 | test eax, eax |
701 | jz .fail |
702 | jz .fail |
Line 702... | Line 703... | ||
702 | 703 | ||
Line 703... | Line 704... | ||
703 | stdcall map_page, [.err_addr], eax, PG_UW |
704 | stdcall map_page, [.err_addr], eax, PG_UWR |
704 | 705 | ||
705 | mov edi, [.err_addr] |
706 | mov edi, [.err_addr] |
706 | and edi, 0xFFFFF000 |
707 | and edi, 0xFFFFF000 |
Line 735... | Line 736... | ||
735 | .fault_in_hdll: |
736 | .fault_in_hdll: |
736 | ; allocate new page, map it as rw and copy data |
737 | ; allocate new page, map it as rw and copy data |
737 | call alloc_page |
738 | call alloc_page |
738 | test eax, eax |
739 | test eax, eax |
739 | jz .fail |
740 | jz .fail |
740 | stdcall map_page, ebx, eax, PG_UW |
741 | stdcall map_page, ebx, eax, PG_UWR |
741 | mov edi, ebx |
742 | mov edi, ebx |
742 | mov ecx, 1024 |
743 | mov ecx, 1024 |
743 | sub ebx, [esi+HDLL.base] |
744 | sub ebx, [esi+HDLL.base] |
744 | mov esi, [esi+HDLL.parent] |
745 | mov esi, [esi+HDLL.parent] |
745 | mov esi, [esi+DLLDESCR.data] |
746 | mov esi, [esi+DLLDESCR.data] |
746 | add esi, ebx |
747 | add esi, ebx |
747 | rep movsd |
748 | rep movsd |
748 | jmp .exit |
749 | jmp .exit |
Line 749... | Line 750... | ||
749 | 750 | ||
750 | .kernel_space: |
751 | .kernel_space: |
751 | test eax, PG_MAP |
752 | test eax, PG_READ |
Line 752... | Line 753... | ||
752 | jz .fail ;страница не присутствует |
753 | jz .fail ;страница не присутствует |
753 | 754 | ||
754 | test eax, 12 ;U/S (+below) |
755 | test eax, 12 ;U/S (+below) |
Line 772... | Line 773... | ||
772 | call alloc_page |
773 | call alloc_page |
773 | test eax, eax |
774 | test eax, eax |
774 | jz .fail |
775 | jz .fail |
Line 775... | Line 776... | ||
775 | 776 | ||
776 | push eax |
777 | push eax |
777 | stdcall map_page, [.err_addr], eax, dword PG_SW |
778 | stdcall map_page, [.err_addr], eax, dword PG_SWR |
778 | pop eax |
779 | pop eax |
779 | mov edi, [.err_addr] |
780 | mov edi, [.err_addr] |
780 | and edi, -4096 |
781 | and edi, -4096 |
Line 781... | Line 782... | ||
781 | lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0 |
782 | lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0 |
782 | 783 | ||
783 | mov ebx, esi |
784 | mov ebx, esi |
784 | shr ebx, 12 |
785 | shr ebx, 12 |
785 | mov edx, [current_slot] |
786 | mov edx, [current_slot] |
Line 786... | Line 787... | ||
786 | or eax, PG_SW |
787 | or eax, PG_SWR |
787 | mov [edx+APPDATA.io_map+ebx*4], eax |
788 | mov [edx+APPDATA.io_map+ebx*4], eax |
788 | 789 | ||
Line 816... | Line 817... | ||
816 | shr ebx, 22 |
817 | shr ebx, 22 |
817 | mov eax, [eax+PROC.pdt_0+ebx*4] ;get page table |
818 | mov eax, [eax+PROC.pdt_0+ebx*4] ;get page table |
818 | mov esi, [ipc_ptab] |
819 | mov esi, [ipc_ptab] |
819 | and eax, 0xFFFFF000 |
820 | and eax, 0xFFFFF000 |
820 | jz .exit |
821 | jz .exit |
821 | stdcall map_page, esi, eax, PG_SW |
822 | stdcall map_page, esi, eax, PG_SWR |
822 | @@: |
823 | @@: |
823 | mov edi, [lin_addr] |
824 | mov edi, [lin_addr] |
824 | and edi, 0xFFFFF000 |
825 | and edi, 0xFFFFF000 |
825 | mov ecx, [buf_size] |
826 | mov ecx, [buf_size] |
826 | add ecx, 4095 |
827 | add ecx, 4095 |
Line 847... | Line 848... | ||
847 | mov eax, [process] |
848 | mov eax, [process] |
848 | mov eax, [eax+PROC.pdt_0+ebx*4] |
849 | mov eax, [eax+PROC.pdt_0+ebx*4] |
849 | and eax, 0xFFFFF000 |
850 | and eax, 0xFFFFF000 |
850 | jz .exit |
851 | jz .exit |
Line 851... | Line 852... | ||
851 | 852 | ||
852 | stdcall map_page, esi, eax, PG_SW |
853 | stdcall map_page, esi, eax, PG_SWR |
853 | xor edx, edx |
854 | xor edx, edx |
854 | jmp .map |
855 | jmp .map |
855 | .exit: |
856 | .exit: |
856 | mov eax, [count] |
857 | mov eax, [count] |
Line 879... | Line 880... | ||
879 | shr ebx, 22 |
880 | shr ebx, 22 |
880 | mov eax, [eax+PROC.pdt_0+ebx*4] ;get page table |
881 | mov eax, [eax+PROC.pdt_0+ebx*4] ;get page table |
881 | mov esi, [proc_mem_tab] |
882 | mov esi, [proc_mem_tab] |
882 | and eax, 0xFFFFF000 |
883 | and eax, 0xFFFFF000 |
883 | jz .exit |
884 | jz .exit |
884 | stdcall map_page, esi, eax, PG_SW |
885 | stdcall map_page, esi, eax, PG_SWR |
885 | @@: |
886 | @@: |
886 | mov edi, [lin_addr] |
887 | mov edi, [lin_addr] |
887 | and edi, 0xFFFFF000 |
888 | and edi, 0xFFFFF000 |
888 | mov ecx, [buf_size] |
889 | mov ecx, [buf_size] |
889 | add ecx, 4095 |
890 | add ecx, 4095 |
Line 910... | Line 911... | ||
910 | mov eax, [process] |
911 | mov eax, [process] |
911 | mov eax, [eax+PROC.pdt_0+ebx*4] |
912 | mov eax, [eax+PROC.pdt_0+ebx*4] |
912 | and eax, 0xFFFFF000 |
913 | and eax, 0xFFFFF000 |
913 | jz .exit |
914 | jz .exit |
Line 914... | Line 915... | ||
914 | 915 | ||
915 | stdcall map_page, esi, eax, PG_SW |
916 | stdcall map_page, esi, eax, PG_SWR |
916 | xor edx, edx |
917 | xor edx, edx |
917 | jmp .map |
918 | jmp .map |
918 | .exit: |
919 | .exit: |
919 | mov eax, [count] |
920 | mov eax, [count] |
Line 925... | Line 926... | ||
925 | ; in: edi = linear address to map |
926 | ; in: edi = linear address to map |
926 | ; out: CF cleared <=> failed |
927 | ; out: CF cleared <=> failed |
927 | ; destroys: only eax |
928 | ; destroys: only eax |
928 | proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword |
929 | proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword |
929 | mov eax, [esi+edx*4] |
930 | mov eax, [esi+edx*4] |
930 | test al, PG_MAP |
931 | test al, PG_READ |
931 | jz .not_present |
932 | jz .not_present |
932 | test al, PG_WRITE |
933 | test al, PG_WRITE |
933 | jz .resolve_readonly |
934 | jz .resolve_readonly |
934 | ; normal case: writable page, just map with requested access |
935 | ; normal case: writable page, just map with requested access |
935 | .map: |
936 | .map: |
Line 945... | Line 946... | ||
945 | push ecx |
946 | push ecx |
946 | call alloc_page |
947 | call alloc_page |
947 | pop ecx |
948 | pop ecx |
948 | test eax, eax |
949 | test eax, eax |
949 | jz .fail |
950 | jz .fail |
950 | or al, PG_UW |
951 | or al, PG_UWR |
951 | mov [esi+edx*4], eax |
952 | mov [esi+edx*4], eax |
952 | jmp .map |
953 | jmp .map |
953 | .resolve_readonly: |
954 | .resolve_readonly: |
954 | ; readonly page, probably copy-on-write |
955 | ; readonly page, probably copy-on-write |
955 | ; check: readonly request of readonly page is ok |
956 | ; check: readonly request of readonly page is ok |
Line 987... | Line 988... | ||
987 | mov eax, [ecx+HDLL.parent] |
988 | mov eax, [ecx+HDLL.parent] |
988 | add ebx, [eax+DLLDESCR.data] |
989 | add ebx, [eax+DLLDESCR.data] |
989 | call alloc_page |
990 | call alloc_page |
990 | test eax, eax |
991 | test eax, eax |
991 | jz .no_hdll |
992 | jz .no_hdll |
992 | or al, PG_UW |
993 | or al, PG_UWR |
993 | mov [esi+edx*4], eax |
994 | mov [esi+edx*4], eax |
994 | stdcall map_page, edi, eax, [req_access] |
995 | stdcall map_page, edi, eax, [req_access] |
995 | push esi edi |
996 | push esi edi |
996 | mov esi, ebx |
997 | mov esi, ebx |
997 | mov ecx, 4096/4 |
998 | mov ecx, 4096/4 |
Line 1088... | Line 1089... | ||
1088 | mov ecx, eax |
1089 | mov ecx, eax |
1089 | pop edi esi |
1090 | pop edi esi |
1090 | @@: |
1091 | @@: |
1091 | mov [used_buf], ecx |
1092 | mov [used_buf], ecx |
1092 | stdcall map_mem_ipc, ecx, [dst_slot], \ |
1093 | stdcall map_mem_ipc, ecx, [dst_slot], \ |
1093 | edi, esi, PG_SW |
1094 | edi, esi, PG_SWR |
Line 1094... | Line 1095... | ||
1094 | 1095 | ||
1095 | mov edi, [dst_offset] |
1096 | mov edi, [dst_offset] |
1096 | add edi, [used_buf] |
1097 | add edi, [used_buf] |
1097 | cmp dword [edi], 0 |
1098 | cmp dword [edi], 0 |