Windows-Server-2003/public/internal/base/inc/emulate.h

1615 lines
21 KiB
C

/*++ BUILD Version: 0000 // Increment this if a change has global effects
Copyright (c) 1994 Microsoft Corporation
Module Name:
emulate.h
Abstract:
This module contains the private header file for the x86 bios
emulation.
Author:
David N. Cutler (davec) 2-Sep-1994
Revision History:
--*/
#ifndef _EMULATE_
#define _EMULATE_
#include "setjmp.h"
#include "xm86.h"
#include "x86new.h"
//
// Define debug tracing flags.
//
//#define XM_DEBUG 1 // ****** temp ******
#define TRACE_INSTRUCTIONS 0x1
#define TRACE_OPERANDS 0x2
#define TRACE_GENERAL_REGISTERS 0x4
#define TRACE_OVERRIDE 0x8
#define TRACE_JUMPS 0x10
#define TRACE_SPECIFIERS 0x20
#define TRACE_SINGLE_STEP 0x40
//
// Define opcode function table indexes.
//
// N.B. This values must correspond exactly one for one with the function
// table entries. If the C language had indexed initializers this
// type would not be necessary.
//
typedef enum _XM_FUNCTION_TABLE_INDEX {
//
// ASCII operators.
//
X86_AAA_OP,
X86_AAD_OP,
X86_AAM_OP,
X86_AAS_OP,
X86_DAA_OP,
X86_DAS_OP,
//
// Group 1 operators.
//
X86_ADD_OP,
X86_OR_OP,
X86_ADC_OP,
X86_SBB_OP,
X86_AND_OP,
X86_SUB_OP,
X86_XOR_OP,
X86_CMP_OP,
//
// Group 2 operators.
//
X86_ROL_OP,
X86_ROR_OP,
X86_RCL_OP,
X86_RCR_OP,
X86_SHL_OP,
X86_SHR_OP,
X86_FILL0_OP,
X86_SAR_OP,
//
// Group 3 operators.
//
X86_TEST_OP,
X86_FILL1_OP,
X86_NOT_OP,
X86_NEG_OP,
X86_MUL_OP,
X86_IMULX_OP,
X86_DIV_OP,
X86_IDIV_OP,
//
// Group 4 and 5 operators.
//
X86_INC_OP,
X86_DEC_OP,
X86_CALL_OP,
X86_FILL2_OP,
X86_JMP_OP,
X86_FILL3_OP,
X86_PUSH_OP,
X86_FILL4_OP,
//
// Group 8 operators.
//
X86_BT_OP,
X86_BTS_OP,
X86_BTR_OP,
X86_BTC_OP,
//
// Stack push and pop operators.
//
X86_POP_OP,
X86_PUSHA_OP,
X86_POPA_OP,
//
// Jump operators.
//
X86_JXX_OP,
X86_LOOP_OP,
X86_JCXZ_OP,
//
// Control operators.
//
X86_ENTER_OP,
X86_HLT_OP,
X86_INT_OP,
X86_IRET_OP,
X86_LEAVE_OP,
X86_RET_OP,
//
// Set boolean byte value based on condition.
//
X86_SXX_OP,
//
// Condition code operators.
//
X86_CMC_OP,
X86_CLC_OP,
X86_STC_OP,
X86_CLI_OP,
X86_STI_OP,
X86_CLD_OP,
X86_STD_OP,
X86_LAHF_OP,
X86_SAHF_OP,
//
// General move operators.
//
X86_MOV_OP,
X86_XCHG_OP,
//
// Convert operations.
//
X86_CBW_OP,
X86_CWD_OP,
//
// Single multiply operator.
//
X86_IMUL_OP,
//
// String operators.
//
X86_CMPS_OP,
X86_INS_OP,
X86_LODS_OP,
X86_MOVS_OP,
X86_OUTS_OP,
X86_SCAS_OP,
X86_STOS_OP,
//
// Effective address operators.
//
X86_BOUND_OP,
X86_LEA_OP,
//
// Double shift operators.
//
X86_SHLD_OP,
X86_SHRD_OP,
//
// I/O operators.
//
X86_IN_OP,
X86_OUT_OP,
//
// Bit scan operators.
//
X86_BSF_OP,
X86_BSR_OP,
//
// Byte swap operators.
//
X86_BSWAP_OP,
//
// Add/compare and exchange operators.
//
X86_XADD_OP,
X86_CMPXCHG_OP,
//
// No operation.
//
X86_NOP_OP,
//
// Illegal opcode.
//
X86_ILL_OP,
X86_MAXIMUM_INDEX
} XM_FUNCTION_TABLE_INDEX;
//
// Define 8-bit register numbers.
//
typedef enum _X86_8BIT_REGISTER {
AL,
CL,
DL,
BL,
AH,
CH,
DH,
BH
} X86_8BIT_REGISTER;
//
// Define 16-bit register numbers.
//
typedef enum _X86_16BIT_REGISTER {
AX,
CX,
DX,
BX,
SP,
BP,
SI,
DI
} X86_16BIT_REGISTER;
//
// Define 32-bit register numbers.
//
typedef enum _X86_32BIT_REGISTER {
EAX,
ECX,
EDX,
EBX,
ESP,
EBP,
ESI,
EDI
} X86_32BIT_REGISTER;
//
// Define general register structure.
//
typedef union _X86_GENERAL_REGISTER {
ULONG Exx;
union {
USHORT Xx;
struct {
UCHAR Xl;
UCHAR Xh;
};
};
} X86_GENERAL_REGISTER, *PX86_GENERAL_REGISTER;
//
// Define segment register numbers.
//
typedef enum _X86_SEGMENT_REGISTER {
ES,
CS,
SS,
DS,
FS,
GS
} X86_SEGMENT_REGISTER;
//
// Define instruction format types.
//
typedef enum _XM_FORMAT_TYPE {
//
// N.B. These format codes MUST be the first codes and MUST be
// exactly in this order since the ordering corresponds to
// segment numbers.
//
FormatSegmentES,
FormatSegmentCS,
FormatSegmentSS,
FormatSegmentDS,
FormatSegmentFS,
FormatSegmentGS,
//
// N.B. These format codes MUST be the second codes and MUST be
// exactly in this order since the ordering corresponds to
// biased segment number. The entry for the code segment is
// a dummy entry to make the indexing work right.
//
FormatLoadSegmentES,
FormatLoadSegmentCS,
FormatLoadSegmentSS,
FormatLoadSegmentDS,
FormatLoadSegmentFS,
FormatLoadSegmentGS,
//
// The following codes can be in any order.
//
FormatGroup1General,
FormatGroup1Immediate,
FormatGroup2By1,
FormatGroup2ByCL,
FormatGroup2ByByte,
FormatGroup3General,
FormatGroup4General,
FormatGroup5General,
FormatGroup8BitOffset,
FormatOpcodeRegister,
FormatLongJump,
FormatShortJump,
FormatSetccByte,
FormatAccumImmediate,
FormatAccumRegister,
FormatMoveGeneral,
FormatMoveImmediate,
FormatMoveRegImmediate,
FormatSegmentOffset,
FormatMoveSegment,
FormatMoveXxGeneral,
FormatFlagsRegister,
FormatPushImmediate,
FormatPopGeneral,
FormatImulImmediate,
FormatStringOperands,
FormatEffectiveOffset,
FormatImmediateJump,
FormatImmediateEnter,
FormatGeneralBitOffset,
FormatShiftDouble,
FormatPortImmediate,
FormatPortDX,
FormatBitScanGeneral,
FormatByteImmediate,
FormatXlatOpcode,
FormatGeneralRegister,
FormatNoOperands,
FormatOpcodeEscape,
FormatPrefixOpcode
} XM_FORMAT_TYPE;
//
// Defined opcode modifier bit masks.
//
#define WIDTH_BIT 0x1 // operand size control
#define DIRECTION_BIT 0x2 // direction of operation
#define SIGN_BIT 0x2 // sign extended byte
//
// Define prefix opcode function index values.
//
typedef enum _XM_PREFIX_FUNCTION_INDEX {
X86_ES_OP = ES,
X86_CS_OP = CS,
X86_SS_OP = SS,
X86_DS_OP = DS,
X86_FS_OP = FS,
X86_GS_OP = GS,
X86_LOCK_OP,
X86_ADSZ_OP,
X86_OPSZ_OP,
X86_REPZ_OP,
X86_REPNZ_OP
} XM_PREFIX_FUNCTION_INDEX;
//
// Define two byte opcode escape.
//
#define TWO_BYTE_ESCAPE 0x0f
//
// Define opcode control table structure.
//
// This table controls the decoding of instructions and there operands.
//
typedef struct _OPCODE_CONTROL {
UCHAR FunctionIndex;
UCHAR FormatType;
} OPCODE_CONTROL, *POPCODE_CONTROL;
//
// Define emulator context structure.
//
// This structure holds the global emulator state.
//
typedef struct _XM_CONTEXT {
//
// Pointers to the opcode control table and the opcode name table.
//
const OPCODE_CONTROL *OpcodeControlTable;
const CHAR **OpcodeNameTable;
//
// x86 extended flags register.
//
union {
UCHAR AhFlags;
USHORT Flags;
ULONG AllFlags;
struct {
ULONG EFLAG_CF : 1;
ULONG EFLAG_MBO : 1;
ULONG EFLAG_PF : 1;
ULONG EFLAG_SBZ0 : 1;
ULONG EFLAG_AF : 1;
ULONG EFLAG_SBZ1 : 1;
ULONG EFLAG_ZF : 1;
ULONG EFLAG_SF : 1;
ULONG EFLAG_TF : 1;
ULONG EFLAG_IF : 1;
ULONG EFLAG_DF : 1;
ULONG EFLAG_OF : 1;
ULONG EFLAG_IOPL : 2;
ULONG EFLAG_NT : 1;
ULONG EFLAG_SBZ2 : 1;
ULONG EFLAG_RF : 1;
ULONG EFLAG_VM : 1;
ULONG EFLAG_AC : 1;
ULONG EFLAG_SBZ3 : 13;
} Eflags;
};
//
// x86 instruction pointer.
//
union {
USHORT Ip;
ULONG Eip;
};
//
// x86 general registers.
//
X86_GENERAL_REGISTER Gpr[8];
//
// x86 segment registers.
//
USHORT SegmentRegister[6];
//
// Emulator segment descriptors.
//
USHORT SegmentLimit[6];
//
// Instruction opcode control information read from the opcode
// control table.
//
OPCODE_CONTROL OpcodeControl;
//
// Call or jmp destination segment segment.
//
USHORT DstSegment;
//
// Source and destination address and value.
//
union {
UCHAR UNALIGNED *DstByte;
USHORT UNALIGNED *DstWord;
ULONG UNALIGNED *DstLong;
};
union {
UCHAR UNALIGNED *SrcByte;
USHORT UNALIGNED *SrcWord;
ULONG UNALIGNED *SrcLong;
};
union {
UCHAR Byte;
ULONG Long;
USHORT Word;
} DstValue;
union {
UCHAR Byte;
ULONG Long;
USHORT Word;
} SrcValue;
//
// Current opcode, data segment register to be used to access
// data operands, function index, and operand data type, and
// effective address offset.
//
ULONG CurrentOpcode;
ULONG DataSegment;
ULONG DataType;
ULONG FunctionIndex;
ULONG Offset;
//
// Prefix control information.
//
BOOLEAN LockPrefixActive;
BOOLEAN OpaddrPrefixActive;
BOOLEAN OpsizePrefixActive;
BOOLEAN RepeatPrefixActive;
BOOLEAN SegmentPrefixActive;
UCHAR RepeatZflag;
//
// Effective address computation control.
//
BOOLEAN RegisterOffsetAddress;
BOOLEAN ComputeOffsetAddress;
//
// Shift count.
//
UCHAR Shift;
//
// Jump buffer.
//
_JBTYPE JumpBuffer[_JBLEN];
//
// Address of read I/O space, write I/O space, and translation address
// routines.
//
PXM_READ_IO_SPACE ReadIoSpace;
PXM_WRITE_IO_SPACE WriteIoSpace;
PXM_TRANSLATE_ADDRESS TranslateAddress;
} XM_CONTEXT, *PXM_CONTEXT, *RESTRICTED_POINTER PRXM_CONTEXT;
//
// Define opcode function and decode operand types.
//
typedef
ULONG
(*POPERAND_DECODE) (
IN PRXM_CONTEXT P
);
typedef
VOID
(*POPCODE_FUNCTION) (
IN PRXM_CONTEXT P
);
//
// Operand decode prototypes.
//
ULONG
XmPushPopSegment (
IN PRXM_CONTEXT P
);
ULONG
XmLoadSegment (
IN PRXM_CONTEXT P
);
ULONG
XmGroup1General (
IN PRXM_CONTEXT P
);
ULONG
XmGroup1Immediate (
IN PRXM_CONTEXT P
);
ULONG
XmGroup2By1 (
IN PRXM_CONTEXT P
);
ULONG
XmGroup2ByCL (
IN PRXM_CONTEXT P
);
ULONG
XmGroup2ByByte (
IN PRXM_CONTEXT P
);
ULONG
XmGroup3General (
IN PRXM_CONTEXT P
);
ULONG
XmGroup45General (
IN PRXM_CONTEXT P
);
ULONG
XmGroup8BitOffset (
IN PRXM_CONTEXT P
);
ULONG
XmOpcodeRegister (
IN PRXM_CONTEXT P
);
ULONG
XmLongJump (
IN PRXM_CONTEXT P
);
ULONG
XmShortJump (
IN PRXM_CONTEXT P
);
ULONG
XmSetccByte (
IN PRXM_CONTEXT P
);
ULONG
XmAccumImmediate (
IN PRXM_CONTEXT P
);
ULONG
XmAccumRegister (
IN PRXM_CONTEXT P
);
ULONG
XmMoveGeneral (
IN PRXM_CONTEXT P
);
ULONG
XmMoveImmediate (
IN PRXM_CONTEXT P
);
ULONG
XmMoveRegImmediate (
IN PRXM_CONTEXT P
);
ULONG
XmSegmentOffset (
IN PRXM_CONTEXT P
);
ULONG
XmMoveSegment (
IN PRXM_CONTEXT P
);
ULONG
XmMoveXxGeneral (
IN PRXM_CONTEXT P
);
ULONG
XmFlagsRegister (
IN PRXM_CONTEXT P
);
ULONG
XmPushImmediate (
IN PRXM_CONTEXT P
);
ULONG
XmPopGeneral (
IN PRXM_CONTEXT P
);
ULONG
XmImulImmediate (
IN PRXM_CONTEXT P
);
ULONG
XmStringOperands (
IN PRXM_CONTEXT P
);
ULONG
XmEffectiveOffset (
IN PRXM_CONTEXT P
);
ULONG
XmImmediateJump (
IN PRXM_CONTEXT P
);
ULONG
XmImmediateEnter (
IN PRXM_CONTEXT P
);
ULONG
XmGeneralBitOffset (
IN PRXM_CONTEXT P
);
ULONG
XmShiftDouble (
IN PRXM_CONTEXT P
);
ULONG
XmPortImmediate (
IN PRXM_CONTEXT P
);
ULONG
XmPortDX (
IN PRXM_CONTEXT P
);
ULONG
XmBitScanGeneral (
IN PRXM_CONTEXT P
);
ULONG
XmByteImmediate (
IN PRXM_CONTEXT P
);
ULONG
XmXlatOpcode (
IN PRXM_CONTEXT P
);
ULONG
XmGeneralRegister (
IN PRXM_CONTEXT P
);
ULONG
XmOpcodeEscape (
IN PRXM_CONTEXT P
);
ULONG
XmPrefixOpcode (
IN PRXM_CONTEXT P
);
ULONG
XmNoOperands (
IN PRXM_CONTEXT P
);
//
// Define miscellaneous prototypes.
//
ULONG
XmComputeParity (
IN ULONG Result
);
XM_STATUS
XmEmulateStream (
IN PRXM_CONTEXT P,
USHORT Segment,
USHORT Offset,
PXM86_CONTEXT Context
);
UCHAR
XmGetCodeByte (
IN PRXM_CONTEXT P
);
UCHAR
XmGetByteImmediate (
IN PRXM_CONTEXT P
);
USHORT
XmGetByteImmediateToWord (
IN PRXM_CONTEXT P
);
ULONG
XmGetByteImmediateToLong (
IN PRXM_CONTEXT P
);
USHORT
XmGetSignedByteImmediateToWord (
IN PRXM_CONTEXT P
);
ULONG
XmGetSignedByteImmediateToLong (
IN PRXM_CONTEXT P
);
USHORT
XmGetWordImmediate (
IN PRXM_CONTEXT P
);
ULONG
XmGetLongImmediate (
IN PRXM_CONTEXT P
);
ULONG
XmPopStack (
IN PRXM_CONTEXT P
);
VOID
XmPushStack (
IN PRXM_CONTEXT P,
IN ULONG Value
);
VOID
XmSetDataType (
IN PRXM_CONTEXT P
);
VOID
XmStoreResult (
IN PRXM_CONTEXT P,
IN ULONG Result
);
//
// Define operand specifier prototypes.
//
PVOID
XmEvaluateAddressSpecifier (
IN PRXM_CONTEXT P,
OUT PLONG Register
);
PVOID
XmGetOffsetAddress (
IN PRXM_CONTEXT P,
IN ULONG Offset
);
PVOID
XmGetRegisterAddress (
IN PRXM_CONTEXT P,
IN ULONG Number
);
PVOID
XmGetStringAddress (
IN PRXM_CONTEXT P,
IN ULONG Segment,
IN ULONG Register
);
VOID
XmSetDestinationValue (
IN PRXM_CONTEXT P,
IN PVOID Destination
);
VOID
XmSetSourceValue (
IN PRXM_CONTEXT P,
IN PVOID Source
);
ULONG
XmGetImmediateSourceValue (
IN PRXM_CONTEXT P,
IN ULONG ByteFlag
);
VOID
XmSetImmediateSourceValue (
IN PRXM_CONTEXT P,
IN ULONG Source
);
//
// ASCII operators.
//
VOID
XmAaaOp (
IN PRXM_CONTEXT P
);
VOID
XmAadOp (
IN PRXM_CONTEXT P
);
VOID
XmAamOp (
IN PRXM_CONTEXT P
);
VOID
XmAasOp (
IN PRXM_CONTEXT P
);
VOID
XmDaaOp (
IN PRXM_CONTEXT P
);
VOID
XmDasOp (
IN PRXM_CONTEXT P
);
//
// Group 1 operations.
//
VOID
XmAddOp (
IN PRXM_CONTEXT P
);
VOID
XmOrOp (
IN PRXM_CONTEXT P
);
VOID
XmAdcOp (
IN PRXM_CONTEXT P
);
VOID
XmSbbOp (
IN PRXM_CONTEXT P
);
VOID
XmAndOp (
IN PRXM_CONTEXT P
);
VOID
XmSubOp (
IN PRXM_CONTEXT P
);
VOID
XmXorOp (
IN PRXM_CONTEXT P
);
VOID
XmCmpOp (
IN PRXM_CONTEXT P
);
//
// Group 2 operations.
//
VOID
XmRolOp (
IN PRXM_CONTEXT P
);
VOID
XmRorOp (
IN PRXM_CONTEXT P
);
VOID
XmRclOp (
IN PRXM_CONTEXT P
);
VOID
XmRcrOp (
IN PRXM_CONTEXT P
);
VOID
XmShlOp (
IN PRXM_CONTEXT P
);
VOID
XmShrOp (
IN PRXM_CONTEXT P
);
VOID
XmSarOp (
IN PRXM_CONTEXT P
);
//
// Group 3 operations.
//
VOID
XmTestOp (
IN PRXM_CONTEXT P
);
VOID
XmNotOp (
IN PRXM_CONTEXT P
);
VOID
XmNegOp (
IN PRXM_CONTEXT P
);
VOID
XmDivOp (
IN PRXM_CONTEXT P
);
VOID
XmIdivOp (
IN PRXM_CONTEXT P
);
VOID
XmImulOp (
IN PRXM_CONTEXT P
);
VOID
XmImulxOp (
IN PRXM_CONTEXT P
);
VOID
XmMulOp (
IN PRXM_CONTEXT P
);
//
// Group 4 and 5 operators.
//
VOID
XmIncOp (
IN PRXM_CONTEXT P
);
VOID
XmDecOp (
IN PRXM_CONTEXT P
);
VOID
XmCallOp (
PRXM_CONTEXT P
);
VOID
XmJmpOp (
IN PRXM_CONTEXT P
);
VOID
XmPushOp (
IN PRXM_CONTEXT P
);
//
// Group 8 operators.
//
VOID
XmBtOp (
IN PRXM_CONTEXT P
);
VOID
XmBtsOp (
IN PRXM_CONTEXT P
);
VOID
XmBtrOp (
IN PRXM_CONTEXT P
);
VOID
XmBtcOp (
IN PRXM_CONTEXT P
);
//
// Stack operations.
//
VOID
XmPopOp (
IN PRXM_CONTEXT P
);
VOID
XmPushaOp (
IN PRXM_CONTEXT P
);
VOID
XmPopaOp (
IN PRXM_CONTEXT P
);
//
// Conditional jump and set conditional operations.
//
VOID
XmJxxOp (
IN PRXM_CONTEXT P
);
VOID
XmLoopOp (
IN PRXM_CONTEXT P
);
VOID
XmJcxzOp (
IN PRXM_CONTEXT P
);
VOID
XmSxxOp (
IN PRXM_CONTEXT P
);
//
// Condition code operations.
//
VOID
XmClcOp (
PRXM_CONTEXT P
);
VOID
XmCldOp (
PRXM_CONTEXT P
);
VOID
XmCliOp (
PRXM_CONTEXT P
);
VOID
XmCmcOp (
PRXM_CONTEXT P
);
VOID
XmStcOp (
PRXM_CONTEXT P
);
VOID
XmStdOp (
PRXM_CONTEXT P
);
VOID
XmStiOp (
PRXM_CONTEXT P
);
VOID
XmLahfOp (
PRXM_CONTEXT P
);
VOID
XmSahfOp (
PRXM_CONTEXT P
);
//
// Move operations.
//
VOID
XmMovOp (
PRXM_CONTEXT P
);
VOID
XmXchgOp (
PRXM_CONTEXT P
);
//
// Convert operations.
//
VOID
XmCbwOp (
PRXM_CONTEXT P
);
VOID
XmCwdOp (
PRXM_CONTEXT P
);
//
// Control operations.
//
VOID
XmEnterOp (
PRXM_CONTEXT P
);
VOID
XmHltOp (
PRXM_CONTEXT P
);
VOID
XmIntOp (
PRXM_CONTEXT P
);
VOID
XmIretOp (
PRXM_CONTEXT P
);
VOID
XmLeaveOp (
PRXM_CONTEXT P
);
VOID
XmRetOp (
PRXM_CONTEXT P
);
//
// String operations.
//
VOID
XmCmpsOp (
PRXM_CONTEXT P
);
VOID
XmInsOp (
PRXM_CONTEXT P
);
VOID
XmLodsOp (
PRXM_CONTEXT P
);
VOID
XmMovsOp (
PRXM_CONTEXT P
);
VOID
XmOutsOp (
PRXM_CONTEXT P
);
VOID
XmScasOp (
PRXM_CONTEXT P
);
VOID
XmStosOp (
PRXM_CONTEXT P
);
//
// Shift double operators.
//
VOID
XmShldOp (
PRXM_CONTEXT P
);
VOID
XmShrdOp (
PRXM_CONTEXT P
);
//
// I/O operators.
//
VOID
XmInOp (
PRXM_CONTEXT P
);
VOID
XmOutOp (
PRXM_CONTEXT P
);
//
// Bit scan operators.
//
VOID
XmBsfOp (
PRXM_CONTEXT P
);
VOID
XmBsrOp (
PRXM_CONTEXT P
);
//
// MIscellaneous operations.
//
VOID
XmXaddOp (
PRXM_CONTEXT P
);
VOID
XmBoundOp (
PRXM_CONTEXT P
);
VOID
XmBswapOp (
PRXM_CONTEXT P
);
VOID
XmCmpxchgOp (
PRXM_CONTEXT P
);
VOID
XmIllOp (
PRXM_CONTEXT P
);
VOID
XmNopOp (
PRXM_CONTEXT P
);
//
// PCI Bios emulation routines.
//
#if !defined(_PURE_EMULATION_)
BOOLEAN
XmExecuteInt1a (
IN OUT PRXM_CONTEXT Context
);
VOID
XmInt1aPciBiosPresent(
IN OUT PRXM_CONTEXT Context
);
VOID
XmInt1aFindPciClassCode(
IN OUT PRXM_CONTEXT Context
);
VOID
XmInt1aFindPciDevice(
IN OUT PRXM_CONTEXT Context
);
VOID
XmInt1aGenerateSpecialCycle(
IN OUT PRXM_CONTEXT Context
);
VOID
XmInt1aGetRoutingOptions(
IN OUT PRXM_CONTEXT Context
);
VOID
XmInt1aSetPciIrq(
IN OUT PRXM_CONTEXT Context
);
VOID
XmInt1aReadConfigRegister(
IN OUT PRXM_CONTEXT Context
);
VOID
XmInt1aWriteConfigRegister(
IN OUT PRXM_CONTEXT Context
);
#endif
//
// Debug routines.
//
#if XM_DEBUG
#include "stdio.h"
//#define DEBUG_PRINT(_X_) DbgPrint _X_
#define DEBUG_PRINT(_X_) printf _X_
VOID
XmTraceDestination (
IN PRXM_CONTEXT P,
IN ULONG Destination
);
VOID
XmTraceFlags (
IN PRXM_CONTEXT P
);
VOID
XmTraceInstruction (
IN XM_OPERATION_DATATYPE DataType,
IN ULONG Instruction
);
VOID
XmTraceJumps (
IN PRXM_CONTEXT P
);
VOID
XmTraceOverride (
IN PRXM_CONTEXT P
);
VOID
XmTraceRegisters (
IN PRXM_CONTEXT P
);
VOID
XmTraceResult (
IN PRXM_CONTEXT P,
IN ULONG Result
);
VOID
XmTraceSpecifier (
IN UCHAR Specifier
);
VOID
XmTraceSource (
IN PRXM_CONTEXT P,
IN ULONG Source
);
#else
#define XmTraceDestination(P, Destination)
#define XmTraceInstruction(DataType, Instruction)
#define XmTraceFlags(P)
#define XmTraceJumps(P)
#define XmTraceOverride(P)
#define XmTraceRegisters(P)
#define XmTraceResult(P, Result)
#define XmTraceSpecifier(Specifier)
#define XmTraceSource(P, Source)
#endif
//
// Define global data.
//
extern XM_CONTEXT XmContext;
extern BOOLEAN XmEmulatorInitialized;
extern const OPCODE_CONTROL XmOpcodeControlTable1[];
extern const OPCODE_CONTROL XmOpcodeControlTable2[];
extern const POPCODE_FUNCTION XmOpcodeFunctionTable[];
extern const POPERAND_DECODE XmOperandDecodeTable[];
#if !defined(_PURE_EMULATION)
extern UCHAR XmNumberPciBusses;
extern BOOLEAN XmPciBiosPresent;
extern PGETSETPCIBUSDATA XmGetPciData;
extern PGETSETPCIBUSDATA XmSetPciData;
#endif
#if XM_DEBUG
extern ULONG XmDebugFlags;
extern const PCHAR XmOpcodeNameTable1[];
extern const PCHAR XmOpcodeNameTable2[];
#endif
#endif // _EMULATE_