aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/debugger/uvsc/uvscengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/debugger/uvsc/uvscengine.cpp')
-rw-r--r--src/plugins/debugger/uvsc/uvscengine.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/plugins/debugger/uvsc/uvscengine.cpp b/src/plugins/debugger/uvsc/uvscengine.cpp
index bc796172c1..38e95df1db 100644
--- a/src/plugins/debugger/uvsc/uvscengine.cpp
+++ b/src/plugins/debugger/uvsc/uvscengine.cpp
@@ -32,6 +32,7 @@
#include <debugger/disassemblerlines.h>
#include <debugger/memoryagent.h>
#include <debugger/moduleshandler.h>
+#include <debugger/peripheralregisterhandler.h>
#include <debugger/registerhandler.h>
#include <debugger/stackhandler.h>
#include <debugger/threadshandler.h>
@@ -162,6 +163,9 @@ void UvscEngine::setupEngine()
if (!configureProject(rp))
return;
+
+ // Reload peripheral register description.
+ peripheralRegisterHandler()->updateRegisterGroups();
}
void UvscEngine::runEngine()
@@ -231,6 +235,14 @@ void UvscEngine::setRegisterValue(const QString &name, const QString &value)
reloadRegisters();
}
+void UvscEngine::setPeripheralRegisterValue(quint64 address, quint64 value)
+{
+ const QByteArray data = UvscUtils::encodeU32(value);
+ if (!m_client->changeMemory(address, data))
+ return;
+ reloadPeripheralRegisters();
+}
+
void UvscEngine::executeStepOver(bool byInstruction)
{
notifyInferiorRunRequested();
@@ -332,6 +344,7 @@ void UvscEngine::activateFrame(int index)
gotoCurrentLocation();
updateLocals();
reloadRegisters();
+ reloadPeripheralRegisters();
}
bool UvscEngine::stateAcceptsBreakpointChanges() const
@@ -469,6 +482,17 @@ void UvscEngine::reloadRegisters()
handleReloadRegisters();
}
+void UvscEngine::reloadPeripheralRegisters()
+{
+ if (!isPeripheralRegistersWindowVisible())
+ return;
+
+ const QList<quint64> addresses = peripheralRegisterHandler()->activeRegisters();
+ if (addresses.isEmpty())
+ return; // Nothing to update.
+ handleReloadPeripheralRegisters(addresses);
+}
+
void UvscEngine::reloadFullStack()
{
resetLocation();
@@ -496,6 +520,7 @@ void UvscEngine::updateAll()
handleThreadInfo();
reloadRegisters();
+ reloadPeripheralRegisters();
updateLocals();
}
@@ -608,6 +633,8 @@ void UvscEngine::handleUpdateLocation(quint64 address)
void UvscEngine::handleStartExecution()
{
+ if (state() != InferiorRunRequested)
+ notifyInferiorRunRequested();
notifyInferiorRunOk();
}
@@ -653,6 +680,7 @@ void UvscEngine::handleReloadStack(bool isFull)
if (!m_client->fetchStackFrames(taskId, m_address, data)) {
m_address = 0;
reloadRegisters();
+ reloadPeripheralRegisters();
return;
}
@@ -678,6 +706,19 @@ void UvscEngine::handleReloadRegisters()
}
}
+void UvscEngine::handleReloadPeripheralRegisters(const QList<quint64> &addresses)
+{
+ for (const quint64 address : addresses) {
+ QByteArray data = UvscUtils::encodeU32(0);
+ if (!m_client->fetchMemory(address, data)) {
+ showMessage(tr("UVSC: Fetching peripheral register failed."), LogMisc);
+ } else {
+ const quint32 value = UvscUtils::decodeU32(data);
+ peripheralRegisterHandler()->updateRegister(address, value);
+ }
+ }
+}
+
void UvscEngine::handleUpdateLocals(bool partial)
{
m_inUpdateLocals = false;