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