VOID NTAPI Fast486Initialize(PFAST486_STATE State, FAST486_MEM_READ_PROC MemReadCallback, FAST486_MEM_WRITE_PROC MemWriteCallback, FAST486_IO_READ_PROC IoReadCallback, FAST486_IO_WRITE_PROC IoWriteCallback, FAST486_IDLE_PROC IdleCallback, FAST486_BOP_PROC BopCallback, FAST486_INT_ACK_PROC IntAckCallback, PULONG Tlb) { /* Set the callbacks (or use default ones if some are NULL) */ State->MemReadCallback = (MemReadCallback ? MemReadCallback : Fast486MemReadCallback ); State->MemWriteCallback = (MemWriteCallback ? MemWriteCallback : Fast486MemWriteCallback); State->IoReadCallback = (IoReadCallback ? IoReadCallback : Fast486IoReadCallback ); State->IoWriteCallback = (IoWriteCallback ? IoWriteCallback : Fast486IoWriteCallback ); State->IdleCallback = (IdleCallback ? IdleCallback : Fast486IdleCallback ); State->BopCallback = (BopCallback ? BopCallback : Fast486BopCallback ); State->IntAckCallback = (IntAckCallback ? IntAckCallback : Fast486IntAckCallback ); /* Set the TLB (if given) */ State->Tlb = Tlb; /* Reset the CPU */ Fast486Reset(State); }
VOID FASTCALL Fast486ExceptionWithErrorCode(PFAST486_STATE State, FAST486_EXCEPTIONS ExceptionCode, ULONG ErrorCode) { FAST486_IDT_ENTRY IdtEntry; /* Increment the exception count */ State->ExceptionCount++; /* Check if the exception occurred more than once */ if (State->ExceptionCount > 1) { /* Then this is a double fault */ ExceptionCode = FAST486_EXCEPTION_DF; } /* Check if this is a triple fault */ if (State->ExceptionCount == 3) { /* Reset the CPU */ Fast486Reset(State); return; } /* Restore the IP to the saved IP */ State->InstPtr = State->SavedInstPtr; if (!Fast486GetIntVector(State, ExceptionCode, &IdtEntry)) { /* * If this function failed, that means Fast486Exception * was called again, so just return in this case. */ return; } /* Perform the interrupt */ if (!Fast486InterruptInternal(State, IdtEntry.Selector, MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh), IdtEntry.Type)) { /* * If this function failed, that means Fast486Exception * was called again, so just return in this case. */ return; } if (EXCEPTION_HAS_ERROR_CODE(ExceptionCode) && (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PE)) { /* Push the error code */ if (!Fast486StackPush(State, ErrorCode)) { /* * If this function failed, that means Fast486Exception * was called again, so just return in this case. */ return; } } /* Reset the exception count */ State->ExceptionCount = 0; }