#include <CommonEmulator.h>
Onikiri::EmulatorUtility::CommonEmulator< Traits >に対する継承グラフ
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 ISAInfoIF * | GetISAInfo () |
virtual MemIF * | GetMemImage () |
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 |
CommonEmulator.h の 58 行で定義されています。
Onikiri::EmulatorUtility::CommonEmulator< Traits >::CommonEmulator | ( | SystemIF * | simSystem | ) |
CommonEmulator.h の 166 行で定義されています。
参照先 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 }
関数の呼び出しグラフ:
Onikiri::EmulatorUtility::CommonEmulator< Traits >::~CommonEmulator | ( | ) | [virtual] |
CommonEmulator.h の 180 行で定義されています。
参照先 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 }
関数の呼び出しグラフ:
void Onikiri::EmulatorUtility::CommonEmulator< Traits >::Commit | ( | OpStateIF * | op, | |
OpInfo * | opinfo | |||
) | [virtual] |
Onikiri::EmulatorIFを実装しています。
CommonEmulator.h の 342 行で定義されています。
参照先 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 }
関数の呼び出しグラフ:
void Onikiri::EmulatorUtility::CommonEmulator< Traits >::Execute | ( | OpStateIF * | op, | |
OpInfo * | opinfo | |||
) | [virtual] |
Onikiri::EmulatorIFを実装しています。
CommonEmulator.h の 328 行で定義されています。
参照先 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 }
関数の呼び出しグラフ:
PC Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetEntryPoint | ( | int | pid | ) | const [virtual] |
Onikiri::EmulatorIFを実装しています。
CommonEmulator.h の 228 行で定義されています。
参照先 ASSERT.
00229 { 00230 ASSERT((size_t)pid < m_processes.size()); 00231 return PC(pid, TID_INVALID, m_processes[pid]->GetEntryPoint() ); 00232 }
u64 Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetInitialRegValue | ( | int | pid, | |
int | index | |||
) | const [virtual] |
Onikiri::EmulatorIFを実装しています。
CommonEmulator.h の 235 行で定義されています。
00236 { 00237 assert((size_t)pid < m_processes.size()); 00238 return m_processes[pid]->GetInitialRegValue(index); 00239 }
ISAInfoIF * Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetISAInfo | ( | ) | [virtual] |
MemIF * Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetMemImage | ( | ) | [virtual] |
std::pair< OpInfo **, int > Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetOp | ( | PC | pc | ) | [virtual] |
int Onikiri::EmulatorUtility::CommonEmulator< Traits >::GetProcessCount | ( | ) | const [virtual] |
Onikiri::EmulatorUtility::CommonEmulator< Traits >::PARAM_ENTRY | ( | "count(Process)" | , | |
m_processCount | ||||
) |
void Onikiri::EmulatorUtility::CommonEmulator< Traits >::Read | ( | MemAccess * | access | ) | [virtual] |
Onikiri::MemIFを実装しています。
CommonEmulator.h の 413 行で定義されています。
参照先 Onikiri::MemAccess::address・Onikiri::EmulatorUtility::ProcessState::GetMemorySystem()・Onikiri::LogicalData::pid・Onikiri::EmulatorUtility::MemorySystem::ReadMemory().
00414 { 00415 int pid = access->address.pid; 00416 ProcessState* process = m_processes[pid]; 00417 process->GetMemorySystem()->ReadMemory(access); 00418 }
関数の呼び出しグラフ:
void Onikiri::EmulatorUtility::CommonEmulator< Traits >::SetExtraOpDecoder | ( | ExtraOpDecoderIF * | extraOpDecoder | ) | [virtual] |
PC Onikiri::EmulatorUtility::CommonEmulator< Traits >::Skip | ( | PC | pc, | |
u64 | skipCount, | |||
u64 * | regArray, | |||
u64 * | executedInsnCount, | |||
u64 * | executedOpCount | |||
) | [virtual] |
Onikiri::EmulatorIFを実装しています。
CommonEmulator.h の 358 行で定義されています。
参照先 Onikiri::EmulatorUtility::VirtualSystem::AddInsnTick()・Onikiri::Addr::address・Onikiri::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 }
関数の呼び出しグラフ:
void Onikiri::EmulatorUtility::CommonEmulator< Traits >::Write | ( | MemAccess * | access | ) | [virtual] |
Onikiri::MemIFを実装しています。
CommonEmulator.h の 421 行で定義されています。
参照先 Onikiri::MemAccess::address・Onikiri::EmulatorUtility::ProcessState::GetMemorySystem()・Onikiri::LogicalData::pid・Onikiri::EmulatorUtility::MemorySystem::WriteMemory().
00422 { 00423 int pid = access->address.pid; 00424 ProcessState* process = m_processes[pid]; 00425 process->GetMemorySystem()->WriteMemory(access); 00426 }
関数の呼び出しグラフ: