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 | endp0>> |
1308 | endp0>> |
1321 | - | ||
1322 | - | ||
1323 | - |