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 | endp0>> |
1325 | endp0>> |
1349 | - | ||
1350 | - | ||
1351 | - |