1*ece92f85SJason Jin /****************************************************************************
2*ece92f85SJason Jin *
3*ece92f85SJason Jin *                       Realmode X86 Emulator Library
4*ece92f85SJason Jin *
5*ece92f85SJason Jin *               Copyright (C) 1991-2004 SciTech Software, Inc.
6*ece92f85SJason Jin *                    Copyright (C) David Mosberger-Tang
7*ece92f85SJason Jin *                      Copyright (C) 1999 Egbert Eich
8*ece92f85SJason Jin *
9*ece92f85SJason Jin *  ========================================================================
10*ece92f85SJason Jin *
11*ece92f85SJason Jin *  Permission to use, copy, modify, distribute, and sell this software and
12*ece92f85SJason Jin *  its documentation for any purpose is hereby granted without fee,
13*ece92f85SJason Jin *  provided that the above copyright notice appear in all copies and that
14*ece92f85SJason Jin *  both that copyright notice and this permission notice appear in
15*ece92f85SJason Jin *  supporting documentation, and that the name of the authors not be used
16*ece92f85SJason Jin *  in advertising or publicity pertaining to distribution of the software
17*ece92f85SJason Jin *  without specific, written prior permission.  The authors makes no
18*ece92f85SJason Jin *  representations about the suitability of this software for any purpose.
19*ece92f85SJason Jin *  It is provided "as is" without express or implied warranty.
20*ece92f85SJason Jin *
21*ece92f85SJason Jin *  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
22*ece92f85SJason Jin *  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
23*ece92f85SJason Jin *  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
24*ece92f85SJason Jin *  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
25*ece92f85SJason Jin *  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
26*ece92f85SJason Jin *  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
27*ece92f85SJason Jin *  PERFORMANCE OF THIS SOFTWARE.
28*ece92f85SJason Jin *
29*ece92f85SJason Jin *  ========================================================================
30*ece92f85SJason Jin *
31*ece92f85SJason Jin * Language:     ANSI C
32*ece92f85SJason Jin * Environment:  Any
33*ece92f85SJason Jin * Developer:    Kendall Bennett
34*ece92f85SJason Jin *
35*ece92f85SJason Jin * Description:  Header file for debug definitions.
36*ece92f85SJason Jin *
37*ece92f85SJason Jin ****************************************************************************/
38*ece92f85SJason Jin 
39*ece92f85SJason Jin #ifndef __X86EMU_DEBUG_H
40*ece92f85SJason Jin #define __X86EMU_DEBUG_H
41*ece92f85SJason Jin 
42*ece92f85SJason Jin /*---------------------- Macros and type definitions ----------------------*/
43*ece92f85SJason Jin 
44*ece92f85SJason Jin /* checks to be enabled for "runtime" */
45*ece92f85SJason Jin 
46*ece92f85SJason Jin #define CHECK_IP_FETCH_F                0x1
47*ece92f85SJason Jin #define CHECK_SP_ACCESS_F               0x2
48*ece92f85SJason Jin #define CHECK_MEM_ACCESS_F              0x4	/*using regular linear pointer */
49*ece92f85SJason Jin #define CHECK_DATA_ACCESS_F             0x8	/*using segment:offset */
50*ece92f85SJason Jin 
51*ece92f85SJason Jin #ifdef DEBUG
52*ece92f85SJason Jin # define CHECK_IP_FETCH()               (M.x86.check & CHECK_IP_FETCH_F)
53*ece92f85SJason Jin # define CHECK_SP_ACCESS()              (M.x86.check & CHECK_SP_ACCESS_F)
54*ece92f85SJason Jin # define CHECK_MEM_ACCESS()             (M.x86.check & CHECK_MEM_ACCESS_F)
55*ece92f85SJason Jin # define CHECK_DATA_ACCESS()            (M.x86.check & CHECK_DATA_ACCESS_F)
56*ece92f85SJason Jin #else
57*ece92f85SJason Jin # define CHECK_IP_FETCH()
58*ece92f85SJason Jin # define CHECK_SP_ACCESS()
59*ece92f85SJason Jin # define CHECK_MEM_ACCESS()
60*ece92f85SJason Jin # define CHECK_DATA_ACCESS()
61*ece92f85SJason Jin #endif
62*ece92f85SJason Jin 
63*ece92f85SJason Jin #ifdef DEBUG
64*ece92f85SJason Jin # define DEBUG_INSTRUMENT()     (M.x86.debug & DEBUG_INSTRUMENT_F)
65*ece92f85SJason Jin # define DEBUG_DECODE()         (M.x86.debug & DEBUG_DECODE_F)
66*ece92f85SJason Jin # define DEBUG_TRACE()          (M.x86.debug & DEBUG_TRACE_F)
67*ece92f85SJason Jin # define DEBUG_STEP()           (M.x86.debug & DEBUG_STEP_F)
68*ece92f85SJason Jin # define DEBUG_DISASSEMBLE()    (M.x86.debug & DEBUG_DISASSEMBLE_F)
69*ece92f85SJason Jin # define DEBUG_BREAK()          (M.x86.debug & DEBUG_BREAK_F)
70*ece92f85SJason Jin # define DEBUG_SVC()            (M.x86.debug & DEBUG_SVC_F)
71*ece92f85SJason Jin # define DEBUG_SAVE_IP_CS()     (M.x86.debug & DEBUG_SAVE_CS_IP)
72*ece92f85SJason Jin 
73*ece92f85SJason Jin # define DEBUG_FS()             (M.x86.debug & DEBUG_FS_F)
74*ece92f85SJason Jin # define DEBUG_PROC()           (M.x86.debug & DEBUG_PROC_F)
75*ece92f85SJason Jin # define DEBUG_SYSINT()         (M.x86.debug & DEBUG_SYSINT_F)
76*ece92f85SJason Jin # define DEBUG_TRACECALL()      (M.x86.debug & DEBUG_TRACECALL_F)
77*ece92f85SJason Jin # define DEBUG_TRACECALLREGS()  (M.x86.debug & DEBUG_TRACECALL_REGS_F)
78*ece92f85SJason Jin # define DEBUG_SYS()            (M.x86.debug & DEBUG_SYS_F)
79*ece92f85SJason Jin # define DEBUG_MEM_TRACE()      (M.x86.debug & DEBUG_MEM_TRACE_F)
80*ece92f85SJason Jin # define DEBUG_IO_TRACE()       (M.x86.debug & DEBUG_IO_TRACE_F)
81*ece92f85SJason Jin # define DEBUG_DECODE_NOPRINT() (M.x86.debug & DEBUG_DECODE_NOPRINT_F)
82*ece92f85SJason Jin #else
83*ece92f85SJason Jin # define DEBUG_INSTRUMENT()     0
84*ece92f85SJason Jin # define DEBUG_DECODE()         0
85*ece92f85SJason Jin # define DEBUG_TRACE()          0
86*ece92f85SJason Jin # define DEBUG_STEP()           0
87*ece92f85SJason Jin # define DEBUG_DISASSEMBLE()    0
88*ece92f85SJason Jin # define DEBUG_BREAK()          0
89*ece92f85SJason Jin # define DEBUG_SVC()            0
90*ece92f85SJason Jin # define DEBUG_SAVE_IP_CS()     0
91*ece92f85SJason Jin # define DEBUG_FS()             0
92*ece92f85SJason Jin # define DEBUG_PROC()           0
93*ece92f85SJason Jin # define DEBUG_SYSINT()         0
94*ece92f85SJason Jin # define DEBUG_TRACECALL()      0
95*ece92f85SJason Jin # define DEBUG_TRACECALLREGS()  0
96*ece92f85SJason Jin # define DEBUG_SYS()            0
97*ece92f85SJason Jin # define DEBUG_MEM_TRACE()      0
98*ece92f85SJason Jin # define DEBUG_IO_TRACE()       0
99*ece92f85SJason Jin # define DEBUG_DECODE_NOPRINT() 0
100*ece92f85SJason Jin #endif
101*ece92f85SJason Jin 
102*ece92f85SJason Jin #ifdef DEBUG
103*ece92f85SJason Jin 
104*ece92f85SJason Jin # define DECODE_PRINTF(x)       if (DEBUG_DECODE()) \
105*ece92f85SJason Jin                                     x86emu_decode_printf(x)
106*ece92f85SJason Jin # define DECODE_PRINTF2(x,y)    if (DEBUG_DECODE()) \
107*ece92f85SJason Jin                                     x86emu_decode_printf2(x,y)
108*ece92f85SJason Jin 
109*ece92f85SJason Jin /*
110*ece92f85SJason Jin  * The following allow us to look at the bytes of an instruction.  The
111*ece92f85SJason Jin  * first INCR_INSTRN_LEN, is called everytime bytes are consumed in
112*ece92f85SJason Jin  * the decoding process.  The SAVE_IP_CS is called initially when the
113*ece92f85SJason Jin  * major opcode of the instruction is accessed.
114*ece92f85SJason Jin  */
115*ece92f85SJason Jin #define INC_DECODED_INST_LEN(x)                     \
116*ece92f85SJason Jin     if (DEBUG_DECODE())                             \
117*ece92f85SJason Jin         x86emu_inc_decoded_inst_len(x)
118*ece92f85SJason Jin 
119*ece92f85SJason Jin #define SAVE_IP_CS(x,y)                                         \
120*ece92f85SJason Jin     if (DEBUG_DECODE() | DEBUG_TRACECALL() | DEBUG_BREAK() \
121*ece92f85SJason Jin               | DEBUG_IO_TRACE() | DEBUG_SAVE_IP_CS()) { \
122*ece92f85SJason Jin         M.x86.saved_cs = x;                                     \
123*ece92f85SJason Jin         M.x86.saved_ip = y;                                     \
124*ece92f85SJason Jin     }
125*ece92f85SJason Jin #else
126*ece92f85SJason Jin # define INC_DECODED_INST_LEN(x)
127*ece92f85SJason Jin # define DECODE_PRINTF(x)
128*ece92f85SJason Jin # define DECODE_PRINTF2(x,y)
129*ece92f85SJason Jin # define SAVE_IP_CS(x,y)
130*ece92f85SJason Jin #endif
131*ece92f85SJason Jin 
132*ece92f85SJason Jin #ifdef DEBUG
133*ece92f85SJason Jin #define TRACE_REGS()                                        \
134*ece92f85SJason Jin     if (DEBUG_DISASSEMBLE()) {                              \
135*ece92f85SJason Jin         x86emu_just_disassemble();                          \
136*ece92f85SJason Jin         goto EndOfTheInstructionProcedure;                  \
137*ece92f85SJason Jin     }                                                       \
138*ece92f85SJason Jin     if (DEBUG_TRACE() || DEBUG_DECODE()) X86EMU_trace_regs()
139*ece92f85SJason Jin #else
140*ece92f85SJason Jin # define TRACE_REGS()
141*ece92f85SJason Jin #endif
142*ece92f85SJason Jin 
143*ece92f85SJason Jin #ifdef DEBUG
144*ece92f85SJason Jin # define SINGLE_STEP()      if (DEBUG_STEP()) x86emu_single_step()
145*ece92f85SJason Jin #else
146*ece92f85SJason Jin # define SINGLE_STEP()
147*ece92f85SJason Jin #endif
148*ece92f85SJason Jin 
149*ece92f85SJason Jin #define TRACE_AND_STEP()    \
150*ece92f85SJason Jin     TRACE_REGS();           \
151*ece92f85SJason Jin     SINGLE_STEP()
152*ece92f85SJason Jin 
153*ece92f85SJason Jin #ifdef DEBUG
154*ece92f85SJason Jin # define START_OF_INSTR()
155*ece92f85SJason Jin # define END_OF_INSTR()     EndOfTheInstructionProcedure: x86emu_end_instr();
156*ece92f85SJason Jin # define END_OF_INSTR_NO_TRACE()    x86emu_end_instr();
157*ece92f85SJason Jin #else
158*ece92f85SJason Jin # define START_OF_INSTR()
159*ece92f85SJason Jin # define END_OF_INSTR()
160*ece92f85SJason Jin # define END_OF_INSTR_NO_TRACE()
161*ece92f85SJason Jin #endif
162*ece92f85SJason Jin 
163*ece92f85SJason Jin #ifdef DEBUG
164*ece92f85SJason Jin # define  CALL_TRACE(u,v,w,x,s)                                 \
165*ece92f85SJason Jin     if (DEBUG_TRACECALLREGS())                                  \
166*ece92f85SJason Jin         x86emu_dump_regs();                                     \
167*ece92f85SJason Jin     if (DEBUG_TRACECALL())                                      \
168*ece92f85SJason Jin         printk("%04x:%04x: CALL %s%04x:%04x\n", u , v, s, w, x);
169*ece92f85SJason Jin # define RETURN_TRACE(n,u,v)                                    \
170*ece92f85SJason Jin     if (DEBUG_TRACECALLREGS())                                  \
171*ece92f85SJason Jin         x86emu_dump_regs();                                     \
172*ece92f85SJason Jin     if (DEBUG_TRACECALL())                                      \
173*ece92f85SJason Jin         printk("%04x:%04x: %s\n",u,v,n);
174*ece92f85SJason Jin #else
175*ece92f85SJason Jin # define CALL_TRACE(u,v,w,x,s)
176*ece92f85SJason Jin # define RETURN_TRACE(n,u,v)
177*ece92f85SJason Jin #endif
178*ece92f85SJason Jin 
179*ece92f85SJason Jin #ifdef DEBUG
180*ece92f85SJason Jin #define DB(x)   x
181*ece92f85SJason Jin #else
182*ece92f85SJason Jin #define DB(x)
183*ece92f85SJason Jin #endif
184*ece92f85SJason Jin 
185*ece92f85SJason Jin /*-------------------------- Function Prototypes --------------------------*/
186*ece92f85SJason Jin 
187*ece92f85SJason Jin #ifdef  __cplusplus
188*ece92f85SJason Jin extern "C" {			/* Use "C" linkage when in C++ mode */
189*ece92f85SJason Jin #endif
190*ece92f85SJason Jin 
191*ece92f85SJason Jin 	extern void x86emu_inc_decoded_inst_len(int x);
192*ece92f85SJason Jin 	extern void x86emu_decode_printf(char *x);
193*ece92f85SJason Jin 	extern void x86emu_decode_printf2(char *x, int y);
194*ece92f85SJason Jin 	extern void x86emu_just_disassemble(void);
195*ece92f85SJason Jin 	extern void x86emu_single_step(void);
196*ece92f85SJason Jin 	extern void x86emu_end_instr(void);
197*ece92f85SJason Jin 	extern void x86emu_dump_regs(void);
198*ece92f85SJason Jin 	extern void x86emu_dump_xregs(void);
199*ece92f85SJason Jin 	extern void x86emu_print_int_vect(u16 iv);
200*ece92f85SJason Jin 	extern void x86emu_instrument_instruction(void);
201*ece92f85SJason Jin 	extern void x86emu_check_ip_access(void);
202*ece92f85SJason Jin 	extern void x86emu_check_sp_access(void);
203*ece92f85SJason Jin 	extern void x86emu_check_mem_access(u32 p);
204*ece92f85SJason Jin 	extern void x86emu_check_data_access(uint s, uint o);
205*ece92f85SJason Jin 
206*ece92f85SJason Jin #ifdef  __cplusplus
207*ece92f85SJason Jin }				/* End of "C" linkage for C++       */
208*ece92f85SJason Jin #endif
209*ece92f85SJason Jin #endif				/* __X86EMU_DEBUG_H */
210