/****************************************************************************
*
*			Realmode X86 Emulator Library
*
*		Copyright (C) 1991-2004 SciTech Software, Inc.
*		     Copyright (C) David Mosberger-Tang
*		       Copyright (C) 1999 Egbert Eich
*
*  ========================================================================
*
*  Permission to use, copy, modify, distribute, and sell this software and
*  its documentation for any purpose is hereby granted without fee,
*  provided that the above copyright notice appear in all copies and that
*  both that copyright notice and this permission notice appear in
*  supporting documentation, and that the name of the authors not be used
*  in advertising or publicity pertaining to distribution of the software
*  without specific, written prior permission.	The authors makes no
*  representations about the suitability of this software for any purpose.
*  It is provided "as is" without express or implied warranty.
*
*  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
*  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
*  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
*  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
*  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
*  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
*  PERFORMANCE OF THIS SOFTWARE.
*
*  ========================================================================
*
* Language:	ANSI C
* Environment:	Any
* Developer:	Kendall Bennett
*
* Description:	Header file for debug definitions.
*
****************************************************************************/

#ifndef __X86EMU_DEBUG_H
#define __X86EMU_DEBUG_H

/*---------------------- Macros and type definitions ----------------------*/

/* checks to be enabled for "runtime" */

#define CHECK_IP_FETCH_F		0x1
#define CHECK_SP_ACCESS_F		0x2
#define CHECK_MEM_ACCESS_F		0x4	/*using regular linear pointer */
#define CHECK_DATA_ACCESS_F		0x8	/*using segment:offset */

#ifdef CONFIG_X86EMU_DEBUG
# define CHECK_IP_FETCH()		(M.x86.check & CHECK_IP_FETCH_F)
# define CHECK_SP_ACCESS()		(M.x86.check & CHECK_SP_ACCESS_F)
# define CHECK_MEM_ACCESS()		(M.x86.check & CHECK_MEM_ACCESS_F)
# define CHECK_DATA_ACCESS()		(M.x86.check & CHECK_DATA_ACCESS_F)
#else
# define CHECK_IP_FETCH()
# define CHECK_SP_ACCESS()
# define CHECK_MEM_ACCESS()
# define CHECK_DATA_ACCESS()
#endif

#ifdef CONFIG_X86EMU_DEBUG
# define DEBUG_INSTRUMENT()	(M.x86.debug & DEBUG_INSTRUMENT_F)
# define DEBUG_DECODE()		(M.x86.debug & DEBUG_DECODE_F)
# define DEBUG_TRACE()		(M.x86.debug & DEBUG_TRACE_F)
# define DEBUG_STEP()		(M.x86.debug & DEBUG_STEP_F)
# define DEBUG_DISASSEMBLE()	(M.x86.debug & DEBUG_DISASSEMBLE_F)
# define DEBUG_BREAK()		(M.x86.debug & DEBUG_BREAK_F)
# define DEBUG_SVC()		(M.x86.debug & DEBUG_SVC_F)
# define DEBUG_SAVE_IP_CS()	(M.x86.debug & DEBUG_SAVE_CS_IP)

# define DEBUG_FS()		(M.x86.debug & DEBUG_FS_F)
# define DEBUG_PROC()		(M.x86.debug & DEBUG_PROC_F)
# define DEBUG_SYSINT()		(M.x86.debug & DEBUG_SYSINT_F)
# define DEBUG_TRACECALL()	(M.x86.debug & DEBUG_TRACECALL_F)
# define DEBUG_TRACECALLREGS()	(M.x86.debug & DEBUG_TRACECALL_REGS_F)
# define DEBUG_SYS()		(M.x86.debug & DEBUG_SYS_F)
# define DEBUG_MEM_TRACE()	(M.x86.debug & DEBUG_MEM_TRACE_F)
# define DEBUG_IO_TRACE()	(M.x86.debug & DEBUG_IO_TRACE_F)
# define DEBUG_DECODE_NOPRINT() (M.x86.debug & DEBUG_DECODE_NOPRINT_F)
#else
# define DEBUG_INSTRUMENT()	0
# define DEBUG_DECODE()		0
# define DEBUG_TRACE()		0
# define DEBUG_STEP()		0
# define DEBUG_DISASSEMBLE()	0
# define DEBUG_BREAK()		0
# define DEBUG_SVC()		0
# define DEBUG_SAVE_IP_CS()	0
# define DEBUG_FS()		0
# define DEBUG_PROC()		0
# define DEBUG_SYSINT()		0
# define DEBUG_TRACECALL()	0
# define DEBUG_TRACECALLREGS()	0
# define DEBUG_SYS()		0
# define DEBUG_MEM_TRACE()	0
# define DEBUG_IO_TRACE()	0
# define DEBUG_DECODE_NOPRINT() 0
#endif

