/*++ Copyright (c) 1994 Microsoft Corporation Module Name: debug.c Abstract: This module implements utility functions. Author: David N. Cutler (davec) 21-Sep-1994 Environment: Kernel mode only. Revision History: --*/ #include "nthal.h" #include "emulate.h" #if defined(XM_DEBUG) // // Define counter used to control flag tracing. // ULONG XmTraceCount = 0; VOID XmTraceDestination ( IN PRXM_CONTEXT P, IN ULONG Destination ) /*++ Routine Description: This function traces the destination value if the TRACE_OPERANDS flag is set. Arguments: P - Supplies a pointer to an emulator context structure. Result - Supplies the destination value to trace. Return Value: None. --*/ { // // Trace result of operation. // if ((XmDebugFlags & TRACE_OPERANDS) != 0) { if (P->DataType == BYTE_DATA) { DEBUG_PRINT(("\n Dst - %02lx", Destination)); } else if (P->DataType == WORD_DATA) { DEBUG_PRINT(("\n Dst - %04lx", Destination)); } else { DEBUG_PRINT(("\n Dst - %08lx", Destination)); } } return; } VOID XmTraceFlags ( IN PRXM_CONTEXT P ) /*++ Routine Description: This function traces the condition flags if the TRACE_FLAGS flag is set. Arguments: P - Supplies a pointer to an emulator context structure. Return Value: None. --*/ { // // Trace flags. // if ((XmDebugFlags & TRACE_OPERANDS) != 0) { DEBUG_PRINT(("\n OF-%lx, DF-%lx, SF-%lx, ZF-%lx, AF-%lx, PF-%lx, CF-%lx", (ULONG)P->Eflags.OF, (ULONG)P->Eflags.DF, (ULONG)P->Eflags.SF, (ULONG)P->Eflags.ZF, (ULONG)P->Eflags.AF, (ULONG)P->Eflags.PF, (ULONG)P->Eflags.CF)); } // // Increment the trace count and if the result is even, then put // out a new line. // XmTraceCount += 1; if (((XmTraceCount & 1) == 0) && (XmDebugFlags != 0)) { DEBUG_PRINT(("\n")); } return; } VOID XmTraceJumps ( IN PRXM_CONTEXT P ) /*++ Routine Description: This function traces jump operations if the TRACE_JUMPS flag is set. Arguments: P - Supplies a pointer to an emulator context structure. Return Value: None. --*/ { // // Trace jumps. // if ((XmDebugFlags & TRACE_JUMPS) != 0) { DEBUG_PRINT(("\n Jump to %04lx:%04lx", (ULONG)P->SegmentRegister[CS], (ULONG)P->Eip)); } return; } VOID XmTraceInstruction ( IN XM_OPERATION_DATATYPE DataType, IN ULONG Instruction ) /*++ Routine Description: This function traces instructions if the TRACE_OPERANDS flag is set. Arguments: DataType - Supplies the data type of the instruction value. Instruction - Supplies the instruction value to trace. Return Value: None. --*/ { // // Trace instruction stream of operation. // if ((XmDebugFlags & TRACE_OPERANDS) != 0) { if (DataType == BYTE_DATA) { DEBUG_PRINT(("%02lx ", Instruction)); } else if (DataType == WORD_DATA) { DEBUG_PRINT(("%04lx ", Instruction)); } else { DEBUG_PRINT(("%08lx ", Instruction)); } } return; } VOID XmTraceOverride ( IN PRXM_CONTEXT P ) /*++ Routine Description: This function traces segment override prefixes. Arguments: P - Supplies a pointer to an emulator context structure. Return Value: None. --*/ { PCHAR Name = "ECSDFG"; ULONG Segment; // // Trace segment override. // if ((XmDebugFlags & TRACE_OVERRIDE) != 0) { Segment = P->DataSegment; DEBUG_PRINT(("\n %cS:Selector - %04lx, Limit - %04lx", (ULONG)Name[Segment], (ULONG)P->SegmentRegister[Segment], P->SegmentLimit[Segment])); } return; } VOID XmTraceRegisters ( IN PRXM_CONTEXT P ) /*++ Routine Description: This function traces emulator registers. Arguments: P - Supplies a pointer to an emulator context structure. Return Value: None. --*/ { // // Trace general register. // if ((XmDebugFlags & TRACE_GENERAL_REGISTERS) != 0) { DEBUG_PRINT(("\n EAX-%08lx ECX-%08lx EDX-%08lx EBX-%08lx", P->Gpr[EAX].Exx, P->Gpr[ECX].Exx, P->Gpr[EDX].Exx, P->Gpr[EBX].Exx)); DEBUG_PRINT(("\n ESP-%08lx EBP-%08lx ESI-%08lx EDI-%08lx", P->Gpr[ESP].Exx, P->Gpr[EBP].Exx, P->Gpr[ESI].Exx, P->Gpr[EDI].Exx)); DEBUG_PRINT(("\n ES:%04lx CS:%04lx SS:%04lx DS:%04lx FS:%04lx GS:%04lx", (ULONG)P->SegmentRegister[ES], (ULONG)P->SegmentRegister[CS], (ULONG)P->SegmentRegister[SS], (ULONG)P->SegmentRegister[DS], (ULONG)P->SegmentRegister[FS], (ULONG)P->SegmentRegister[GS])); } return; } VOID XmTraceResult ( IN PRXM_CONTEXT P, IN ULONG Result ) /*++ Routine Description: This function traces the result value if the TRACE_OPERANDS flag is set. Arguments: P - Supplies a pointer to an emulator context structure. Result - Supplies the result value to trace. Return Value: None. --*/ { // // Trace result of operation. // if ((XmDebugFlags & TRACE_OPERANDS) != 0) { if (P->DataType == BYTE_DATA) { DEBUG_PRINT(("\n Rsl - %02lx", Result)); } else if (P->DataType == WORD_DATA) { DEBUG_PRINT(("\n Rsl - %04lx", Result)); } else { DEBUG_PRINT(("\n Rsl - %08lx", Result)); } } return; } VOID XmTraceSpecifier ( IN UCHAR Specifier ) /*++ Routine Description: This function traces the specifiern if the TRACE_OPERANDS flag is set. Arguments: Specifier - Supplies the specifier value to trace. Return Value: None. --*/ { // // Trace instruction stream of operation. // if ((XmDebugFlags & TRACE_OPERANDS) != 0) { DEBUG_PRINT(("%02lx ", Specifier)); if ((XmDebugFlags & TRACE_SPECIFIERS) != 0) { DEBUG_PRINT(("(mod-%01lx reg-%01lx r/m-%01lx) ", (Specifier >> 6) & 0x3, (Specifier >> 3) & 0x7, (Specifier >> 0) & 0x7)); } } return; } VOID XmTraceSource ( IN PRXM_CONTEXT P, IN ULONG Source ) /*++ Routine Description: This function traces the source value if the TRACE_OPERANDS flag is set. Arguments: P - Supplies a pointer to an emulator context structure. Source - Supplies the source value to trace. Return Value: None. --*/ { // // Trace result of operation. // if ((XmDebugFlags & TRACE_OPERANDS) != 0) { if (P->DataType == BYTE_DATA) { DEBUG_PRINT(("\n Src - %02lx", Source)); } else if (P->DataType == WORD_DATA) { DEBUG_PRINT(("\n Src - %04lx", Source)); } else { DEBUG_PRINT(("\n Src - %08lx", Source)); } } return; } #endif