From 3828c94b3938ddc60cc431e719a75ec0c8fdbaf7 Mon Sep 17 00:00:00 2001
From: Tim Sander <tim@krieglstein.org>
Date: Thu, 5 Jun 2014 17:22:51 +0200
Subject: [PATCH] GdbDebugger: add fast restart for debugging

Change-Id: Ie51847de912748d05a6b208bec82fd612d777202
Reviewed-by: hjk <hjk121@nokiamail.com>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@digia.com>
---
 src/plugins/baremetal/baremetal.pro           |   4 -
 src/plugins/baremetal/baremetal.qbs           |   3 +-
 src/plugins/baremetal/baremetaldevice.cpp     |  46 +++++++++
 src/plugins/baremetal/baremetaldevice.h       |   9 ++
 .../baremetaldeviceconfigurationwidget.cpp    |  88 ++++++++++++------
 .../baremetaldeviceconfigurationwidget.h      |  20 +++-
 .../baremetaldeviceconfigurationwidget.ui     |  82 ----------------
 .../baremetaldeviceconfigurationwizard.cpp    |   1 +
 ...aremetaldeviceconfigurationwizardpages.cpp |  86 ++++++++++++-----
 .../baremetaldeviceconfigurationwizardpages.h |  27 +++---
 ...metaldeviceconfigurationwizardsetuppage.ui |  86 -----------------
 .../baremetal/baremetalruncontrolfactory.cpp  |   2 +-
 .../baremetal/baremetalruncontrolfactory.h    |   1 +
 src/plugins/debugger/debugger.qrc             |   2 +
 src/plugins/debugger/debuggerconstants.h      |   4 +-
 src/plugins/debugger/debuggerengine.h         |   1 +
 src/plugins/debugger/debuggerplugin.cpp       |  25 +++++
 .../debugger/debuggerstartparameters.h        |   1 +
 src/plugins/debugger/gdb/gdbengine.cpp        |  29 +++++-
 src/plugins/debugger/gdb/gdbengine.h          |   1 +
 .../debugger/gdb/remotegdbserveradapter.cpp   |   2 +-
 .../debugger/images/debugger_restart.png      | Bin 0 -> 1035 bytes
 .../debugger/images/debugger_restart.svg      |  77 +++++++++++++++
 .../images/debugger_restart_small.png         | Bin 0 -> 675 bytes
 .../remotelinux/remotelinuxdebugsupport.cpp   |   1 +
 25 files changed, 347 insertions(+), 251 deletions(-)
 delete mode 100644 src/plugins/baremetal/baremetaldeviceconfigurationwidget.ui
 delete mode 100644 src/plugins/baremetal/baremetaldeviceconfigurationwizardsetuppage.ui
 create mode 100644 src/plugins/debugger/images/debugger_restart.png
 create mode 100644 src/plugins/debugger/images/debugger_restart.svg
 create mode 100644 src/plugins/debugger/images/debugger_restart_small.png

diff --git a/src/plugins/baremetal/baremetal.pro b/src/plugins/baremetal/baremetal.pro
index e877b934a12..7cf1db563dd 100644
--- a/src/plugins/baremetal/baremetal.pro
+++ b/src/plugins/baremetal/baremetal.pro
@@ -27,7 +27,3 @@ HEADERS += baremetalplugin.h \
     baremetaldeviceconfigurationwidget.h \
     baremetaldeviceconfigurationwizard.h \
     baremetaldeviceconfigurationwizardpages.h
-
-FORMS += \
-    baremetaldeviceconfigurationwizardsetuppage.ui \
-    baremetaldeviceconfigurationwidget.ui
diff --git a/src/plugins/baremetal/baremetal.qbs b/src/plugins/baremetal/baremetal.qbs
index 5571c745f63..72a2f3f71f2 100644
--- a/src/plugins/baremetal/baremetal.qbs
+++ b/src/plugins/baremetal/baremetal.qbs
@@ -21,12 +21,11 @@ QtcPlugin {
         "baremetaldeviceconfigurationwidget.cpp", "baremetaldeviceconfigurationwidget.h",
         "baremetaldeviceconfigurationwizard.cpp", "baremetaldeviceconfigurationwizard.h",
         "baremetaldeviceconfigurationwizardpages.cpp", "baremetaldeviceconfigurationwizardpages.h",
-        "baremetaldeviceconfigurationwizardsetuppage.ui",
         "baremetalgdbcommandsdeploystep.cpp", "baremetalgdbcommandsdeploystep.h",
         "baremetalplugin.cpp", "baremetalplugin.h",
         "baremetalrunconfiguration.cpp", "baremetalrunconfiguration.h",
         "baremetalrunconfigurationfactory.cpp", "baremetalrunconfigurationfactory.h",
-        "baremetalrunconfigurationwidget.cpp", "baremetalrunconfigurationwidget.h", "baremetaldeviceconfigurationwidget.ui",
+        "baremetalrunconfigurationwidget.cpp", "baremetalrunconfigurationwidget.h",
         "baremetalruncontrolfactory.cpp", "baremetalruncontrolfactory.h",
     ]
 }
