Subversion Repositories Kolibri OS

Rev

Rev 1055 | Rev 1072 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1055 Rev 1056
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2008. 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: 1055 $
8
$Revision: 1056 $
9
 
9
 
Line 542... Line 542...
542
           and eax, 0xFFFFF000
542
           and eax, 0xFFFFF000
543
           ret
543
           ret
Line 544... Line 544...
544
 
544
 
-
 
545
 
545
 
546
align 4
Line 546... Line -...
546
align 4
-
 
547
proc page_fault_handler
547
; Now it is called from sys32::exc_c (see stack frame there)
Line 548... Line -...
548
 
-
 
549
        test    byte [esp+12+2], 2
-
 
550
        jnz     v86_page_fault
-
 
551
 
-
 
552
        .err_code equ ebp+32
548
proc page_fault_handler
553
        .err_addr equ ebp-4
549
 
554
 
-
 
555
           pushad
-
 
556
           mov ebp, esp
550
    .err_addr   equ ebp-4
557
           mov eax, cr2
-
 
558
           push eax
-
 
559
 
-
 
560
           mov ax, app_data
551
 
Line 561... Line 552...
561
           mov ds, ax
552
        mov     ebp, esp
562
           mov es, ax
553
        mov     ebx, cr2
563
 
554
        push    ebx               ; that is locals: .err_addr = cr2
564
           inc [pg_data.pages_faults]
555
        inc     [pg_data.pages_faults]
565
 
556
 
566
;     push eax
557
;     push eax
567
;     push edx
558
;     push edx
Line 568... Line -...
568
;     mov edx, 0x400   ;bochs
-
 
569
;     mov al,0xff      ;bochs
559
;     mov edx, 0x400   ;bochs
Line 570... Line 560...
570
;     out dx, al       ;bochs
560
;     mov al,0xff      ;bochs
571
;     pop edx
561
;     out dx, al       ;bochs
Line 572... Line 562...
572
;     pop eax
562
;     pop edx
573
 
563
;     pop eax
Line 574... Line 564...
574
           mov ebx, [.err_addr]
564
 
575
           mov eax, [.err_code]
565
        mov     eax, [pf_err_code]
576
 
566
 
577
           cmp ebx, OS_BASE
-
 
-
 
567
        cmp     ebx, OS_BASE      ;ebx == .err_addr
578
           jb .user_space      ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
568
        jb      .user_space       ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
579
 
569
 
580
           cmp ebx, page_tabs
570
        cmp     ebx, page_tabs
581
           jb .kernel_space    ;ñòðàíèöà â ïàìÿòè ÿäðà
571
        jb      .kernel_space     ;ñòðàíèöà â ïàìÿòè ÿäðà
582
 
572
 
583
           cmp ebx, kernel_tabs
573
        cmp     ebx, kernel_tabs
584
           jb .alloc;.app_tabs ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
574
        jb      .alloc;.app_tabs  ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
-
 
575
                                  ;ïðîñòî ñîçäàäèì îäíó
-
 
576
if 0 ;ïîêà ýòî ïðîñòî ëèøíåå
-
 
577
        cmp     ebx, LFB_BASE
-
 
578
        jb      .core_tabs        ;òàáëèöû ñòðàíèö ÿäðà
-
 
579
                                  ;Îøèáêà
-
 
580
  .lfb:
Line 585... Line -...
585
                               ;ïðîñòî ñîçäàäèì îäíó
-
 
586
 
581
                                  ;îáëàñòü LFB
587
           cmp ebx, LFB_BASE
582
                                  ;Îøèáêà
588
           jb .core_tabs       ;òàáëèöû ñòðàíèö ÿäðà
583
        jmp     .fail
589
                               ;Îøèáêà
584
end if
590
.lfb:
585
.core_tabs:
591
                               ;îáëàñòü LFB
586
.fail:  ;simply return to caller
592
                               ;Îøèáêà
587
        mov     esp, ebp
593
           jmp .fail
588
        mov     bl, 14 ;#PF
594
 
589
        ret
595
align 4
590
 
596
.user_space:
591
.user_space:
597
           test eax, PG_MAP
592
        test    eax, PG_MAP
598
           jnz .err_access     ;Ñòðàíèöà ïðèñóòñòâóåò
593
        jnz     .err_access       ;Ñòðàíèöà ïðèñóòñòâóåò
599
                               ;Îøèáêà äîñòóïà ?
594
                                  ;Îøèáêà äîñòóïà ?
600
 
595
 
601
           shr ebx, 12
596
        shr     ebx, 12
602
           mov ecx, ebx
597
        mov     ecx, ebx
603
           shr ecx, 10
598
        shr     ecx, 10
604
           mov edx, [master_tab+ecx*4]
599
        mov     edx, [master_tab+ecx*4]
605
           test edx, PG_MAP
600
        test    edx, PG_MAP
606
           jz .fail            ;òàáëèöà ñòðàíèö íå ñîçäàíà
601
        jz      .fail             ;òàáëèöà ñòðàíèö íå ñîçäàíà
607
                               ;íåâåðíûé àäðåñ â ïðîãðàììå
602
                                  ;íåâåðíûé àäðåñ â ïðîãðàììå
608
 
603
 
-
 
604
        mov     eax, [page_tabs+ebx*4]
-
 
605
        test    eax, 2
-
 
606
        jz      .fail             ;àäðåñ íå çàðåçåðâèðîâàí äëÿ ;
