Subversion Repositories Kolibri OS

Rev

Rev 1161 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1161 Rev 1198
Line 451... Line 451...
451
           xchg esi, edi
451
           xchg esi, edi
Line 452... Line 452...
452
 
452
 
453
@@:
453
@@:
454
           call alloc_page
454
           call alloc_page
455
           test eax, eax
455
           test eax, eax
Line 456... Line 456...
456
           jz .exit
456
           jz .exit_pop
Line 457... Line 457...
457
 
457
 
458
           stdcall map_page_table, edi, eax
458
           stdcall map_page_table, edi, eax
Line 489... Line 489...
489
           add esi, 0x1000
489
           add esi, 0x1000
490
           cmp esi, edi
490
           cmp esi, edi
491
           jb  @B
491
           jb  @B
Line 492... Line 492...
492
 
492
 
-
 
493
           jmp .update_size
-
 
494
.exit_pop:
-
 
495
           pop edi
493
           jmp .update_size
496
           pop esi
494
.exit:
497
.exit:
495
           xor eax, eax
498
           xor eax, eax
496
           inc eax
499
           inc eax
497
           dec [pg_data.pg_mutex]
500
           dec [pg_data.pg_mutex]
Line 542... Line 545...
542
           and eax, 0xFFFFF000
545
           and eax, 0xFFFFF000
543
           ret
546
           ret
Line 544... Line 547...
544
 
547
 
-
 
548
 
545
 
549
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
550
; Now it is called from core/sys32::exc_c (see stack frame there)
Line 551... Line 551...
551
 
551
proc page_fault_handler
552
        .err_code equ ebp+32
552
 
553
        .err_addr equ ebp-4
553
    .err_addr   equ ebp-4
554
 
-
 
555
           pushad
-
 
556
           mov ebp, esp
554
 
557
           mov eax, cr2
-
 
558
           push eax
-
 
559
 
-
 
560
           mov ax, app_data