diff --git a/src/plugins/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp
index 5913f33a914..8a0ab724d73 100644
--- a/src/plugins/baremetal/baremetaldevice.cpp
+++ b/src/plugins/baremetal/baremetaldevice.cpp
@@ -38,6 +38,7 @@ using namespace ProjectExplorer;
 namespace BareMetal {
 namespace Internal {
 
+const char GdbResetKey[] = "GdbResetCommand";
 const char GdbCommandsKey[] = "GdbCommands";
 
 BareMetalDevice::Ptr BareMetalDevice::create()
@@ -58,12 +59,14 @@ BareMetalDevice::Ptr BareMetalDevice::create(const BareMetalDevice &other)
 void BareMetalDevice::fromMap(const QVariantMap &map)
 {
     IDevice::fromMap(map);
+    setGdbResetCommands(map.value(QLatin1String(GdbResetKey)).toString());
     setGdbInitCommands(map.value(QLatin1String(GdbCommandsKey)).toString());
 }
 
 QVariantMap BareMetalDevice::toMap() const
 {
     QVariantMap map = IDevice::toMap();
+    map.insert(QLatin1String(GdbResetKey), gdbResetCommands());
     map.insert(QLatin1String(GdbCommandsKey), gdbInitCommands());
     return map;
 }
@@ -114,8 +117,51 @@ BareMetalDevice::BareMetalDevice(const QString &name, Core::Id type, MachineType
 BareMetalDevice::BareMetalDevice(const BareMetalDevice &other)
     : IDevice(other)
 {
+    setGdbResetCommands(other.gdbResetCommands());
     setGdbInitCommands(other.gdbInitCommands());
 }
 
+QString BareMetalDevice::exampleString()
+{
+    return QLatin1String("<p><i>")
+            + QCoreApplication::translate("BareMetal", "Example:")
+            + QLatin1String("</i><p>");
+}
+
+QString BareMetalDevice::hostLineToolTip()
+{
+    return QLatin1String("<html>")
+            + QCoreApplication::translate("BareMetal",
+              "Enter your hostname like \"localhost\" or \"192.0.2.1\" or "
+              "a command which must support GDB pipelining "
+              "starting with a pipe symbol.")
+            + exampleString() + QLatin1String(
+              "&nbsp;&nbsp;|openocd -c \"gdb_port pipe; "
+              "log_output openocd.log\" -f boards/myboard.cfg");
+}
+
+QString BareMetalDevice::resetCommandToolTip()
+{
+    return QLatin1String("<html>")
+            + QCoreApplication::translate("BareMetal",
+              "Enter the hardware reset command here.<br>"
+              "The CPU should be halted after this command.")
+            + exampleString() + QLatin1String(
+              "&nbsp;&nbsp;monitor reset halt");
+}
+
+QString BareMetalDevice::initCommandToolTip()
+{
+    return QLatin1String("<html>")
+            + QCoreApplication::translate("BareMetal",
+              "Enter commands to reset the board, and write the nonvolatile memory.")
+            + exampleString() + QLatin1String(
+              "&nbsp;&nbsp;set remote hardware-breakpoint-limit 6<br/>"
+              "&nbsp;&nbsp;set remote hardware-watchpoint-limit 4<br/>"
+              "&nbsp;&nbsp;monitor reset halt<br/>"
+              "&nbsp;&nbsp;load<br/>"
+              "&nbsp;&nbsp;monitor reset halt");
+}
+
 } //namespace Internal
 } //namespace BareMetal
diff --git a/src/plugins/baremetal/baremetaldevice.h b/src/plugins/baremetal/baremetaldevice.h
index 3da87b64e8d..375fcf400a3 100644
--- a/src/plugins/baremetal/baremetaldevice.h
+++ b/src/plugins/baremetal/baremetaldevice.h
@@ -55,12 +55,20 @@ public:
 
     ProjectExplorer::DeviceProcessSignalOperation::Ptr signalOperation() const;
 
+    QString gdbResetCommands() const { return m_gdbResetCommands; }
+    void setGdbResetCommands(const QString &gdbResetCommands) { m_gdbResetCommands = gdbResetCommands; }
+
     QString gdbInitCommands() const { return m_gdbInitCommands; }
     void setGdbInitCommands(const QString &gdbCommands) { m_gdbInitCommands=gdbCommands; }
 
     virtual void fromMap(const QVariantMap &map);
     virtual QVariantMap toMap() const;
 
+    static QString exampleString();
+    static QString hostLineToolTip();
+    static QString initCommandToolTip();
+    static QString resetCommandToolTip();
+
 protected:
     BareMetalDevice() {}
     BareMetalDevice(const QString &name, Core::Id type,
@@ -69,6 +77,7 @@ protected:
 
 private:
     BareMetalDevice &operator=(const BareMetalDevice &);
+    QString m_gdbResetCommands;
     QString m_gdbInitCommands;
 };
 
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp
index 34cc50b51e3..0431977fbc9 100644
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp
+++ b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp
@@ -29,74 +29,100 @@
 
 #include "baremetaldeviceconfigurationwidget.h"
 
-#include "ui_baremetaldeviceconfigurationwidget.h"
 #include "baremetaldevice.h"
 
 #include <coreplugin/variablechooser.h>
 #include <ssh/sshconnection.h>
 #include <utils/qtcassert.h>
 
+#include <QFormLayout>
 #include <QLabel>
+#include <QLineEdit>
+#include <QSpinBox>
+#include <QPlainTextEdit>
 
+using namespace Core;
 using namespace QSsh;
 
 namespace BareMetal {
-using namespace Internal;
+namespace Internal {
 
 BareMetalDeviceConfigurationWidget::BareMetalDeviceConfigurationWidget(
-        const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent) :
-   IDeviceWidget(deviceConfig, parent),
-   m_ui(new Ui::BareMetalDeviceConfigurationWidget)
+        const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent)
+    : IDeviceWidget(deviceConfig, parent)
 {
-    m_ui->setupUi(this);
-    connect(m_ui->gdbHostLineEdit, SIGNAL(editingFinished()), SLOT(hostnameChanged()));
-    connect(m_ui->gdbPortSpinBox, SIGNAL(valueChanged(int)), SLOT(portChanged()));
-    connect(m_ui->gdbCommandsTextEdit, SIGNAL(textChanged()), SLOT(gdbInitCommandsChanged()));
-    Core::VariableChooser::addVariableSupport(m_ui->gdbCommandsTextEdit);
-    new Core::VariableChooser(this);
-    initGui();
-}
+    SshConnectionParameters sshParams = device()->sshParameters();
+    QSharedPointer<BareMetalDevice> p = qSharedPointerCast<BareMetalDevice>(device());
+    QTC_ASSERT(!p.isNull(), return);
 
-BareMetalDeviceConfigurationWidget::~BareMetalDeviceConfigurationWidget()
-{
-    delete m_ui;
+    m_gdbHostLineEdit = new QLineEdit(this);
+    m_gdbHostLineEdit->setText(sshParams.host);
+    m_gdbHostLineEdit->setToolTip(BareMetalDevice::hostLineToolTip());
+
+    m_gdbPortSpinBox = new QSpinBox(this);
+    m_gdbPortSpinBox->setRange(1, 65535);
+    m_gdbPortSpinBox->setValue(sshParams.port);
+
+    m_gdbInitCommandsTextEdit = new QPlainTextEdit(this);
+    m_gdbInitCommandsTextEdit->setPlainText(p->gdbInitCommands());
+    m_gdbInitCommandsTextEdit->setToolTip(BareMetalDevice::initCommandToolTip());
+
+    m_gdbResetCommandsTextEdit = new QPlainTextEdit(this);
+    m_gdbResetCommandsTextEdit->setPlainText(p->gdbResetCommands());
+    m_gdbResetCommandsTextEdit->setToolTip(BareMetalDevice::resetCommandToolTip());
+
+    QFormLayout *formLayout = new QFormLayout(this);
+    formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
+    formLayout->addRow(tr("GDB host:"), m_gdbHostLineEdit);
+    formLayout->addRow(tr("GDB port:"), m_gdbPortSpinBox);
+    formLayout->addRow(tr("Init commands:"), m_gdbInitCommandsTextEdit);
+    formLayout->addRow(tr("Reset commands:"), m_gdbResetCommandsTextEdit);
+
+    VariableChooser::addVariableSupport(m_gdbResetCommandsTextEdit);
+    VariableChooser::addVariableSupport(m_gdbInitCommandsTextEdit);
+    (void)new VariableChooser(this);
+
+    connect(m_gdbHostLineEdit, SIGNAL(editingFinished()), SLOT(hostnameChanged()));
+    connect(m_gdbPortSpinBox, SIGNAL(valueChanged(int)), SLOT(portChanged()));
+    connect(m_gdbResetCommandsTextEdit, SIGNAL(textChanged()),SLOT(gdbResetCommandsChanged()));
+    connect(m_gdbInitCommandsTextEdit, SIGNAL(textChanged()), SLOT(gdbInitCommandsChanged()));
 }
 
 void BareMetalDeviceConfigurationWidget::hostnameChanged()
 {
     SshConnectionParameters sshParams = device()->sshParameters();
-    sshParams.host = m_ui->gdbHostLineEdit->text().trimmed();
+    sshParams.host = m_gdbHostLineEdit->text().trimmed();
     device()->setSshParameters(sshParams);
 }
 
 void BareMetalDeviceConfigurationWidget::portChanged()
 {
     SshConnectionParameters sshParams = device()->sshParameters();
-    sshParams.port = m_ui->gdbPortSpinBox->value();
+    sshParams.port = m_gdbPortSpinBox->value();
     device()->setSshParameters(sshParams);
 }
 
+void BareMetalDeviceConfigurationWidget::gdbResetCommandsChanged()
+{
+    QSharedPointer<BareMetalDevice> p = qSharedPointerCast<BareMetalDevice>(device());
+    QTC_ASSERT(!p.isNull(), return);
+    p->setGdbResetCommands(m_gdbResetCommandsTextEdit->toPlainText().trimmed());
+}
+
 void BareMetalDeviceConfigurationWidget::gdbInitCommandsChanged()
 {
     QSharedPointer<BareMetalDevice> p = qSharedPointerCast<BareMetalDevice>(device());
     QTC_ASSERT(!p.isNull(), return);
-    p->setGdbInitCommands(m_ui->gdbCommandsTextEdit->toPlainText());
+    p->setGdbInitCommands(m_gdbInitCommandsTextEdit->toPlainText());
 }
 
-void BareMetalDeviceConfigurationWidget::updateDeviceFromUi() {
+void BareMetalDeviceConfigurationWidget::updateDeviceFromUi()
+{
     hostnameChanged();
     portChanged();
+    gdbResetCommandsChanged();
     gdbInitCommandsChanged();
 }
 
-void BareMetalDeviceConfigurationWidget::initGui()
-{
-    SshConnectionParameters sshParams = device()->sshParameters();
-    m_ui->gdbHostLineEdit->setText(sshParams.host);
-    m_ui->gdbPortSpinBox->setValue(sshParams.port);
-    QSharedPointer<BareMetalDevice> p = qSharedPointerCast<BareMetalDevice>(device());
-    QTC_ASSERT(!p.isNull(), return);
-    m_ui->gdbCommandsTextEdit->setPlainText(p->gdbInitCommands());
-}
-
-} //namespace BareMetal
+} // namespace Internal
+} // namespace BareMetal
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h
index 3927a5b397a..fb1dc29088e 100644
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h
+++ b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h
@@ -32,9 +32,14 @@
 
 #include <projectexplorer/devicesupport/idevicewidget.h>
 
-namespace BareMetal {
+QT_BEGIN_NAMESPACE
+class QLineEdit;
+class QSpinBox;
+class QPlainTextEdit;
+QT_END_NAMESPACE
 
-namespace Ui { class BareMetalDeviceConfigurationWidget; }
+namespace BareMetal {
+namespace Internal {
 
 class BareMetalDeviceConfigurationWidget
       : public ProjectExplorer::IDeviceWidget
@@ -44,19 +49,24 @@ class BareMetalDeviceConfigurationWidget
 public:
     explicit BareMetalDeviceConfigurationWidget(
         const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent = 0);
-    ~BareMetalDeviceConfigurationWidget();
 
 private slots:
     void hostnameChanged();
     void portChanged();
+    void gdbResetCommandsChanged();
     void gdbInitCommandsChanged();
 
 private:
     void updateDeviceFromUi();
     void initGui();
-    Ui::BareMetalDeviceConfigurationWidget *m_ui;
+
+    QLineEdit *m_gdbHostLineEdit;
+    QSpinBox *m_gdbPortSpinBox;
+    QPlainTextEdit *m_gdbResetCommandsTextEdit;
+    QPlainTextEdit *m_gdbInitCommandsTextEdit;
 };
 
-} //namespace BareMetal
+} // namespace Internal
+} // namespace BareMetal
 
 #endif // BAREMETALDEVICECONFIGURATIONWIDGET_H
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.ui b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.ui
deleted file mode 100644
index 17236089bec..00000000000
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.ui
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>BareMetal::BareMetalDeviceConfigurationWidget</class>
- <widget class="QWidget" name="BareMetal::BareMetalDeviceConfigurationWidget">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>496</width>
-    <height>251</height>
-   </rect>
-  </property>
-  <property name="minimumSize">
-   <size>
-    <width>100</width>
-    <height>100</height>
-   </size>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <property name="locale">
-   <locale language="English" country="UnitedStates"/>
-  </property>
-  <layout class="QFormLayout" name="formLayout">
-   <property name="fieldGrowthPolicy">
-    <enum>QFormLayout::ExpandingFieldsGrow</enum>
-   </property>
-   <item row="0" column="0">
-    <widget class="QLabel" name="gdbHostLabel">
-     <property name="locale">
-      <locale language="English" country="UnitedStates"/>
-     </property>
-     <property name="text">
-      <string>GDB host:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1">
-    <widget class="QLineEdit" name="gdbHostLineEdit"/>
-   </item>
-   <item row="1" column="0">
-    <widget class="QLabel" name="gdbPortLabel">
-     <property name="locale">
-      <locale language="English" country="UnitedStates"/>
-     </property>
-     <property name="text">
-      <string>GDB port:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1">
-    <widget class="QSpinBox" name="gdbPortSpinBox">
-     <property name="minimum">
-      <number>1</number>
-     </property>
-     <property name="maximum">
-      <number>65535</number>
-     </property>
-     <property name="value">
-      <number>3333</number>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0">
-    <widget class="QLabel" name="gdbCommandsLabel">
-     <property name="locale">
-      <locale language="English" country="UnitedStates"/>
-     </property>
-     <property name="text">
-      <string>GDB commands:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1">
-    <widget class="QPlainTextEdit" name="gdbCommandsTextEdit"/>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp
index d891267e0ea..ae15ced0b73 100644
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp
+++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp
@@ -78,6 +78,7 @@ IDevice::Ptr BareMetalDeviceConfigurationWizard::device() const
                                                   Core::Id(Constants::BareMetalOsType),
                                                   IDevice::Hardware);
     device->setSshParameters(sshParams);
