Subversion Repositories Kolibri OS

Rev

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