diff options
Diffstat (limited to 'drivers/bios_emulator/include')
| -rw-r--r-- | drivers/bios_emulator/include/biosemu.h | 392 | ||||
| -rw-r--r-- | drivers/bios_emulator/include/x86emu.h | 191 | ||||
| -rw-r--r-- | drivers/bios_emulator/include/x86emu/debug.h | 209 | ||||
| -rw-r--r-- | drivers/bios_emulator/include/x86emu/decode.h | 88 | ||||
| -rw-r--r-- | drivers/bios_emulator/include/x86emu/ops.h | 45 | ||||
| -rw-r--r-- | drivers/bios_emulator/include/x86emu/prim_asm.h | 970 | ||||
| -rw-r--r-- | drivers/bios_emulator/include/x86emu/prim_ops.h | 141 | ||||
| -rw-r--r-- | drivers/bios_emulator/include/x86emu/regs.h | 340 | ||||
| -rw-r--r-- | drivers/bios_emulator/include/x86emu/x86emui.h | 101 | 
9 files changed, 2477 insertions, 0 deletions
| diff --git a/drivers/bios_emulator/include/biosemu.h b/drivers/bios_emulator/include/biosemu.h new file mode 100644 index 000000000..13cb3170c --- /dev/null +++ b/drivers/bios_emulator/include/biosemu.h @@ -0,0 +1,392 @@ +/**************************************************************************** +* +*                        BIOS emulator and interface +*                      to Realmode X86 Emulator Library +* +*               Copyright (C) 1996-1999 SciTech Software, Inc. +* +*  ======================================================================== +* +*  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 the real mode x86 BIOS emulator, which is +*               used to warmboot any number of VGA compatible PCI/AGP +*               controllers under any OS, on any processor family that +*               supports PCI. We also allow the user application to call +*               real mode BIOS functions and Int 10h functions (including +*               the VESA BIOS). +* +****************************************************************************/ + +#ifndef __BIOSEMU_H +#define __BIOSEMU_H + +#ifdef __KERNEL__ +#include "x86emu.h" +#else +#include "x86emu.h" +#include "pmapi.h" +#include "pcilib.h" +#endif + +/*---------------------- Macros and type definitions ----------------------*/ + +#pragma pack(1) + +#ifndef __KERNEL__ +/**************************************************************************** +REMARKS: +Data structure used to describe the details specific to a particular VGA +controller. This information is used to allow the VGA controller to be +swapped on the fly within the BIOS emulator. + +HEADER: +biosemu.h + +MEMBERS: +pciInfo         - PCI device information block for the controller +BIOSImage       - Pointer to a read/write copy of the BIOS image +BIOSImageLen    - Length of the BIOS image +LowMem          - Copy of key low memory areas +****************************************************************************/ +typedef struct { +	PCIDeviceInfo *pciInfo; +	void *BIOSImage; +	ulong BIOSImageLen; +	uchar LowMem[1536]; +} BE_VGAInfo; +#else +/**************************************************************************** +REMARKS: +Data structure used to describe the details for the BIOS emulator system +environment as used by the X86 emulator library. + +HEADER: +biosemu.h + +MEMBERS: +vgaInfo         - VGA BIOS information structure +biosmem_base    - Base of the BIOS image +biosmem_limit   - Limit of the BIOS image +busmem_base     - Base of the VGA bus memory +****************************************************************************/ +typedef struct { +	int function; +	int device; +	int bus; +	u32 VendorID; +	u32 DeviceID; +	pci_dev_t pcidev; +	void *BIOSImage; +	u32 BIOSImageLen; +	u8 LowMem[1536]; +} BE_VGAInfo; + +#endif				/* __KERNEL__ */ + +#define CRT_C   24		/* 24  CRT Controller Registers             */ +#define ATT_C   21		/* 21  Attribute Controller Registers       */ +#define GRA_C   9		/* 9   Graphics Controller Registers        */ +#define SEQ_C   5		/* 5   Sequencer Registers                  */ +#define PAL_C   768		/* 768 Palette Registers                    */ + +/**************************************************************************** +REMARKS: +Data structure used to describe the details for the BIOS emulator system +environment as used by the X86 emulator library. + +HEADER: +biosemu.h + +MEMBERS: +vgaInfo         - VGA BIOS information structure +biosmem_base    - Base of the BIOS image +biosmem_limit   - Limit of the BIOS image +busmem_base     - Base of the VGA bus memory +timer           - Timer used to emulate PC timer ports +timer0          - Latched value for timer 0 +timer0Latched   - True if timer 0 value was just latched +timer2          - Current value for timer 2 +emulateVGA      - True to emulate VGA I/O and memory accesses +****************************************************************************/ + +typedef struct { +	BE_VGAInfo vgaInfo; +	ulong biosmem_base; +	ulong biosmem_limit; +	ulong busmem_base; + +	u32 timer0; +	int timer0Latched; +	u32 timer1; +	int timer1Latched; +	u32 timer2; +	int timer2Latched; + +	int emulateVGA; +	u8 emu61; +	u8 emu70; +	int flipFlop3C0; +	u32 configAddress; +	u8 emu3C0; +	u8 emu3C1[ATT_C]; +	u8 emu3C2; +	u8 emu3C4; +	u8 emu3C5[SEQ_C]; +	u8 emu3C6; +	uint emu3C7; +	uint emu3C8; +	u8 emu3C9[PAL_C]; +	u8 emu3CE; +	u8 emu3CF[GRA_C]; +	u8 emu3D4; +	u8 emu3D5[CRT_C]; +	u8 emu3DA; + +} BE_sysEnv; + +#ifdef __KERNEL__ + +/* Define some types when compiling for the Linux kernel that normally + * come from the SciTech PM library. + */ + +/**************************************************************************** +REMARKS: +Structure describing the 32-bit extended x86 CPU registers + +HEADER: +pmapi.h + +MEMBERS: +eax     - Value of the EAX register +ebx     - Value of the EBX register +ecx     - Value of the ECX register +edx     - Value of the EDX register +esi     - Value of the ESI register +edi     - Value of the EDI register +cflag   - Value of the carry flag +****************************************************************************/ +typedef struct { +	u32 eax; +	u32 ebx; +	u32 ecx; +	u32 edx; +	u32 esi; +	u32 edi; +	u32 cflag; +} RMDWORDREGS; + +/**************************************************************************** +REMARKS: +Structure describing the 16-bit x86 CPU registers + +HEADER: +pmapi.h + +MEMBERS: +ax      - Value of the AX register +bx      - Value of the BX register +cx      - Value of the CX register +dx      - Value of the DX register +si      - Value of the SI register +di      - Value of the DI register +cflag   - Value of the carry flag +****************************************************************************/ +#ifdef __BIG_ENDIAN__ +typedef struct { +	u16 ax_hi, ax; +	u16 bx_hi, bx; +	u16 cx_hi, cx; +	u16 dx_hi, dx; +	u16 si_hi, si; +	u16 di_hi, di; +	u16 cflag_hi, cflag; +} RMWORDREGS; +#else +typedef struct { +	u16 ax, ax_hi; +	u16 bx, bx_hi; +	u16 cx, cx_hi; +	u16 dx, dx_hi; +	u16 si, si_hi; +	u16 di, di_hi; +	u16 cflag, cflag_hi; +} RMWORDREGS; +#endif + +/**************************************************************************** +REMARKS: +Structure describing the 8-bit x86 CPU registers + +HEADER: +pmapi.h + +MEMBERS: +al      - Value of the AL register +ah      - Value of the AH register +bl      - Value of the BL register +bh      - Value of the BH register +cl      - Value of the CL register +ch      - Value of the CH register +dl      - Value of the DL register +dh      - Value of the DH register +****************************************************************************/ +#ifdef __BIG_ENDIAN__ +typedef struct { +	u16 ax_hi; +	u8 ah, al; +	u16 bx_hi; +	u8 bh, bl; +	u16 cx_hi; +	u8 ch, cl; +	u16 dx_hi; +	u8 dh, dl; +} RMBYTEREGS; +#else +typedef struct { +	u8 al; +	u8 ah; +	u16 ax_hi; +	u8 bl; +	u8 bh; +	u16 bx_hi; +	u8 cl; +	u8 ch; +	u16 cx_hi; +	u8 dl; +	u8 dh; +	u16 dx_hi; +} RMBYTEREGS; +#endif + +/**************************************************************************** +REMARKS: +Structure describing all the x86 CPU registers + +HEADER: +pmapi.h + +MEMBERS: +e   - Member to access registers as 32-bit values +x   - Member to access registers as 16-bit values +h   - Member to access registers as 8-bit values +****************************************************************************/ +typedef union { +	RMDWORDREGS e; +	RMWORDREGS x; +	RMBYTEREGS h; +} RMREGS; + +/**************************************************************************** +REMARKS: +Structure describing all the x86 segment registers + +HEADER: +pmapi.h + +MEMBERS: +es  - ES segment register +cs  - CS segment register +ss  - SS segment register +ds  - DS segment register +fs  - FS segment register +gs  - GS segment register +****************************************************************************/ +typedef struct { +	u16 es; +	u16 cs; +	u16 ss; +	u16 ds; +	u16 fs; +	u16 gs; +} RMSREGS; + +#endif				/* __KERNEL__ */ + +#ifndef __KERNEL__ + +/**************************************************************************** +REMARKS: +Structure defining all the BIOS Emulator API functions as exported from +the Binary Portable DLL. +{secret} +****************************************************************************/ +typedef struct { +	ulong dwSize; +	 ibool(PMAPIP BE_init) (u32 debugFlags, int memSize, BE_VGAInfo * info); +	void (PMAPIP BE_setVGA) (BE_VGAInfo * info); +	void (PMAPIP BE_getVGA) (BE_VGAInfo * info); +	void *(PMAPIP BE_mapRealPointer) (uint r_seg, uint r_off); +	void *(PMAPIP BE_getVESABuf) (uint * len, uint * rseg, uint * roff); +	void (PMAPIP BE_callRealMode) (uint seg, uint off, RMREGS * regs, +				       RMSREGS * sregs); +	int (PMAPIP BE_int86) (int intno, RMREGS * in, RMREGS * out); +	int (PMAPIP BE_int86x) (int intno, RMREGS * in, RMREGS * out, +				RMSREGS * sregs); +	void *reserved1; +	void (PMAPIP BE_exit) (void); +} BE_exports; + +/**************************************************************************** +REMARKS: +Function pointer type for the Binary Portable DLL initialisation entry point. +{secret} +****************************************************************************/ +typedef BE_exports *(PMAPIP BE_initLibrary_t) (PM_imports * PMImp); +#endif + +#pragma pack() + +/*---------------------------- Global variables ---------------------------*/ + +#ifdef  __cplusplus +extern "C" {			/* Use "C" linkage when in C++ mode */ +#endif + +/* {secret} Global BIOS emulator system environment */ +	extern BE_sysEnv _BE_env; + +/*-------------------------- Function Prototypes --------------------------*/ + +/* BIOS emulator library entry points */ +	int X86API BE_init(u32 debugFlags, int memSize, BE_VGAInfo * info, +			   int shared); +	void X86API BE_setVGA(BE_VGAInfo * info); +	void X86API BE_getVGA(BE_VGAInfo * info); +	void X86API BE_setDebugFlags(u32 debugFlags); +	void *X86API BE_mapRealPointer(uint r_seg, uint r_off); +	void *X86API BE_getVESABuf(uint * len, uint * rseg, uint * roff); +	void X86API BE_callRealMode(uint seg, uint off, RMREGS * regs, +				    RMSREGS * sregs); +	int X86API BE_int86(int intno, RMREGS * in, RMREGS * out); +	int X86API BE_int86x(int intno, RMREGS * in, RMREGS * out, +			     RMSREGS * sregs); +	void X86API BE_exit(void); + +#ifdef  __cplusplus +}				/* End of "C" linkage for C++       */ +#endif +#endif				/* __BIOSEMU_H */ diff --git a/drivers/bios_emulator/include/x86emu.h b/drivers/bios_emulator/include/x86emu.h new file mode 100644 index 000000000..6004beb05 --- /dev/null +++ b/drivers/bios_emulator/include/x86emu.h @@ -0,0 +1,191 @@ +/**************************************************************************** +* +*                       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 ----------------------*/ + +#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_prepareForInt(int num); + +/* decode.c */ + +	void X86EMU_exec(void); +	void X86EMU_halt_sys(void); + +#ifdef  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 */ diff --git a/drivers/bios_emulator/include/x86emu/debug.h b/drivers/bios_emulator/include/x86emu/debug.h new file mode 100644 index 000000000..268c9d391 --- /dev/null +++ b/drivers/bios_emulator/include/x86emu/debug.h @@ -0,0 +1,209 @@ +/**************************************************************************** +* +*			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 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 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 + +#ifdef 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 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 DEBUG +# define SINGLE_STEP()	    if (DEBUG_STEP()) x86emu_single_step() +#else +# define SINGLE_STEP() +#endif + +#define TRACE_AND_STEP()    \ +    TRACE_REGS();	    \ +    SINGLE_STEP() + +#ifdef 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 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 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 */ diff --git a/drivers/bios_emulator/include/x86emu/decode.h b/drivers/bios_emulator/include/x86emu/decode.h new file mode 100644 index 000000000..77769f009 --- /dev/null +++ b/drivers/bios_emulator/include/x86emu/decode.h @@ -0,0 +1,88 @@ +/**************************************************************************** +* +*                       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 instruction decoding logic. +* +****************************************************************************/ + +#ifndef __X86EMU_DECODE_H +#define __X86EMU_DECODE_H + +/*---------------------- Macros and type definitions ----------------------*/ + +/* Instruction Decoding Stuff */ + +#define FETCH_DECODE_MODRM(mod,rh,rl)   fetch_decode_modrm(&mod,&rh,&rl) +#define DECODE_RM_BYTE_REGISTER(r)      decode_rm_byte_register(r) +#define DECODE_RM_WORD_REGISTER(r)      decode_rm_word_register(r) +#define DECODE_RM_LONG_REGISTER(r)      decode_rm_long_register(r) +#define DECODE_CLEAR_SEGOVR()           M.x86.mode &= ~SYSMODE_CLRMASK + +/*-------------------------- Function Prototypes --------------------------*/ + +#ifdef  __cplusplus +extern "C" {                        /* Use "C" linkage when in C++ mode */ +#endif + +void    x86emu_intr_raise (u8 type); +void    fetch_decode_modrm (int *mod,int *regh,int *regl); +u8      fetch_byte_imm (void); +u16     fetch_word_imm (void); +u32     fetch_long_imm (void); +u8      fetch_data_byte (uint offset); +u8      fetch_data_byte_abs (uint segment, uint offset); +u16     fetch_data_word (uint offset); +u16     fetch_data_word_abs (uint segment, uint offset); +u32     fetch_data_long (uint offset); +u32     fetch_data_long_abs (uint segment, uint offset); +void    store_data_byte (uint offset, u8 val); +void    store_data_byte_abs (uint segment, uint offset, u8 val); +void    store_data_word (uint offset, u16 val); +void    store_data_word_abs (uint segment, uint offset, u16 val); +void    store_data_long (uint offset, u32 val); +void    store_data_long_abs (uint segment, uint offset, u32 val); +u8*     decode_rm_byte_register(int reg); +u16*    decode_rm_word_register(int reg); +u32*    decode_rm_long_register(int reg); +u16*    decode_rm_seg_register(int reg); +unsigned decode_rm00_address(int rm); +unsigned decode_rm01_address(int rm); +unsigned decode_rm10_address(int rm); +unsigned decode_rmXX_address(int mod, int rm); + +#ifdef  __cplusplus +}                                   /* End of "C" linkage for C++       */ +#endif + +#endif /* __X86EMU_DECODE_H */ diff --git a/drivers/bios_emulator/include/x86emu/ops.h b/drivers/bios_emulator/include/x86emu/ops.h new file mode 100644 index 000000000..a4f2316ba --- /dev/null +++ b/drivers/bios_emulator/include/x86emu/ops.h @@ -0,0 +1,45 @@ +/**************************************************************************** +* +*                       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 operand decoding functions. +* +****************************************************************************/ + +#ifndef __X86EMU_OPS_H +#define __X86EMU_OPS_H + +extern void (*x86emu_optab[0x100])(u8 op1); +extern void (*x86emu_optab2[0x100])(u8 op2); + +#endif /* __X86EMU_OPS_H */ diff --git a/drivers/bios_emulator/include/x86emu/prim_asm.h b/drivers/bios_emulator/include/x86emu/prim_asm.h new file mode 100644 index 000000000..4cb4cab5d --- /dev/null +++ b/drivers/bios_emulator/include/x86emu/prim_asm.h @@ -0,0 +1,970 @@ +/**************************************************************************** +* +*                       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:     Watcom C++ 10.6 or later +* Environment:  Any +* Developer:    Kendall Bennett +* +* Description:  Inline assembler versions of the primitive operand +*               functions for faster performance. At the moment this is +*               x86 inline assembler, but these functions could be replaced +*               with native inline assembler for each supported processor +*               platform. +* +****************************************************************************/ + +#ifndef __X86EMU_PRIM_ASM_H +#define __X86EMU_PRIM_ASM_H + +#ifdef  __WATCOMC__ + +#ifndef VALIDATE +#define __HAVE_INLINE_ASSEMBLER__ +#endif + +u32 get_flags_asm(void); +#pragma aux get_flags_asm =         \ +    "pushf"                         \ +    "pop    eax"                    \ +    value [eax]                     \ +    modify exact [eax]; + +u16 aaa_word_asm(u32 * flags, u16 d); +#pragma aux aaa_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "aaa"                           \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax]                 \ +    value [ax]                      \ +    modify exact [ax]; + +u16 aas_word_asm(u32 * flags, u16 d); +#pragma aux aas_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "aas"                           \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax]                 \ +    value [ax]                      \ +    modify exact [ax]; + +u16 aad_word_asm(u32 * flags, u16 d); +#pragma aux aad_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "aad"                           \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax]                 \ +    value [ax]                      \ +    modify exact [ax]; + +u16 aam_word_asm(u32 * flags, u8 d); +#pragma aux aam_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "aam"                           \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al]                 \ +    value [ax]                      \ +    modify exact [ax]; + +u8 adc_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux adc_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "adc    al,bl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [bl]            \ +    value [al]                      \ +    modify exact [al bl]; + +u16 adc_word_asm(u32 * flags, u16 d, u16 s); +#pragma aux adc_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "adc    ax,bx"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [bx]            \ +    value [ax]                      \ +    modify exact [ax bx]; + +u32 adc_long_asm(u32 * flags, u32 d, u32 s); +#pragma aux adc_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "adc    eax,ebx"                \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [ebx]          \ +    value [eax]                     \ +    modify exact [eax ebx]; + +u8 add_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux add_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "add    al,bl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [bl]            \ +    value [al]                      \ +    modify exact [al bl]; + +u16 add_word_asm(u32 * flags, u16 d, u16 s); +#pragma aux add_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "add    ax,bx"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [bx]            \ +    value [ax]                      \ +    modify exact [ax bx]; + +u32 add_long_asm(u32 * flags, u32 d, u32 s); +#pragma aux add_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "add    eax,ebx"                \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [ebx]          \ +    value [eax]                     \ +    modify exact [eax ebx]; + +u8 and_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux and_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "and    al,bl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [bl]            \ +    value [al]                      \ +    modify exact [al bl]; + +u16 and_word_asm(u32 * flags, u16 d, u16 s); +#pragma aux and_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "and    ax,bx"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [bx]            \ +    value [ax]                      \ +    modify exact [ax bx]; + +u32 and_long_asm(u32 * flags, u32 d, u32 s); +#pragma aux and_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "and    eax,ebx"                \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [ebx]          \ +    value [eax]                     \ +    modify exact [eax ebx]; + +u8 cmp_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux cmp_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "cmp    al,bl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [bl]            \ +    value [al]                      \ +    modify exact [al bl]; + +u16 cmp_word_asm(u32 * flags, u16 d, u16 s); +#pragma aux cmp_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "cmp    ax,bx"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [bx]            \ +    value [ax]                      \ +    modify exact [ax bx]; + +u32 cmp_long_asm(u32 * flags, u32 d, u32 s); +#pragma aux cmp_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "cmp    eax,ebx"                \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [ebx]          \ +    value [eax]                     \ +    modify exact [eax ebx]; + +u8 daa_byte_asm(u32 * flags, u8 d); +#pragma aux daa_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "daa"                           \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al]                 \ +    value [al]                      \ +    modify exact [al]; + +u8 das_byte_asm(u32 * flags, u8 d); +#pragma aux das_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "das"                           \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al]                 \ +    value [al]                      \ +    modify exact [al]; + +u8 dec_byte_asm(u32 * flags, u8 d); +#pragma aux dec_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "dec    al"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al]                 \ +    value [al]                      \ +    modify exact [al]; + +u16 dec_word_asm(u32 * flags, u16 d); +#pragma aux dec_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "dec    ax"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax]                 \ +    value [ax]                      \ +    modify exact [ax]; + +u32 dec_long_asm(u32 * flags, u32 d); +#pragma aux dec_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "dec    eax"                    \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax]                \ +    value [eax]                     \ +    modify exact [eax]; + +u8 inc_byte_asm(u32 * flags, u8 d); +#pragma aux inc_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "inc    al"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al]                 \ +    value [al]                      \ +    modify exact [al]; + +u16 inc_word_asm(u32 * flags, u16 d); +#pragma aux inc_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "inc    ax"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax]                 \ +    value [ax]                      \ +    modify exact [ax]; + +u32 inc_long_asm(u32 * flags, u32 d); +#pragma aux inc_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "inc    eax"                    \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax]                \ +    value [eax]                     \ +    modify exact [eax]; + +u8 or_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux or_byte_asm =           \ +    "push   [edi]"                  \ +    "popf"                          \ +    "or al,bl"                      \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [bl]            \ +    value [al]                      \ +    modify exact [al bl]; + +u16 or_word_asm(u32 * flags, u16 d, u16 s); +#pragma aux or_word_asm =           \ +    "push   [edi]"                  \ +    "popf"                          \ +    "or ax,bx"                      \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [bx]            \ +    value [ax]                      \ +    modify exact [ax bx]; + +u32 or_long_asm(u32 * flags, u32 d, u32 s); +#pragma aux or_long_asm =           \ +    "push   [edi]"                  \ +    "popf"                          \ +    "or eax,ebx"                    \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [ebx]          \ +    value [eax]                     \ +    modify exact [eax ebx]; + +u8 neg_byte_asm(u32 * flags, u8 d); +#pragma aux neg_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "neg    al"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al]                 \ +    value [al]                      \ +    modify exact [al]; + +u16 neg_word_asm(u32 * flags, u16 d); +#pragma aux neg_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "neg    ax"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax]                 \ +    value [ax]                      \ +    modify exact [ax]; + +u32 neg_long_asm(u32 * flags, u32 d); +#pragma aux neg_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "neg    eax"                    \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax]                \ +    value [eax]                     \ +    modify exact [eax]; + +u8 not_byte_asm(u32 * flags, u8 d); +#pragma aux not_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "not    al"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al]                 \ +    value [al]                      \ +    modify exact [al]; + +u16 not_word_asm(u32 * flags, u16 d); +#pragma aux not_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "not    ax"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax]                 \ +    value [ax]                      \ +    modify exact [ax]; + +u32 not_long_asm(u32 * flags, u32 d); +#pragma aux not_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "not    eax"                    \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax]                \ +    value [eax]                     \ +    modify exact [eax]; + +u8 rcl_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux rcl_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "rcl    al,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [cl]            \ +    value [al]                      \ +    modify exact [al cl]; + +u16 rcl_word_asm(u32 * flags, u16 d, u8 s); +#pragma aux rcl_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "rcl    ax,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [cl]            \ +    value [ax]                      \ +    modify exact [ax cl]; + +u32 rcl_long_asm(u32 * flags, u32 d, u8 s); +#pragma aux rcl_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "rcl    eax,cl"                 \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [cl]           \ +    value [eax]                     \ +    modify exact [eax cl]; + +u8 rcr_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux rcr_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "rcr    al,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [cl]            \ +    value [al]                      \ +    modify exact [al cl]; + +u16 rcr_word_asm(u32 * flags, u16 d, u8 s); +#pragma aux rcr_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "rcr    ax,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [cl]            \ +    value [ax]                      \ +    modify exact [ax cl]; + +u32 rcr_long_asm(u32 * flags, u32 d, u8 s); +#pragma aux rcr_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "rcr    eax,cl"                 \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [cl]           \ +    value [eax]                     \ +    modify exact [eax cl]; + +u8 rol_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux rol_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "rol    al,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [cl]            \ +    value [al]                      \ +    modify exact [al cl]; + +u16 rol_word_asm(u32 * flags, u16 d, u8 s); +#pragma aux rol_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "rol    ax,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [cl]            \ +    value [ax]                      \ +    modify exact [ax cl]; + +u32 rol_long_asm(u32 * flags, u32 d, u8 s); +#pragma aux rol_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "rol    eax,cl"                 \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [cl]           \ +    value [eax]                     \ +    modify exact [eax cl]; + +u8 ror_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux ror_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "ror    al,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [cl]            \ +    value [al]                      \ +    modify exact [al cl]; + +u16 ror_word_asm(u32 * flags, u16 d, u8 s); +#pragma aux ror_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "ror    ax,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [cl]            \ +    value [ax]                      \ +    modify exact [ax cl]; + +u32 ror_long_asm(u32 * flags, u32 d, u8 s); +#pragma aux ror_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "ror    eax,cl"                 \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [cl]           \ +    value [eax]                     \ +    modify exact [eax cl]; + +u8 shl_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux shl_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "shl    al,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [cl]            \ +    value [al]                      \ +    modify exact [al cl]; + +u16 shl_word_asm(u32 * flags, u16 d, u8 s); +#pragma aux shl_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "shl    ax,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [cl]            \ +    value [ax]                      \ +    modify exact [ax cl]; + +u32 shl_long_asm(u32 * flags, u32 d, u8 s); +#pragma aux shl_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "shl    eax,cl"                 \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [cl]           \ +    value [eax]                     \ +    modify exact [eax cl]; + +u8 shr_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux shr_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "shr    al,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [cl]            \ +    value [al]                      \ +    modify exact [al cl]; + +u16 shr_word_asm(u32 * flags, u16 d, u8 s); +#pragma aux shr_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "shr    ax,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [cl]            \ +    value [ax]                      \ +    modify exact [ax cl]; + +u32 shr_long_asm(u32 * flags, u32 d, u8 s); +#pragma aux shr_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "shr    eax,cl"                 \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [cl]           \ +    value [eax]                     \ +    modify exact [eax cl]; + +u8 sar_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux sar_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "sar    al,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [cl]            \ +    value [al]                      \ +    modify exact [al cl]; + +u16 sar_word_asm(u32 * flags, u16 d, u8 s); +#pragma aux sar_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "sar    ax,cl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [cl]            \ +    value [ax]                      \ +    modify exact [ax cl]; + +u32 sar_long_asm(u32 * flags, u32 d, u8 s); +#pragma aux sar_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "sar    eax,cl"                 \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [cl]           \ +    value [eax]                     \ +    modify exact [eax cl]; + +u16 shld_word_asm(u32 * flags, u16 d, u16 fill, u8 s); +#pragma aux shld_word_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "shld   ax,dx,cl"               \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [dx] [cl]       \ +    value [ax]                      \ +    modify exact [ax dx cl]; + +u32 shld_long_asm(u32 * flags, u32 d, u32 fill, u8 s); +#pragma aux shld_long_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "shld   eax,edx,cl"             \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [edx] [cl]     \ +    value [eax]                     \ +    modify exact [eax edx cl]; + +u16 shrd_word_asm(u32 * flags, u16 d, u16 fill, u8 s); +#pragma aux shrd_word_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "shrd   ax,dx,cl"               \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [dx] [cl]       \ +    value [ax]                      \ +    modify exact [ax dx cl]; + +u32 shrd_long_asm(u32 * flags, u32 d, u32 fill, u8 s); +#pragma aux shrd_long_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "shrd   eax,edx,cl"             \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [edx] [cl]     \ +    value [eax]                     \ +    modify exact [eax edx cl]; + +u8 sbb_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux sbb_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "sbb    al,bl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [bl]            \ +    value [al]                      \ +    modify exact [al bl]; + +u16 sbb_word_asm(u32 * flags, u16 d, u16 s); +#pragma aux sbb_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "sbb    ax,bx"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [bx]            \ +    value [ax]                      \ +    modify exact [ax bx]; + +u32 sbb_long_asm(u32 * flags, u32 d, u32 s); +#pragma aux sbb_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "sbb    eax,ebx"                \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [ebx]          \ +    value [eax]                     \ +    modify exact [eax ebx]; + +u8 sub_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux sub_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "sub    al,bl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [bl]            \ +    value [al]                      \ +    modify exact [al bl]; + +u16 sub_word_asm(u32 * flags, u16 d, u16 s); +#pragma aux sub_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "sub    ax,bx"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [bx]            \ +    value [ax]                      \ +    modify exact [ax bx]; + +u32 sub_long_asm(u32 * flags, u32 d, u32 s); +#pragma aux sub_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "sub    eax,ebx"                \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [ebx]          \ +    value [eax]                     \ +    modify exact [eax ebx]; + +void test_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux test_byte_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "test   al,bl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [bl]            \ +    modify exact [al bl]; + +void test_word_asm(u32 * flags, u16 d, u16 s); +#pragma aux test_word_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "test   ax,bx"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [bx]            \ +    modify exact [ax bx]; + +void test_long_asm(u32 * flags, u32 d, u32 s); +#pragma aux test_long_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "test   eax,ebx"                \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [ebx]          \ +    modify exact [eax ebx]; + +u8 xor_byte_asm(u32 * flags, u8 d, u8 s); +#pragma aux xor_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "xor    al,bl"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [al] [bl]            \ +    value [al]                      \ +    modify exact [al bl]; + +u16 xor_word_asm(u32 * flags, u16 d, u16 s); +#pragma aux xor_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "xor    ax,bx"                  \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [ax] [bx]            \ +    value [ax]                      \ +    modify exact [ax bx]; + +u32 xor_long_asm(u32 * flags, u32 d, u32 s); +#pragma aux xor_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "xor    eax,ebx"                \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    parm [edi] [eax] [ebx]          \ +    value [eax]                     \ +    modify exact [eax ebx]; + +void imul_byte_asm(u32 * flags, u16 * ax, u8 d, u8 s); +#pragma aux imul_byte_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "imul   bl"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],ax"               \ +    parm [edi] [esi] [al] [bl]      \ +    modify exact [esi ax bl]; + +void imul_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 d, u16 s); +#pragma aux imul_word_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "imul   bx"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],ax"               \ +    "mov    [ecx],dx"               \ +    parm [edi] [esi] [ecx] [ax] [bx]\ +    modify exact [esi edi ax bx dx]; + +void imul_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 d, u32 s); +#pragma aux imul_long_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "imul   ebx"                    \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],eax"              \ +    "mov    [ecx],edx"              \ +    parm [edi] [esi] [ecx] [eax] [ebx] \ +    modify exact [esi edi eax ebx edx]; + +void mul_byte_asm(u32 * flags, u16 * ax, u8 d, u8 s); +#pragma aux mul_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "mul    bl"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],ax"               \ +    parm [edi] [esi] [al] [bl]      \ +    modify exact [esi ax bl]; + +void mul_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 d, u16 s); +#pragma aux mul_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "mul    bx"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],ax"               \ +    "mov    [ecx],dx"               \ +    parm [edi] [esi] [ecx] [ax] [bx]\ +    modify exact [esi edi ax bx dx]; + +void mul_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 d, u32 s); +#pragma aux mul_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "mul    ebx"                    \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],eax"              \ +    "mov    [ecx],edx"              \ +    parm [edi] [esi] [ecx] [eax] [ebx] \ +    modify exact [esi edi eax ebx edx]; + +void idiv_byte_asm(u32 * flags, u8 * al, u8 * ah, u16 d, u8 s); +#pragma aux idiv_byte_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "idiv   bl"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],al"               \ +    "mov    [ecx],ah"               \ +    parm [edi] [esi] [ecx] [ax] [bl]\ +    modify exact [esi edi ax bl]; + +void idiv_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 dlo, u16 dhi, u16 s); +#pragma aux idiv_word_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "idiv   bx"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],ax"               \ +    "mov    [ecx],dx"               \ +    parm [edi] [esi] [ecx] [ax] [dx] [bx]\ +    modify exact [esi edi ax dx bx]; + +void idiv_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 dlo, u32 dhi, u32 s); +#pragma aux idiv_long_asm =         \ +    "push   [edi]"                  \ +    "popf"                          \ +    "idiv   ebx"                    \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],eax"              \ +    "mov    [ecx],edx"              \ +    parm [edi] [esi] [ecx] [eax] [edx] [ebx]\ +    modify exact [esi edi eax edx ebx]; + +void div_byte_asm(u32 * flags, u8 * al, u8 * ah, u16 d, u8 s); +#pragma aux div_byte_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "div    bl"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],al"               \ +    "mov    [ecx],ah"               \ +    parm [edi] [esi] [ecx] [ax] [bl]\ +    modify exact [esi edi ax bl]; + +void div_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 dlo, u16 dhi, u16 s); +#pragma aux div_word_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "div    bx"                     \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],ax"               \ +    "mov    [ecx],dx"               \ +    parm [edi] [esi] [ecx] [ax] [dx] [bx]\ +    modify exact [esi edi ax dx bx]; + +void div_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 dlo, u32 dhi, u32 s); +#pragma aux div_long_asm =          \ +    "push   [edi]"                  \ +    "popf"                          \ +    "div    ebx"                    \ +    "pushf"                         \ +    "pop    [edi]"                  \ +    "mov    [esi],eax"              \ +    "mov    [ecx],edx"              \ +    parm [edi] [esi] [ecx] [eax] [edx] [ebx]\ +    modify exact [esi edi eax edx ebx]; + +#endif + +#endif				/* __X86EMU_PRIM_ASM_H */ diff --git a/drivers/bios_emulator/include/x86emu/prim_ops.h b/drivers/bios_emulator/include/x86emu/prim_ops.h new file mode 100644 index 000000000..2291e8488 --- /dev/null +++ b/drivers/bios_emulator/include/x86emu/prim_ops.h @@ -0,0 +1,141 @@ +/**************************************************************************** +* +*                       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 primitive operation functions. +* +****************************************************************************/ + +#ifndef __X86EMU_PRIM_OPS_H +#define __X86EMU_PRIM_OPS_H + +#ifdef  __cplusplus +extern "C" {                        /* Use "C" linkage when in C++ mode */ +#endif + +u16     aaa_word (u16 d); +u16     aas_word (u16 d); +u16     aad_word (u16 d); +u16     aam_word (u8 d); +u8      adc_byte (u8 d, u8 s); +u16     adc_word (u16 d, u16 s); +u32     adc_long (u32 d, u32 s); +u8      add_byte (u8 d, u8 s); +u16     add_word (u16 d, u16 s); +u32     add_long (u32 d, u32 s); +u8      and_byte (u8 d, u8 s); +u16     and_word (u16 d, u16 s); +u32     and_long (u32 d, u32 s); +u8      cmp_byte (u8 d, u8 s); +u16     cmp_word (u16 d, u16 s); +u32     cmp_long (u32 d, u32 s); +u8      daa_byte (u8 d); +u8      das_byte (u8 d); +u8      dec_byte (u8 d); +u16     dec_word (u16 d); +u32     dec_long (u32 d); +u8      inc_byte (u8 d); +u16     inc_word (u16 d); +u32     inc_long (u32 d); +u8      or_byte (u8 d, u8 s); +u16     or_word (u16 d, u16 s); +u32     or_long (u32 d, u32 s); +u8      neg_byte (u8 s); +u16     neg_word (u16 s); +u32     neg_long (u32 s); +u8      not_byte (u8 s); +u16     not_word (u16 s); +u32     not_long (u32 s); +u8      rcl_byte (u8 d, u8 s); +u16     rcl_word (u16 d, u8 s); +u32     rcl_long (u32 d, u8 s); +u8      rcr_byte (u8 d, u8 s); +u16     rcr_word (u16 d, u8 s); +u32     rcr_long (u32 d, u8 s); +u8      rol_byte (u8 d, u8 s); +u16     rol_word (u16 d, u8 s); +u32     rol_long (u32 d, u8 s); +u8      ror_byte (u8 d, u8 s); +u16     ror_word (u16 d, u8 s); +u32     ror_long (u32 d, u8 s); +u8      shl_byte (u8 d, u8 s); +u16     shl_word (u16 d, u8 s); +u32     shl_long (u32 d, u8 s); +u8      shr_byte (u8 d, u8 s); +u16     shr_word (u16 d, u8 s); +u32     shr_long (u32 d, u8 s); +u8      sar_byte (u8 d, u8 s); +u16     sar_word (u16 d, u8 s); +u32     sar_long (u32 d, u8 s); +u16     shld_word (u16 d, u16 fill, u8 s); +u32     shld_long (u32 d, u32 fill, u8 s); +u16     shrd_word (u16 d, u16 fill, u8 s); +u32     shrd_long (u32 d, u32 fill, u8 s); +u8      sbb_byte (u8 d, u8 s); +u16     sbb_word (u16 d, u16 s); +u32     sbb_long (u32 d, u32 s); +u8      sub_byte (u8 d, u8 s); +u16     sub_word (u16 d, u16 s); +u32     sub_long (u32 d, u32 s); +void    test_byte (u8 d, u8 s); +void    test_word (u16 d, u16 s); +void    test_long (u32 d, u32 s); +u8      xor_byte (u8 d, u8 s); +u16     xor_word (u16 d, u16 s); +u32     xor_long (u32 d, u32 s); +void    imul_byte (u8 s); +void    imul_word (u16 s); +void    imul_long (u32 s); +void    imul_long_direct(u32 *res_lo, u32* res_hi,u32 d, u32 s); +void    mul_byte (u8 s); +void    mul_word (u16 s); +void    mul_long (u32 s); +void    idiv_byte (u8 s); +void    idiv_word (u16 s); +void    idiv_long (u32 s); +void    div_byte (u8 s); +void    div_word (u16 s); +void    div_long (u32 s); +void    ins (int size); +void    outs (int size); +u16     mem_access_word (int addr); +void    push_word (u16 w); +void    push_long (u32 w); +u16     pop_word (void); +u32     pop_long (void); + +#ifdef  __cplusplus +}                                   /* End of "C" linkage for C++       */ +#endif + +#endif /* __X86EMU_PRIM_OPS_H */ diff --git a/drivers/bios_emulator/include/x86emu/regs.h b/drivers/bios_emulator/include/x86emu/regs.h new file mode 100644 index 000000000..a7fedd2f6 --- /dev/null +++ b/drivers/bios_emulator/include/x86emu/regs.h @@ -0,0 +1,340 @@ +/**************************************************************************** +* +*			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 x86 register definitions. +* +****************************************************************************/ + +#ifndef __X86EMU_REGS_H +#define __X86EMU_REGS_H + +/*---------------------- Macros and type definitions ----------------------*/ + +#pragma pack(1) + +/* + * General EAX, EBX, ECX, EDX type registers.  Note that for + * portability, and speed, the issue of byte swapping is not addressed + * in the registers.  All registers are stored in the default format + * available on the host machine.  The only critical issue is that the + * registers should line up EXACTLY in the same manner as they do in + * the 386.  That is: + * + * EAX & 0xff  === AL + * EAX & 0xffff == AX + * + * etc.	 The result is that alot of the calculations can then be + * done using the native instruction set fully. + */ + +#ifdef	__BIG_ENDIAN__ + +typedef struct { +	u32 e_reg; +} I32_reg_t; + +typedef struct { +	u16 filler0, x_reg; +} I16_reg_t; + +typedef struct { +	u8 filler0, filler1, h_reg, l_reg; +} I8_reg_t; + +#else				/* !__BIG_ENDIAN__ */ + +typedef struct { +	u32 e_reg; +} I32_reg_t; + +typedef struct { +	u16 x_reg; +} I16_reg_t; + +typedef struct { +	u8 l_reg, h_reg; +} I8_reg_t; + +#endif				/* BIG_ENDIAN */ + +typedef union { +	I32_reg_t I32_reg; +	I16_reg_t I16_reg; +	I8_reg_t I8_reg; +} i386_general_register; + +struct i386_general_regs { +	i386_general_register A, B, C, D; +}; + +typedef struct i386_general_regs Gen_reg_t; + +struct i386_special_regs { +	i386_general_register SP, BP, SI, DI, IP; +	u32 FLAGS; +}; + +/* + * Segment registers here represent the 16 bit quantities + * CS, DS, ES, SS. + */ + +#undef CS +#undef DS +#undef SS +#undef ES +#undef FS +#undef GS + +struct i386_segment_regs { +	u16 CS, DS, SS, ES, FS, GS; +}; + +/* 8 bit registers */ +#define R_AH  gen.A.I8_reg.h_reg +#define R_AL  gen.A.I8_reg.l_reg +#define R_BH  gen.B.I8_reg.h_reg +#define R_BL  gen.B.I8_reg.l_reg +#define R_CH  gen.C.I8_reg.h_reg +#define R_CL  gen.C.I8_reg.l_reg +#define R_DH  gen.D.I8_reg.h_reg +#define R_DL  gen.D.I8_reg.l_reg + +/* 16 bit registers */ +#define R_AX  gen.A.I16_reg.x_reg +#define R_BX  gen.B.I16_reg.x_reg +#define R_CX  gen.C.I16_reg.x_reg +#define R_DX  gen.D.I16_reg.x_reg + +/* 32 bit extended registers */ +#define R_EAX  gen.A.I32_reg.e_reg +#define R_EBX  gen.B.I32_reg.e_reg +#define R_ECX  gen.C.I32_reg.e_reg +#define R_EDX  gen.D.I32_reg.e_reg + +/* special registers */ +#define R_SP  spc.SP.I16_reg.x_reg +#define R_BP  spc.BP.I16_reg.x_reg +#define R_SI  spc.SI.I16_reg.x_reg +#define R_DI  spc.DI.I16_reg.x_reg +#define R_IP  spc.IP.I16_reg.x_reg +#define R_FLG spc.FLAGS + +/* special registers */ +#define R_SP  spc.SP.I16_reg.x_reg +#define R_BP  spc.BP.I16_reg.x_reg +#define R_SI  spc.SI.I16_reg.x_reg +#define R_DI  spc.DI.I16_reg.x_reg +#define R_IP  spc.IP.I16_reg.x_reg +#define R_FLG spc.FLAGS + +/* special registers */ +#define R_ESP  spc.SP.I32_reg.e_reg +#define R_EBP  spc.BP.I32_reg.e_reg +#define R_ESI  spc.SI.I32_reg.e_reg +#define R_EDI  spc.DI.I32_reg.e_reg +#define R_EIP  spc.IP.I32_reg.e_reg +#define R_EFLG spc.FLAGS + +/* segment registers */ +#define R_CS  seg.CS +#define R_DS  seg.DS +#define R_SS  seg.SS +#define R_ES  seg.ES +#define R_FS  seg.FS +#define R_GS  seg.GS + +/* flag conditions   */ +#define FB_CF 0x0001		/* CARRY flag  */ +#define FB_PF 0x0004		/* PARITY flag */ +#define FB_AF 0x0010		/* AUX	flag   */ +#define FB_ZF 0x0040		/* ZERO flag   */ +#define FB_SF 0x0080		/* SIGN flag   */ +#define FB_TF 0x0100		/* TRAP flag   */ +#define FB_IF 0x0200		/* INTERRUPT ENABLE flag */ +#define FB_DF 0x0400		/* DIR flag    */ +#define FB_OF 0x0800		/* OVERFLOW flag */ + +/* 80286 and above always have bit#1 set */ +#define F_ALWAYS_ON  (0x0002)	/* flag bits always on */ + +/* + * Define a mask for only those flag bits we will ever pass back + * (via PUSHF) + */ +#define F_MSK (FB_CF|FB_PF|FB_AF|FB_ZF|FB_SF|FB_TF|FB_IF|FB_DF|FB_OF) + +/* following bits masked in to a 16bit quantity */ + +#define F_CF 0x0001		/* CARRY flag  */ +#define F_PF 0x0004		/* PARITY flag */ +#define F_AF 0x0010		/* AUX	flag   */ +#define F_ZF 0x0040		/* ZERO flag   */ +#define F_SF 0x0080		/* SIGN flag   */ +#define F_TF 0x0100		/* TRAP flag   */ +#define F_IF 0x0200		/* INTERRUPT ENABLE flag */ +#define F_DF 0x0400		/* DIR flag    */ +#define F_OF 0x0800		/* OVERFLOW flag */ + +#define TOGGLE_FLAG(flag)	(M.x86.R_FLG ^= (flag)) +#define SET_FLAG(flag)		(M.x86.R_FLG |= (flag)) +#define CLEAR_FLAG(flag)	(M.x86.R_FLG &= ~(flag)) +#define ACCESS_FLAG(flag)	(M.x86.R_FLG & (flag)) +#define CLEARALL_FLAG(m)	(M.x86.R_FLG = 0) + +#define CONDITIONAL_SET_FLAG(COND,FLAG) \ +  if (COND) SET_FLAG(FLAG); else CLEAR_FLAG(FLAG) + +#define F_PF_CALC 0x010000	/* PARITY flag has been calced	  */ +#define F_ZF_CALC 0x020000	/* ZERO flag has been calced	  */ +#define F_SF_CALC 0x040000	/* SIGN flag has been calced	  */ + +#define F_ALL_CALC	0xff0000	/* All have been calced	  */ + +/* + * Emulator machine state. + * Segment usage control. + */ +#define SYSMODE_SEG_DS_SS	0x00000001 +#define SYSMODE_SEGOVR_CS	0x00000002 +#define SYSMODE_SEGOVR_DS	0x00000004 +#define SYSMODE_SEGOVR_ES	0x00000008 +#define SYSMODE_SEGOVR_FS	0x00000010 +#define SYSMODE_SEGOVR_GS	0x00000020 +#define SYSMODE_SEGOVR_SS	0x00000040 +#define SYSMODE_PREFIX_REPE	0x00000080 +#define SYSMODE_PREFIX_REPNE	0x00000100 +#define SYSMODE_PREFIX_DATA	0x00000200 +#define SYSMODE_PREFIX_ADDR	0x00000400 +#define SYSMODE_INTR_PENDING	0x10000000 +#define SYSMODE_EXTRN_INTR	0x20000000 +#define SYSMODE_HALTED		0x40000000 + +#define SYSMODE_SEGMASK (SYSMODE_SEG_DS_SS	| \ +			 SYSMODE_SEGOVR_CS	| \ +			 SYSMODE_SEGOVR_DS	| \ +			 SYSMODE_SEGOVR_ES	| \ +			 SYSMODE_SEGOVR_FS	| \ +			 SYSMODE_SEGOVR_GS	| \ +			 SYSMODE_SEGOVR_SS) +#define SYSMODE_CLRMASK (SYSMODE_SEG_DS_SS	| \ +			 SYSMODE_SEGOVR_CS	| \ +			 SYSMODE_SEGOVR_DS	| \ +			 SYSMODE_SEGOVR_ES	| \ +			 SYSMODE_SEGOVR_FS	| \ +			 SYSMODE_SEGOVR_GS	| \ +			 SYSMODE_SEGOVR_SS	| \ +			 SYSMODE_PREFIX_DATA	| \ +			 SYSMODE_PREFIX_ADDR) + +#define	 INTR_SYNCH	      0x1 +#define	 INTR_ASYNCH	      0x2 +#define	 INTR_HALTED	      0x4 + +typedef struct { +	struct i386_general_regs gen; +	struct i386_special_regs spc; +	struct i386_segment_regs seg; +	/* +	 * MODE contains information on: +	 *  REPE prefix		    2 bits  repe,repne +	 *  SEGMENT overrides	    5 bits  normal,DS,SS,CS,ES +	 *  Delayed flag set	    3 bits  (zero, signed, parity) +	 *  reserved		    6 bits +	 *  interrupt #		    8 bits  instruction raised interrupt +	 *  BIOS video segregs	    4 bits +	 *  Interrupt Pending	    1 bits +	 *  Extern interrupt	    1 bits +	 *  Halted		    1 bits +	 */ +	long mode; +	u8 intno; +	volatile int intr;	/* mask of pending interrupts */ +	int debug; +#ifdef DEBUG +	int check; +	u16 saved_ip; +	u16 saved_cs; +	int enc_pos; +	int enc_str_pos; +	char decode_buf[32];	/* encoded byte stream	*/ +	char decoded_buf[256];	/* disassembled strings */ +#endif +} X86EMU_regs; + +/**************************************************************************** +REMARKS: +Structure maintaining the emulator machine state. + +MEMBERS: +x86		- X86 registers +mem_base	- Base real mode memory for the emulator +mem_size	- Size of the real mode memory block for the emulator +****************************************************************************/ +#undef x86 +typedef struct { +	X86EMU_regs x86; +	u8 *mem_base; +	u32 mem_size; +	void *private; +} X86EMU_sysEnv; + +#pragma pack() + +/*----------------------------- Global Variables --------------------------*/ + +#ifdef	__cplusplus +extern "C" {			/* Use "C" linkage when in C++ mode */ +#endif + +/* Global emulator machine state. + * + * We keep it global to avoid pointer dereferences in the code for speed. + */ + +	extern X86EMU_sysEnv _X86EMU_env; +#define	  M		_X86EMU_env + +/*-------------------------- Function Prototypes --------------------------*/ + +/* Function to log information at runtime */ + +#ifndef __KERNEL__ +	void printk(const char *fmt, ...); +#endif + +#ifdef	__cplusplus +}				/* End of "C" linkage for C++	    */ +#endif +#endif				/* __X86EMU_REGS_H */ diff --git a/drivers/bios_emulator/include/x86emu/x86emui.h b/drivers/bios_emulator/include/x86emu/x86emui.h new file mode 100644 index 000000000..a74957d99 --- /dev/null +++ b/drivers/bios_emulator/include/x86emu/x86emui.h @@ -0,0 +1,101 @@ +/**************************************************************************** +* +*                       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 system specific functions. These functions +*               are always compiled and linked in the OS depedent libraries, +*               and never in a binary portable driver. +* +****************************************************************************/ + +#ifndef __X86EMU_X86EMUI_H +#define __X86EMU_X86EMUI_H + +/* If we are compiling in C++ mode, we can compile some functions as + * inline to increase performance (however the code size increases quite + * dramatically in this case). + */ + +#if defined(__cplusplus) && !defined(_NO_INLINE) +#define _INLINE inline +#else +#define _INLINE static +#endif + +/* Get rid of unused parameters in C++ compilation mode */ + +#ifdef __cplusplus +#define X86EMU_UNUSED(v) +#else +#define X86EMU_UNUSED(v)    v +#endif + +#include "x86emu.h" +#include "x86emu/regs.h" +#include "x86emu/debug.h" +#include "x86emu/decode.h" +#include "x86emu/ops.h" +#include "x86emu/prim_ops.h" +#ifndef __KERNEL__ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#endif + +#define printk printf + + +/*--------------------------- Inline Functions ----------------------------*/ + +#ifdef  __cplusplus +extern "C" {			/* Use "C" linkage when in C++ mode */ +#endif + +	extern u8(X86APIP sys_rdb) (u32 addr); +	extern u16(X86APIP sys_rdw) (u32 addr); +	extern u32(X86APIP sys_rdl) (u32 addr); +	extern void (X86APIP sys_wrb) (u32 addr, u8 val); +	extern void (X86APIP sys_wrw) (u32 addr, u16 val); +	extern void (X86APIP sys_wrl) (u32 addr, u32 val); + +	extern u8(X86APIP sys_inb) (X86EMU_pioAddr addr); +	extern u16(X86APIP sys_inw) (X86EMU_pioAddr addr); +	extern u32(X86APIP sys_inl) (X86EMU_pioAddr addr); +	extern void (X86APIP sys_outb) (X86EMU_pioAddr addr, u8 val); +	extern void (X86APIP sys_outw) (X86EMU_pioAddr addr, u16 val); +	extern void (X86APIP sys_outl) (X86EMU_pioAddr addr, u32 val); + +#ifdef  __cplusplus +}				/* End of "C" linkage for C++       */ +#endif +#endif				/* __X86EMU_X86EMUI_H */ |