+    device->setGdbResetCommands(d->m_setupPage.gdbResetCommands());
     device->setGdbInitCommands(d->m_setupPage.gdbInitCommands());
     return device;
 }
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp
index 717a6190789..90ef922f837 100644
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp
+++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp
@@ -28,39 +28,73 @@
 ****************************************************************************/
 
 #include "baremetaldeviceconfigurationwizardpages.h"
-#include "ui_baremetaldeviceconfigurationwizardsetuppage.h"
+#include "baremetaldevice.h"
 
 #include <coreplugin/variablechooser.h>
 #include <projectexplorer/devicesupport/idevice.h>
 
+#include <QFormLayout>
+#include <QLineEdit>
+#include <QPlainTextEdit>
+#include <QSpinBox>
+
+using namespace Core;
+
 namespace BareMetal {
 namespace Internal {
-class BareMetalDeviceConfigurationWizardSetupPagePrivate;
-} // namespace Internal
 
-BareMetalDeviceConfigurationWizardSetupPage::BareMetalDeviceConfigurationWizardSetupPage(QWidget *parent) :
-    QWizardPage(parent), d(new Internal::BareMetalDeviceConfigurationWizardSetupPagePrivate)
+BareMetalDeviceConfigurationWizardSetupPage::BareMetalDeviceConfigurationWizardSetupPage(QWidget *parent)
+    : QWizardPage(parent)
 {
-    d->ui.setupUi(this);
     setTitle(tr("Set up GDB Server or Hardware Debugger"));
-    setSubTitle(QLatin1String(" ")); // For Qt bug (background color)
-    connect(d->ui.hostNameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged()));
-    connect(d->ui.nameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged()));
-    connect(d->ui.portSpinBox, SIGNAL(valueChanged(int)), SIGNAL(completeChanged()));
-    connect(d->ui.gdbInitCommandsPlainTextEdit, SIGNAL(textChanged()), SIGNAL(completeChanged()));
-    Core::VariableChooser::addVariableSupport(d->ui.gdbInitCommandsPlainTextEdit);
-    new Core::VariableChooser(this);
-}
 
-BareMetalDeviceConfigurationWizardSetupPage::~BareMetalDeviceConfigurationWizardSetupPage()
-{
-    delete d;
+    m_nameLineEdit = new QLineEdit(this);
+
+    m_hostNameLineEdit = new QLineEdit(this);
+    m_hostNameLineEdit->setToolTip(BareMetalDevice::hostLineToolTip());
+    m_hostNameLineEdit->setText(QLatin1String(
+        "|openocd -c \"gdb_port pipe\" -c \"log_output openocd.log;\" "
+        "-f board/stm3241g_eval_stlink.cfg"));
+
+    m_portSpinBox = new QSpinBox(this);
+    m_portSpinBox->setRange(1, 65535);
+    m_portSpinBox->setValue(3333);
+
+    m_gdbInitCommandsPlainTextEdit = new QPlainTextEdit(this);
+    m_gdbInitCommandsPlainTextEdit->setToolTip(BareMetalDevice::initCommandToolTip());
+    m_gdbInitCommandsPlainTextEdit->setPlainText(QLatin1String(
+        "set remote hardware-breakpoint-limit 6\n"
+        "set remote hardware-watchpoint-limit 4\n"
+        "monitor reset halt\n"
+        "load\n"
+        "monitor reset halt"));
+
+    m_gdbResetCommandsTextEdit = new QPlainTextEdit(this);
+    m_gdbResetCommandsTextEdit->setToolTip(BareMetalDevice::resetCommandToolTip());
+    m_gdbResetCommandsTextEdit->setPlainText(QLatin1String("monitor reset halt"));
+
+    QFormLayout *formLayout = new QFormLayout(this);
+    formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
+    formLayout->addRow(tr("Name:"), m_nameLineEdit);
+    formLayout->addRow(tr("GDB host:"), m_hostNameLineEdit);
+    formLayout->addRow(tr("GDB port:"), m_portSpinBox);
+    formLayout->addRow(tr("Init commands:"), m_gdbInitCommandsPlainTextEdit);
+    formLayout->addRow(tr("Reset commands:"), m_gdbResetCommandsTextEdit);
+
+    connect(m_nameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged()));
+    connect(m_hostNameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged()));
+    connect(m_portSpinBox, SIGNAL(valueChanged(int)), SIGNAL(completeChanged()));
+    connect(m_gdbResetCommandsTextEdit, SIGNAL(textChanged()), SIGNAL(completeChanged()));
+    connect(m_gdbInitCommandsPlainTextEdit, SIGNAL(textChanged()), SIGNAL(completeChanged()));
+
+    VariableChooser::addVariableSupport(m_gdbResetCommandsTextEdit);
+    VariableChooser::addVariableSupport(m_gdbInitCommandsPlainTextEdit);
+    (void)new VariableChooser(this);
 }
 
 void BareMetalDeviceConfigurationWizardSetupPage::initializePage()
 {
-    d->ui.nameLineEdit->setText(defaultConfigurationName());
-
+    m_nameLineEdit->setText(defaultConfigurationName());
 }
 
 bool BareMetalDeviceConfigurationWizardSetupPage::isComplete() const
@@ -70,22 +104,27 @@ bool BareMetalDeviceConfigurationWizardSetupPage::isComplete() const
 
 QString BareMetalDeviceConfigurationWizardSetupPage::configurationName() const
 {
-    return d->ui.nameLineEdit->text().trimmed();
+    return m_nameLineEdit->text().trimmed();
 }
 
 QString BareMetalDeviceConfigurationWizardSetupPage::gdbHostname() const
 {
-    return d->ui.hostNameLineEdit->text().trimmed();
+    return m_hostNameLineEdit->text().trimmed();
 }
 
 quint16 BareMetalDeviceConfigurationWizardSetupPage::gdbPort() const
 {
-    return quint16(d->ui.portSpinBox->value());
+    return quint16(m_portSpinBox->value());
+}
+
+QString BareMetalDeviceConfigurationWizardSetupPage::gdbResetCommands() const
+{
+    return m_gdbResetCommandsTextEdit->toPlainText().trimmed();
 }
 
 QString BareMetalDeviceConfigurationWizardSetupPage::gdbInitCommands() const
 {
-    return d->ui.gdbInitCommandsPlainTextEdit->toPlainText();
+    return m_gdbInitCommandsPlainTextEdit->toPlainText().trimmed();
 }
 
 QString BareMetalDeviceConfigurationWizardSetupPage::defaultConfigurationName() const
@@ -93,4 +132,5 @@ QString BareMetalDeviceConfigurationWizardSetupPage::defaultConfigurationName()
     return tr("Bare Metal Device");
 }
 
+} // namespace Internal
 } // namespace BareMetal
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h
index 1cbb75455e8..16096a14947 100644
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h
+++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h
@@ -30,40 +30,41 @@
 #ifndef BAREMETALDEVICECONFIGURATIONWIZARDPAGES_H
 #define BAREMETALDEVICECONFIGURATIONWIZARDPAGES_H
 
-#include "ui_baremetaldeviceconfigurationwizardsetuppage.h"
 #include <QWizardPage>
 
-namespace BareMetal {
+QT_BEGIN_NAMESPACE
+class QLineEdit;
+class QSpinBox;
+class QPlainTextEdit;
+QT_END_NAMESPACE
 
+namespace BareMetal {
 namespace Internal {
 
-class BareMetalDeviceConfigurationWizardSetupPagePrivate
-{
-public:
-    Ui::BareMetalDeviceConfigurationWizardSetupPage ui;
-};
-
-} // namespace Internal
-
 class BareMetalDeviceConfigurationWizardSetupPage : public QWizardPage
 {
-    Q_OBJECT
 public:
     explicit BareMetalDeviceConfigurationWizardSetupPage(QWidget *parent = 0);
-    ~BareMetalDeviceConfigurationWizardSetupPage();
 
     void initializePage();
     bool isComplete() const;
     QString configurationName() const;
     QString gdbHostname() const;
     quint16 gdbPort() const;
+    QString gdbResetCommands() const;
     QString gdbInitCommands() const;
 
     virtual QString defaultConfigurationName() const;
+
 private:
-    Internal::BareMetalDeviceConfigurationWizardSetupPagePrivate * const d;
+    QLineEdit *m_nameLineEdit;
+    QLineEdit *m_hostNameLineEdit;
+    QSpinBox *m_portSpinBox;
+    QPlainTextEdit *m_gdbResetCommandsTextEdit;
+    QPlainTextEdit *m_gdbInitCommandsPlainTextEdit;
 };
 
+} // namespace Internal
 } // namespace BareMetal
 
 #endif // BAREMETALDEVICECONFIGURATIONWIZARDPAGES_H
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardsetuppage.ui b/src/plugins/baremetal/baremetaldeviceconfigurationwizardsetuppage.ui
deleted file mode 100644
index be6c1dd1203..00000000000
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardsetuppage.ui
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>BareMetal::Internal::BareMetalDeviceConfigurationWizardSetupPage</class>
- <widget class="QWidget" name="BareMetal::Internal::BareMetalDeviceConfigurationWizardSetupPage">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>517</width>
-    <height>301</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <property name="locale">
-   <locale language="English" country="UnitedStates"/>
-  </property>
-  <layout class="QFormLayout" name="formLayout">
-   <item row="0" column="0">
-    <widget class="QLabel" name="namelabel">
-     <property name="text">
-      <string>Name:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1">
-    <widget class="QLineEdit" name="nameLineEdit"/>
-   </item>
-   <item row="3" column="1">
-    <widget class="QLineEdit" name="hostNameLineEdit">
-     <property name="text">
-      <string>|openocd -c &quot;gdb_port pipe&quot; -c &quot;log_output openocd.log;&quot; -f board/stm3241g_eval_stlink.cfg</string>
-     </property>
-    </widget>
-   </item>
-   <item row="6" column="0">
-    <widget class="QLabel" name="HostPortLabel">
-     <property name="text">
-      <string>GDB port:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="0">
-    <widget class="QLabel" name="hostLabel">
-     <property name="text">
-      <string>GDB host:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="6" column="1">
-    <widget class="QSpinBox" name="portSpinBox">
-     <property name="minimum">
-      <number>1</number>
-     </property>
-     <property name="maximum">
-      <number>65535</number>
-     </property>
-     <property name="value">
-      <number>3333</number>
-     </property>
-    </widget>
-   </item>
-   <item row="7" column="0">
-    <widget class="QLabel" name="gdbInitLabel">
-     <property name="text">
-      <string>GDB commands:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="7" column="1">
-    <widget class="QPlainTextEdit" name="gdbInitCommandsPlainTextEdit">
-     <property name="plainText">
-      <string>set remote hardware-breakpoint-limit 6
-set remote hardware-watchpoint-limit 4
-monitor reset halt
-load
-monitor reset halt</string>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/plugins/baremetal/baremetalruncontrolfactory.cpp b/src/plugins/baremetal/baremetalruncontrolfactory.cpp
index 04cd5b0b787..b79cfb91f73 100644
--- a/src/plugins/baremetal/baremetalruncontrolfactory.cpp
+++ b/src/plugins/baremetal/baremetalruncontrolfactory.cpp
@@ -33,7 +33,6 @@
 #include "baremetaldevice.h"
 
 #include <debugger/debuggerplugin.h>
-#include <debugger/debuggerrunner.h>
 #include <debugger/debuggerstartparameters.h>
 #include <debugger/debuggerkitinformation.h>
 #include <projectexplorer/buildsteplist.h>
