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