555
        push    ebx               ;save exception number (#PF)
Line 561... Line 556...
561
           mov ds, ax
556
        mov     ebp, esp
562
           mov es, ax
557
        mov     ebx, cr2
563
 
558
        push    ebx               ;that is locals: .err_addr = cr2
564
           inc [pg_data.pages_faults]
559
        inc     [pg_data.pages_faults]
565
 
560
 
566
;     push eax
561
;     push eax
567
;     push edx
562
;     push edx
Line 568... Line -...
568
;     mov edx, 0x400   ;bochs
-
 
569
;     mov al,0xff      ;bochs
563
;     mov edx, 0x400   ;bochs
Line 570... Line 564...
570
;     out dx, al       ;bochs
564
;     mov al,0xff      ;bochs
571
;     pop edx
565
;     out dx, al       ;bochs
Line 572... Line 566...
572
;     pop eax
566
;     pop edx
573
 
567
;     pop eax
Line 574... Line 568...
574
           mov ebx, [.err_addr]
568
 
575
           mov eax, [.err_code]
569
        mov     eax, [pf_err_code]
576
 
570
 
577
           cmp ebx, OS_BASE
-
 
-
 
571
        cmp     ebx, OS_BASE      ;ebx == .err_addr
578
           jb .user_space      ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
572
        jb      .user_space       ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
579
 
573
 
580
           cmp ebx, page_tabs
574
        cmp     ebx, page_tabs
581
           jb .kernel_space    ;ñòðàíèöà â ïàìÿòè ÿäðà
575
        jb      .kernel_space     ;ñòðàíèöà â ïàìÿòè ÿäðà
582
 
576
 
583
           cmp ebx, kernel_tabs
577
        cmp     ebx, kernel_tabs
584
           jb .alloc;.app_tabs ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
578
        jb      .alloc;.app_tabs  ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
-
 
579
                                  ;ïðîñòî ñîçäàäèì îäíó
-
 
580
if 0 ;ïîêà ýòî ïðîñòî ëèøíåå
-
 
581
        cmp     ebx, LFB_BASE
-
 
582
        jb      .core_tabs        ;òàáëèöû ñòðàíèö ÿäðà
-
 
583
                                  ;Îøèáêà
-
 
584
  .lfb:
Line 585... Line -...
585
                               ;ïðîñòî ñîçäàäèì îäíó
-
 
586
 
585
                                  ;îáëàñòü LFB
587
           cmp ebx, LFB_BASE
586
                                  ;Îøèáêà
588
           jb .core_tabs       ;òàáëèöû ñòðàíèö ÿäðà
587
        jmp     .fail
589
                               ;Îøèáêà
588
end if
Line 613... Line 612...
613
.alloc:
612
.alloc:
614
           call alloc_page
613
        call    alloc_page
615
           test eax, eax
614
        test    eax, eax
616
           jz .fail
615
        jz      .fail
Line 617... Line 616...
617
 
616
 
Line 618... Line 617...
618
           stdcall map_page,[ebp-4],eax,dword PG_UW
617
        stdcall map_page,[.err_addr],eax,dword PG_UW
619
 
618
 
620
           mov edi, [ebp-4]
619
        mov     edi, [.err_addr]
621
           and edi, 0xFFFFF000
620
        and     edi, 0xFFFFF000
622
           mov ecx, 1024
621
        mov     ecx, 1024
623
           xor eax, eax
622
        xor     eax, eax
624
           cld
-
 
625
           rep stosd
623
       ;cld     ;caller is duty for this
626
.exit:
624
        rep     stosd
627
           mov esp, ebp
625
.exit:  ;iret with repeat fault instruction
628
           popad
626
        add     esp,12 ;clear in stack: locals(.err_addr) + #PF + ret_to_caller
Line 629... Line 627...
629
           add esp, 4
627
        restore_ring3_context
630
           iretd
628
        iretd
631
 
629
 
Line 632... Line 630...
632
.err_access:
630
.err_access  =  .fail
633
;íèêîãäà íå ïðîèñõîäèò
631
;íèêîãäà íå ïðîèñõîäèò
634
           jmp .fail
632
       ;jmp     .fail
Line 635... Line 633...
635
 
633
 
636
.kernel_space:
634
.kernel_space:
637
           test eax, PG_MAP
635
        test    eax, PG_MAP
638
           jz .fail        ;ñòðàíèöà íå ïðèñóòñòâóåò
636
        jz      .fail   ;ñòðàíèöà íå ïðèñóòñòâóåò
639
 
637
 
640
           test eax, 4     ;U/S
638
        test    eax,12  ;U/S (+below)
Line 641... Line 639...
641
           jnz .fail       ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
639
        jnz     .fail   ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
Line 642... Line 640...
642
                           ;ÿäðà
640
                        ;ÿäðà
Line 658... Line 656...
658
           call alloc_page
656
        call    alloc_page
659
           test eax, eax
657
        test    eax, eax
660
           jz .fail
658
        jz      .fail
Line 661... Line 659...
661
 
659
 
662
           push eax
660
        push    eax
663
           stdcall map_page,[ebp-4],eax,dword PG_SW
661
        stdcall map_page,[.err_addr],eax,dword PG_SW
664
           pop eax
662
        pop     eax
665
           mov edi, [.err_addr]
663
        mov     edi, [.err_addr]
666
           and edi, -4096
664
        and     edi, -4096
Line 672... Line 670...
672
           or eax, PG_SW
670
        or      eax, PG_SW
673
           mov [edx+APPDATA.io_map+ebx*4], eax
671
        mov     [edx+APPDATA.io_map+ebx*4], eax
Line 674... Line 672...
674
 
672
 
675
           add esi, [default_io_map]
673
        add     esi, [default_io_map]
676
           mov ecx, 4096/4
674
        mov     ecx, 4096/4
677
           cld
675
       ;cld     ;caller is duty for this
678
           rep movsd
676
        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
677
        jmp     .exit
Line 697... Line 678...
697
endp
678
endp
698
 
679
 
699
align 4
680
align 4
Line 981... Line 962...
981
endp
962
endp
Line 982... Line 963...
982
 
963
 
983
align 4
964
align 4
Line 984... Line 965...
984
sysfn_meminfo:
965
sysfn_meminfo:
985
 
966
 
986
        ;   add ebx, new_app_base
967
        ;   add ecx, new_app_base
Line 987... Line 968...
987
           cmp ebx, OS_BASE
968
           cmp ecx, OS_BASE
988
           jae .fail
969
           jae .fail
989
 
970
 
990
           mov eax, [pg_data.pages_count]
971
           mov eax, [pg_data.pages_count]
991
           mov [ebx], eax
972
           mov [ecx], eax
992
           shl eax, 12
973
           shl eax, 12
993
           mov [esp+36], eax
974
           mov [esp+32], eax
994
           mov ecx, [pg_data.pages_free]
975
           mov eax, [pg_data.pages_free]
995
           mov [ebx+4], ecx
976
           mov [ecx+4], eax
996
           mov edx, [pg_data.pages_faults]
977
           mov eax, [pg_data.pages_faults]
997
           mov [ebx+8], edx
978
           mov [ecx+8], eax
998
           mov esi, [heap_size]
979
           mov eax, [heap_size]
999
           mov [ebx+12], esi
980
           mov [ecx+12], eax
1000
           mov edi, [heap_free]
981
           mov eax, [heap_free]
1001
           mov [ebx+16], edi
982
           mov [ecx+16], eax
1002
           mov eax, [heap_blocks]
983
           mov eax, [heap_blocks]
1003
           mov [ebx+20], eax
984
           mov [ecx+20], eax
1004
           mov ecx, [free_blocks]
985
           mov eax, [free_blocks]
1005
           mov [ebx+24], ecx
986
           mov [ecx+24], eax
1006
           ret
987
           ret
Line 1007... Line 988...
1007
.fail:
988
.fail:
1008
           mov dword [esp+36], -1
989
           mov dword [esp+32], -1
1009
           ret
990
           ret
1010
 
991
 
1011
align 4
992
align 4
1012
f68call:
993
f68call:
1013
           dd f68.11
994
           dd f68.11
1014
           dd f68.12
995
           dd f68.12
1015
           dd f68.13
996
           dd f68.13
1016
           dd f68.14
997
           dd f68.14
1017
           dd f68.15
998
           dd f68.fail ;moved to f68.24
1018
           dd f68.16
999
           dd f68.16
1019
           dd f68.17
1000
           dd f68.17
1020
           dd f68.18
1001
           dd f68.fail ;moved to f68.25
1021
           dd f68.19
1002
           dd f68.19
-
 
1003
           dd f68.20
-
 
1004
           dd f68.21
Line 1022... Line 1005...
1022
           dd f68.20
1005
           dd f68.22
1023
           dd f68.21
1006
           dd f68.23
1024
           dd f68.22
1007
           dd f68.24
1025
           dd f68.23
1008
           dd f68.25
Line 1026... Line 1009...
1026
 
1009
 
1027
align 4
1010
align 4
Line 1028... Line 1011...
1028
f68:
1011
f68:
1029
           cmp  eax,4
1012
           cmp  eax,4
Line 1030... Line 1013...
1030
           jle  sys_sheduler
1013
           jle  sys_sheduler
1031
 
1014
 
1032
           cmp eax, 11
1015
           cmp eax, 11
Line 1049... Line 1032...
1049
           mov [esp+36], eax
1032
           mov [esp+36], eax
1050
           ret
1033
           ret
1051
.14:
1034
.14:
1052
           cmp ebx, OS_BASE
1035
           cmp ebx, OS_BASE
1053
           jae .fail
1036
           jae .fail
-
 
1037
           mov edi,ebx
1054
           stdcall get_event_ex, ebx, ecx
1038
           call get_event_ex
1055
           mov [esp+36], eax
1039
           mov [esp+36], eax
1056
           ret
1040
           ret
1057
.15:
1041
.24:
1058
           mov ecx, [current_slot]
1042
           mov  eax, [current_slot]
1059
           mov eax, [ecx+APPDATA.fpu_handler]
1043
           xchg ebx, [eax+APPDATA.exc_handler]
1060
           mov [ecx+APPDATA.fpu_handler], ebx
1044
           xchg ecx, [eax+APPDATA.except_mask]
1061
           mov [esp+36], eax
1045
           mov  [esp+36], ebx ; reg_eax+8
-
 
1046
           mov  [esp+24], ecx ; reg_ebx+8
1062
           ret
1047
           ret
1063
.16:
1048
.16:
1064
           test ebx, ebx
1049
           test ebx, ebx
1065
           jz .fail
1050
           jz .fail
1066
           cmp ebx, OS_BASE
1051
           cmp ebx, OS_BASE
Line 1070... Line 1055...
1070
           ret
1055
           ret
1071
.17:
1056
.17:
1072
           call srv_handlerEx   ;ebx
1057
           call srv_handlerEx   ;ebx
1073
           mov [esp+36], eax
1058
           mov [esp+36], eax
1074
           ret
1059
           ret
1075
.18:
1060
.25:
-
 
1061
           cmp ebx,32
-
 
1062
           jae .fail
1076
           mov ecx, [current_slot]
1063
           mov  eax, [current_slot]
1077
           mov eax, [ecx+APPDATA.sse_handler]
1064
           btr  [eax+APPDATA.except_mask],ebx
1078
           mov [ecx+APPDATA.sse_handler], ebx
1065
           setc byte[esp+36]
1079
           mov [esp+36], eax
1066
           jecxz @f
-
 
1067
           bts  [eax+APPDATA.except_mask],ebx
1080
           ret
1068
     @@:   ret
1081
.19:
1069
.19:
1082
           cmp ebx, OS_BASE
1070
           cmp ebx, OS_BASE
1083
           jae .fail
1071
           jae .fail
1084
           stdcall load_library, ebx
1072
           stdcall load_library, ebx
1085
           mov [esp+36], eax
1073
           mov [esp+36], eax
Line 1316... Line 1304...
1316
           xor eax, eax
1304
           xor eax, eax
1317
           pop ebx
1305
           pop ebx
1318
.fail:
1306
.fail:
1319
           ret
1307
           ret
1320
endp
1308
endp
1321
-
 
1322
-
 
1323
-