@@ -104,6 +103,7 @@ DebuggerStartParameters BareMetalRunControlFactory::startParameters(const BareMe
         params.remoteChannel = device->sshParameters().host + QLatin1String(":") + QString::number(device->sshParameters().port);
     params.remoteSetupNeeded = false; // qml stuff, not needed
     params.commandsAfterConnect = device->gdbInitCommands().toLatin1();
+    params.commandsForReset = device->gdbResetCommands().toLatin1();
     BuildConfiguration *bc = target->activeBuildConfiguration();
     BuildStepList *bsl = bc->stepList(BareMetalGdbCommandsDeployStep::stepId());
     if (bsl) {
diff --git a/src/plugins/baremetal/baremetalruncontrolfactory.h b/src/plugins/baremetal/baremetalruncontrolfactory.h
index 2b349c687e5..b0b6f2dcefa 100644
--- a/src/plugins/baremetal/baremetalruncontrolfactory.h
+++ b/src/plugins/baremetal/baremetalruncontrolfactory.h
@@ -34,6 +34,7 @@
 
 #include <projectexplorer/runconfiguration.h>
 #include <debugger/debuggerstartparameters.h>
+#include <debugger/debuggerrunner.h>
 
 namespace BareMetal {
 namespace Internal {
diff --git a/src/plugins/debugger/debugger.qrc b/src/plugins/debugger/debugger.qrc
index 06ac7d09d1e..5fe047141be 100644
--- a/src/plugins/debugger/debugger.qrc
+++ b/src/plugins/debugger/debugger.qrc
@@ -36,5 +36,7 @@
         <file>images/qml/select.png</file>
         <file>images/qml/app-on-top.png</file>
         <file>images/qml/apply-on-save.png</file>
+        <file>images/debugger_restart.png</file>
+        <file>images/debugger_restart_small.png</file>
     </qresource>
 </RCC>
diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h
index 02517dc65c9..838cb7464a7 100644
--- a/src/plugins/debugger/debuggerconstants.h
+++ b/src/plugins/debugger/debuggerconstants.h
@@ -58,6 +58,7 @@ const char STEP[]                   = "Debugger.StepLine";
 const char STEPOUT[]                = "Debugger.StepOut";
 const char NEXT[]                   = "Debugger.NextLine";
 const char REVERSE[]                = "Debugger.ReverseDirection";
+const char RESET[]                  = "Debugger.Reset";
 const char OPERATE_BY_INSTRUCTION[] = "Debugger.OperateByInstruction";
 const char QML_SHOW_APP_ON_TOP[]    = "Debugger.QmlShowAppOnTop";
 const char QML_UPDATE_ON_SAVE[]     = "Debugger.QmlUpdateOnSave";
@@ -162,7 +163,8 @@ enum DebuggerCapabilities
     MemoryAddressCapability = 0x1000000,
     ShowModuleSectionsCapability = 0x200000,
     WatchComplexExpressionsCapability = 0x400000, // Used to filter out challenges for cdb.
-    AdditionalQmlStackCapability = 0x800000 // C++ debugger engine is able to retrieve QML stack as well.
+    AdditionalQmlStackCapability = 0x800000, // C++ debugger engine is able to retrieve QML stack as well.
+    ResetInferiorCapability = 0x1000000  //!< restart program while debugging
 };
 
 enum LogChannel
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index e1c41638841..453c755f4b5 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -334,6 +334,7 @@ protected:
     virtual void runEngine() = 0;
     virtual void shutdownInferior() = 0;
     virtual void shutdownEngine() = 0;
+    virtual void resetInferior() {}
 
     virtual void detachDebugger();
     virtual void exitDebugger();
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 89b2de50aeb..303a1af21ee 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1004,6 +1004,12 @@ public slots:
         currentEngine()->abortDebugger();
     }
 
+    void handleReset()
+    {
+        currentEngine()->resetLocation();
+        currentEngine()->resetInferior();
+    }
+
     void handleExecStep()
     {
         if (currentEngine()->state() == DebuggerNotReady) {
@@ -1250,6 +1256,7 @@ public:
     QAction *m_reverseDirectionAction;
     QAction *m_frameUpAction;
     QAction *m_frameDownAction;
+    QAction *m_resetAction;
 
     QToolButton *m_reverseToolButton;
 
@@ -1258,6 +1265,7 @@ public:
     QIcon m_continueIcon;
     QIcon m_interruptIcon;
     QIcon m_locationMarkIcon;
+    QIcon m_resetIcon;
 
     StatusLabel *m_statusLabel;
     QComboBox *m_threadBox;
@@ -2247,6 +2255,7 @@ void DebuggerPluginPrivate::setInitialState()
 
     m_exitAction->setEnabled(false);
     m_abortAction->setEnabled(false);
+    m_resetAction->setEnabled(false);
 
     m_interruptAction->setEnabled(false);
     m_continueAction->setEnabled(false);
@@ -2386,6 +2395,8 @@ void DebuggerPluginPrivate::updateState(DebuggerEngine *engine)
 
     m_abortAction->setEnabled(state != DebuggerNotReady
                                       && state != DebuggerFinished);
+    m_resetAction->setEnabled((stopped || state == DebuggerNotReady)
+                              && engine->hasCapability(ResetInferiorCapability));
 
     m_stepAction->setEnabled(stopped || state == DebuggerNotReady);
     m_nextAction->setEnabled(stopped || state == DebuggerNotReady);
@@ -2775,6 +2786,8 @@ void DebuggerPluginPrivate::extensionsInitialized()
     m_interruptIcon = QIcon(_(Core::Constants::ICON_PAUSE));
     m_interruptIcon.addFile(QLatin1String(":/debugger/images/debugger_interrupt.png"));
     m_locationMarkIcon = QIcon(_(":/debugger/images/location_16.png"));
+    m_resetIcon = QIcon(_(":/debugger/images/debugger_restart_small.png:"));
+    m_resetIcon.addFile(QLatin1String(":/debugger/images/debugger_restart.png"));
 
     m_busy = false;
 
@@ -2849,6 +2862,11 @@ void DebuggerPluginPrivate::extensionsInitialized()
         "resets the debugger to the initial state."));
     connect(act, SIGNAL(triggered()), SLOT(handleAbort()));
 
+    act = m_resetAction = new QAction(tr("Restart Debugging"),this);
+    act->setToolTip(tr("Restart the debugging session."));
+    act->setIcon(m_resetIcon);
+    connect(act,SIGNAL(triggered()),SLOT(handleReset()));
+
     act = m_nextAction = new QAction(tr("Step Over"), this);
     act->setIcon(QIcon(QLatin1String(":/debugger/images/debugger_stepover_small.png")));
     connect(act, SIGNAL(triggered()), SLOT(handleExecNext()));
@@ -3098,6 +3116,12 @@ void DebuggerPluginPrivate::extensionsInitialized()
     cmd->setDescription(tr("Reset Debugger"));
     debugMenu->addAction(cmd, CC::G_DEFAULT_ONE);
 
+    cmd = ActionManager::registerAction(m_resetAction,
+         Constants::RESET, globalcontext);
+    cmd->setDescription(tr("Restart Debugging"));
+    cmd->setDefaultKeySequence(QKeySequence(tr("Shift+Ctrl+R")));
+    debugMenu->addAction(cmd, CC::G_DEFAULT_ONE);
+
     debugMenu->addSeparator(globalcontext);
 
     cmd = ActionManager::registerAction(m_nextAction,
@@ -3310,6 +3334,7 @@ void DebuggerPluginPrivate::extensionsInitialized()
     hbox->addWidget(toolButton(Constants::NEXT));
     hbox->addWidget(toolButton(Constants::STEP));
     hbox->addWidget(toolButton(Constants::STEPOUT));
+    hbox->addWidget(toolButton(Constants::RESET));
     hbox->addWidget(toolButton(Constants::OPERATE_BY_INSTRUCTION));
 
     //hbox->addWidget(new StyledSeparator);
diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h
index 17dc02a7b62..4f8ffe7d073 100644
--- a/src/plugins/debugger/debuggerstartparameters.h
+++ b/src/plugins/debugger/debuggerstartparameters.h
@@ -131,6 +131,7 @@ public:
     QMap<QString, QString> sourcePathMap;
 
     // Used by baremetal plugin
+    QByteArray commandsForReset; // commands used for resetting the inferior
     bool useContinueInsteadOfRun; // if connected to a hw debugger run is not possible but continue is used
     QByteArray commandsAfterConnect; // additional commands to post after connection to debug target
 
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 41bc6c05b50..02c142415af 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -1213,7 +1213,8 @@ void GdbEngine::handleResultRecord(GdbResponse *response)
         showMessage(_("ALL COMMANDS DONE; INVOKING CALLBACK"));
         CommandsDoneCallback cont = m_commandsDoneCallback;
         m_commandsDoneCallback = 0;
-        (this->*cont)();
+        if (response->resultClass != GdbResultRunning) //only start if the thing is not already running
+            (this->*cont)();
     } else {
         PENDING_DEBUG("MISSING TOKENS: " << m_cookieForToken.keys());
     }
@@ -2028,7 +2029,8 @@ bool GdbEngine::hasCapability(unsigned cap) const
         | RunToLineCapability
         | WatchComplexExpressionsCapability
         | MemoryAddressCapability
-        | AdditionalQmlStackCapability))
+        | AdditionalQmlStackCapability
+        | ResetInferiorCapability))
         return true;
 
     if (startParameters().startMode == AttachCore)
