mirror of
https://github.com/reactos/reactos.git
synced 2024-06-28 08:51:29 +00:00
[NTOS] Fix interrupt flag handling in KiPageFault
This fixes a crash in kmtest:ZwAllocateVirtualMemory
This commit is contained in:
parent
5b6e7eceda
commit
12ed9f30a7
|
@ -417,13 +417,15 @@ FUNC KiPageFault
|
||||||
mov rdx, cr2
|
mov rdx, cr2
|
||||||
mov [rbp + KTRAP_FRAME_FaultAddress], rdx
|
mov [rbp + KTRAP_FRAME_FaultAddress], rdx
|
||||||
|
|
||||||
/* If interrupts are off, treat this as an access violation */
|
/* If interrupts are off, do not enable them */
|
||||||
test dword ptr [rbp + KTRAP_FRAME_EFlags], EFLAGS_IF_MASK
|
test dword ptr [rbp + KTRAP_FRAME_EFlags], EFLAGS_IF_MASK
|
||||||
jz AccessViolation
|
jz IntsDisabled
|
||||||
|
|
||||||
/* Enable interrupts for the page fault handler */
|
/* Enable interrupts for the page fault handler */
|
||||||
sti
|
sti
|
||||||
|
|
||||||
|
IntsDisabled:
|
||||||
|
|
||||||
/* Call page fault handler */
|
/* Call page fault handler */
|
||||||
mov ecx, [rbp + KTRAP_FRAME_ErrorCode] // FaultCode
|
mov ecx, [rbp + KTRAP_FRAME_ErrorCode] // FaultCode
|
||||||
// rdx == Address
|
// rdx == Address
|
||||||
|
@ -443,13 +445,10 @@ FUNC KiPageFault
|
||||||
|
|
||||||
PageFaultError:
|
PageFaultError:
|
||||||
|
|
||||||
/* Disable interrupts again for the debugger */
|
|
||||||
cli
|
|
||||||
|
|
||||||
/* Set parameter 1 to error code */
|
/* Set parameter 1 to error code */
|
||||||
mov r9d, [rbp + KTRAP_FRAME_ErrorCode]
|
mov r9d, [rbp + KTRAP_FRAME_ErrorCode]
|
||||||
|
|
||||||
/* Set parameter2 to faulting address */
|
/* Set parameter 2 to faulting address */
|
||||||
mov r10, cr2 // Param2 = faulting address
|
mov r10, cr2 // Param2 = faulting address
|
||||||
|
|
||||||
cmp eax, STATUS_ACCESS_VIOLATION
|
cmp eax, STATUS_ACCESS_VIOLATION
|
||||||
|
@ -477,6 +476,10 @@ SpecialCode:
|
||||||
call InternalDispatchException
|
call InternalDispatchException
|
||||||
|
|
||||||
PageFaultReturn:
|
PageFaultReturn:
|
||||||
|
|
||||||
|
/* Disable interrupts for the return */
|
||||||
|
cli
|
||||||
|
|
||||||
/* Return */
|
/* Return */
|
||||||
ExitTrap (TF_SAVE_ALL or TF_CHECKUSERAPC)
|
ExitTrap (TF_SAVE_ALL or TF_CHECKUSERAPC)
|
||||||
ENDFUNC
|
ENDFUNC
|
||||||
|
|
Loading…
Reference in a new issue