# define ERR_PRINTF(x)		printf(x)
# define ERR_PRINTF2(x, y)	printf(x, y)

#ifdef CONFIG_X86EMU_DEBUG


# define DECODE_PRINTF(x)	if (DEBUG_DECODE()) \
				    x86emu_decode_printf(x)
# define DECODE_PRINTF2(x,y)	if (DEBUG_DECODE()) \
				    x86emu_decode_printf2(x,y)

/*
 * The following allow us to look at the bytes of an instruction.  The
 * first INCR_INSTRN_LEN, is called everytime bytes are consumed in
 * the decoding process.  The SAVE_IP_CS is called initially when the
 * major opcode of the instruction is accessed.
 */
#define INC_DECODED_INST_LEN(x)			    \
    if (DEBUG_DECODE())				    \
	x86emu_inc_decoded_inst_len(x)

#define SAVE_IP_CS(x,y)						\
    if (DEBUG_DECODE() | DEBUG_TRACECALL() | DEBUG_BREAK() \
	      | DEBUG_IO_TRACE() | DEBUG_SAVE_IP_CS()) { \
	M.x86.saved_cs = x;					\
	M.x86.saved_ip = y;					\
    }
#else
# define INC_DECODED_INST_LEN(x)
# define DECODE_PRINTF(x)
# define DECODE_PRINTF2(x,y)
# define SAVE_IP_CS(x,y)
#endif

#ifdef CONFIG_X86EMU_DEBUG
#define TRACE_REGS()					    \
    if (DEBUG_DISASSEMBLE()) {				    \
	x86emu_just_disassemble();			    \
	goto EndOfTheInstructionProcedure;		    \
    }							    \
    if (DEBUG_TRACE() || DEBUG_DECODE()) X86EMU_trace_regs()
#else
# define TRACE_REGS()
#endif

#ifdef CONFIG_X86EMU_DEBUG
# define SINGLE_STEP()	    if (DEBUG_STEP()) x86emu_single_step()
#else
# define SINGLE_STEP()
#endif

#define TRACE_AND_STEP()    \
    TRACE_REGS();	    \
    SINGLE_STEP()

#ifdef CONFIG_X86EMU_DEBUG
# define START_OF_INSTR()
# define END_OF_INSTR()	    EndOfTheInstructionProcedure: x86emu_end_instr();
# define END_OF_INSTR_NO_TRACE()    x86emu_end_instr();
#else
# define START_OF_INSTR()
# define END_OF_INSTR()
# define END_OF_INSTR_NO_TRACE()
#endif

#ifdef CONFIG_X86EMU_DEBUG
# define  CALL_TRACE(u,v,w,x,s)					\
    if (DEBUG_TRACECALLREGS())					\
	x86emu_dump_regs();					\
    if (DEBUG_TRACECALL())					\
	printk("%04x:%04x: CALL %s%04x:%04x\n", u , v, s, w, x);
# define RETURN_TRACE(n,u,v)					\
    if (DEBUG_TRACECALLREGS())					\
	x86emu_dump_regs();					\
    if (DEBUG_TRACECALL())					\
	printk("%04x:%04x: %s\n",u,v,n);
#else
# define CALL_TRACE(u,v,w,x,s)
# define RETURN_TRACE(n,u,v)
#endif

#ifdef CONFIG_X86EMU_DEBUG
#define DB(x)	x
#else
#define DB(x)
#endif

/*-------------------------- Function Prototypes --------------------------*/

#ifdef	__cplusplus
extern "C" {			/* Use "C" linkage when in C++ mode */
#endif

	extern void x86emu_inc_decoded_inst_len(int x);
	extern void x86emu_decode_printf(char *x);
	extern void x86emu_decode_printf2(char *x, int y);
	extern void x86emu_just_disassemble(void);
	extern void x86emu_single_step(void);
	extern void x86emu_end_instr(void);
	extern void x86emu_dump_regs(void);
	extern void x86emu_dump_xregs(void);
	extern void x86emu_print_int_vect(u16 iv);
	extern void x86emu_instrument_instruction(void);
	extern void x86emu_check_ip_access(void);
	extern void x86emu_check_sp_access(void);
	extern void x86emu_check_mem_access(u32 p);
	extern void x86emu_check_data_access(uint s, uint o);

#ifdef	__cplusplus
}				/* End of "C" linkage for C++	    */
#endif
#endif				/* __X86EMU_DEBUG_H */