@@ -4430,6 +4432,29 @@ void GdbEngine::abortDebugger()
     }
 }
 
+void GdbEngine::resetInferior()
+{
+    if (!startParameters().commandsForReset.isEmpty()) {
+        QByteArray substitutedCommands = VariableManager::expandedString(
+                    QString::fromLatin1(startParameters().commandsForReset)).toLatin1();
+        foreach (QByteArray command, substitutedCommands.split('\n')) {
+            command = command.trimmed();
+            if (!command.isEmpty()) {
+                if (state() == InferiorStopOk) {
+                    postCommand(command, ConsoleCommand|Immediate);
+                } else {
+                    GdbCommand gdbCmd;
+                    gdbCmd.command = command;
+                    gdbCmd.flags = ConsoleCommand;
+                    m_commandsToRunOnTemporaryBreak.append(gdbCmd);
+                }
+            }
+        }
+    }
+    requestInterruptInferior();
+    runEngine();
+}
+
 void GdbEngine::handleAdapterStartFailed(const QString &msg, Id settingsIdHint)
 {
     QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state());
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 28a793869ba..215338b25d5 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -78,6 +78,7 @@ private: ////////// General Interface //////////
     virtual void shutdownInferior();
     virtual void shutdownEngine() = 0;
     virtual void abortDebugger();
