Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
9faa7d73
Commit
9faa7d73
authored
Feb 13, 1999
by
Marcus Meissner
Committed by
Alexandre Julliard
Feb 13, 1999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Moved the if1632/signal.c stuff into loader/signal.c, adapted function
pointers for wine_debug and INSTR_EmulateInstruction.
parent
b4c726e2
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
177 additions
and
279 deletions
+177
-279
ddraw.c
graphics/ddraw.c
+8
-6
Makefile.in
if1632/Makefile.in
+0
-1
signal.c
if1632/signal.c
+0
-229
debugger.h
include/debugger.h
+9
-0
dosexe.h
include/dosexe.h
+0
-5
miscemu.h
include/miscemu.h
+1
-4
sig_context.h
include/sig_context.h
+10
-0
dosvm.c
loader/dos/dosvm.c
+2
-5
signal.c
loader/signal.c
+142
-15
instr.c
miscemu/instr.c
+0
-7
main.c
miscemu/main.c
+5
-7
No files found.
graphics/ddraw.c
View file @
9faa7d73
...
...
@@ -73,7 +73,6 @@
/* Restore signal handlers overwritten by XF86DGA
*/
#define RESTORE_SIGNALS
BOOL32
(
*
SIGNAL_Reinit
)(
void
);
/* didn't find any obvious place to put this */
/* Where do these GUIDs come from? mkuuid.
* They exist solely to distinguish between the targets Wine support,
...
...
@@ -2750,7 +2749,7 @@ static HRESULT WINAPI DGA_IDirectDraw_SetDisplayMode(
#endif
#ifdef RESTORE_SIGNALS
if
(
SIGNAL_Reinit
)
SIGNAL_Reinit
();
SIGNAL_InitHandlers
();
#endif
return
DD_OK
;
#else
/* defined(HAVE_LIBXXF86DGA) */
...
...
@@ -3000,7 +2999,7 @@ static HRESULT WINAPI DGA_IDirectDraw2_RestoreDisplayMode(LPDIRECTDRAW2 this) {
Sleep
(
1000
);
TSXF86DGADirectVideo
(
display
,
DefaultScreen
(
display
),
0
);
#ifdef RESTORE_SIGNALS
if
(
SIGNAL_Reinit
)
SIGNAL_Reinit
();
SIGNAL_InitHandlers
();
#endif
return
DD_OK
;
#else
/* defined(HAVE_LIBXXF86DGA) */
...
...
@@ -3033,7 +3032,8 @@ static ULONG WINAPI DGA_IDirectDraw2_Release(LPDIRECTDRAW2 this) {
#ifdef HAVE_LIBXXF86DGA
if
(
!--
(
this
->
ref
))
{
TSXF86DGADirectVideo
(
display
,
DefaultScreen
(
display
),
0
);
if
(
this
->
d
.
window
&&
(
this
->
d
.
mainWindow
!=
this
->
d
.
window
))
DestroyWindow32
(
this
->
d
.
window
);
#ifdef HAVE_LIBXXF86VM
if
(
orig_mode
)
{
TSXF86VidModeSwitchToMode
(
...
...
@@ -3048,7 +3048,7 @@ static ULONG WINAPI DGA_IDirectDraw2_Release(LPDIRECTDRAW2 this) {
#endif
#ifdef RESTORE_SIGNALS
if
(
SIGNAL_Reinit
)
SIGNAL_Reinit
();
SIGNAL_InitHandlers
();
#endif
HeapFree
(
GetProcessHeap
(),
0
,
this
);
return
0
;
...
...
@@ -3061,6 +3061,8 @@ static ULONG WINAPI Xlib_IDirectDraw2_Release(LPDIRECTDRAW2 this) {
TRACE
(
ddraw
,
"(%p)->() decrementing from %lu.
\n
"
,
this
,
this
->
ref
);
if
(
!--
(
this
->
ref
))
{
if
(
this
->
d
.
window
&&
(
this
->
d
.
mainWindow
!=
this
->
d
.
window
))
DestroyWindow32
(
this
->
d
.
window
);
HeapFree
(
GetProcessHeap
(),
0
,
this
);
return
0
;
}
...
...
@@ -3773,7 +3775,7 @@ HRESULT WINAPI DGA_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter)
(
*
lplpDD
)
->
d
.
screen_depth
=
DefaultDepthOfScreen
(
X11DRV_GetXScreen
());
(
*
lplpDD
)
->
d
.
depth
=
DefaultDepthOfScreen
(
X11DRV_GetXScreen
());
#ifdef RESTORE_SIGNALS
if
(
SIGNAL_Reinit
)
SIGNAL_Reinit
();
SIGNAL_InitHandlers
();
#endif
return
DD_OK
;
...
...
if1632/Makefile.in
View file @
9faa7d73
...
...
@@ -55,7 +55,6 @@ C_SRCS = \
builtin.c
\
dummy.c
\
relay.c
\
signal.c
\
snoop.c
\
thunk.c
...
...
if1632/signal.c
deleted
100644 → 0
View file @
b4c726e2
/*
* Emulator signal handling
*
* Copyright 1995 Alexandre Julliard
*/
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <setjmp.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "debugger.h"
#include "options.h"
#include "sig_context.h"
#include "miscemu.h"
#include "dosexe.h"
#include "thread.h"
#include "debug.h"
static
const
char
*
const
SIGNAL_traps
[]
=
{
"Division by zero exception"
,
/* 0 */
"Debug exception"
,
/* 1 */
"NMI interrupt"
,
/* 2 */
"Breakpoint exception"
,
/* 3 */
"Overflow exception"
,
/* 4 */
"Bound range exception"
,
/* 5 */
"Invalid opcode exception"
,
/* 6 */
"Device not available exception"
,
/* 7 */
"Double fault exception"
,
/* 8 */
"Coprocessor segment overrun"
,
/* 9 */
"Invalid TSS exception"
,
/* 10 */
"Segment not present exception"
,
/* 11 */
"Stack fault"
,
/* 12 */
"General protection fault"
,
/* 13 */
"Page fault"
,
/* 14 */
"Unknown exception"
,
/* 15 */
"Floating point exception"
,
/* 16 */
"Alignment check exception"
,
/* 17 */
"Machine check exception"
/* 18 */
};
#define NB_TRAPS (sizeof(SIGNAL_traps) / sizeof(SIGNAL_traps[0]))
extern
void
SIGNAL_SetHandler
(
int
sig
,
void
(
*
func
)(),
int
flags
);
extern
BOOL32
INSTR_EmulateInstruction
(
SIGCONTEXT
*
context
);
/**********************************************************************
* SIGNAL_break
*
* Handle Ctrl-C and such
*/
static
HANDLER_DEF
(
SIGNAL_break
)
{
HANDLER_INIT
();
if
(
Options
.
debug
)
wine_debug
(
signal
,
HANDLER_CONTEXT
);
/* Enter our debugger */
else
exit
(
0
);
}
/**********************************************************************
* SIGNAL_trap
*
* SIGTRAP handler.
*/
static
HANDLER_DEF
(
SIGNAL_trap
)
{
HANDLER_INIT
();
wine_debug
(
signal
,
HANDLER_CONTEXT
);
/* Enter our debugger */
}
/**********************************************************************
* SIGNAL_fault
*
* Segfault handler.
*/
static
HANDLER_DEF
(
SIGNAL_fault
)
{
const
char
*
fault
=
"Segmentation fault"
;
HANDLER_INIT
();
if
(
INSTR_EmulateInstruction
(
HANDLER_CONTEXT
))
return
;
#ifdef TRAP_sig
if
(
TRAP_sig
(
HANDLER_CONTEXT
)
<
NB_TRAPS
)
fault
=
SIGNAL_traps
[
TRAP_sig
(
HANDLER_CONTEXT
)];
#endif
if
(
IS_SELECTOR_SYSTEM
(
CS_sig
(
HANDLER_CONTEXT
)))
{
MSG
(
"%s in 32-bit code (0x%08lx).
\n
"
,
fault
,
EIP_sig
(
HANDLER_CONTEXT
));
}
else
{
MSG
(
"%s in 16-bit code (%04x:%04lx).
\n
"
,
fault
,
(
WORD
)
CS_sig
(
HANDLER_CONTEXT
),
EIP_sig
(
HANDLER_CONTEXT
)
);
}
#ifdef CR2_sig
MSG
(
"Fault address is 0x%08lx
\n
"
,
CR2_sig
(
HANDLER_CONTEXT
));
#endif
wine_debug
(
signal
,
HANDLER_CONTEXT
);
}
/***********************************************************************
* SIGNAL_SetContext
*
* Set the register values from a sigcontext.
*/
#ifdef UNUSED_FUNCTIONS
static
void
SIGNAL_SetSigContext
(
const
SIGCONTEXT
*
sigcontext
,
CONTEXT
*
context
)
{
EAX_reg
(
context
)
=
EAX_sig
(
sigcontext
);
EBX_reg
(
context
)
=
EBX_sig
(
sigcontext
);
ECX_reg
(
context
)
=
ECX_sig
(
sigcontext
);
EDX_reg
(
context
)
=
EDX_sig
(
sigcontext
);
ESI_reg
(
context
)
=
ESI_sig
(
sigcontext
);
EDI_reg
(
context
)
=
EDI_sig
(
sigcontext
);
EBP_reg
(
context
)
=
EBP_sig
(
sigcontext
);
EFL_reg
(
context
)
=
EFL_sig
(
sigcontext
);
EIP_reg
(
context
)
=
EIP_sig
(
sigcontext
);
ESP_reg
(
context
)
=
ESP_sig
(
sigcontext
);
CS_reg
(
context
)
=
LOWORD
(
CS_sig
(
sigcontext
));
DS_reg
(
context
)
=
LOWORD
(
DS_sig
(
sigcontext
));
ES_reg
(
context
)
=
LOWORD
(
ES_sig
(
sigcontext
));
SS_reg
(
context
)
=
LOWORD
(
SS_sig
(
sigcontext
));
#ifdef FS_sig
FS_reg
(
context
)
=
LOWORD
(
FS_sig
(
sigcontext
));
#else
GET_FS
(
FS_reg
(
&
DEBUG_context
)
);
FS_reg
(
context
)
&=
0xffff
;
#endif
#ifdef GS_sig
GS_reg
(
context
)
=
LOWORD
(
GS_sig
(
sigcontext
));
#else
GET_GS
(
GS_reg
(
&
DEBUG_context
)
);
GS_reg
(
context
)
&=
0xffff
;
#endif
}
#endif
/***********************************************************************
* SIGNAL_GetSigContext
*
* Build a sigcontext from the register values.
*/
#ifdef UNUSED_FUNCTIONS
static
void
SIGNAL_GetSigContext
(
SIGCONTEXT
*
sigcontext
,
const
CONTEXT
*
context
)
{
EAX_sig
(
sigcontext
)
=
EAX_reg
(
context
);
EBX_sig
(
sigcontext
)
=
EBX_reg
(
context
);
ECX_sig
(
sigcontext
)
=
ECX_reg
(
context
);
EDX_sig
(
sigcontext
)
=
EDX_reg
(
context
);
ESI_sig
(
sigcontext
)
=
ESI_reg
(
context
);
EDI_sig
(
sigcontext
)
=
EDI_reg
(
context
);
EBP_sig
(
sigcontext
)
=
EBP_reg
(
context
);
EFL_sig
(
sigcontext
)
=
EFL_reg
(
context
);
EIP_sig
(
sigcontext
)
=
EIP_reg
(
context
);
ESP_sig
(
sigcontext
)
=
ESP_reg
(
context
);
CS_sig
(
sigcontext
)
=
CS_reg
(
context
);
DS_sig
(
sigcontext
)
=
DS_reg
(
context
);
ES_sig
(
sigcontext
)
=
ES_reg
(
context
);
SS_sig
(
sigcontext
)
=
SS_reg
(
context
);
#ifdef FS_sig
FS_sig
(
sigcontext
)
=
FS_reg
(
context
);
#else
SET_FS
(
FS_reg
(
&
DEBUG_context
)
);
#endif
#ifdef GS_sig
GS_sig
(
sigcontext
)
=
GS_reg
(
context
);
#else
SET_GS
(
GS_reg
(
&
DEBUG_context
)
);
#endif
}
#endif
/***********************************************************************
* SIGNAL_InfoRegisters
*
* Display registers information.
*/
void
SIGNAL_InfoRegisters
(
CONTEXT
*
context
)
{
MSG
(
" CS:%04x SS:%04x DS:%04x ES:%04x FS:%04x GS:%04x"
,
(
WORD
)
CS_reg
(
context
),
(
WORD
)
SS_reg
(
context
),
(
WORD
)
DS_reg
(
context
),
(
WORD
)
ES_reg
(
context
),
(
WORD
)
FS_reg
(
context
),
(
WORD
)
GS_reg
(
context
)
);
MSG
(
"
\n
EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx
\n
"
,
EIP_reg
(
context
),
ESP_reg
(
context
),
EBP_reg
(
context
),
EFL_reg
(
context
)
);
MSG
(
" EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx
\n
"
,
EAX_reg
(
context
),
EBX_reg
(
context
),
ECX_reg
(
context
),
EDX_reg
(
context
)
);
MSG
(
" ESI:%08lx EDI:%08lx
\n
"
,
ESI_reg
(
context
),
EDI_reg
(
context
)
);
}
/**********************************************************************
* SIGNAL_InitEmulator
*
* Initialize emulator signals.
*/
BOOL32
SIGNAL_InitEmulator
(
void
)
{
SIGNAL_SetHandler
(
SIGINT
,
(
void
(
*
)())
SIGNAL_break
,
1
);
SIGNAL_SetHandler
(
SIGSEGV
,
(
void
(
*
)())
SIGNAL_fault
,
1
);
SIGNAL_SetHandler
(
SIGILL
,
(
void
(
*
)())
SIGNAL_fault
,
1
);
SIGNAL_SetHandler
(
SIGFPE
,
(
void
(
*
)())
SIGNAL_fault
,
1
);
SIGNAL_SetHandler
(
SIGTRAP
,
(
void
(
*
)())
SIGNAL_trap
,
1
);
/* debugger */
SIGNAL_SetHandler
(
SIGHUP
,
(
void
(
*
)())
SIGNAL_trap
,
1
);
/* forced break*/
#ifdef SIGBUS
SIGNAL_SetHandler
(
SIGBUS
,
(
void
(
*
)())
SIGNAL_fault
,
1
);
#endif
instr_emu_call
=
INSTR_EmulateInstruction
;
return
TRUE
;
}
include/debugger.h
View file @
9faa7d73
...
...
@@ -321,4 +321,13 @@ extern void DEBUG_Disassemble( const DBG_ADDR *, const DBG_ADDR*, int offset );
extern
void
ctx_debug
(
int
signal
,
CONTEXT
*
regs
);
extern
void
wine_debug
(
int
signal
,
SIGCONTEXT
*
regs
);
/* miscemu/instr.c */
extern
BOOL32
INSTR_EmulateInstruction
(
SIGCONTEXT
*
);
/* loader/signal.c */
extern
void
(
*
fnWINE_Debugger
)(
int
,
SIGCONTEXT
*
);
extern
void
(
*
ctx_debug_call
)(
int
,
CONTEXT
*
);
extern
BOOL32
(
*
fnINSTR_EmulateInstruction
)(
SIGCONTEXT
*
);
#endif
/* __WINE_DEBUGGER_H */
include/dosexe.h
View file @
9faa7d73
...
...
@@ -43,11 +43,6 @@ extern LPDOSTASK MZ_AllocDPMITask( HMODULE16 hModule );
#define V86_FLAG 0x00020000
extern
void
(
*
ctx_debug_call
)(
int
,
CONTEXT
*
);
#ifdef __i386__
extern
BOOL32
(
*
instr_emu_call
)(
SIGCONTEXT
*
);
#endif
extern
void
MZ_Tick
(
WORD
handle
);
extern
HINSTANCE16
MZ_CreateProcess
(
LPCSTR
name
,
LPCSTR
cmdline
,
LPCSTR
env
,
BOOL32
inherit
,
...
...
include/miscemu.h
View file @
9faa7d73
...
...
@@ -105,10 +105,7 @@ extern void WINAPI XMS_Handler(CONTEXT*);
extern
BOOL32
SIGNAL_Init
(
void
);
extern
void
SIGNAL_SetHandler
(
int
sig
,
void
(
*
func
)(),
int
flags
);
extern
void
SIGNAL_MaskAsyncEvents
(
BOOL32
flag
);
/* if1632/signal.c */
extern
BOOL32
SIGNAL_InitEmulator
(
void
);
extern
BOOL32
(
*
SIGNAL_Reinit
)(
void
);
extern
void
SIGNAL_InitHandlers
(
void
);
/* misc/aspi.c */
extern
void
ASPI_DOS_HandleInt
(
CONTEXT
*
context
);
...
...
include/sig_context.h
View file @
9faa7d73
...
...
@@ -35,6 +35,7 @@ typedef struct
unsigned
long
oldmask
;
unsigned
long
cr2
;
}
SIGCONTEXT
;
#define __HAVE_SIGCONTEXT
#define HANDLER_DEF(name) void name (int signal, SIGCONTEXT context)
#define HANDLER_CONTEXT (&context)
...
...
@@ -58,6 +59,7 @@ typedef struct
#include <machine/frame.h>
typedef
struct
trapframe
SIGCONTEXT
;
#define __HAVE_SIGCONTEXT
#define HANDLER_DEF(name) void name(int signal, int code, SIGCONTEXT *context)
#define HANDLER_CONTEXT context
...
...
@@ -73,6 +75,7 @@ typedef struct trapframe SIGCONTEXT;
#include <signal.h>
typedef
struct
sigcontext
SIGCONTEXT
;
#define __HAVE_SIGCONTEXT
#define HANDLER_DEF(name) void name(int signal, int code, SIGCONTEXT *context)
#define HANDLER_CONTEXT context
...
...
@@ -87,6 +90,7 @@ typedef struct sigcontext SIGCONTEXT;
#endif
#include <sys/ucontext.h>
typedef
struct
ucontext
SIGCONTEXT
;
#define __HAVE_SIGCONTEXT
#define HANDLER_DEF(name) void name(int signal, void *siginfo, SIGCONTEXT *context)
#define HANDLER_CONTEXT context
...
...
@@ -126,6 +130,7 @@ typedef struct _CONTEXT /* Note 1 */
ULONG
ctx_RegEsp
;
ULONG
ctx_SegSs
;
}
SIGCONTEXT
;
#define __HAVE_SIGCONTEXT
/*typedef CONTEXTRECORD *PCONTEXTRECORD;*/
#endif
/* __EMX__ */
...
...
@@ -265,4 +270,9 @@ typedef struct _CONTEXT /* Note 1 */
#endif
/* __i386__ */
#ifndef __HAVE_SIGCONTEXT
/* empty entry for non x86 architectures mostly. */
typedef
DWORD
SIGCONTEXT
;
#endif
#endif
/* __WINE_SIG_CONTEXT_H */
loader/dos/dosvm.c
View file @
9faa7d73
...
...
@@ -23,15 +23,12 @@
#include "msdos.h"
#include "miscemu.h"
#include "debugger.h"
#include "debug.h"
#include "module.h"
#include "task.h"
#include "ldt.h"
#include "dosexe.h"
#include "dosmod.h"
void
(
*
ctx_debug_call
)(
int
sig
,
CONTEXT
*
ctx
)
=
NULL
;
BOOL32
(
*
instr_emu_call
)(
SIGCONTEXT
*
ctx
)
=
NULL
;
#include "debug.h"
#ifdef MZ_SUPPORTED
...
...
@@ -121,7 +118,7 @@ static int DOSVM_Process( LPDOSTASK lpDosTask, int fn, int sig,
#define CP(x,y) y##_sig(&sigcontext) = VM86->regs.x
CV
;
#undef CP
if
(
instr_emu_call
)
ret
=
instr_emu_call
(
&
sigcontext
);
if
(
fnINSTR_EmulateInstruction
)
ret
=
fnINSTR_EmulateInstruction
(
&
sigcontext
);
#define CP(x,y) VM86->regs.x = y##_sig(&sigcontext)
CV
;
#undef CP
...
...
loader/signal.c
View file @
9faa7d73
/*
* Wine signal handling
*
* Copyright 1995 Alexandre Julliard
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
...
...
@@ -29,10 +30,46 @@
# endif
#endif
#include "miscemu.h"
#include "selectors.h"
#include "sig_context.h"
#include "winsock.h"
#include "global.h"
#include "options.h"
#include "debugger.h"
#include "miscemu.h"
#include "dosexe.h"
#include "thread.h"
#include "debug.h"
void
(
*
fnWINE_Debugger
)(
int
,
SIGCONTEXT
*
)
=
NULL
;
void
(
*
ctx_debug_call
)(
int
sig
,
CONTEXT
*
ctx
)
=
NULL
;
BOOL32
(
*
fnINSTR_EmulateInstruction
)(
SIGCONTEXT
*
ctx
)
=
NULL
;
#ifdef __i386__
/* i386 specific faults */
static
const
char
*
const
SIGNAL_traps
[]
=
{
"Division by zero exception"
,
/* 0 */
"Debug exception"
,
/* 1 */
"NMI interrupt"
,
/* 2 */
"Breakpoint exception"
,
/* 3 */
"Overflow exception"
,
/* 4 */
"Bound range exception"
,
/* 5 */
"Invalid opcode exception"
,
/* 6 */
"Device not available exception"
,
/* 7 */
"Double fault exception"
,
/* 8 */
"Coprocessor segment overrun"
,
/* 9 */
"Invalid TSS exception"
,
/* 10 */
"Segment not present exception"
,
/* 11 */
"Stack fault"
,
/* 12 */
"General protection fault"
,
/* 13 */
"Page fault"
,
/* 14 */
"Unknown exception"
,
/* 15 */
"Floating point exception"
,
/* 16 */
"Alignment check exception"
,
/* 17 */
"Machine check exception"
/* 18 */
};
#define NB_TRAPS (sizeof(SIGNAL_traps) / sizeof(SIGNAL_traps[0]))
#endif
/* Linux sigaction function */
...
...
@@ -152,6 +189,106 @@ extern void ASYNC_sigio(int a);
/**********************************************************************
* SIGNAL_MaskAsyncEvents
*/
void
SIGNAL_MaskAsyncEvents
(
BOOL32
flag
)
{
sigprocmask
(
(
flag
)
?
SIG_BLOCK
:
SIG_UNBLOCK
,
&
async_signal_set
,
NULL
);
}
extern
void
SIGNAL_SetHandler
(
int
sig
,
void
(
*
func
)(),
int
flags
);
/**********************************************************************
* SIGNAL_break
*
* Handle Ctrl-C and such
*/
static
HANDLER_DEF
(
SIGNAL_break
)
{
HANDLER_INIT
();
if
(
Options
.
debug
&&
fnWINE_Debugger
)
fnWINE_Debugger
(
signal
,
HANDLER_CONTEXT
);
/* Enter our debugger */
else
exit
(
0
);
}
/**********************************************************************
* SIGNAL_trap
*
* SIGTRAP handler.
*/
static
HANDLER_DEF
(
SIGNAL_trap
)
{
HANDLER_INIT
();
if
(
fnWINE_Debugger
)
fnWINE_Debugger
(
signal
,
HANDLER_CONTEXT
);
/* Enter our debugger */
}
/**********************************************************************
* SIGNAL_fault
*
* Segfault handler.
*/
static
HANDLER_DEF
(
SIGNAL_fault
)
{
const
char
*
fault
=
"Segmentation fault"
;
HANDLER_INIT
();
#ifdef __i386__
#if defined(TRAP_sig) && defined(CR2_sig)
if
(
TRAP_sig
(
HANDLER_CONTEXT
)
==
0x0e
&&
VIRTUAL_HandleFault
(
(
LPVOID
)
CR2_sig
(
HANDLER_CONTEXT
)
))
return
;
#endif
if
(
fnINSTR_EmulateInstruction
&&
fnINSTR_EmulateInstruction
(
HANDLER_CONTEXT
)
)
return
;
#ifdef TRAP_sig
if
(
TRAP_sig
(
HANDLER_CONTEXT
)
<
NB_TRAPS
)
fault
=
SIGNAL_traps
[
TRAP_sig
(
HANDLER_CONTEXT
)];
#endif
if
(
IS_SELECTOR_SYSTEM
(
CS_sig
(
HANDLER_CONTEXT
)))
{
MSG
(
"%s in 32-bit code (0x%08lx).
\n
"
,
fault
,
EIP_sig
(
HANDLER_CONTEXT
));
}
else
{
MSG
(
"%s in 16-bit code (%04x:%04lx).
\n
"
,
fault
,
(
WORD
)
CS_sig
(
HANDLER_CONTEXT
),
EIP_sig
(
HANDLER_CONTEXT
)
);
}
#ifdef CR2_sig
MSG
(
"Fault address is 0x%08lx
\n
"
,
CR2_sig
(
HANDLER_CONTEXT
));
#endif
#endif
if
(
fnWINE_Debugger
)
fnWINE_Debugger
(
signal
,
HANDLER_CONTEXT
);
}
/**********************************************************************
* SIGNAL_InitHandlers
*/
void
SIGNAL_InitHandlers
(
void
)
{
SIGNAL_SetHandler
(
SIGINT
,
(
void
(
*
)())
SIGNAL_break
,
1
);
SIGNAL_SetHandler
(
SIGSEGV
,
(
void
(
*
)())
SIGNAL_fault
,
1
);
SIGNAL_SetHandler
(
SIGILL
,
(
void
(
*
)())
SIGNAL_fault
,
1
);
SIGNAL_SetHandler
(
SIGFPE
,
(
void
(
*
)())
SIGNAL_fault
,
1
);
SIGNAL_SetHandler
(
SIGTRAP
,
(
void
(
*
)())
SIGNAL_trap
,
1
);
/* debugger */
SIGNAL_SetHandler
(
SIGHUP
,
(
void
(
*
)())
SIGNAL_trap
,
1
);
/* forced break*/
#ifdef SIGBUS
SIGNAL_SetHandler
(
SIGBUS
,
(
void
(
*
)())
SIGNAL_fault
,
1
);
#endif
return
;
}
/**********************************************************************
* SIGNAL_Init
*/
BOOL32
SIGNAL_Init
(
void
)
...
...
@@ -180,20 +317,10 @@ BOOL32 SIGNAL_Init(void)
/* SIGNAL_SetHandler( SIGIO, (void (*)())WINSOCK_sigio, 0); */
SIGNAL_SetHandler
(
SIGIO
,
(
void
(
*
)())
ASYNC_sigio
,
0
);
#endif
sigaddset
(
&
async_signal_set
,
SIGALRM
);
/* ignore SIGPIPE so that WINSOCK can get a EPIPE error instead */
signal
(
SIGPIPE
,
SIG_IGN
);
SIGNAL_InitHandlers
();
return
TRUE
;
}
/**********************************************************************
* SIGNAL_MaskAsyncEvents
*/
void
SIGNAL_MaskAsyncEvents
(
BOOL32
flag
)
{
sigprocmask
(
(
flag
)
?
SIG_BLOCK
:
SIG_UNBLOCK
,
&
async_signal_set
,
NULL
);
}
miscemu/instr.c
View file @
9faa7d73
...
...
@@ -323,13 +323,6 @@ BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context )
SEGPTR
gpHandler
;
BYTE
*
instr
;
/* Check for page-fault */
#if defined(TRAP_sig) && defined(CR2_sig)
if
(
TRAP_sig
(
context
)
==
0x0e
&&
VIRTUAL_HandleFault
(
(
LPVOID
)
CR2_sig
(
context
)
))
return
TRUE
;
#endif
long_op
=
long_addr
=
IS_SEL_32
(
context
,
CS_sig
(
context
));
instr
=
(
BYTE
*
)
MK_PTR
(
context
,
CS_sig
(
context
),
EIP_sig
(
context
));
if
(
!
instr
)
return
FALSE
;
...
...
miscemu/main.c
View file @
9faa7d73
...
...
@@ -32,10 +32,6 @@ BOOL32 MAIN_EmulatorInit(void)
/* Initialize relay code */
if
(
!
RELAY_Init
())
return
FALSE
;
/* Initialize signal handling */
if
(
!
SIGNAL_InitEmulator
())
return
FALSE
;
SIGNAL_Reinit
=
SIGNAL_InitEmulator
;
/* Create the Win16 printer driver */
if
(
!
WIN16DRV_Init
())
return
FALSE
;
...
...
@@ -150,8 +146,11 @@ int main( int argc, char *argv[] )
}
}
/* Set up debugger callback routines */
ctx_debug_call
=
ctx_debug
;
/* Set up debugger/instruction emulation callback routines */
ctx_debug_call
=
ctx_debug
;
fnWINE_Debugger
=
wine_debug
;
fnINSTR_EmulateInstruction
=
INSTR_EmulateInstruction
;
if
(
Options
.
debug
)
TASK_AddTaskEntryBreakpoint
=
DEBUG_AddTaskEntryBreakpoint
;
...
...
@@ -177,4 +176,3 @@ int main( int argc, char *argv[] )
MSG
(
"main: Should never happen: returned from TASK_StartTask()
\n
"
);
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment