544,23 → 544,14 |
|
|
align 4 |
; Now it is called from sys32::exc_c (see stack frame there) |
proc page_fault_handler |
|
test byte [esp+12+2], 2 |
jnz v86_page_fault |
|
.err_code equ ebp+32 |
.err_addr equ ebp-4 |
|
pushad |
mov ebp, esp |
mov eax, cr2 |
push eax |
|
mov ax, app_data |
mov ds, ax |
mov es, ax |
|
mov ebx, cr2 |
push ebx ; that is locals: .err_addr = cr2 |
inc [pg_data.pages_faults] |
|
; push eax |
571,10 → 562,9 |
; pop edx |
; pop eax |
|
mov ebx, [.err_addr] |
mov eax, [.err_code] |
mov eax, [pf_err_code] |
|
cmp ebx, OS_BASE |
cmp ebx, OS_BASE ;ebx == .err_addr |
jb .user_space ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ; |
|
cmp ebx, page_tabs |
583,7 → 573,7 |
cmp ebx, kernel_tabs |
jb .alloc;.app_tabs ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ; |
;ïðîñòî ñîçäàäèì îäíó |
|
if 0 ;ïîêà ýòî ïðîñòî ëèøíåå |
cmp ebx, LFB_BASE |
jb .core_tabs ;òàáëèöû ñòðàíèö ÿäðà |
;Îøèáêà |
591,8 → 581,13 |
;îáëàñòü LFB |
;Îøèáêà |
jmp .fail |
end if |
.core_tabs: |
.fail: ;simply return to caller |
mov esp, ebp |
mov bl, 14 ;#PF |
ret |
|
align 4 |
.user_space: |
test eax, PG_MAP |
jnz .err_access ;Ñòðàíèöà ïðèñóòñòâóåò |
615,33 → 610,32 |
test eax, eax |
jz .fail |
|
stdcall map_page,[ebp-4],eax,dword PG_UW |
stdcall map_page,[.err_addr],eax,dword PG_UW |
|
mov edi, [ebp-4] |
mov edi, [.err_addr] |
and edi, 0xFFFFF000 |
mov ecx, 1024 |
xor eax, eax |
cld |
;cld ;caller is duty for this |
rep stosd |
.exit: |
mov esp, ebp |
popad |
add esp, 4 |
.exit: ;iret with repeat fault instruction |
add esp,8 ; clear in stack: locals(.err_addr) + ret_to_caller |
restore_ring3_context |
iretd |
|
.err_access: |
.err_access = .fail |
;íèêîãäà íå ïðîèñõîäèò |
jmp .fail |
;jmp .fail |
|
.kernel_space: |
test eax, PG_MAP |
jz .fail ;ñòðàíèöà íå ïðèñóòñòâóåò |
|
test eax, 4 ;U/S |
test eax,12 ;U/S (+below) |
jnz .fail ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè |
;ÿäðà |
test eax, 8 |
jnz .fail ;óñòàíîâëåí çàðåçåðâèðîâàííûé áèò |
;test eax, 8 |
;jnz .fail ;óñòàíîâëåí çàðåçåðâèðîâàííûé áèò |
;â òàáëèöàõ ñòðàíèö. äîáàâëåíî â P4/Xeon |
|
;ïîïûòêà çàïèñè â çàùèù¸ííóþ ñòðàíèöó ÿäðà |
660,7 → 654,7 |
jz .fail |
|
push eax |
stdcall map_page,[ebp-4],eax,dword PG_SW |
stdcall map_page,[.err_addr],eax,dword PG_SW |
pop eax |
mov edi, [.err_addr] |
and edi, -4096 |
674,26 → 668,9 |
|
add esi, [default_io_map] |
mov ecx, 4096/4 |
cld |
;cld ;caller is duty for this |
rep movsd |
jmp .exit |
|
|
;íå îáðàáàòûâàåì. Îøèáêà |
|
.core_tabs: |
.fail: |
mov esp, ebp |
popad |
add esp, 4 |
|
; iretd |
|
save_ring3_context ;debugger support |
|
mov bl, 14 |
jmp exc_c |
iretd |
endp |
|
align 4 |
1346,6 → 1323,3 |
.fail: |
ret |
endp |
|
|
|