Subversion Repositories Kolibri OS

Rev

Rev 1055 | Rev 1072 | Go to most recent revision | Show entire file | Regard 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
-
 
548
 
-
 
549
        test    byte [esp+12+2], 2
-
 
550
        jnz     v86_page_fault
547
; Now it is called from sys32::exc_c (see stack frame there)
Line 551... Line -...
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
Line 613... Line 608...
613
.alloc:
608
.alloc:
614
           call alloc_page
609
        call    alloc_page
615
           test eax, eax
610
        test    eax, eax
616
           jz .fail
611
        jz      .fail
Line 617... Line 612...
617
 
612
 
Line 618... Line 613...
618
           stdcall map_page,[ebp-4],eax,dword PG_UW
613
        stdcall map_page,[.err_addr],eax,dword PG_UW
619
 
614
 
620
           mov edi, [ebp-4]
615
        mov     edi, [.err_addr]
621
           and edi, 0xFFFFF000
616
        and     edi, 0xFFFFF000
622
           mov ecx, 1024
617
        mov     ecx, 1024
623
           xor eax, eax
618
        xor     eax, eax
624
           cld
-
 
625
           rep stosd
619
       ;cld     ;caller is duty for this
626
.exit:
620
        rep     stosd
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
Line 629... Line 623...
629
           add esp, 4
623
        restore_ring3_context
630
           iretd
624
        iretd
631
 
625
 
Line 632... Line 626...
632
.err_access:
626
.err_access  =  .fail
633
;íèêîãäà íå ïðîèñõîäèò
627
;íèêîãäà íå ïðîèñõîäèò
634
           jmp .fail
628
       ;jmp     .fail
Line 635... Line 629...
635
 
629
 
636
.kernel_space:
630
.kernel_space:
637
           test eax, PG_MAP
631
        test    eax, PG_MAP
638
           jz .fail        ;ñòðàíèöà íå ïðèñóòñòâóåò
632
        jz      .fail   ;ñòðàíèöà íå ïðèñóòñòâóåò
639
 
633
 
640
           test eax, 4     ;U/S
634
        test    eax,12  ;U/S (+below)
Line 641... Line 635...
641
           jnz .fail       ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
635
        jnz     .fail   ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
Line 642... Line 636...
642
                           ;ÿäðà
636
                        ;ÿäðà
Line 658... Line 652...
658
           call alloc_page
652
        call    alloc_page
659
           test eax, eax
653
        test    eax, eax
660
           jz .fail
654
        jz      .fail
Line 661... Line 655...
661
 
655
 
662
           push eax
656
        push    eax
663
           stdcall map_page,[ebp-4],eax,dword PG_SW
657
        stdcall map_page,[.err_addr],eax,dword PG_SW
664
           pop eax
658
        pop     eax
665
           mov edi, [.err_addr]
659
        mov     edi, [.err_addr]
666
           and edi, -4096
660
        and     edi, -4096
Line 672... Line 666...
672
           or eax, PG_SW
666
        or      eax, PG_SW
673
           mov [edx+APPDATA.io_map+ebx*4], eax
667
        mov     [edx+APPDATA.io_map+ebx*4], eax
Line 674... Line 668...
674
 
668
 
675
           add esi, [default_io_map]
669
        add     esi, [default_io_map]
676
           mov ecx, 4096/4
670
        mov     ecx, 4096/4
677
           cld
671
       ;cld     ;caller is duty for this
678
           rep movsd
672
        rep     movsd
679
           jmp .exit
-
 
680
 
-
 
681
 
-
 
682
;íå îáðàáàòûâàåì. Îøèáêà
-
 
683
 
-
 
684
.core_tabs:
-
 
685
.fail:
-
 
686
           mov esp, ebp
-
 
687
           popad
-
 
688
           add esp, 4
-
 
689
 
-
 
690
;           iretd
-
 
691
 
-
 
692
           save_ring3_context     ;debugger support
-
 
693
 
-
 
694
           mov bl, 14
-
 
695
           jmp exc_c
-
 
696
           iretd
673
        jmp     .exit
Line 697... Line 674...
697
endp
674
endp
698
 
675
 
699
align 4
676
align 4
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
-