mirror of
git://source.winehq.org/git/wine.git
synced 2024-11-05 18:01:34 +00:00
46ea8b3f73
Thu Apr 30 16:28:12 1998 James Juran <jrj120@psu.edu> * [scheduler/process.c] Implemented GetExitCodeProcess. The code is a direct translation of GetExitCodeThread. Mon Apr 27 22:20:25 1998 Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de> * [loader/pe_image.c] Unload dummy module when PE_LoadLibraryEx32A fails with PE_LoadImage (makes Encarta 98 installer proceed). * [files/drive.c] Make GetDriveType16 return DRIVE_REMOVABLE for TYPE_CDROM. Make GetCurrentDirectory32 behave like the code does and not like the help describes. * [files/profile.c] Revoke recent change in PROFILE_GetSection and try better handling of special case. * [include/windows.h] Change definition of ACCEL32. * [misc/commdlg.c] Replace the GetXXXFilename32 macros by normal code. Fix two reported bugs in my changes to commdlg. * [windows/win.c] Add a hook to catch bogus WM_SIZE messages by emitting a warning in the appropriate case. * [objects/bitmap.c] Reject unreasonbable large size arguments in CreateCompatibleBitmap32 and add an fixme for that situation. Sun Apr 26 18:30:07 1998 Alexandre Julliard <julliard@lrc.epfl.ch> * [include/ldt.h] [debugger/*.c] [miscemu/instr.c] Added IS_SELECTOR_SYSTEM and IS_SELECTOR_32BIT macros. Make instruction emulation support system selectors. * [loader/*.c] Started moving NE specific functions to the new loader/ne directory. * [memory/environ.c] Enforce the 127 chars limit only when creating the environment of a Win16 process. Sun Apr 26 12:22:23 1998 Andreas Mohr <100.30936@germany.net> * [files/file.c] Fixed an incredible typo in CopyFile32A that made it unusable since a rewrite in 970112 (!!). * [files/directory.c] Fixed GetTempPath32A/W to include trailing backslash. * [misc/ver.c] Make find_pe_resource "work" with corrupt files. * [misc/wsprintf.c] Altered WPRINTF_ParseFormatA/W to treat invalid format chars as normal output, too. * [msdos/dpmi.c] Implemented "Allocate/Free real mode callback" (0x0303/0x0304). Cross your fingers if you need to use it ;) (completely untested) Implemented "Call real mode proc with far return" (0x0301, tested). * [msdos/int21.c] Fixed ioctlGenericBlkDevReq/0x60. * [relay32/dplayx.spec] [relay32/builtin32.c] [relay32/Makefile.in] Added built-in DPLAYX.DLL. * [windows/win.c] Fixed GetWindowWord()/GWW_HWNDPARENT to return the window's owner if it has no parent (SDK). Sat Apr 25 15:09:53 1998 M.T.Fortescue <mark@mtfhpc.demon.co.uk> * [debugger/db_disasm.c] Fixed disassemble bug for no-display option and 'lock', 'repne' and 'repe' prefixes. * [debugger/registers.c] Added textual flag description output on 'info regs'. Sat Apr 25 14:18:26 1998 Matthew Becker <mbecker@glasscity.net> * [*/*.c] Added stubs and/or documentation for the following functions: LookupPrivilegeValue, OpenService, ControlService, RegGetKeySecurity, StartService, SetComputerName, DeleteService, CloseServiceHandle, OpenProcessToken, OpenSCManager, DeregisterEventSource, WaitForDebugEvent, WaitForInputIdle, RegisterEventSource, SetDebugErrorLevel, SetConsoleCursorPosition, ChoosePixelFormat, SetPixelFormat, GetPixelFormat, DescribePixelFormat, SwapBuffers, PolyBezier, AbortPath, DestroyAcceleratorTable, HeapWalk, DdeInitialize, DdeUninitialize, DdeConnectList, DdeDisconnectList, DdeCreateStringHandle, DdePostAdvise, DdeGetData, DdeNameService, DdeGetLastError, WNetGetDirectoryType, EnumPrinters, RegFlushKey, RegGetKeySecurity, DllGetClassObject, DllCanUnloadNow, CreateBitmap, CreateCompatibleBitmap, CreateBitmapIndirect, GetBitmapBits, SetBitmapBits, LoadImage, CopyImage, LoadBitmap, DrawIcon, CreateDiscardableBitmap, SetDIBits, GetCharABCWidths, LoadTypeLib, SetConsoleCtrlHandler, CreateConsoleScreenBuffer, ReadConsoleInput, GetConsoleCursorInfo, SetConsoleCursorInfo, SetConsoleWindowInfo, SetConsoleTextAttribute, SetConsoleScreenBufferSize, FillConsoleOutputCharacter, FillConsoleOutputAttribute, CreateMailslot, GetMailslotInfo, GetCompressedFileSize, GetProcessWindowStation, GetThreadDesktop, SetDebugErrorLevel, WaitForDebugEvent, SetComputerName, CreateMDIWindow. Thu Apr 23 23:54:04 1998 Douglas Ridgway <ridgway@winehq.com> * [include/windows.h] [objects/enhmetafile.c] [relay32/gdi32.spec] Implement CopyEnhMetaFile, Get/SetEnhMetaFileBits, other fixes. * [include/windows.h] [objects/metafile.c] [relay32/gdi32.spec] 32-bit metafile fixes, implement EnumMetaFile32, GetMetaFileBitsEx. * [objects/font.c] [graphics/x11drv/xfont.c] [graphics/x11drv/text.c] Some rotated text support for X11R6 displays. * [win32/newfns.c] [ole/ole2nls.c] Moved GetNumberFormat32A. Wed Apr 22 17:38:20 1998 David Lee Lambert <lamber45@egr.msu.edu> * [ole/ole2nls.c] [misc/network.c] Changed some function documentation to the new style. * [misc/network.c] [include/windows.h] [if1632/user.spec] [relay32/mpr.spec] [misc/mpr.c] Added stubs for some Win32 network functions; renamed some 16-bit ones with 32-bit counterparts, as well as WNetGetDirectoryType; moved the stubs in misc/mpr.c (three of them!) to misc/network.c. * [ole/compobj.c] [ole/storage.c] [ole/ole2disp.c] [ole/ole2nls.c] [ole/folders.c] [ole/moniker.c] [ole/ole2.c] [graphics/fontengine.c] [graphics/ddraw.c] [graphics/env.c] [graphics/driver.c] [graphics/escape.c] Changed fprintf's to proper debug-macros. * [include/winnls.h] Added some flags (for internal use). * [ole/ole2nls.c] Added the Unicode core function, and worked out a way to hide the commonality of the core. * [relay32/kernel32.spec] Added support for GetDate/Time32A/W. Wed Apr 22 09:16:03 1998 Gordon Chaffee <chaffee@cs.berkeley.edu> * [win32/code_page.c] Fixed problem with MultiByteToWideChar that was introduced in last release. Made MultiByteToWideChar more compatible with Win32. * [graphics/x11drv/graphics.c] Fixed problem with drawing arcs. Tue Apr 21 11:24:58 1998 Constantine Sapuntzakis <csapuntz@tma-1.lcs.mit.edu> * [ole/ole2nls.c] Move stuff from 0x409 case to Lang_En. * [relay32/user32.spec] [windows/winpos.c] Added stubs for GetWindowRgn32 and SetWindowRgn32. Makes Office Paperclip happy. Tue Apr 21 11:16:16 1998 Constantine Sapuntzakis <csapuntz@tma-1.lcs.mit.edu> * [loader/pe_image.c] If image is relocated, TLS addresses need to be adjusted. * [debugger/*.c] Generalized tests for 32-bit segments. Tue Apr 21 02:04:59 1998 James Juran <jrj120@psu.edu> * [misc/*.c] [miscemu/*.c] [msdos/*.c] [if1632/*.c] [include/*.h] [loader/*.c] [memory/*.c] [multimedia/*.c] [objects/*.c] Almost all fprintf statements converted to appropriate debug messages. * [README] Updated "GETTING MORE INFORMATION" section to include WineHQ. * [documentation/debugger] Fixed typo. * [windows/defwnd.c] Added function documentation. Sun Apr 19 16:30:58 1998 Marcus Meissner <marcus@mud.de> * [Make.rules.in] Added lint target (using lclint). * [relay32/oleaut32.spec][relay32/Makefile.in][ole/typelib.c] [ole/ole2disp.c] Added oleaut32 spec, added some SysString functions. * [if1632/signal.c] Added printing of faultaddress in Linux (using CR2 debug register). * [configure.in] Added <sys/types.h> for statfs checks. * [loader/*.c][debugger/break.c][debugger/hash.c] Started to split win32/win16 module handling, preparing support for other binary formats (like ELF). Sat Apr 18 10:07:41 1998 Rein Klazes <rklazes@casema.net> * [misc/registry.c] Fixed a bug that made RegQueryValuexxx returning incorrect registry values. Fri Apr 17 22:59:22 1998 Alexander V. Lukyanov <lav@long.yar.ru> * [misc/lstr.c] FormatMessage32*: remove linefeed when nolinefeed set; check for target underflow. Fri Apr 17 00:38:14 1998 Alexander V. Lukyanov <lav@long.yar.ru> * [misc/crtdll.c] Implement xlat_file_ptr for CRT stdin/stdout/stderr address translation. Wed Apr 15 20:43:56 1998 Jim Peterson <jspeter@birch.ee.vt.edu> * [controls/menu.c] Added 'odaction' parameter to MENU_DrawMenuItem() and redirected WM_DRAWITEM messages to GetWindow(hwnd,GW_OWNER). Tue Apr 14 16:17:55 1998 Berend Reitsma <berend@united-info.com> * [graphics/metafiledrv/init.c] [graphics/painting.c] [graphics/win16drv/init.c] [graphics/x11drv/graphics.c] [graphics/x11drv/init.c] [include/gdi.h] [include/x11drv.h] [relay32/gdi32.spec] Added PolyPolyline routine. * [windows/winproc.c] Changed WINPROC_GetProc() to return proc instead of &(jmp proc).
336 lines
13 KiB
C
336 lines
13 KiB
C
/*
|
|
* Debugger register handling
|
|
*
|
|
* Copyright 1995 Alexandre Julliard
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include "debugger.h"
|
|
|
|
CONTEXT DEBUG_context;
|
|
|
|
/***********************************************************************
|
|
* DEBUG_SetRegister
|
|
*
|
|
* Set a register value.
|
|
*/
|
|
void DEBUG_SetRegister( enum debug_regs reg, int val )
|
|
{
|
|
switch(reg)
|
|
{
|
|
case REG_EAX: EAX_reg(&DEBUG_context) = val; break;
|
|
case REG_EBX: EBX_reg(&DEBUG_context) = val; break;
|
|
case REG_ECX: ECX_reg(&DEBUG_context) = val; break;
|
|
case REG_EDX: EDX_reg(&DEBUG_context) = val; break;
|
|
case REG_ESI: ESI_reg(&DEBUG_context) = val; break;
|
|
case REG_EDI: EDI_reg(&DEBUG_context) = val; break;
|
|
case REG_EBP: EBP_reg(&DEBUG_context) = val; break;
|
|
case REG_EFL: EFL_reg(&DEBUG_context) = val; break;
|
|
case REG_EIP: EIP_reg(&DEBUG_context) = val; break;
|
|
case REG_ESP: ESP_reg(&DEBUG_context) = val; break;
|
|
case REG_AX: AX_reg(&DEBUG_context) = val; break;
|
|
case REG_BX: BX_reg(&DEBUG_context) = val; break;
|
|
case REG_CX: CX_reg(&DEBUG_context) = val; break;
|
|
case REG_DX: DX_reg(&DEBUG_context) = val; break;
|
|
case REG_SI: SI_reg(&DEBUG_context) = val; break;
|
|
case REG_DI: DI_reg(&DEBUG_context) = val; break;
|
|
case REG_BP: BP_reg(&DEBUG_context) = val; break;
|
|
case REG_FL: FL_reg(&DEBUG_context) = val; break;
|
|
case REG_IP: IP_reg(&DEBUG_context) = val; break;
|
|
case REG_SP: SP_reg(&DEBUG_context) = val; break;
|
|
case REG_CS: CS_reg(&DEBUG_context) = val; break;
|
|
case REG_DS: DS_reg(&DEBUG_context) = val; break;
|
|
case REG_ES: ES_reg(&DEBUG_context) = val; break;
|
|
case REG_SS: SS_reg(&DEBUG_context) = val; break;
|
|
case REG_FS: FS_reg(&DEBUG_context) = val; break;
|
|
case REG_GS: GS_reg(&DEBUG_context) = val; break;
|
|
}
|
|
}
|
|
|
|
|
|
int
|
|
DEBUG_PrintRegister(enum debug_regs reg)
|
|
{
|
|
switch(reg)
|
|
{
|
|
case REG_EAX: fprintf(stderr, "%%eax"); break;
|
|
case REG_EBX: fprintf(stderr, "%%ebx"); break;
|
|
case REG_ECX: fprintf(stderr, "%%ecx"); break;
|
|
case REG_EDX: fprintf(stderr, "%%edx"); break;
|
|
case REG_ESI: fprintf(stderr, "%%esi"); break;
|
|
case REG_EDI: fprintf(stderr, "%%edi"); break;
|
|
case REG_EBP: fprintf(stderr, "%%ebp"); break;
|
|
case REG_EFL: fprintf(stderr, "%%efl"); break;
|
|
case REG_EIP: fprintf(stderr, "%%eip"); break;
|
|
case REG_ESP: fprintf(stderr, "%%esp"); break;
|
|
case REG_AX: fprintf(stderr, "%%ax"); break;
|
|
case REG_BX: fprintf(stderr, "%%bx"); break;
|
|
case REG_CX: fprintf(stderr, "%%cx"); break;
|
|
case REG_DX: fprintf(stderr, "%%dx"); break;
|
|
case REG_SI: fprintf(stderr, "%%si"); break;
|
|
case REG_DI: fprintf(stderr, "%%di"); break;
|
|
case REG_BP: fprintf(stderr, "%%bp"); break;
|
|
case REG_FL: fprintf(stderr, "%%fl"); break;
|
|
case REG_IP: fprintf(stderr, "%%ip"); break;
|
|
case REG_SP: fprintf(stderr, "%%sp"); break;
|
|
case REG_CS: fprintf(stderr, "%%cs"); break;
|
|
case REG_DS: fprintf(stderr, "%%ds"); break;
|
|
case REG_ES: fprintf(stderr, "%%es"); break;
|
|
case REG_SS: fprintf(stderr, "%%ss"); break;
|
|
case REG_FS: fprintf(stderr, "%%fs"); break;
|
|
case REG_GS: fprintf(stderr, "%%gs"); break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* DEBUG_GetRegister
|
|
*
|
|
* Get a register value.
|
|
*/
|
|
int DEBUG_GetRegister( enum debug_regs reg )
|
|
{
|
|
switch(reg)
|
|
{
|
|
case REG_EAX: return EAX_reg(&DEBUG_context);
|
|
case REG_EBX: return EBX_reg(&DEBUG_context);
|
|
case REG_ECX: return ECX_reg(&DEBUG_context);
|
|
case REG_EDX: return EDX_reg(&DEBUG_context);
|
|
case REG_ESI: return ESI_reg(&DEBUG_context);
|
|
case REG_EDI: return EDI_reg(&DEBUG_context);
|
|
case REG_EBP: return EBP_reg(&DEBUG_context);
|
|
case REG_EFL: return EFL_reg(&DEBUG_context);
|
|
case REG_EIP: return EIP_reg(&DEBUG_context);
|
|
case REG_ESP: return ESP_reg(&DEBUG_context);
|
|
case REG_AX: return AX_reg(&DEBUG_context);
|
|
case REG_BX: return BX_reg(&DEBUG_context);
|
|
case REG_CX: return CX_reg(&DEBUG_context);
|
|
case REG_DX: return DX_reg(&DEBUG_context);
|
|
case REG_SI: return SI_reg(&DEBUG_context);
|
|
case REG_DI: return DI_reg(&DEBUG_context);
|
|
case REG_BP: return BP_reg(&DEBUG_context);
|
|
case REG_FL: return FL_reg(&DEBUG_context);
|
|
case REG_IP: return IP_reg(&DEBUG_context);
|
|
case REG_SP: return SP_reg(&DEBUG_context);
|
|
case REG_CS: return CS_reg(&DEBUG_context);
|
|
case REG_DS: return DS_reg(&DEBUG_context);
|
|
case REG_ES: return ES_reg(&DEBUG_context);
|
|
case REG_SS: return SS_reg(&DEBUG_context);
|
|
case REG_FS: return FS_reg(&DEBUG_context);
|
|
case REG_GS: return GS_reg(&DEBUG_context);
|
|
}
|
|
return 0; /* should not happen */
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* DEBUG_SetSigContext
|
|
*
|
|
* Set the register values from a sigcontext.
|
|
*/
|
|
void DEBUG_SetSigContext( const SIGCONTEXT *sigcontext )
|
|
{
|
|
EAX_reg(&DEBUG_context) = EAX_sig(sigcontext);
|
|
EBX_reg(&DEBUG_context) = EBX_sig(sigcontext);
|
|
ECX_reg(&DEBUG_context) = ECX_sig(sigcontext);
|
|
EDX_reg(&DEBUG_context) = EDX_sig(sigcontext);
|
|
ESI_reg(&DEBUG_context) = ESI_sig(sigcontext);
|
|
EDI_reg(&DEBUG_context) = EDI_sig(sigcontext);
|
|
EBP_reg(&DEBUG_context) = EBP_sig(sigcontext);
|
|
EFL_reg(&DEBUG_context) = EFL_sig(sigcontext);
|
|
EIP_reg(&DEBUG_context) = EIP_sig(sigcontext);
|
|
ESP_reg(&DEBUG_context) = ESP_sig(sigcontext);
|
|
CS_reg(&DEBUG_context) = LOWORD(CS_sig(sigcontext));
|
|
DS_reg(&DEBUG_context) = LOWORD(DS_sig(sigcontext));
|
|
ES_reg(&DEBUG_context) = LOWORD(ES_sig(sigcontext));
|
|
SS_reg(&DEBUG_context) = LOWORD(SS_sig(sigcontext));
|
|
#ifdef FS_sig
|
|
FS_reg(&DEBUG_context) = LOWORD(FS_sig(sigcontext));
|
|
#else
|
|
GET_FS( FS_reg(&DEBUG_context) );
|
|
FS_reg(&DEBUG_context) &= 0xffff;
|
|
#endif
|
|
#ifdef GS_sig
|
|
GS_reg(&DEBUG_context) = LOWORD(GS_sig(sigcontext));
|
|
#else
|
|
GET_GS( GS_reg(&DEBUG_context) );
|
|
GS_reg(&DEBUG_context) &= 0xffff;
|
|
#endif
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* DEBUG_GetSigContext
|
|
*
|
|
* Build a sigcontext from the register values.
|
|
*/
|
|
void DEBUG_GetSigContext( SIGCONTEXT *sigcontext )
|
|
{
|
|
EAX_sig(sigcontext) = EAX_reg(&DEBUG_context);
|
|
EBX_sig(sigcontext) = EBX_reg(&DEBUG_context);
|
|
ECX_sig(sigcontext) = ECX_reg(&DEBUG_context);
|
|
EDX_sig(sigcontext) = EDX_reg(&DEBUG_context);
|
|
ESI_sig(sigcontext) = ESI_reg(&DEBUG_context);
|
|
EDI_sig(sigcontext) = EDI_reg(&DEBUG_context);
|
|
EBP_sig(sigcontext) = EBP_reg(&DEBUG_context);
|
|
EFL_sig(sigcontext) = EFL_reg(&DEBUG_context);
|
|
EIP_sig(sigcontext) = EIP_reg(&DEBUG_context);
|
|
ESP_sig(sigcontext) = ESP_reg(&DEBUG_context);
|
|
CS_sig(sigcontext) = CS_reg(&DEBUG_context);
|
|
DS_sig(sigcontext) = DS_reg(&DEBUG_context);
|
|
ES_sig(sigcontext) = ES_reg(&DEBUG_context);
|
|
SS_sig(sigcontext) = SS_reg(&DEBUG_context);
|
|
#ifdef FS_sig
|
|
FS_sig(sigcontext) = FS_reg(&DEBUG_context);
|
|
#else
|
|
SET_FS( FS_reg(&DEBUG_context) );
|
|
#endif
|
|
#ifdef GS_sig
|
|
GS_sig(sigcontext) = GS_reg(&DEBUG_context);
|
|
#else
|
|
SET_GS( GS_reg(&DEBUG_context) );
|
|
#endif
|
|
}
|
|
|
|
/***********************************************************************
|
|
* DEBUG_Flags
|
|
*
|
|
* Return Flag String.
|
|
*/
|
|
char *DEBUG_Flags( DWORD flag, char *buf )
|
|
{
|
|
char *pt;
|
|
|
|
strcpy( buf, " - 00 - - - " );
|
|
pt = buf + strlen( buf );
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000001 ) *pt = 'C'; /* Carry Falg */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000002 ) *pt = '1';
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000004 ) *pt = 'P'; /* Parity Flag */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000008 ) *pt = '-';
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000010 ) *pt = 'A'; /* Auxiliary Carry Flag */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000020 ) *pt = '-';
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000040 ) *pt = 'Z'; /* Zero Flag */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000080 ) *pt = 'S'; /* Sign Flag */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000100 ) *pt = 'T'; /* Trap/Trace Flag */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000200 ) *pt = 'I'; /* Interupt Enable Flag */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000400 ) *pt = 'D'; /* Direction Indicator */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00000800 ) *pt = 'O'; /* Overflow Flag */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00001000 ) *pt = '1'; /* I/O Privilage Level */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00002000 ) *pt = '1'; /* I/O Privilage Level */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00004000 ) *pt = 'N'; /* Nested Task Flag */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00008000 ) *pt = '-';
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00010000 ) *pt = 'R'; /* Resume Flag */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00020000 ) *pt = 'V'; /* Vritual Mode Flag */
|
|
if ( buf >= pt-- ) return( buf );
|
|
if ( flag & 0x00040000 ) *pt = 'a'; /* Alignment Check Flag */
|
|
if ( buf >= pt-- ) return( buf );
|
|
return( buf );
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* DEBUG_InfoRegisters
|
|
*
|
|
* Display registers information.
|
|
*/
|
|
void DEBUG_InfoRegisters(void)
|
|
{
|
|
char flag[33];
|
|
|
|
fprintf(stderr,"Register dump:\n");
|
|
|
|
/* First get the segment registers out of the way */
|
|
fprintf( stderr," CS:%04x SS:%04x DS:%04x ES:%04x FS:%04x GS:%04x",
|
|
(WORD)CS_reg(&DEBUG_context), (WORD)SS_reg(&DEBUG_context),
|
|
(WORD)DS_reg(&DEBUG_context), (WORD)ES_reg(&DEBUG_context),
|
|
(WORD)FS_reg(&DEBUG_context), (WORD)GS_reg(&DEBUG_context) );
|
|
if (dbg_mode == 16)
|
|
{
|
|
fprintf( stderr,"\n IP:%04x SP:%04x BP:%04x FLAGS:%04x(%s)\n",
|
|
IP_reg(&DEBUG_context), SP_reg(&DEBUG_context),
|
|
BP_reg(&DEBUG_context), FL_reg(&DEBUG_context),
|
|
DEBUG_Flags(FL_reg(&DEBUG_context), flag));
|
|
fprintf( stderr," AX:%04x BX:%04x CX:%04x DX:%04x SI:%04x DI:%04x\n",
|
|
AX_reg(&DEBUG_context), BX_reg(&DEBUG_context),
|
|
CX_reg(&DEBUG_context), DX_reg(&DEBUG_context),
|
|
SI_reg(&DEBUG_context), DI_reg(&DEBUG_context) );
|
|
}
|
|
else /* 32-bit mode */
|
|
{
|
|
fprintf( stderr, "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx(%s)\n",
|
|
EIP_reg(&DEBUG_context), ESP_reg(&DEBUG_context),
|
|
EBP_reg(&DEBUG_context), EFL_reg(&DEBUG_context),
|
|
DEBUG_Flags(EFL_reg(&DEBUG_context), flag));
|
|
fprintf( stderr, " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n",
|
|
EAX_reg(&DEBUG_context), EBX_reg(&DEBUG_context),
|
|
ECX_reg(&DEBUG_context), EDX_reg(&DEBUG_context) );
|
|
fprintf( stderr, " ESI:%08lx EDI:%08lx\n",
|
|
ESI_reg(&DEBUG_context), EDI_reg(&DEBUG_context) );
|
|
}
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* DEBUG_ValidateRegisters
|
|
*
|
|
* Make sure all registers have a correct value for returning from
|
|
* the signal handler.
|
|
*/
|
|
BOOL32 DEBUG_ValidateRegisters(void)
|
|
{
|
|
WORD cs, ds;
|
|
|
|
/* Check that a selector is a valid ring-3 LDT selector, or a NULL selector */
|
|
#define CHECK_SEG(seg,name) \
|
|
if (((seg) & ~3) && \
|
|
((((seg) & 7) != 7) || IS_LDT_ENTRY_FREE(SELECTOR_TO_ENTRY(seg)))) \
|
|
{ \
|
|
fprintf( stderr, "*** Invalid value for %s register: %04x\n", \
|
|
(name), (WORD)(seg) ); \
|
|
return FALSE; \
|
|
}
|
|
|
|
GET_CS(cs);
|
|
GET_DS(ds);
|
|
if (CS_reg(&DEBUG_context) != cs) CHECK_SEG(CS_reg(&DEBUG_context), "CS");
|
|
if (SS_reg(&DEBUG_context) != ds) CHECK_SEG(SS_reg(&DEBUG_context), "SS");
|
|
if (DS_reg(&DEBUG_context) != ds) CHECK_SEG(DS_reg(&DEBUG_context), "DS");
|
|
if (ES_reg(&DEBUG_context) != ds) CHECK_SEG(ES_reg(&DEBUG_context), "ES");
|
|
if (FS_reg(&DEBUG_context) != ds) CHECK_SEG(FS_reg(&DEBUG_context), "FS");
|
|
if (GS_reg(&DEBUG_context) != ds) CHECK_SEG(GS_reg(&DEBUG_context), "GS");
|
|
|
|
/* Check that CS and SS are not NULL */
|
|
|
|
if (!(CS_reg(&DEBUG_context) & ~3))
|
|
{
|
|
fprintf( stderr, "*** Invalid value for CS register: %04x\n",
|
|
(WORD)CS_reg(&DEBUG_context) );
|
|
return FALSE;
|
|
}
|
|
if (!(SS_reg(&DEBUG_context) & ~3))
|
|
{
|
|
fprintf( stderr, "*** Invalid value for SS register: %04x\n",
|
|
(WORD)SS_reg(&DEBUG_context) );
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
#undef CHECK_SEG
|
|
}
|