summaryrefslogtreecommitdiffstats
path: root/private/mvdm/vdmexts/i386/regs.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/vdmexts/i386/regs.c')
-rw-r--r--private/mvdm/vdmexts/i386/regs.c252
1 files changed, 252 insertions, 0 deletions
diff --git a/private/mvdm/vdmexts/i386/regs.c b/private/mvdm/vdmexts/i386/regs.c
new file mode 100644
index 000000000..f700b02e6
--- /dev/null
+++ b/private/mvdm/vdmexts/i386/regs.c
@@ -0,0 +1,252 @@
+/*++
+
+Copyright (c) 1991 Microsoft Corporation
+
+Module Name:
+
+ Registers.c
+
+Abstract:
+
+ This module contains routines for manipulating registers.
+
+Author:
+
+ Dave Hastings (daveh) 1-Apr-1992
+
+Notes:
+
+ The routines in this module assume that the pointers to the ntsd
+ routines have already been set up.
+
+Revision History:
+
+--*/
+
+#include <precomp.h>
+#pragma hdrstop
+#include <stdio.h>
+
+const char *FpuTagNames[] = {
+ "Valid",
+ "Zero",
+ "Special",
+ "Empty"
+};
+
+VOID
+PrintContext(
+ IN PCONTEXT Context
+ );
+
+VOID
+IntelRegistersp(
+ VOID
+ )
+/*++
+
+Routine Description:
+
+ This routine dumps out the 16 bit register set from the vdmtib
+
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ None.
+
+Notes:
+
+ This routine assumes that the pointers to the ntsd routines have already
+ been set up.
+
+--*/
+{
+ BOOL Status;
+ ULONG Address;
+ CONTEXT IntelRegisters;
+
+ //
+ // Get the address of the VdmTib
+ //
+
+ if (sscanf(lpArgumentString, "%lx", &Address) < 0) {
+ Address = (*GetExpression)(
+ "ntvdm!VdmTib"
+ );
+ }
+
+ if (!Address) {
+ (*Print)("Error geting VdmTib address\n");
+ return;
+ }
+
+ //
+ // Read the 16 bit context
+ //
+
+ Status = READMEM(
+ &(((PVDM_TIB)Address)->VdmContext),
+ &IntelRegisters,
+ sizeof(CONTEXT)
+ );
+
+ if (!Status) {
+ GetLastError();
+ (*Print)("Could not get VdmContext\n");
+ } else {
+ PrintContext(&IntelRegisters);
+ }
+}
+
+VOID
+PrintContext(
+ IN PCONTEXT Context
+ )
+/*++
+
+Routine Description:
+
+ This routine dumps out a context.
+
+Arguments:
+
+ Context -- Supplies a pointer to the context to dump
+
+Return Value:
+
+ None.
+
+--*/
+{
+ (*Print)(
+ "eax=%08lx ebx=%08lx ecx=%08lx edx=%08lx esi=%08lx edi=%08lx\n",
+ Context->Eax,
+ Context->Ebx,
+ Context->Ecx,
+ Context->Edx,
+ Context->Esi,
+ Context->Edi
+ );
+
+ (*Print)(
+ "eip=%08lx esp=%08lx ebp=%08lx\n",
+ Context->Eip,
+ Context->Esp,
+ Context->Ebp
+ );
+
+ (*Print)(
+ "cs=%04x ss=%04x ds=%04x es=%04x fs=%04x gs=%04x eflags=%08x\n",
+ Context->SegCs,
+ Context->SegSs,
+ Context->SegDs,
+ Context->SegEs,
+ Context->SegFs,
+ Context->SegGs,
+ Context->EFlags
+ );
+}
+
+VOID
+Fpup(
+ VOID
+ )
+/*++
+
+Routine Description:
+
+ This routine dumps out the x86 floating-point state.
+
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ None.
+
+Notes:
+
+ This routine assumes that the pointers to the ntsd routines have already
+ been set up.
+
+--*/
+{
+ CONTEXT IntelRegisters;
+ USHORT Temp;
+ int RegNum;
+
+ //
+ // Read the thread's context
+ //
+ IntelRegisters.ContextFlags = CONTEXT_FLOATING_POINT;
+ if (GetThreadContext(hCurrentThread, &IntelRegisters) == FALSE) {
+ GetLastError();
+ (*Print)("Could not get 32-bit thread context\n");
+ return;
+ };
+
+ Temp = (USHORT)IntelRegisters.FloatSave.ControlWord;
+ (*Print)(" Control word = %X\n", Temp);
+
+ (*Print)(
+ " Infinity = %d Rounding = %d Precision = %d PM=%d UM=%d OM=%d ZM=%d DM=%d IM=%d\n",
+ (Temp >> 11) & 1, // Infinity
+ (Temp >> 9) & 3, // Rounding (2 bits)
+ (Temp >> 7) & 3, // Precision (2 bits)
+ (Temp >> 5) & 1, // Precision Exception Mask
+ (Temp >> 4) & 1, // Underflow Exception Mask
+ (Temp >> 3) & 1, // Overflow Exception Mask
+ (Temp >> 2) & 1, // Zero Divide Exception Mask
+ (Temp >> 1) & 1, // Denormalized Operand Exception Mask
+ Temp & 1 // Invalid Operation Exception Mask
+ );
+
+ Temp = (USHORT)IntelRegisters.FloatSave.StatusWord;
+ (*Print)(" Status word = %X\n", Temp);
+
+ (*Print)(
+ " Top=%d C3=%d C2=%d C1=%d C0=%d ES=%d SF=%d PE=%d UE=%d OE=%d ZE=%d DE=%d IE=%d\n",
+ (Temp >> 11) & 7, // Top (3 bits)
+ (Temp >> 7) & 1, // Error Summary
+ (Temp >> 14) & 1, // C3
+ (Temp >> 10) & 1, // C2
+ (Temp >> 9) & 1, // C1
+ (Temp >> 8) & 1, // C0
+ (Temp >> 7) & 1, // Error Summary
+ (Temp >> 6) & 1, // Stack Fault
+ (Temp >> 5) & 1, // Precision Exception
+ (Temp >> 4) & 1, // Underflow Exception
+ (Temp >> 3) & 1, // Overflow Exception
+ (Temp >> 2) & 1, // Zero Divide Exception
+ (Temp >> 1) & 1, // Denormalized Operand Exception
+ Temp & 1 // Invalid Operation Exception
+ );
+
+ (*Print)(" Last Instruction: CS:EIP=%X:%X EA=%X:%X\n",
+ (USHORT)IntelRegisters.FloatSave.ErrorSelector,
+ IntelRegisters.FloatSave.ErrorOffset,
+ (USHORT)IntelRegisters.FloatSave.DataSelector,
+ IntelRegisters.FloatSave.DataOffset
+ );
+
+ (*Print)(" Floating-point registers:\n");
+ for (RegNum=0; RegNum<8; ++RegNum) {
+
+ PBYTE r80 = (PBYTE)&IntelRegisters.FloatSave.RegisterArea[RegNum*10];
+
+ Temp = (((USHORT)IntelRegisters.FloatSave.TagWord) >> (RegNum*2)) & 3;
+
+ (*Print)(
+ " %d. %s %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n",
+ RegNum,
+ FpuTagNames[Temp],
+ r80[0], r80[1], r80[2], r80[3], r80[4], r80[5], r80[6], r80[7], r80[8], r80[9]
+ );
+ }
+}