Subversion Repositories Kolibri OS

Rev

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]