Subversion Repositories Kolibri OS

Rev

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