decompiler  1.0.0
Public Member Functions | Private Attributes | List of all members
ghidra::SegmentOp Class Reference

The segmented address operator. More...

#include <userop.hh>

Inheritance diagram for ghidra::SegmentOp:
ghidra::TermPatternOp ghidra::UserPcodeOp

Public Member Functions

 SegmentOp (Architecture *g, const string &nm, int4 ind)
 Constructor. More...
 
AddrSpacegetSpace (void) const
 Get the address space being pointed to.
 
bool hasFarPointerSupport (void) const
 Return true, if this op supports far pointers.
 
int4 getBaseSize (void) const
 Get size in bytes of the base/segment value.
 
int4 getInnerSize (void) const
 Get size in bytes of the near value.
 
const VarnodeDatagetResolve (void) const
 Get the default register for resolving indirect segments.
 
virtual int4 getNumVariableTerms (void) const
 Get the number of input Varnodes expected.
 
virtual bool unify (Funcdata &data, PcodeOp *op, vector< Varnode *> &bindlist) const
 Gather the formal input Varnode objects given the root PcodeOp. More...
 
virtual uintb execute (const vector< uintb > &input) const
 Compute the output value of this operation, given constant inputs. More...
 
virtual void decode (Decoder &decoder)
 Restore the detailed description from a stream element. More...
 
- Public Member Functions inherited from ghidra::TermPatternOp
 TermPatternOp (Architecture *g, const string &nm, int4 ind)
 Constructor.
 
- Public Member Functions inherited from ghidra::UserPcodeOp
 UserPcodeOp (Architecture *g, const string &nm, int4 ind)
 Construct from name and index.
 
const string & getName (void) const
 Get the low-level name of the p-code op.
 
int4 getIndex (void) const
 Get the constant id of the op.
 
uint4 getDisplay (void) const
 Get display type (0=functional)
 
virtual ~UserPcodeOp (void)
 Destructor.
 
virtual string getOperatorName (const PcodeOp *op) const
 Get the symbol representing this operation in decompiled code. More...
 
virtual int4 extractAnnotationSize (const Varnode *vn, const PcodeOp *op)
 Assign a size to an annotation input to this userop. More...
 

Private Attributes

AddrSpacespc
 The physical address space into which a segmented pointer points.
 
int4 injectId
 Id of InjectPayload that emulates this operation.
 
int4 baseinsize
 The size in bytes of the base or segment value.
 
int4 innerinsize
 The size in bytes of the near pointer value.
 
bool supportsfarpointer
 Is true if the joined pair base:near acts as a far pointer.
 
VarnodeData constresolve
 How to resolve constant near pointers.
 

Additional Inherited Members

- Public Types inherited from ghidra::UserPcodeOp
enum  userop_flags { annotation_assignment = 1, no_operator = 2 }
 Enumeration of different boolean properties that can be assigned to a CALLOTHER. More...
 
- Protected Attributes inherited from ghidra::UserPcodeOp
string name
 Low-level name of p-code operator.
 
int4 useropindex
 Index passed in the CALLOTHER op.
 
Architectureglb
 Architecture owning the user defined op.
 
uint4 flags
 Boolean attributes of the CALLOTHER.
 

Detailed Description

The segmented address operator.

This op is a placeholder for address mappings involving segments. The map goes between a high-level view of a pointer, consisting of multiple pieces, and a low-level view, where there is only a single absolute pointer. The mapping could be

The output of the operator is always a full low-level pointer. The operator takes two inputs:

High-level analysis can ignore the base/segment and any normalization on the near pointer. Emitted expressions involving this segment op prints only the near portion. Data-type information propagates only through this high-level side.

The decompiler looks for the term-tree defined in SegmentOp and replaces it with the SEGMENTOP operator in any p-code it analyzes. The core routine that looks for the term-tree is unify().

Constructor & Destructor Documentation

◆ SegmentOp()

ghidra::SegmentOp::SegmentOp ( Architecture g,
const string &  nm,
int4  ind 
)

Constructor.

Parameters
gis the owning Architecture for this instance of the segment operation
nmis the low-level name of the segment operation
indis the constant id identifying the specific CALLOTHER variant

References constresolve, and ghidra::VarnodeData::space.

Member Function Documentation

◆ decode()

void ghidra::SegmentOp::decode ( Decoder decoder)
virtual

◆ execute()

uintb ghidra::SegmentOp::execute ( const vector< uintb > &  input) const
virtual

Compute the output value of this operation, given constant inputs.

Parameters
inputis the ordered list of constant inputs
Returns
the resulting value as a constant

Implements ghidra::TermPatternOp.

References ghidra::ExecutablePcode::evaluate(), ghidra::PcodeInjectLibrary::getPayload(), ghidra::UserPcodeOp::glb, injectId, and ghidra::Architecture::pcodeinjectlib.

Referenced by ghidra::RuleSegment::applyOp(), and ghidra::EmulatePcodeOp::executeSegmentOp().

◆ unify()

bool ghidra::SegmentOp::unify ( Funcdata data,
PcodeOp op,
vector< Varnode *> &  bindlist 
) const
virtual

Gather the formal input Varnode objects given the root PcodeOp.

Parameters
datais the function being analyzed
opis the root operation
bindlistwill hold the ordered list of input Varnodes
Returns
true if the requisite inputs were found

Implements ghidra::TermPatternOp.

References baseinsize, ghidra::PcodeOp::code(), ghidra::CPUI_CALLOTHER, ghidra::PcodeOp::getIn(), ghidra::Varnode::getOffset(), innerinsize, ghidra::Varnode::isConstant(), ghidra::Funcdata::newConstant(), ghidra::PcodeOp::numInput(), and ghidra::UserPcodeOp::useropindex.

Referenced by ghidra::ActionSegmentize::apply().


The documentation for this class was generated from the following files: