Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
frag.h
Abstract:
This module contains public structures and interfaces for the fragment library.
Author:
Dave Hastings (daveh) creation-date 24-Jun-1995
Revision History:
--*/
#ifndef _FRAG_H_
#define _FRAG_H_
//
// function declaration for the function to patch Operand fragments
// CodeLocation specifies the location of the beginning of the copy
// of the fragment in memory. Reference indicates if it is a value
// or reference operand. Argument number refers to which argument it
// is for the c call to the operation fragment (zero based)
//
typedef INT (*PPLACEOPERANDFN)( IN PULONG CodeLocation, IN POPERAND Operand, IN ULONG OperandNumber );
//
// function declaration for the function to patch operation fragments
// CodeLocation specifies the location of the beginning of the copy
// of the fragment in memory
//
typedef ULONG (*PPLACEOPERATIONFN)(PULONG CodeLocation, #if _ALPHA_
ULONG CurrentECU, #endif
PINSTRUCTION Instruction);
//
// Structure to describe and locate the code for a fragment
//
typedef struct _FragDescr { BYTE FastPlaceFn; // index into PlaceFn[] when in fast mode
BYTE SlowPlaceFn; // index into PlaceFn[] when in slow mode
USHORT Flags; // OPFL_ flags
DWORD RegsSet; // registers set by this instr
USHORT FlagsNeeded; // bits from flags register required for this instr
USHORT FlagsSet; // bits from flags register modified by this instr
} FRAGDESC; typedef CONST FRAGDESC *PFRAGDESCR;
//
// Bit definitions for FRAGDESC.Flags field
//
#define OPFL_ALIGN 1
#define OPFL_HASNOFLAGS 2
#define OPFL_STOP_COMPILE 4
#define OPFL_END_NEXT_EP 8
#define OPFL_CTRLTRNS 16
#define OPFL_ADDR16 32
#define OPFL_INLINEARITH 64
// Bit values for FRAGDESC.RegsSet field
#define REGAL 1
#define REGAH 2
#define REGAX 3
#define REGEAX 7
#define REGCL (1<<3)
#define REGCH (2<<3)
#define REGCX (3<<3)
#define REGECX (7<<3)
#define REGDL (1<<6)
#define REGDH (2<<6)
#define REGDX (3<<6)
#define REGEDX (7<<6)
#define REGBL (1<<9)
#define REGBH (2<<9)
#define REGBX (3<<9)
#define REGEBX (7<<9)
#define REGSP (3<<12)
#define REGESP (7<<12)
#define REGBP (3<<15)
#define REGEBP (7<<15)
#define REGSI (3<<18)
#define REGESI (7<<18)
#define REGDI (3<<21)
#define REGEDI (7<<21)
#define ALLREGS (REGEAX|REGEBX|REGECX|REGEDX|REGESP|REGEBP|REGESI|REGEDI)
//
// Constants to help break apart bitfields of REG... constants. Register
// caching code uses a single DWORD to hold caching information for the 8
// x86 general-purpose registers (REGEAX through REGEDI), using 3 bits of
// data for each.
//
#define REGMASK 7
#define REGCOUNT 8
#define REGSHIFT 3
//
// Declare fragment description array
//
extern CONST FRAGDESC Fragments[OP_MAX]; extern CONST PPLACEOPERATIONFN PlaceFn[FN_MAX];
VOID FlushCallstack( PTHREADSTATE cpu );
//
// The following three functions are used by the indirect control transfer code
//
ULONG getUniqueIndex( VOID );
VOID FlushIndirControlTransferTable( VOID );
ULONG IndirectControlTransfer( IN ULONG tableEntry, IN ULONG intelAddr, IN PTHREADSTATE cpu );
ULONG IndirectControlTransferFar( IN PTHREADSTATE cpu, IN PUSHORT pintelAddr, IN ULONG tableEntry );
ULONG PlaceInstructions( PCHAR CodeLocation, DWORD cEntryPoints );
//
// Function for initializing the fragment library
//
BOOL FragLibInit( PCPUCONTEXT cpu, DWORD StackBase );
#endif
|