+    virtual void resetInferior();
 
     virtual bool acceptsDebuggerCommands() const;
     virtual void executeDebuggerCommand(const QString &command, DebuggerLanguages languages);
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
index 4d2098fc9da..ca6e95771d7 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
@@ -406,7 +406,7 @@ void GdbRemoteServerEngine::runEngine()
 {
     QTC_ASSERT(state() == EngineRunRequested, qDebug() << state());
 
-    const QString remoteExecutable = startParameters().remoteExecutable; // This is only set for pure QNX
+    const QString remoteExecutable = startParameters().remoteExecutable;
     if (!remoteExecutable.isEmpty()) {
         postCommand("-exec-run", GdbEngine::RunRequest, CB(handleExecRun));
     } else {
diff --git a/src/plugins/debugger/images/debugger_restart.png b/src/plugins/debugger/images/debugger_restart.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c6493120781a902de3cc96ae26f4d0135d9b654
GIT binary patch
literal 1035
zcmV+m1oZofP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000-d000-d0rU=cFaQ7m8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H11BgjPK~zYIjg?z$6jdC?e`j{L7s}Qy>=J6Fh8AonmO{~*4vON^
zh^?{l^3s?wUg3d=QGo|F#0xx#36PqoXw<+2Fjl2O5K<edYZ$dCttgEyv;+z*E82p!
zrPn<^?5^2PPo4cI^Dy7{{l9O{nR5|RN}NhJ#eKjRHaKV*@@uDF&CxwpD->9DDvhZI
zxKhL>mD>*JrYHiQ27Uw%T88|`$wW8Bi$FQh3#?1-(QLvsz^Qas<_mMY^Y;M_DVRS2
zYyoP3$ARy4Q)EpF&`t3q@J^N|+f`TD#NL{Arg^+U-4x{x8LMsY3xV|$0(4VU0PlIz
ze4?(hiIRZM{_wjDj`l}^9*2NV1-3yqMQ-v4HUZj}JL_36^H%DAdy8!?&j1{<4B6!n
z@Sy_B0$vBubW@Z8tIBgLxn*{cP*(%nkFNvx33$}O9LtbRK%;^(bW>z%z*7LL7jGsi
zqwH*b319%IvJ818E*@7HBx4(asEtnpmTN$9PDX%Ye>ul49^~xRc7UChA^%7c+jlX*
zH%X)T8E8>xR%*cf{Op?m2=}&5YK|K;6I-$}{(K4?wwWDK1l;WguD`)M4}c5(XA;DD
zyV5e`1G*{Z0A9<G?FzFK3hX*J@Mr&UpC7=N9!L;=g&2nwm8rn4X+TG~uML1g-=YLj
z@;^pXRl!sNosog_^bSQ>mRHR*j~8IAZi-Y7LgHFOL3L<AJ;0t*Z<3P{pmxFY0ENUh
zU#j&6P^`dri;CT7z-f;wz2K9YFgY0kHXgm7<2_9PF9TaGLyk`I<$j<Js8!J2K)#St
zqMPDbV8^0a%h(<~f=jsB^ldGnt_FbLfscV-fD6D3AP=YlR-yj60MA*5+>r=y0|$V6
zOK08Aw%}nh-P1X7=_ntZe3f4>f5&Kago?Z>md;*5OV3xdMM8{>4^1^?yDURK1|Sl5
zvTlm$KnPfppIyY7#hbb7#)l9H#^o3n`#ZQi*iF&QG5|)#hiHq0Xz6a`hn_|v1OIKE
zW5n+3;RylpklgrmEC-n9E9IWKk5K3<p&;jG(p(vMv@|5Kp0VgC&F4Pj^YGi8={q?F
zYz1CRm`@5w3VJv$o;v~0tLBwE_VD*`FNZol;=t+m`Rm%HD9{Y7w+z{8_fiJLL(+i<
zfh9mGP+ByjEPJ8<wt+7@cby#?8|)@_{_M958Bv-5{{q9zI+Dx=0^I-r002ovPDHLk
FV1hX0%0U1C

literal 0
HcmV?d00001

diff --git a/src/plugins/debugger/images/debugger_restart.svg b/src/plugins/debugger/images/debugger_restart.svg
new file mode 100644
index 00000000000..08af9db3e3d
--- /dev/null
+++ b/src/plugins/debugger/images/debugger_restart.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2403"
+   height="16"
+   width="16"
+   version="1.0"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="restartF.svg"
+   inkscape:export-filename="/home/tstone/projekte/stm32/qt-creator/src/plugins/debugger/images/restart.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <metadata
+     id="metadata9">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs7" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="812"
+     inkscape:window-height="480"
+     id="namedview5"
+     showgrid="false"
+     inkscape:zoom="2.6074563"
+     inkscape:cx="29.713525"
+     inkscape:cy="39.686584"
+     inkscape:window-x="528"
+     inkscape:window-y="112"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2403" />
+  <path
+     id="circle"
+     style="fill:none;stroke:#39a200;stroke-width:3;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     d="M 4.3814407,4.7280695 C 1.0195763,7.1548695 2.1753174,13.61748 7.4891237,13.770186 12.207451,13.905779 15.5821,9.9571474 11.885043,4.5928762"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="csc" />
+  <path
+     id="topmark"
+     style="stroke:#39a200;stroke-linecap:round;stroke-width:3;fill:none;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+     d="m8 6.9952v-4.9904" />
+  <path
+     style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+     d="M 4.677966,4.5423729 C 0.38168193,7.6562328 2.6923842,13.541247 7.5932203,13.627119"
+     id="arrow"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cc" />
+  <path
+     style="fill:#ffffff;fill-opacity:0.94117647;stroke:#39a200;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     d="M 7.8291211,15.145082 11.463143,13.540112 7.7592641,12.467117 z"
+     id="arrowhead"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccc" />
+</svg>
diff --git a/src/plugins/debugger/images/debugger_restart_small.png b/src/plugins/debugger/images/debugger_restart_small.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b10c8fe79ed0a2d0c55dddac22218be4e1b2d9c
GIT binary patch
literal 675
zcmV;U0$lxxP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10w765K~y-6m6KgalVKEqpYv_HQZZ~d5*Rq50wEZYx)qfmwVS#L
zA<&f+^g}2_kVqH`L0A2dMuddSF9@AQM1+!IMlA!2E-aQ1f`VOGXe!gz_ML9r{2VRl
zy*lS`&U60WBdSWa=Qrgb28l?mzR2cd{3Eyq=*MDkPq$S4H$arKl&r8Xo1fFJ_)Iw?
zuuGD(XQIoyq$I~dhYB<CB^pOhX>3geep4<N=a<|$>%Drya&SE}Q;w6<DjWt*=H}75
zrUieucne({+io8i=KIn#qP))pSnwgOD2)}Sl%@e9T&OE+Vr06XaJ2oU%c3O{@HVKA
zR2f-OT@DDQ0V<SLZ9c-oXa_*+P`xe-45t$cpH}L<VPjUW0u)JVlB6b(BtHROAJZWW
zs)0Zxs9^xHcw+->1=|)9Rvf31i{-$TvSogtB;-3*WP$kV3}AM0{tE$55P?gX{R2pw
z7*3&ib&h;a0}O-aYwylk0Z$#3n*xV?rks~HNw2uVlv1CEutL3!*$p76Ti9*NEpKsE
z!<D_gbbf4MXtHlM&sjLNrD%s|^xI%TEU{=ShrW3iwPQ6JM^#Z(_V-fY3o(BDsaIc3
zKGxXp1${p8Ko{b3I=4Kd&%TB<(BoELh?}%xq~gSWjsCE#*I!%|r9lw)Hup}ND(~`S
zymMh-;{Hf1vDgy{>b*6y$#%}=T~boCZo_uO5gj=CW9qL?z#mKb))u@b7X<(S002ov
JPDHLkV1myK9zy^C

literal 0
HcmV?d00001

diff --git a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp
index db9b15f45d1..11a5f0df529 100644
--- a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp
+++ b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp
@@ -104,6 +104,7 @@ DebuggerStartParameters LinuxDeviceDebugSupport::startParameters(const AbstractR
         params.startMode = AttachToRemoteServer;
         params.executable = runConfig->localExecutableFilePath();
         params.remoteChannel = device->sshParameters().host + QLatin1String(":-1");
+        params.remoteExecutable = runConfig->remoteExecutableFilePath();
     } else {
         params.startMode = AttachToRemoteServer;
     }
-- 
GitLab