Improved support for vm86 mode.
diff --git a/debugger/break.c b/debugger/break.c
index e2ffe81..beabf4c 100644
--- a/debugger/break.c
+++ b/debugger/break.c
@@ -269,27 +269,27 @@
{
if (breakpoints[num].refcount == 0)
{
- breakpoints[num].refcount = 1;
- breakpoints[num].enabled = TRUE;
- breakpoints[num].type = type;
- breakpoints[num].skipcount = 0;
- breakpoints[num].addr = *addr;
- breakpoints[num].is32 = 1;
-#ifdef __i386__
- if (addr->seg)
- {
- switch (DEBUG_GetSelectorType( addr->seg ))
- {
- case 32: break;
- case 16: breakpoints[num].is32 = 0; break;
- default: RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
- }
- }
-#endif
- return num;
+ breakpoints[num].refcount = 1;
+ breakpoints[num].enabled = TRUE;
+ breakpoints[num].type = type;
+ breakpoints[num].skipcount = 0;
+ breakpoints[num].addr = *addr;
+ switch (DEBUG_GetSelectorType( addr->seg ))
+ {
+ case MODE_32:
+ breakpoints[num].is32 = 1;
+ break;
+ case MODE_VM86:
+ case MODE_16:
+ breakpoints[num].is32 = 0;
+ break;
+ default:
+ RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
+ }
+ return num;
}
}
-
+
DEBUG_Printf( DBG_CHN_MESG, "Too many breakpoints. Please delete some.\n" );
return -1;
}
@@ -360,7 +360,7 @@
breakpoints[num].u.b.func = func;
DEBUG_Printf( DBG_CHN_MESG, "Breakpoint %d at ", num );
- DEBUG_PrintAddress( &breakpoints[num].addr, breakpoints[num].is32 ? 32 : 16,
+ DEBUG_PrintAddress( &breakpoints[num].addr, breakpoints[num].is32 ? MODE_32 : MODE_16,
TRUE );
DEBUG_Printf( DBG_CHN_MESG, "\n" );
}
@@ -472,7 +472,7 @@
breakpoints[reg].u.w.reg = reg;
DEBUG_Printf( DBG_CHN_MESG, "Watchpoint %d at ", num );
- DEBUG_PrintAddress( &breakpoints[num].addr, breakpoints[num].is32 ? 32:16, TRUE );
+ DEBUG_PrintAddress( &breakpoints[num].addr, breakpoints[num].is32 ? MODE_32 : MODE_16, TRUE );
DEBUG_Printf( DBG_CHN_MESG, "\n" );
}
}
@@ -623,7 +623,7 @@
{
DEBUG_Printf( DBG_CHN_MESG, "%d: %c ", i, breakpoints[i].enabled ? 'y' : 'n');
DEBUG_PrintAddress( &breakpoints[i].addr,
- breakpoints[i].is32 ? 32 : 16, TRUE);
+ breakpoints[i].is32 ? MODE_32 : MODE_16, TRUE);
DEBUG_Printf( DBG_CHN_MESG, " (%u)\n", breakpoints[i].refcount );
if( breakpoints[i].condition != NULL )
{
@@ -640,7 +640,7 @@
{
DEBUG_Printf( DBG_CHN_MESG, "%d: %c ", i, breakpoints[i].enabled ? 'y' : 'n');
DEBUG_PrintAddress( &breakpoints[i].addr,
- breakpoints[i].is32 ? 32 : 16, TRUE);
+ breakpoints[i].is32 ? MODE_32 : MODE_16, TRUE);
DEBUG_Printf( DBG_CHN_MESG, " on %d byte%s (%c)\n",
breakpoints[i].u.w.len + 1,
breakpoints[i].u.w.len > 0 ? "s" : "",
@@ -702,7 +702,7 @@
int bpnum;
DWORD oldval;
int wpnum;
- int addrlen = 32;
+ enum dbg_mode addr_mode;
struct symbol_info syminfo;
#ifdef __i386__
@@ -723,7 +723,7 @@
DEBUG_Printf( DBG_CHN_MESG, "Stopped on breakpoint %d at ", bpnum );
syminfo = DEBUG_PrintAddress( &breakpoints[bpnum].addr,
- breakpoints[bpnum].is32 ? 32 : 16, TRUE );
+ breakpoints[bpnum].is32 ? MODE_32 : MODE_16, TRUE );
DEBUG_Printf( DBG_CHN_MESG, "\n" );
if( syminfo.list.sourcefile != NULL )
@@ -744,11 +744,9 @@
}
if (!DEBUG_ShallBreak(wpnum)) return TRUE;
-#ifdef __i386__
- if (addr->seg) addrlen = DEBUG_GetSelectorType( addr->seg );
-#endif
+ addr_mode = DEBUG_GetSelectorType( addr->seg );
DEBUG_Printf(DBG_CHN_MESG, "Stopped on watchpoint %d at ", wpnum);
- syminfo = DEBUG_PrintAddress( addr, addrlen, TRUE );
+ syminfo = DEBUG_PrintAddress( addr, addr_mode, TRUE );
DEBUG_Printf(DBG_CHN_MESG, " values: old=%lu new=%lu\n",
oldval, breakpoints[wpnum].u.w.oldval);
diff --git a/debugger/db_disasm.c b/debugger/db_disasm.c
index ff54791..0fc9212 100644
--- a/debugger/db_disasm.c
+++ b/debugger/db_disasm.c
@@ -1033,7 +1033,7 @@
address.seg = 0;
address.off = addr;
- DEBUG_PrintAddress( &address, db_disasm_16 ? 16 : 32, TRUE );
+ DEBUG_PrintAddress( &address, db_disasm_16 ? MODE_16 : MODE_32, TRUE );
}
void db_print_address(char *seg, int size, struct i_addr *addrp, int byref)
@@ -1189,10 +1189,12 @@
* Set this so we get can supress the printout if we need to.
*/
db_display = display;
- switch (DEBUG_GetSelectorType(addr->seg)) {
- case 16: db_disasm_16 = 1; break;
- case 32: db_disasm_16 = 0; break;
- default: DEBUG_Printf(DBG_CHN_MESG, "Bad selector %ld\n", addr->seg); return;
+ switch (DEBUG_GetSelectorType(addr->seg))
+ {
+ case MODE_VM86:
+ case MODE_16: db_disasm_16 = 1; break;
+ case MODE_32: db_disasm_16 = 0; break;
+ default: DEBUG_Printf(DBG_CHN_MESG, "Bad selector %lx\n", addr->seg); return;
}
get_value_inc( inst, addr, 1, FALSE );
@@ -1625,8 +1627,7 @@
2, FALSE );
if( db_display )
{
- DEBUG_PrintAddress( &address, short_addr ? 16 : 32,
- TRUE );
+ DEBUG_PrintAddress( &address, short_addr ? MODE_16 : MODE_32, TRUE );
}
}
diff --git a/debugger/dbg.y b/debugger/dbg.y
index 7acfbce..12a2ded 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -40,7 +40,7 @@
}
%token tCONT tPASS tSTEP tLIST tNEXT tQUIT tHELP tBACKTRACE tINFO tWALK tUP tDOWN
-%token tENABLE tDISABLE tBREAK tWATCH tDELETE tSET tMODE tPRINT tEXAM tABORT
+%token tENABLE tDISABLE tBREAK tWATCH tDELETE tSET tMODE tPRINT tEXAM tABORT tVM86
%token tCLASS tMAPS tMODULE tSTACK tSEGMENTS tREGS tWND tQUEUE tLOCAL
%token tPROCESS tTHREAD tMODREF tEOL
%token tFRAME tSHARE tCOND tDISPLAY tUNDISPLAY tDISASSEMBLE
@@ -117,6 +117,7 @@
DEBUG_CurrThread->dbg_exec_mode = EXEC_STEPI_OVER; return TRUE; }
| tABORT tEOL { kill(getpid(), SIGABRT); }
| tMODE tNUM tEOL { mode_command($2); }
+ | tMODE tVM86 tEOL { DEBUG_CurrThread->dbg_mode = MODE_VM86; }
| tENABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, TRUE ); }
| tDISABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, FALSE ); }
| tDELETE tBREAK tNUM tEOL { DEBUG_DelBreakpoint( $3 ); }
@@ -346,8 +347,12 @@
static void mode_command(int newmode)
{
- if ((newmode == 16) || (newmode == 32)) DEBUG_CurrThread->dbg_mode = newmode;
- else DEBUG_Printf(DBG_CHN_MESG,"Invalid mode (use 16 or 32)\n");
+ switch(newmode)
+ {
+ case 16: DEBUG_CurrThread->dbg_mode = MODE_16; break;
+ case 32: DEBUG_CurrThread->dbg_mode = MODE_32; break;
+ default: DEBUG_Printf(DBG_CHN_MESG,"Invalid mode (use 16, 32 or vm86)\n");
+ }
}
void DEBUG_Exit(DWORD ec)
diff --git a/debugger/debug.l b/debugger/debug.l
index cb8dc64..855f5e2 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -41,6 +41,7 @@
%s DEL_CMD
%s WALK_CMD
%s SHOW_CMD
+%s MODE_CMD
%s NOCMD
%x ASTRING_EXPECTED
@@ -111,7 +112,7 @@
<INITIAL>abort|abor|abo { BEGIN(NOCMD); return tABORT; }
<INITIAL>print|prin|pri|pr|p { BEGIN(FORMAT_EXPECTED); return tPRINT; }
-<INITIAL>mode { BEGIN(NOCMD); return tMODE; }
+<INITIAL>mode { BEGIN(MODE_CMD); return tMODE; }
<INITIAL>show|sho|sh { BEGIN(SHOW_CMD); return tSHOW; }
<INITIAL>symbolfile|symbols|symbol|sf { BEGIN(PATH_EXPECTED); return tSYMBOLFILE; }
@@ -134,6 +135,7 @@
<INFO_CMD>maps|map { return tMAPS; }
<INFO_CMD,WALK_CMD>window|windo|wind|win|wnd { return tWND; }
<HELP_CMD>info|inf|in { return tINFO; }
+<MODE_CMD>vm86 { return tVM86; }
<INITIAL,SHOW_CMD>directories|directorie|directori|director|directo|direct|direc|direc|dir {
BEGIN(PATH_EXPECTED); return tDIR; }
diff --git a/debugger/debugger.h b/debugger/debugger.h
index b5c021e..bf860a7 100644
--- a/debugger/debugger.h
+++ b/debugger/debugger.h
@@ -144,6 +144,11 @@
struct expr * condition;
} DBG_BREAKPOINT;
+enum dbg_mode
+{
+ MODE_INVALID, MODE_16, MODE_32, MODE_VM86
+};
+
typedef struct tagDBG_THREAD {
struct tagDBG_PROCESS* process;
HANDLE handle;
@@ -151,7 +156,7 @@
LPVOID start;
LPVOID teb;
int wait_for_first_exception;
- int dbg_mode;
+ enum dbg_mode dbg_mode;
enum exec_mode dbg_exec_mode;
int dbg_exec_count;
DBG_BREAKPOINT stepOverBP;
@@ -326,12 +331,11 @@
/* debugger/info.c */
extern void DEBUG_PrintBasic( const DBG_VALUE* value, int count, char format );
-extern struct symbol_info DEBUG_PrintAddress( const DBG_ADDR *addr,
- int addrlen, int flag );
+extern struct symbol_info DEBUG_PrintAddress( const DBG_ADDR *addr, enum dbg_mode mode, int flag );
extern void DEBUG_Help(void);
extern void DEBUG_HelpInfo(void);
extern struct symbol_info DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr,
- int addrlen,
+ enum dbg_mode mode,
unsigned int ebp,
int flag );
extern void DEBUG_InfoClass(const char* clsName);
@@ -357,10 +361,9 @@
extern DWORD DEBUG_ToLinear( const DBG_ADDR *address );
extern void DEBUG_GetCurrentAddress( DBG_ADDR * );
extern BOOL DEBUG_GrabAddress( DBG_VALUE* value, BOOL fromCode );
+extern enum dbg_mode DEBUG_GetSelectorType( WORD sel );
#ifdef __i386__
extern void DEBUG_FixAddress( DBG_ADDR *address, DWORD def );
-extern BOOL DEBUG_FixSegment( DBG_ADDR* addr );
-extern int DEBUG_GetSelectorType( WORD sel );
extern int DEBUG_IsSelectorSystem( WORD sel );
#endif
diff --git a/debugger/expr.c b/debugger/expr.c
index 29262ef..7466dc8 100644
--- a/debugger/expr.c
+++ b/debugger/expr.c
@@ -513,9 +513,6 @@
rtn.type = NULL;
rtn.addr.seg = VAL(exp1);
rtn.addr.off = VAL(exp2);
-#ifdef __i386__
- DEBUG_FixSegment(&rtn.addr);
-#endif
break;
case EXP_OP_LOR:
exp->un.binop.result = (VAL(exp1) || VAL(exp2));
diff --git a/debugger/info.c b/debugger/info.c
index 2df7ac8..f11f68e 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -120,7 +120,7 @@
* Print an 16- or 32-bit address, with the nearest symbol if any.
*/
struct symbol_info
-DEBUG_PrintAddress( const DBG_ADDR *addr, int addrlen, int flag )
+DEBUG_PrintAddress( const DBG_ADDR *addr, enum dbg_mode mode, int flag )
{
struct symbol_info rtn;
@@ -128,7 +128,7 @@
&rtn.list );
if (addr->seg) DEBUG_Printf( DBG_CHN_MESG, "0x%04lx:", addr->seg&0xFFFF );
- if (addrlen == 16) DEBUG_Printf( DBG_CHN_MESG, "0x%04lx", addr->off );
+ if (mode != MODE_32) DEBUG_Printf( DBG_CHN_MESG, "0x%04lx", addr->off );
else DEBUG_Printf( DBG_CHN_MESG, "0x%08lx", addr->off );
if (name) DEBUG_Printf( DBG_CHN_MESG, " (%s)", name );
return rtn;
@@ -141,7 +141,7 @@
* each function (if known). This is useful in a backtrace.
*/
struct symbol_info
-DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr, int addrlen,
+DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr, enum dbg_mode mode,
unsigned int ebp, int flag )
{
struct symbol_info rtn;
@@ -150,7 +150,7 @@
&rtn.list );
if (addr->seg) DEBUG_Printf( DBG_CHN_MESG, "0x%04lx:", addr->seg );
- if (addrlen == 16) DEBUG_Printf( DBG_CHN_MESG, "0x%04lx", addr->off );
+ if (mode != MODE_32) DEBUG_Printf( DBG_CHN_MESG, "0x%04lx", addr->off );
else DEBUG_Printf( DBG_CHN_MESG, "0x%08lx", addr->off );
if (name) DEBUG_Printf( DBG_CHN_MESG, " (%s)", name );
@@ -186,7 +186,7 @@
" show dir dir <path>",
" display <expr> undisplay <disnum>",
" delete display <disnum> debugmsg <class>[-+]<type>\n",
-" mode [16,32] walk [wnd,class,queue,module,",
+" mode [16,32,vm86] walk [wnd,class,queue,module,",
" whatis process,modref <pid>]",
" info (see 'help info' for options)\n",
diff --git a/debugger/memory.c b/debugger/memory.c
index 6f7083c..416788d 100644
--- a/debugger/memory.c
+++ b/debugger/memory.c
@@ -15,10 +15,7 @@
#include "winbase.h"
#ifdef __i386__
-#include "wine/winbase16.h"
-
-#define DBG_V86_MODULE(seg) ((seg)>>16)
-#define IS_SELECTOR_V86(seg) DBG_V86_MODULE(seg)
+#define IS_VM86_MODE() (DEBUG_context.EFlags & V86_FLAG)
#endif
static void DEBUG_Die(const char* msg)
@@ -52,41 +49,33 @@
return res;
}
+enum dbg_mode DEBUG_GetSelectorType( WORD sel )
+{
+#ifdef __i386__
+ LDT_ENTRY le;
+
+ if (IS_VM86_MODE()) return MODE_VM86;
+ if (sel == 0) return MODE_32;
+ if (GetThreadSelectorEntry( DEBUG_CurrThread->handle, sel, &le))
+ return le.HighWord.Bits.Default_Big ? MODE_32 : MODE_16;
+ /* selector doesn't exist */
+ return MODE_INVALID;
+#else
+ return MODE_32;
+#endif
+}
#ifdef __i386__
void DEBUG_FixAddress( DBG_ADDR *addr, DWORD def)
{
if (addr->seg == 0xffffffff) addr->seg = def;
- if (!IS_SELECTOR_V86(addr->seg) && DEBUG_IsSelectorSystem(addr->seg)) addr->seg = 0;
-}
-
-BOOL DEBUG_FixSegment( DBG_ADDR* addr )
-{
- /* V86 mode ? */
- if (DEBUG_context.EFlags & V86_FLAG) {
- addr->seg |= (DWORD)(GetExePtr(GetCurrentTask())) << 16;
- return TRUE;
- }
- return FALSE;
-}
-
-int DEBUG_GetSelectorType( WORD sel )
-{
- LDT_ENTRY le;
-
- if (sel == 0)
- return 32;
- if (IS_SELECTOR_V86(sel))
- return 16;
- if (GetThreadSelectorEntry( DEBUG_CurrThread->handle, sel, &le))
- return le.HighWord.Bits.Default_Big ? 32 : 16;
- /* selector doesn't exist */
- return 0;
+ if (DEBUG_IsSelectorSystem(addr->seg)) addr->seg = 0;
}
/* Determine if sel is a system selector (i.e. not managed by Wine) */
BOOL DEBUG_IsSelectorSystem(WORD sel)
{
- return !(sel & 4) || (((sel & 0xFFFF) >> 3) < 17);
+ if (IS_VM86_MODE()) return FALSE; /* no system selectors in vm86 mode */
+ return !(sel & 4) || ((sel >> 3) < 17);
}
#endif /* __i386__ */
@@ -95,10 +84,8 @@
#ifdef __i386__
LDT_ENTRY le;
-#if 0
- if (IS_SELECTOR_V86(addr->seg))
- return (DWORD) DOSMEM_MemoryBase(DBG_V86_MODULE(addr->seg)) + (((addr->seg)&0xFFFF)<<4) + addr->off;
-#endif
+ if (IS_VM86_MODE()) return (DWORD)(LOWORD(addr->seg) << 4) + addr->off;
+
if (DEBUG_IsSelectorSystem(addr->seg))
return addr->off;
@@ -116,7 +103,7 @@
#ifdef __i386__
addr->seg = DEBUG_context.SegCs;
- if (!DEBUG_FixSegment( addr ) && DEBUG_IsSelectorSystem(addr->seg))
+ if (DEBUG_IsSelectorSystem(addr->seg))
addr->seg = 0;
addr->off = DEBUG_context.Eip;
#elif defined(__sparc__)
diff --git a/debugger/registers.c b/debugger/registers.c
index 4ff5952..d5a2747 100644
--- a/debugger/registers.c
+++ b/debugger/registers.c
@@ -82,7 +82,7 @@
(WORD)DEBUG_context.SegCs, (WORD)DEBUG_context.SegSs,
(WORD)DEBUG_context.SegDs, (WORD)DEBUG_context.SegEs,
(WORD)DEBUG_context.SegFs, (WORD)DEBUG_context.SegGs );
- if (DEBUG_CurrThread->dbg_mode == 16)
+ if (DEBUG_CurrThread->dbg_mode != MODE_32)
{
char flag[33];
diff --git a/debugger/stack.c b/debugger/stack.c
index 0c59389..5cdff62 100644
--- a/debugger/stack.c
+++ b/debugger/stack.c
@@ -63,11 +63,13 @@
value.addr.off = DEBUG_context.Esp;
DEBUG_Printf(DBG_CHN_MESG,"Stack dump:\n");
- switch (DEBUG_GetSelectorType(value.addr.seg)) {
- case 32: /* 32-bit mode */
+ switch (DEBUG_GetSelectorType(value.addr.seg))
+ {
+ case MODE_32: /* 32-bit mode */
DEBUG_ExamineMemory( &value, 24, 'x' );
break;
- case 16: /* 16-bit mode */
+ case MODE_16: /* 16-bit mode */
+ case MODE_VM86:
value.addr.off &= 0xffff;
DEBUG_ExamineMemory( &value, 24, 'w' );
break;
@@ -79,7 +81,8 @@
}
#ifdef __i386__
-static void DEBUG_ForceFrame(DBG_ADDR *stack, DBG_ADDR *code, int frameno, int bits, int noisy, const char *caveat)
+static void DEBUG_ForceFrame(DBG_ADDR *stack, DBG_ADDR *code, int frameno, enum dbg_mode mode,
+ int noisy, const char *caveat)
{
int theframe = nframe++;
frames = (struct bt_info *)DBG_realloc(frames,
@@ -90,8 +93,7 @@
frames[theframe].cs = code->seg;
frames[theframe].eip = code->off;
if (noisy)
- frames[theframe].frame = DEBUG_PrintAddressAndArgs( code, bits,
- stack->off, TRUE );
+ frames[theframe].frame = DEBUG_PrintAddressAndArgs( code, mode, stack->off, TRUE );
else
DEBUG_FindNearestSymbol( code, TRUE,
&frames[theframe].frame.sym, stack->off,
@@ -99,7 +101,8 @@
frames[theframe].ss = stack->seg;
frames[theframe].ebp = stack->off;
if (noisy) {
- DEBUG_Printf( DBG_CHN_MESG, (bits == 16) ? " (bp=%04lx%s)\n" : " (ebp=%08lx%s)\n", stack->off, caveat?caveat:"" );
+ DEBUG_Printf( DBG_CHN_MESG, (mode != MODE_32) ? " (bp=%04lx%s)\n" : " (ebp=%08lx%s)\n",
+ stack->off, caveat?caveat:"" );
}
}
@@ -136,7 +139,8 @@
code.seg = *cs;
code.off = frame.ip;
addr->off = frame.bp & ~1;
- DEBUG_ForceFrame(addr, &code, frameno, 16, noisy, possible_cs ? ", far call assumed" : NULL );
+ DEBUG_ForceFrame(addr, &code, frameno, MODE_16, noisy,
+ possible_cs ? ", far call assumed" : NULL );
return TRUE;
}
@@ -158,7 +162,7 @@
code.seg = *cs;
code.off = frame.ip;
addr->off = frame.bp;
- DEBUG_ForceFrame(addr, &code, frameno, 32, noisy, NULL);
+ DEBUG_ForceFrame(addr, &code, frameno, MODE_32, noisy, NULL);
if (addr->off == old_bp) return FALSE;
return TRUE;
}
@@ -195,12 +199,12 @@
/* first stack frame from registers */
switch (DEBUG_GetSelectorType(ss))
{
- case 32:
+ case MODE_32:
code.seg = cs;
code.off = DEBUG_context.Eip;
addr.seg = ss;
addr.off = DEBUG_context.Ebp;
- DEBUG_ForceFrame( &addr, &code, frameno, 32, noisy, NULL );
+ DEBUG_ForceFrame( &addr, &code, frameno, MODE_32, noisy, NULL );
if (!(code.seg || code.off)) {
/* trying to execute a null pointer... yuck...
* if it was a call to null, the return EIP should be
@@ -208,21 +212,22 @@
tmp.seg = ss;
tmp.off = DEBUG_context.Esp;
if (DEBUG_READ_MEM((void *)DEBUG_ToLinear(&tmp), &code.off, sizeof(code.off))) {
- DEBUG_ForceFrame( &addr, &code, ++frameno, 32, noisy, ", null call assumed" );
+ DEBUG_ForceFrame( &addr, &code, ++frameno, MODE_32, noisy, ", null call assumed" );
}
}
is16 = FALSE;
break;
- case 16:
+ case MODE_16:
+ case MODE_VM86:
code.seg = cs;
code.off = LOWORD(DEBUG_context.Eip);
addr.seg = ss;
addr.off = LOWORD(DEBUG_context.Ebp);
- DEBUG_ForceFrame( &addr, &code, frameno, 16, noisy, NULL );
+ DEBUG_ForceFrame( &addr, &code, frameno, MODE_16, noisy, NULL );
is16 = TRUE;
break;
default:
- if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad segment '%u'\n", ss);
+ if (noisy) DEBUG_Printf( DBG_CHN_MESG, "Bad segment '%x'\n", ss);
return;
}
@@ -282,7 +287,7 @@
cs = 0;
addr.seg = 0;
addr.off = frame32.ebp;
- DEBUG_ForceFrame( &addr, &code, ++frameno, 32, noisy, NULL );
+ DEBUG_ForceFrame( &addr, &code, ++frameno, MODE_32, noisy, NULL );
next_switch = cur_switch;
tmp.seg = SELECTOROF(next_switch);
@@ -316,7 +321,7 @@
cs = frame16.cs;
addr.seg = SELECTOROF(next_switch);
addr.off = frame16.bp;
- DEBUG_ForceFrame( &addr, &code, ++frameno, 16, noisy, NULL );
+ DEBUG_ForceFrame( &addr, &code, ++frameno, MODE_16, noisy, NULL );
next_switch = cur_switch;
if (!DEBUG_READ_MEM((void*)next_switch, &frame32, sizeof(STACK32FRAME))) {
diff --git a/debugger/winedbg.c b/debugger/winedbg.c
index 1b78279..45dde5c 100644
--- a/debugger/winedbg.c
+++ b/debugger/winedbg.c
@@ -282,15 +282,24 @@
DEBUG_SuspendExecution();
if (!is_debug) {
-#ifdef __i386__
- if (DEBUG_IsSelectorSystem(DEBUG_context.SegCs))
+ if (!addr.seg)
DEBUG_Printf(DBG_CHN_MESG, " in 32-bit code (0x%08lx).\n", addr.off);
else
- DEBUG_Printf(DBG_CHN_MESG, " in 16-bit code (%04x:%04lx).\n",
- LOWORD(addr.seg), addr.off);
-#else
- DEBUG_Printf(DBG_CHN_MESG, " (0x%08lx).\n", addr.off);
-#endif
+ switch(DEBUG_GetSelectorType(addr.seg))
+ {
+ case MODE_32:
+ DEBUG_Printf(DBG_CHN_MESG, " in 32-bit code (%04lx:%08lx).\n", addr.seg, addr.off);
+ break;
+ case MODE_16:
+ DEBUG_Printf(DBG_CHN_MESG, " in 16-bit code (%04lx:%04lx).\n", addr.seg, addr.off);
+ break;
+ case MODE_VM86:
+ DEBUG_Printf(DBG_CHN_MESG, " in vm86 code (%04lx:%04lx).\n", addr.seg, addr.off);
+ break;
+ case MODE_INVALID:
+ DEBUG_Printf(DBG_CHN_MESG, "bad CS (%lx)\n", addr.seg);
+ break;
+ }
}
DEBUG_LoadEntryPoints("Loading new modules symbols:\n");
@@ -302,16 +311,13 @@
&DEBUG_CurrThread->dbg_exec_count))
return FALSE;
-#ifdef __i386__
- switch (newmode = DEBUG_GetSelectorType(addr.seg)) {
- case 16: case 32: break;
- default: DEBUG_Printf(DBG_CHN_MESG, "Bad CS (%ld)\n", addr.seg); newmode = 32;
- }
-#else
- newmode = 32;
-#endif
+ if ((newmode = DEBUG_GetSelectorType(addr.seg)) == MODE_INVALID) newmode = MODE_32;
if (newmode != DEBUG_CurrThread->dbg_mode)
- DEBUG_Printf(DBG_CHN_MESG,"In %d bit mode.\n", DEBUG_CurrThread->dbg_mode = newmode);
+ {
+ static const char * const names[] = { "???", "16-bit", "32-bit", "vm86" };
+ DEBUG_Printf(DBG_CHN_MESG,"In %s mode.\n", names[newmode] );
+ DEBUG_CurrThread->dbg_mode = newmode;
+ }
DEBUG_DoDisplay();
@@ -326,7 +332,7 @@
DEBUG_InfoRegisters();
DEBUG_InfoStack();
#ifdef __i386__
- if (DEBUG_CurrThread->dbg_mode == 16) {
+ if (DEBUG_CurrThread->dbg_mode == MODE_16) {
DEBUG_InfoSegments(DEBUG_context.SegDs >> 3, 1);
if (DEBUG_context.SegEs != DEBUG_context.SegDs)
DEBUG_InfoSegments(DEBUG_context.SegEs >> 3, 1);
@@ -374,7 +380,6 @@
BOOL ret = TRUE;
*cont = DBG_CONTINUE;
- if (first_chance && !force && !DBG_IVAR(BreakOnFirstChance)) return TRUE;
switch (rec->ExceptionCode)
{
@@ -384,6 +389,13 @@
break;
}
+ if (first_chance && !force && !DBG_IVAR(BreakOnFirstChance))
+ {
+ /* pass exception to program except for debug exceptions */
+ *cont = is_debug ? DBG_CONTINUE : DBG_EXCEPTION_NOT_HANDLED;
+ return TRUE;
+ }
+
if (!is_debug)
{
/* print some infos */
@@ -432,6 +444,16 @@
return TRUE;
}
break;
+ case EXCEPTION_VM86_INTx:
+ DEBUG_Printf(DBG_CHN_MESG, "interrupt %02lx in vm86 mode",
+ rec->ExceptionInformation[0]);
+ break;
+ case EXCEPTION_VM86_STI:
+ DEBUG_Printf(DBG_CHN_MESG, "sti in vm86 mode");
+ break;
+ case EXCEPTION_VM86_PICRETURN:
+ DEBUG_Printf(DBG_CHN_MESG, "PIC return in vm86 mode");
+ break;
default:
DEBUG_Printf(DBG_CHN_MESG, "%08lx", rec->ExceptionCode);
break;
@@ -728,7 +750,7 @@
DWORD cont;
BOOL ret;
- DEBUG_Printf(DBG_CHN_MESG, " on pid %ld\n", DEBUG_CurrPid);
+ DEBUG_Printf(DBG_CHN_MESG, " on pid %lx\n", DEBUG_CurrPid);
for (ret = TRUE; ret; ) {
/* wait until we get at least one loaded process */
@@ -741,7 +763,7 @@
}
};
- DEBUG_Printf(DBG_CHN_MESG, "WineDbg terminated on pid %ld\n", DEBUG_CurrPid);
+ DEBUG_Printf(DBG_CHN_MESG, "WineDbg terminated on pid %lx\n", DEBUG_CurrPid);
return 0;
}