/****************************************************************************
*
*                       Realmode X86 Emulator Library
*
*               Copyright (C) 1996-1999 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 public specific functions.
*               Any application linking against us should only
*               include this header
*
****************************************************************************/

#ifndef __X86EMU_X86EMU_H
#define __X86EMU_X86EMU_H

#include <asm/types.h>
#include <common.h>
#include <pci.h>
#include <asm/io.h>
#define X86API
#define X86APIP *
typedef u16 X86EMU_pioAddr;

#include "x86emu/regs.h"

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

#if defined(CONFIG_ARM)
#define GAS_LINE_COMMENT	"@"
#elif defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_X86)
#define GAS_LINE_COMMENT	"#"
#elif defined (CONFIG_SH)
#define GAS_LINE_COMMENT	"!"
#endif

#define GOT2_TYPE	".got2,\"aw\"\t"GAS_LINE_COMMENT

#pragma pack(1)

/****************************************************************************
REMARKS:
Data structure containing ponters to programmed I/O functions used by the
emulator. This is used so that the user program can hook all programmed
I/O for the emulator to handled as necessary by the user program. By
default the emulator contains simple functions that do not do access the
hardware in any way. To allow the emualtor access the hardware, you will
need to override the programmed I/O functions using the X86EMU_setupPioFuncs
function.

HEADER:
x86emu.h

MEMBERS:
inb     - Function to read a byte from an I/O port
inw     - Function to read a word from an I/O port
inl     - Function to read a dword from an I/O port
outb    - Function to write a byte to an I/O port
outw    - Function to write a word to an I/O port
outl    - Function to write a dword to an I/O port
****************************************************************************/
typedef struct {
	u8(X86APIP inb) (X86EMU_pioAddr addr);
	u16(X86APIP inw) (X86EMU_pioAddr addr);
	u32(X86APIP inl) (X86EMU_pioAddr addr);
	void (X86APIP outb) (X86EMU_pioAddr addr, u8 val);
	void (X86APIP outw) (X86EMU_pioAddr addr, u16 val);
	void (X86APIP outl) (X86EMU_pioAddr addr, u32 val);
} X86EMU_pioFuncs;

/****************************************************************************
REMARKS:
Data structure containing ponters to memory access functions used by the
emulator. This is used so that the user program can hook all memory
access functions as necessary for the emulator. By default the emulator
contains simple functions that only access the internal memory of the
emulator. If you need specialised functions to handle access to different
types of memory (ie: hardware framebuffer accesses and BIOS memory access
etc), you will need to override this using the X86EMU_setupMemFuncs
function.

HEADER:
x86emu.h

MEMBERS:
rdb     - Function to read a byte from an address
rdw     - Function to read a word from an address
rdl     - Function to read a dword from an address
wrb     - Function to write a byte to an address
wrw     - Function to write a word to an address
wrl     - Function to write a dword to an address
****************************************************************************/
typedef struct {
	u8(X86APIP rdb) (u32 addr);
	u16(X86APIP rdw) (u32 addr);
	u32(X86APIP rdl) (u32 addr);
	void (X86APIP wrb) (u32 addr, u8 val);
	void (X86APIP wrw) (u32 addr, u16 val);
	void (X86APIP wrl) (u32 addr, u32 val);
} X86EMU_memFuncs;

/****************************************************************************
  Here are the default memory read and write
  function in case they are needed as fallbacks.
***************************************************************************/
extern u8 X86API rdb(u32 addr);
extern u16 X86API rdw(u32 addr);
extern u32 X86API rdl(u32 addr);
extern void X86API wrb(u32 addr, u8 val);
extern void X86API wrw(u32 addr, u16 val);
extern void X86API wrl(u32 addr, u32 val);

#pragma pack()

/*--------------------- type definitions -----------------------------------*/

typedef void (X86APIP X86EMU_intrFuncs) (int num);
extern X86EMU_intrFuncs _X86EMU_intrTab[256];

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

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

	void X86EMU_setupMemFuncs(X86EMU_memFuncs * funcs);
	void X86EMU_setupPioFuncs(X86EMU_pioFuncs * funcs);
	void X86EMU_setupIntrFuncs(X86EMU_intrFuncs funcs[]);
	void X86EMU_setupIntrFunc(int intnum, X86EMU_intrFuncs func);
	void X86EMU_prepareForInt(int num);

/* decode.c */

	void X86EMU_exec(void);
	void X86EMU_halt_sys(void);

#ifdef CONFIG_X86EMU_DEBUG
#define HALT_SYS()  \
    printf("halt_sys: file %s, line %d\n", __FILE__, __LINE__), \
    X86EMU_halt_sys()
#else
#define HALT_SYS()  X86EMU_halt_sys()
#endif

/* Debug options */

#define DEBUG_DECODE_F          0x0001	/* print decoded instruction  */
#define DEBUG_TRACE_F           0x0002	/* dump regs before/after execution */
#define DEBUG_STEP_F            0x0004
#define DEBUG_DISASSEMBLE_F     0x0008
#define DEBUG_BREAK_F           0x0010
#define DEBUG_SVC_F             0x0020
#define DEBUG_SAVE_CS_IP        0x0040
#define DEBUG_FS_F              0x0080
#define DEBUG_PROC_F            0x0100
#define DEBUG_SYSINT_F          0x0200	/* bios system interrupts. */
#define DEBUG_TRACECALL_F       0x0400
#define DEBUG_INSTRUMENT_F      0x0800
#define DEBUG_MEM_TRACE_F       0x1000
#define DEBUG_IO_TRACE_F        0x2000
#define DEBUG_TRACECALL_REGS_F  0x4000
#define DEBUG_DECODE_NOPRINT_F  0x8000
#define DEBUG_EXIT              0x10000
#define DEBUG_SYS_F             (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F)

	void X86EMU_trace_regs(void);
	void X86EMU_trace_xregs(void);
	void X86EMU_dump_memory(u16 seg, u16 off, u32 amt);
	int X86EMU_trace_on(void);
	int X86EMU_trace_off(void);

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