bool MainMemoryAccessBase::doRead(uint32_t address, uint32_t* buffer, size_t count) { MemoryArea* cpu = mm->getMemoryArea("CPU"); if (!cpu) return false; uint32_t pc = 0; cpu->read(0, &pc, 1); bool omitFirst = (address & 0x1); if (omitFirst) { --address; ++count; } bool omitLast = (count & 1); if (omitLast) { ++count; } const hal_id readMacro = devHandle->supportsQuickMemRead() ? ID_ReadMemQuick : ID_ReadMemWords; HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(readMacro)); el->appendInputData32(this->getStart() + address); el->appendInputData32(static_cast<uint32_t>(count/2)); el->appendInputData32(pc); el->setOutputSize(count); ReadElement r(buffer, count, omitFirst, omitLast, 0); this->readMap[this->elements.size()] = r; this->elements.push_back(el); return true; }
bool DebugManagerV3::run (uint16_t controlMask, DebugEventTarget * cb, bool releaseJtag) { MemoryManager* mm = this->parent->getMemoryManager(); MemoryArea* cpu = mm->getMemoryArea("CPU"); if (!cpu) { return false; } lpm5WakeupDetected = false; if(cb!=0) { cbx=cb; } uint32_t pc, sr; cpu->read(0, &pc, 1); cpu->read(2, &sr, 1); if(mm->flushAll()==false) { return false; } cycleCounter_.reset(); ConfigManager *cm = parent->getFetHandle()->getConfigManager(); const uint16_t mdb = parent->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager()->getInstructionAt(pc); if (mdb != 0) { mdbPatchValue = mdb; } HalExecElement* el = new HalExecElement(this->parent->checkHalId(ID_RestoreContext_ReleaseJtag)); this->parent->getWatchdogControl()->addParamsTo(el); el->appendInputData32(pc); el->appendInputData16(sr); el->appendInputData16(controlMask!=0? 0x0007: 0x0006); // eem control bits el->appendInputData16(mdbPatchValue); // mdb el->appendInputData16(releaseJtag ? 1 : 0); el->appendInputData16(cm->ulpDebugEnabled() ? 1 : 0); mdbPatchValue = 0; HalExecCommand cmd; cmd.elements.push_back(el); if (!this->parent->send(cmd)) { return false; } // handle lpmx5 polling if (releaseJtag) { pausePolling(); } else { this->resumePolling(); } if (controlMask!=0 && !releaseJtag) { if (!activatePolling(controlMask)) { return false; } } resetCycleCounterBeforeNextStep = true; return true; }