-
 
607
                                  ;èñïîëüçîâàíèÿ. Îøèáêà
-
 
608
.alloc:
-
 
609
        call    alloc_page
-
 
610
        test    eax, eax
-
 
611
        jz      .fail
-
 
612
 
-
 
613
        stdcall map_page,[.err_addr],eax,dword PG_UW
-
 
614
 
Line 609... Line -...
609
           mov eax, [page_tabs+ebx*4]
-
 
610
           test eax, 2
-
 
611
           jz .fail            ;àäðåñ íå çàðåçåðâèðîâàí äëÿ ;
-
 
612
                               ;èñïîëüçîâàíèÿ. Îøèáêà
-
 
613
.alloc:
-
 
614
           call alloc_page
-
 
615
           test eax, eax
-
 
616
           jz .fail
-
 
617
 
-
 
618
           stdcall map_page,[ebp-4],eax,dword PG_UW
-
 
619
 
-
 
620
           mov edi, [ebp-4]
-
 
621
           and edi, 0xFFFFF000
615
        mov     edi, [.err_addr]
622
           mov ecx, 1024
616
        and     edi, 0xFFFFF000
623
           xor eax, eax
617
        mov     ecx, 1024
Line 624... Line 618...
624
           cld
618
        xor     eax, eax
625
           rep stosd
619
       ;cld     ;caller is duty for this
626
.exit:
620
        rep     stosd
Line 627... Line 621...
627
           mov esp, ebp
621
.exit:  ;iret with repeat fault instruction
628
           popad
622
        add     esp,8 ; clear in stack: locals(.err_addr) + ret_to_caller
629
           add esp, 4
623
        restore_ring3_context
630
           iretd
624
        iretd
631
 
625
 
632
.err_access:
626
.err_access  =  .fail
Line 633... Line 627...
633
;íèêîãäà íå ïðîèñõîäèò
627
;íèêîãäà íå ïðîèñõîäèò
Line 634... Line 628...
634
           jmp .fail
628
       ;jmp     .fail
635
 
629
 
Line 636... Line 630...
636
.kernel_space:
630
.kernel_space:
637
           test eax, PG_MAP
631
        test    eax, PG_MAP
Line 638... Line 632...
638
           jz .fail        ;ñòðàíèöà íå ïðèñóòñòâóåò
632
        jz      .fail   ;ñòðàíèöà íå ïðèñóòñòâóåò
639
 
633
 
Line 640... Line 634...
640
           test eax, 4     ;U/S
634
        test    eax,12  ;U/S (+below)
641
           jnz .fail       ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
635
        jnz     .fail   ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
642
                           ;ÿäðà
636
                        ;ÿäðà
643
           test eax, 8
637
       ;test    eax, 8
644
           jnz .fail       ;óñòàíîâëåí çàðåçåðâèðîâàííûé áèò
638
       ;jnz     .fail   ;óñòàíîâëåí çàðåçåðâèðîâàííûé áèò
645
                           ;â òàáëèöàõ ñòðàíèö. äîáàâëåíî â P4/Xeon
639
                        ;â òàáëèöàõ ñòðàíèö. äîáàâëåíî â P4/Xeon
646
 
640
 
647
;ïîïûòêà çàïèñè â çàùèù¸ííóþ ñòðàíèöó ÿäðà
641
;ïîïûòêà çàïèñè â çàùèù¸ííóþ ñòðàíèöó ÿäðà
648
 
642
 
649
           cmp ebx, tss._io_map_0
643
        cmp     ebx, tss._io_map_0
650
           jb .fail
644
        jb      .fail
651
 
645
 
652
           cmp ebx, tss._io_map_0+8192
646
        cmp     ebx, tss._io_map_0+8192
653
           jae .fail
647
        jae     .fail
654
 
648
 
655
; io permission map
649
; io permission map
656
; copy-on-write protection
650
; copy-on-write protection
657
 
651
 
658
           call alloc_page
652
        call    alloc_page
659
           test eax, eax
653
        test    eax, eax
660
           jz .fail
654
        jz      .fail
661
 
655
 
662
           push eax
-
 
663
           stdcall map_page,[ebp-4],eax,dword PG_SW
-
 
664
           pop eax
-
 
665
           mov edi, [.err_addr]
-
 
666
           and edi, -4096
-
 
667
           lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0
-
 
668
 
-
 
669
           mov ebx, esi
-
 
670
           shr ebx, 12
-
 
671
           mov edx, [current_slot]
-
 
672
           or eax, PG_SW
-
 
673
           mov [edx+APPDATA.io_map+ebx*4], eax
-
 
674
 
-
 
675
           add esi, [default_io_map]
-
 
676
           mov ecx, 4096/4
-
 
677
           cld
-
 
678
           rep movsd
-
 
679
           jmp .exit
656
        push    eax
Line 680... Line 657...
680
 
657
        stdcall map_page,[.err_addr],eax,dword PG_SW
681
 
658
        pop     eax
682
;íå îáðàáàòûâàåì. Îøèáêà
659
        mov     edi, [.err_addr]
Line 1344... Line 1321...
1344
           xor eax, eax
1321
           xor eax, eax
1345
           pop ebx
1322
           pop ebx
1346
.fail:
1323
.fail:
1347
           ret
1324
           ret
1348
endp
1325
endp
1349
-
 
1350
-
 
1351
-