クラス テンプレート Onikiri::EmulatorUtility::CommonEmulator< Traits >

#include <CommonEmulator.h>

Onikiri::EmulatorUtility::CommonEmulator< Traits >に対する継承グラフ

Inheritance graph
[凡例]
Onikiri::EmulatorUtility::CommonEmulator< Traits >のコラボレーション図

Collaboration graph
[凡例]
すべてのメンバ一覧

Public メソッド

virtual void Commit (OpStateIF *op, OpInfo *opinfo)
 CommonEmulator (SystemIF *simSystem)
virtual void Execute (OpStateIF *op, OpInfo *opinfo)
virtual PC GetEntryPoint (int pid) const
virtual u64 GetInitialRegValue (int pid, int index) const
virtual ISAInfoIFGetISAInfo ()
virtual MemIFGetMemImage ()
virtual std::pair< OpInfo **,
int > 
GetOp (PC pc)
virtual int GetProcessCount () const
 PARAM_ENTRY ("count(Process)", m_processCount) RESULT_ENTRY("/Session/Result/System/@ResultCRC32"
virtual void Read (MemAccess *access)
virtual void SetExtraOpDecoder (ExtraOpDecoderIF *extraOpDecoder)
virtual PC Skip (PC pc, u64 skipCount, u64 *regArray, u64 *executedInsnCount, u64 *executedOpCount)
virtual void Write (MemAccess *access)
virtual ~CommonEmulator ()

構成

class  CodeWordHash

説明

template<class Traits>
class Onikiri::EmulatorUtility::CommonEmulator< Traits >

CommonEmulator.h58 行で定義されています。


コンストラクタとデストラクタ

template<class Traits>
Onikiri::EmulatorUtility::CommonEmulator< Traits >::CommonEmulator ( SystemIF simSystem  ) 

CommonEmulator.h166 行で定義されています。

参照先 Onikiri::ParamExchange::LoadParam()Onikiri::EmulatorUtility::Operation::testroundmode()THROW_RUNTIME_ERROR.

00167             :   m_opInfoArrayPool(sizeof(OpInfo*)),
00168                 m_extraOpDecoder(0),
00169                 m_enableResultCRC( false )
00170         {
00171             // param, vZX
00172             LoadParam();
00173             if (!CreateProcesses(simSystem)) {
00174                 THROW_RUNTIME_ERROR("failed to create target processes.");
00175             }
00176             Operation::testroundmode(NULL);
00177         }

関数の呼び出しグラフ:

template<class Traits>
Onikiri::EmulatorUtility::CommonEmulator< Traits >::~CommonEmulator (  )  [virtual]

CommonEmulator.h180 行で定義されています。

参照先 Onikiri::ParamExchange::ReleaseParam().

00181         {
00182             for (std::vector<ProcessState*>::iterator e = m_processes.begin(); e != m_processes.end(); ++e) {
00183                 delete *e;
00184             }
00185 
00186             ReleaseParam();
00187         }

関数の呼び出しグラフ:


関数

template<class Traits>
void Onikiri::EmulatorUtility::CommonEmulator< Traits >::Commit ( OpStateIF op,
OpInfo opinfo 
) [virtual]

Onikiri::EmulatorIFを実装しています。

CommonEmulator.h342 行で定義されています。

参照先 Onikiri::OpStateIF::GetDst()Onikiri::OpInfo::GetDstNum()Onikiri::OpStateIF::GetPC().

00343         {
00344             if( m_enableResultCRC ){
00345                 u64 dst = info->GetDstNum() > 0 ? op->GetDst(0) : 0;
00346                 CalcCRC( op->GetPC(), dst );
00347             }
00348         }

関数の呼び出しグラフ:

template<class Traits>
void Onikiri::EmulatorUtility::CommonEmulator< Traits >::Execute ( OpStateIF op,
OpInfo opinfo 
) [virtual]

Onikiri::EmulatorIFを実装しています。

CommonEmulator.h328 行で定義されています。

参照先 Onikiri::EmulatorUtility::VirtualSystem::AddInsnTick()Onikiri::EmulatorUtility::OpEmulationState::ApplyEmulationState()Onikiri::OpStateIF::GetPC()Onikiri::EmulatorUtility::ProcessState::GetVirtualSystem()Onikiri::LogicalData::pid.

00329         {
00330             OpInfoType* opInfo = static_cast<OpInfoType*>(opInfoBase);
00331             int pid = op->GetPC().pid;
00332             ProcessState* process = m_processes[pid];
00333 
00334             // タs
00335             OpEmulationState opState(op, opInfo, process);  // opIyh OpEmulationState \z
00336             opInfo->GetEmulationFunc()(&opState);
00337             opState.ApplyEmulationState<OpInfoType>();  // op l
00338             process->GetVirtualSystem()->AddInsnTick();
00339         }

関数の呼び出しグラフ:

template<class Traits>
PC Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetEntryPoint ( int  pid  )  const [virtual]

Onikiri::EmulatorIFを実装しています。

CommonEmulator.h228 行で定義されています。

参照先 ASSERT.

00229         {
00230             ASSERT((size_t)pid < m_processes.size());
00231             return PC(pid, TID_INVALID, m_processes[pid]->GetEntryPoint() );
00232         }

template<class Traits>
u64 Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetInitialRegValue ( int  pid,
int  index 
) const [virtual]

Onikiri::EmulatorIFを実装しています。

CommonEmulator.h235 行で定義されています。

00236         {
00237             assert((size_t)pid < m_processes.size());
00238             return m_processes[pid]->GetInitialRegValue(index);
00239         }

template<class Traits>
ISAInfoIF * Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetISAInfo (  )  [virtual]

Onikiri::EmulatorIFを実装しています。

CommonEmulator.h190 行で定義されています。

00191         {
00192             return &m_alpha64Info;
00193         }

template<class Traits>
MemIF * Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetMemImage (  )  [virtual]

Onikiri::EmulatorIFを実装しています。

CommonEmulator.h322 行で定義されています。

00323         {
00324             return this;
00325         }

template<class Traits>
std::pair< OpInfo **, int > Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetOp ( PC  pc  )  [virtual]

Onikiri::EmulatorIFを実装しています。

CommonEmulator.h316 行で定義されています。

00317         {
00318             return GetOpBody(pc);
00319         }

template<class Traits>
int Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetProcessCount (  )  const [virtual]

Onikiri::EmulatorIFを実装しています。

CommonEmulator.h222 行で定義されています。

00223         {
00224             return m_processCount;
00225         }

template<class Traits>
Onikiri::EmulatorUtility::CommonEmulator< Traits >::PARAM_ENTRY ( "count(Process)"  ,
m_processCount   
)

template<class Traits>
void Onikiri::EmulatorUtility::CommonEmulator< Traits >::Read ( MemAccess access  )  [virtual]

Onikiri::MemIFを実装しています。

CommonEmulator.h413 行で定義されています。

参照先 Onikiri::MemAccess::addressOnikiri::EmulatorUtility::ProcessState::GetMemorySystem()Onikiri::LogicalData::pidOnikiri::EmulatorUtility::MemorySystem::ReadMemory().

00414         {
00415             int pid = access->address.pid;
00416             ProcessState* process = m_processes[pid];
00417             process->GetMemorySystem()->ReadMemory(access);
00418         }

関数の呼び出しグラフ:

template<class Traits>
void Onikiri::EmulatorUtility::CommonEmulator< Traits >::SetExtraOpDecoder ( ExtraOpDecoderIF extraOpDecoder  )  [virtual]

Onikiri::EmulatorIFを実装しています。

CommonEmulator.h216 行で定義されています。

00217         {
00218             m_extraOpDecoder = extraOpDecoder;
00219         }

template<class Traits>
PC Onikiri::EmulatorUtility::CommonEmulator< Traits >::Skip ( PC  pc,
u64  skipCount,
u64 regArray,
u64 executedInsnCount,
u64 executedOpCount 
) [virtual]

Onikiri::EmulatorIFを実装しています。

CommonEmulator.h358 行で定義されています。

参照先 Onikiri::EmulatorUtility::VirtualSystem::AddInsnTick()Onikiri::Addr::addressOnikiri::EmulatorUtility::ProcessState::GetVirtualSystem()Onikiri::LogicalData::pid.

00359         {
00360             if (skipCount == 0) {
00361                 if (executedInsnCount)
00362                     *executedInsnCount = 0;
00363                 if (executedOpCount)
00364                     *executedOpCount = 0;
00365                 return pc;
00366             }
00367 
00368             u64 totalOpCount = 0;
00369             u64 initialSkipCount = skipCount;
00370             ProcessState* process = m_processes[pc.pid];
00371             VirtualSystem* virtualSystem = process->GetVirtualSystem();
00372             bool enableResultCRC = m_enableResultCRC;
00373 
00374             SkipOp op(this);
00375             while (skipCount-- != 0 && pc.address != 0) {
00376                 std::pair<OpInfo**, int> ops_pair = GetOpBody(pc);
00377                 OpInfo** opInfoArray = ops_pair.first;
00378                 int opCount = ops_pair.second;
00379 
00380                 // opInfoArray Sタs
00381                 for (int opIndex = 0; opIndex < opCount; opIndex ++) {
00382                     totalOpCount++;
00383                     OpInfoType* opInfo = static_cast<OpInfoType*>( opInfoArray[opIndex] );
00384                     
00385                     OpEmulationState opState(&op, opInfo, process, pc, pc.address + ISAInfoType::InstructionWordBitSize/8, regArray);   // opIyh OpEmulationState \z
00386                     opInfo->GetEmulationFunc()(&opState);
00387                     opState.ApplyEmulationStateToRegArray<OpInfoType>(regArray);
00388 
00389                     if( enableResultCRC ){
00390                         u64 dst = opInfo->GetDstNum() > 0 ? opState.GetDst(0) : 0;
00391                         CalcCRC( pc, dst );
00392                     }
00393                     virtualSystem->AddInsnTick();
00394     
00395                     if (opIndex == opCount-1) {
00396                         if (opState.GetTaken())
00397                             pc.address = opState.GetTakenPC();
00398                         else
00399                             pc.address += ISAInfoType::InstructionWordBitSize/8;
00400                         break;
00401                     }
00402                 }
00403             }
00404 
00405             if (executedInsnCount)
00406                 *executedInsnCount = initialSkipCount - skipCount;
00407             if (executedOpCount)
00408                 *executedOpCount = totalOpCount;
00409             return pc;
00410         }

関数の呼び出しグラフ:

template<class Traits>
void Onikiri::EmulatorUtility::CommonEmulator< Traits >::Write ( MemAccess access  )  [virtual]

Onikiri::MemIFを実装しています。

CommonEmulator.h421 行で定義されています。

参照先 Onikiri::MemAccess::addressOnikiri::EmulatorUtility::ProcessState::GetMemorySystem()Onikiri::LogicalData::pidOnikiri::EmulatorUtility::MemorySystem::WriteMemory().

00422         {
00423             int pid = access->address.pid;
00424             ProcessState* process = m_processes[pid];
00425             process->GetMemorySystem()->WriteMemory(access);
00426         }

関数の呼び出しグラフ:


このクラスの説明は次のファイルから生成されました:
Onikiri2に対してTue Jun 18 15:25:09 2013に生成されました。  doxygen 1.4.7