124 lines
2.8 KiB
C
124 lines
2.8 KiB
C
|
|
||
|
/*++
|
||
|
|
||
|
Copyright (c) 1993 Digital Equipment Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
optable.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Definitions for -
|
||
|
Table of operations, their names and charactersitics
|
||
|
Used by ntsd, windbg and acc's dissassembler
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Miche Baker-Harvey (mbh) 10-Jan-1993
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
*/
|
||
|
|
||
|
#ifndef _OPTABLE_
|
||
|
#define _OPTABLE_
|
||
|
|
||
|
|
||
|
// Each entry in the opTable is either for a
|
||
|
// + function - one option on a particular opcode
|
||
|
// + terminal opcode - an opcode without a function field
|
||
|
// the above two can both appear directly in disassembly
|
||
|
|
||
|
// + non terminal opcode - an opcode with a function field:
|
||
|
// these entries do not represent values which can be
|
||
|
// executed directly: they require a function entry.
|
||
|
|
||
|
// + invalid opcode - this is an opcode reserved to digital
|
||
|
|
||
|
|
||
|
typedef enum ENTRY_TYPE {
|
||
|
|
||
|
INVALID_ETYPE,
|
||
|
NON_TERMINAL_ETYPE,
|
||
|
TERMINAL_ETYPE,
|
||
|
FUNCTION_ETYPE,
|
||
|
NOT_AN_ETYPE
|
||
|
|
||
|
} ENTRY_TYPE;
|
||
|
|
||
|
|
||
|
#define NO_FUNC (ULONG)-1
|
||
|
|
||
|
typedef ULONG (* PFOPPARSE)();
|
||
|
|
||
|
typedef struct _OPTBLENTRY {
|
||
|
|
||
|
union {
|
||
|
|
||
|
struct {
|
||
|
|
||
|
PUCHAR _pszName; // Name of the instruction
|
||
|
PFOPPARSE _parsFunc; // Function to parse operands
|
||
|
|
||
|
} s0; // functions and terminal opcodes
|
||
|
|
||
|
struct {
|
||
|
|
||
|
struct _OPTBLENTRY * _funcTable; // Describes funcs for opcode
|
||
|
ULONG _funcTableSize; // Number of possible funcs
|
||
|
|
||
|
} s1; // non-terminal opcodes
|
||
|
|
||
|
} u;
|
||
|
|
||
|
|
||
|
// These fields describe the instruction
|
||
|
|
||
|
|
||
|
ULONG opCode; // Top 6 bits of a 32-bit alpha instr
|
||
|
ULONG funcCode; // Function; meaning is opcode dependent
|
||
|
ULONG iType; // type of the instr: branch, fp, mem...
|
||
|
// values are ALPHA_* in alphaops.h
|
||
|
|
||
|
ENTRY_TYPE eType; // type of this entry in the opTable
|
||
|
|
||
|
} OPTBLENTRY, * POPTBLENTRY;
|
||
|
|
||
|
|
||
|
// MBH - hack workaround:
|
||
|
// I tried to do this with nameless functions and structures;
|
||
|
// it works just fine on ALPHA, but dies on 386, so use this
|
||
|
// ugly hack instead.
|
||
|
// The name "pszAlphaName" is used instead of the more obvious
|
||
|
// "pszName" because other structures contain pszName.
|
||
|
|
||
|
#define pszAlphaName u.s0._pszName
|
||
|
#define parsFunc u.s0._parsFunc
|
||
|
#define funcTable u.s1._funcTable
|
||
|
#define funcTableSize u.s1._funcTableSize
|
||
|
|
||
|
POPTBLENTRY findNonTerminalEntry(ULONG);
|
||
|
POPTBLENTRY findStringEntry(PUCHAR);
|
||
|
POPTBLENTRY findOpCodeEntry(ULONG);
|
||
|
char * findFuncName(POPTBLENTRY, ULONG);
|
||
|
char * findFlagName(ULONG, ULONG);
|
||
|
void printTable();
|
||
|
void opTableInit();
|
||
|
|
||
|
|
||
|
// This structure is used for the floating point flag names.
|
||
|
|
||
|
|
||
|
#define FPFLAGS_NOT_AN_ENTRY 0xffffffff
|
||
|
|
||
|
typedef struct _FPFLAGS {
|
||
|
|
||
|
ULONG flags; // the flags on the opcode
|
||
|
PUCHAR flagname; // the string mnemonic for the flags
|
||
|
|
||
|
} FPFLAGS, * PFPFLAGS;
|
||
|
|
||
|
|
||
|
#endif // _OPTABLE_
|