X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fntoskrnl%2Fke%2Fi386%2Ftrap.s;h=c8458c387ed26740183031ceffc4d3bffd2737fa;hp=15a146e101240aa5594b5081ba8f350822add727;hb=422721748d4c1d9e544a42d496227fce0c54f52f;hpb=66afccbaeb5211aabea244d2245f875e90d494cb diff --git a/reactos/ntoskrnl/ke/i386/trap.s b/reactos/ntoskrnl/ke/i386/trap.s index 15a146e1012..c8458c387ed 100644 --- a/reactos/ntoskrnl/ke/i386/trap.s +++ b/reactos/ntoskrnl/ke/i386/trap.s @@ -947,6 +947,7 @@ _KiTrap6: /* Enter V86 Trap */ V86_TRAP_PROLOG kit6_a, kit6_v +VdmOpCodeFault: /* Not yet supported (Invalid OPCODE from V86) */ UNHANDLED_PATH @@ -957,6 +958,7 @@ NotV86UD: /* Enter trap */ TRAP_PROLOG kit6_a, kit6_t +DispatchLockErrata: /* Check if this happened in kernel mode */ test byte ptr [ebp+KTRAP_FRAME_CS], MODE_MASK jz KmodeOpcode @@ -1949,14 +1951,21 @@ _KiTrap14: NoFixUp: mov edi, cr2 - /* REACTOS Mm Hack of Doom */ + /* Check if this processor has the cmpxchg8b lock errata */ + cmp byte ptr _KiI386PentiumLockErrataPresent, 0 + jnz HandleLockErrata + +NotLockErrata: + /* HACK: Handle page faults with interrupts disabled */ test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_INTERRUPT_MASK je HandlePf /* Enable interrupts and check if we got here with interrupts disabled */ sti - /* test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_INTERRUPT_MASK - jz IllegalState */ +#ifdef HACK_ABOVE_FIXED + test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_INTERRUPT_MASK + jz IllegalState +#endif HandlePf: /* Send trap frame and check if this is kernel-mode or usermode */ @@ -2075,6 +2084,33 @@ VdmAlertGpf: /* FIXME: NOT SUPPORTED */ UNHANDLED_PATH + +HandleLockErrata: + + /* Fail if this isn't a write fault */ + test word ptr [ebp+KTRAP_FRAME_ERROR_CODE], 0x4 + jnz NotLockErrata + + /* Also make sure the page fault is for IDT entry 6 */ + mov eax, PCR[KPCR_IDT] + add eax, 0x30 + cmp eax, edi + jne NotLockErrata + + /* + * This is a write fault to the Invalid Opcode handler entry. + * We assume this is the lock errata and not a real write fault. + */ + + /* Clear the error code */ + and dword ptr [ebp+KTRAP_FRAME_ERROR_CODE], 0 + + /* Check if this happened in V86 mode */ + test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK + jnz VdmOpCodeFault + + /* Dispatch this to the invalid opcode handler */ + jmp DispatchLockErrata .endfunc .func KiTrap0F