OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [gui_plugin/] [MainWindow/] [DbgMainWindow.cpp] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sergeykhbr
#include "DbgMainWindow.h"
2
#include "moc_DbgMainWindow.h"
3
#include "ControlWidget/PnpWidget.h"
4
#include "CpuWidgets/RegsViewWidget.h"
5
#include "CpuWidgets/AsmViewWidget.h"
6
#include "CpuWidgets/MemViewWidget.h"
7
#include "CpuWidgets/SymbolBrowserWidget.h"
8
#include "CpuWidgets/StackTraceWidget.h"
9
#include "ControlWidget/ConsoleWidget.h"
10
#include "PeriphWidgets/UartWidget.h"
11
#include "PeriphWidgets/GpioWidget.h"
12
#include "GnssWidgets/MapWidget.h"
13
#include <QtWidgets/QtWidgets>
14
 
15
namespace debugger {
16
 
17
DbgMainWindow::DbgMainWindow(IGui *igui, event_def *init_done) {
18
    igui_ = igui;
19
    initDone_ = init_done;
20
    statusRequested_ = false;
21
    ebreak_ = 0;
22
 
23
    setWindowTitle(tr("RISC-V platform debugger"));
24
    resize(QDesktopWidget().availableGeometry(this).size() * 0.7);
25
 
26
    listConsoleListeners_.make_list(0);
27
    /** Console commands used by main window: */
28
    cmdStatus_.make_string("status");
29
    cmdRun_.make_string("c");
30
    cmdHalt_.make_string("halt");
31
    cmdStep_.make_string("c 1");
32
 
33
    createActions();
34
    createMenus();
35
    createStatusBar();
36
    createMdiWindow();
37
 
38
    /** QT documeneted behaviour:
39
     *
40
     * If you add a child widget to an already visible widget
41
     * you must explicitly show the child to make it visible.
42
     */
43
    addWidgets();
44
 
45
    setUnifiedTitleAndToolBarOnMac(true);
46
 
47
    /**
48
     * To use the following type in SIGNAL -> SLOT definitions
49
     * we have to register them using qRegisterMetaType template
50
     */
51
    qRegisterMetaType<uint64_t>("uint64_t");
52
    qRegisterMetaType<uint32_t>("uint32_t");
53
 
54
    connect(this, SIGNAL(signalPostInit(AttributeType *)),
55
            this, SLOT(slotPostInit(AttributeType *)));
56
    connect(this, SIGNAL(signalExit()), this, SLOT(slotExit()));
57
 
58
    tmrGlobal_ = new QTimer(this);
59
    connect(tmrGlobal_, SIGNAL(timeout()), this, SLOT(slotConfigDone()));
60
    tmrGlobal_->setSingleShot(true);
61
    tmrGlobal_->setInterval(1);
62
    tmrGlobal_->start();
63
}
64
 
65
DbgMainWindow::~DbgMainWindow() {
66
    if (ebreak_) {
67
        delete ebreak_;
68
    }
69
    tmrGlobal_->stop();
70
    igui_->removeFromQueue(static_cast<IGuiCmdHandler *>(this));
71
    qApp->quit();
72
}
73
 
74
void DbgMainWindow::closeEvent(QCloseEvent *ev) {
75
    ev->accept();
76
}
77
 
78
void DbgMainWindow::handleResponse(AttributeType *req, AttributeType *resp) {
79
    if (req->is_equal(cmdStatus_.to_string())) {
80
        statusRequested_ = false;
81
        if (resp->is_nil()) {
82
            return;
83
        }
84
        DsuMapType::udbg_type::debug_region_type::control_reg ctrl;
85
        ctrl.val = resp->to_uint64();
86
        if ((actionRun_->isChecked() && ctrl.bits.halt)
87
            || (!actionRun_->isChecked() && !ctrl.bits.halt)) {
88
            emit signalTargetStateChanged(ctrl.bits.halt == 0);
89
        }
90
        if (ctrl.bits.breakpoint && ebreak_) {
91
            ebreak_->skip();
92
        }
93
#if 0
94
        static const char *xSTATES[] = {"Idle", "WaitGrant", "WaitResp", "WaitAccept"};
95
        static const char *CSTATES[] = {"Idle", "IMem", "DMem"};
96
        RISCV_printf(0, 0, "istate=%s dstate=%s; cstate=%s",
97
          xSTATES[ctrl.bits.istate],
98
          xSTATES[ctrl.bits.dstate],
99
          CSTATES[ctrl.bits.cstate]);
100
#endif
101
    }
102
}
103
 
104
void DbgMainWindow::postInit(AttributeType *cfg) {
105
    emit signalPostInit(cfg);
106
}
107
 
108
void DbgMainWindow::getConfiguration(AttributeType &cfg) {
109
    cfg = config_;
110
}
111
 
112
void DbgMainWindow::callExit() {
113
    emit signalExit();
114
}
115
 
116
void DbgMainWindow::slotExit() {
117
    close();
118
}
119
 
120
void DbgMainWindow::createActions() {
121
    actionRegs_ = new QAction(QIcon(tr(":/images/cpu_96x96.png")),
122
                              tr("&Regs"), this);
123
    actionRegs_->setToolTip(tr("CPU Registers view"));
124
    actionRegs_->setShortcut(QKeySequence("Ctrl+r"));
125
    actionRegs_->setCheckable(true);
126
    actionRegs_->setChecked(false);
127
    connect(actionRegs_, SIGNAL(triggered(bool)),
128
            this, SLOT(slotActionTriggerRegs(bool)));
129
 
130
    actionCpuAsm_ = new QAction(QIcon(tr(":/images/asm_96x96.png")),
131
                              tr("&Memory"), this);
132
    actionCpuAsm_->setToolTip(tr("Disassembler view"));
133
    actionCpuAsm_->setShortcut(QKeySequence("Ctrl+d"));
134
    actionCpuAsm_->setCheckable(true);
135
    connect(actionCpuAsm_, SIGNAL(triggered(bool)),
136
            this, SLOT(slotActionTriggerCpuAsmView(bool)));
137
 
138
    actionStackTrace_ = new QAction(QIcon(tr(":/images/stack_96x96.png")),
139
                              tr("&Stack"), this);
140
    actionStackTrace_->setToolTip(tr("Stack trace"));
141
    actionStackTrace_->setShortcut(QKeySequence("Ctrl+t"));
142
    actionStackTrace_->setCheckable(true);
143
    connect(actionStackTrace_, SIGNAL(triggered(bool)),
144
            this, SLOT(slotActionTriggerStackTraceView(bool)));
145
 
146
    actionSymbolBrowser_ = new QAction(QIcon(tr(":/images/info_96x96.png")),
147
                              tr("&Symbols"), this);
148
    actionSymbolBrowser_->setToolTip(tr("Symbol Browser"));
149
    actionSymbolBrowser_->setShortcut(QKeySequence("Ctrl+s"));
150
    actionSymbolBrowser_->setCheckable(false);
151
    connect(actionSymbolBrowser_, SIGNAL(triggered()),
152
            this, SLOT(slotActionTriggerSymbolBrowser()));
153
 
154
    actionMem_ = new QAction(QIcon(tr(":/images/mem_96x96.png")),
155
                              tr("&Memory"), this);
156
    actionMem_->setToolTip(tr("Memory view"));
157
    actionMem_->setShortcut(QKeySequence("Ctrl+m"));
158
    actionMem_->setCheckable(true);
159
    actionMem_->setChecked(false);
160
    connect(actionMem_, SIGNAL(triggered(bool)),
161
            this, SLOT(slotActionTriggerMemView(bool)));
162
 
163
    actionPnp_ = new QAction(QIcon(tr(":/images/board_96x96.png")),
164
                              tr("&Pnp"), this);
165
    actionPnp_->setToolTip(tr("Plug'n'play information view"));
166
    actionPnp_->setShortcut(QKeySequence("Ctrl+p"));
167
    actionPnp_->setCheckable(true);
168
    actionPnp_->setChecked(false);
169
    connect(actionPnp_, SIGNAL(triggered(bool)),
170
            this, SLOT(slotActionTriggerPnp(bool)));
171
 
172
    actionGpio_ = new QAction(QIcon(tr(":/images/gpio_96x96.png")),
173
                              tr("&GPIO"), this);
174
    actionGpio_->setToolTip(tr("GPIO control view"));
175
    actionGpio_->setCheckable(true);
176
    actionGpio_->setChecked(false);
177
    connect(actionGpio_, SIGNAL(triggered(bool)),
178
            this, SLOT(slotActionTriggerGpio(bool)));
179
 
180
    actionSerial_ = new QAction(QIcon(tr(":/images/serial_96x96.png")),
181
                              tr("&Serial port"), this);
182
    actionSerial_->setToolTip(tr("Serial port console view"));
183
    actionSerial_->setCheckable(true);
184
    actionSerial_->setChecked(false);
185
    connect(actionSerial_, SIGNAL(triggered(bool)),
186
            this, SLOT(slotActionTriggerUart0(bool)));
187
 
188
    actionGnssMap_ = new QAction(QIcon(tr(":/images/serial_96x96.png")),
189
                              tr("&OpenStreetMap"), this);
190
    actionGnssMap_->setToolTip(tr("Open Street map with GNSS tracks view"));
191
    actionGnssMap_->setCheckable(true);
192
    actionGnssMap_->setChecked(false);
193
    connect(actionGnssMap_, SIGNAL(triggered(bool)),
194
            this, SLOT(slotActionTriggerGnssMap(bool)));
195
 
196
    actionRun_ = new QAction(QIcon(tr(":/images/start_96x96.png")),
197
                             tr("&Run"), this);
198
    actionRun_->setToolTip(tr("Start Execution (F5)"));
199
    actionRun_->setShortcut(QKeySequence("F5"));
200
    actionRun_->setCheckable(true);
201
    actionRun_->setChecked(false);
202
    connect(actionRun_ , SIGNAL(triggered()),
203
            this, SLOT(slotActionTargetRun()));
204
    connect(this, SIGNAL(signalTargetStateChanged(bool)),
205
            actionRun_, SLOT(setChecked(bool)));
206
 
207
    actionHalt_ = new QAction(QIcon(tr(":/images/pause_96x96.png")),
208
                              tr("&Halt"), this);
209
    actionHalt_->setToolTip(tr("Stop Execution (Ctrl+Alt+F5)"));
210
    actionHalt_->setShortcut(QKeySequence("Ctrl+Alt+F5"));
211
    connect(actionHalt_ , SIGNAL(triggered()),
212
            this, SLOT(slotActionTargetHalt()));
213
 
214
    actionStep_ = new QAction(QIcon(tr(":/images/stepinto_96x96.png")),
215
                              tr("&Step Into"), this);
216
    actionStep_->setToolTip(tr("Instruction Step (F11)"));
217
    actionStep_->setShortcut(QKeySequence("F11"));
218
    connect(actionStep_ , SIGNAL(triggered()),
219
            this, SLOT(slotActionTargetStepInto()));
220
 
221
 
222
    actionQuit_ = new QAction(tr("&Quit"), this);
223
    actionQuit_->setShortcuts(QKeySequence::Quit);
224
    actionQuit_->setStatusTip(tr("Quit the application"));
225
    connect(actionQuit_, SIGNAL(triggered()), this, SLOT(close()));
226
 
227
    actionAbout_ = new QAction(tr("&About"), this);
228
    actionAbout_->setStatusTip(tr("Show the application's About box"));
229
    connect(actionAbout_, SIGNAL(triggered()), this, SLOT(slotActionAbout()));
230
 
231
    QToolBar *toolbarRunControl = addToolBar(tr("toolbarRunControl"));
232
    toolbarRunControl->addAction(actionRun_);
233
    toolbarRunControl->addAction(actionHalt_);
234
    toolbarRunControl->addAction(actionStep_);
235
 
236
    QToolBar *toolbarCpu = addToolBar(tr("toolbarCpu"));
237
    toolbarCpu->addAction(actionCpuAsm_);
238
    toolbarCpu->addAction(actionRegs_);
239
    toolbarCpu->addAction(actionStackTrace_);
240
    toolbarCpu->addAction(actionMem_);
241
    QToolBar *toolbarPeriph = addToolBar(tr("toolbarPeriph"));
242
    toolbarPeriph->addAction(actionPnp_);
243
}
244
 
245
void DbgMainWindow::createMenus() {
246
    QMenu *menu = menuBar()->addMenu(tr("&File"));
247
    menu->addAction(actionQuit_);
248
    menu->addSeparator();
249
 
250
    menu = menuBar()->addMenu(tr("&Views"));
251
    menu->addAction(actionSerial_);
252
    menu->addAction(actionGpio_);
253
    menu->addAction(actionPnp_);
254
    menu->addSeparator();
255
    menu->addAction(actionRegs_);
256
    menu->addAction(actionSymbolBrowser_);
257
 
258
    menu = menuBar()->addMenu(tr("&GNSS"));
259
    menu->addAction(actionGnssMap_);
260
 
261
    menu = menuBar()->addMenu(tr("&Help"));
262
    menu->addAction(actionAbout_);
263
}
264
 
265
 
266
void DbgMainWindow::createStatusBar() {
267
    statusBar()->showMessage(tr("Ready"));
268
}
269
 
270
void DbgMainWindow::createMdiWindow() {
271
    AttributeType cfgMdi(Attr_Dict);
272
    cfgMdi["Tabbed"].make_boolean(false);
273
    mdiArea_ = new MdiAreaWidget(cfgMdi, this);
274
    setCentralWidget(mdiArea_);
275
 
276
    /** Docked Widgets: */
277
    QDockWidget *dock = new QDockWidget(tr("Debugger console"), this);
278
    dock->setAllowedAreas(Qt::BottomDockWidgetArea);
279
    addDockWidget(Qt::BottomDockWidgetArea, dock);
280
 
281
 
282
    ConsoleWidget *consoleWidget = new ConsoleWidget(igui_, this);
283
    dock->setWidget(consoleWidget);
284
    connect(this, SIGNAL(signalPostInit(AttributeType *)),
285
            consoleWidget, SLOT(slotPostInit(AttributeType *)));
286
}
287
 
288
void DbgMainWindow::addWidgets() {
289
    slotActionTriggerUart0(true);
290
    slotActionTriggerCpuAsmView(true);
291
}
292
 
293
void DbgMainWindow::slotActionTriggerUart0(bool val) {
294
    if (val) {
295
        viewUart0_ =
296
            new UartQMdiSubWindow(igui_, mdiArea_, this, actionSerial_);
297
    } else {
298
        viewUart0_->close();
299
    }
300
}
301
 
302
void DbgMainWindow::slotActionTriggerCpuAsmView(bool val) {
303
    if (val) {
304
        viewCpuAsm_ =
305
            new AsmQMdiSubWindow(igui_, mdiArea_, this, actionCpuAsm_);
306
    } else {
307
        viewCpuAsm_->close();
308
    }
309
}
310
 
311
void DbgMainWindow::slotActionTriggerRegs(bool val) {
312
    if (val) {
313
        viewRegs_ = new RegsQMdiSubWindow(igui_, mdiArea_, this,
314
                                        actionRegs_);
315
    } else {
316
        viewRegs_->close();
317
    }
318
}
319
 
320
void DbgMainWindow::slotActionTriggerStackTraceView(bool val) {
321
    if (val) {
322
        viewStackTrace_ =
323
            new StackTraceQMdiSubWindow(igui_, mdiArea_, this, actionStackTrace_);
324
    } else {
325
        viewStackTrace_->close();
326
    }
327
}
328
 
329
void DbgMainWindow::slotActionTriggerMemView(bool val) {
330
    if (val) {
331
        viewMem_ = new MemQMdiSubWindow(igui_, mdiArea_, this,
332
                                        0xfffff000, 20, actionMem_);
333
    } else {
334
        viewMem_->close();
335
    }
336
}
337
 
338
void DbgMainWindow::slotActionTriggerGpio(bool val) {
339
    if (val) {
340
        viewGpio_ = new GpioQMdiSubWindow(igui_, mdiArea_, this,
341
                                        actionGpio_);
342
    } else {
343
        viewGpio_->close();
344
    }
345
}
346
 
347
void DbgMainWindow::slotActionTriggerPnp(bool val) {
348
    if (val) {
349
        viewPnp_ = new PnpQMdiSubWindow(igui_, mdiArea_, this,
350
                                        actionPnp_);
351
    } else {
352
        viewPnp_->close();
353
    }
354
}
355
 
356
void DbgMainWindow::slotActionTriggerGnssMap(bool val) {
357
    if (val) {
358
        viewGnssMap_ =
359
            new MapQMdiSubWindow(igui_, mdiArea_, this, actionGnssMap_);
360
    } else {
361
        viewGnssMap_->close();
362
    }
363
}
364
 
365
 
366
void DbgMainWindow::slotActionTriggerSymbolBrowser() {
367
    new SymbolBrowserQMdiSubWindow(igui_, mdiArea_, this);
368
}
369
 
370
void DbgMainWindow::slotOpenDisasm(uint64_t addr, uint64_t sz) {
371
    new AsmQMdiSubWindow(igui_, mdiArea_, this, NULL, addr);
372
}
373
 
374
void DbgMainWindow::slotOpenMemory(uint64_t addr, uint64_t sz) {
375
    new MemQMdiSubWindow(igui_, mdiArea_, this, addr, sz);
376
}
377
 
378
void DbgMainWindow::slotPostInit(AttributeType *cfg) {
379
    config_ = *cfg;
380
    // Enable polling timer:
381
    connect(tmrGlobal_, SIGNAL(timeout()), this, SLOT(slotUpdateByTimer()));
382
    int ms = static_cast<int>(config_["PollingMs"].to_uint64());
383
    tmrGlobal_->setInterval(ms);
384
    tmrGlobal_->setSingleShot(false);
385
    tmrGlobal_->start(ms);
386
 
387
    ISocInfo *isoc = static_cast<ISocInfo *>(igui_->getSocInfo());
388
    if (isoc) {
389
        DsuMapType *dsu = isoc->getpDsu();
390
        ebreak_ = new EBreakHandler(igui_);
391
 
392
        ebreak_->setBrAddressFetch(
393
            reinterpret_cast<uint64_t>(&dsu->udbg.v.br_address_fetch));
394
        ebreak_->setHwRemoveBreakpoint(
395
            reinterpret_cast<uint64_t>(&dsu->udbg.v.remove_breakpoint));
396
    }
397
 
398
    // Debug:
399
    //slotActionTriggerGnssMap(true);
400
}
401
 
402
void DbgMainWindow::slotConfigDone() {
403
    RISCV_event_set(initDone_);
404
    disconnect(tmrGlobal_, SIGNAL(timeout()), this, SLOT(slotConfigDone()));
405
    tmrGlobal_->stop();
406
}
407
 
408
 
409
void DbgMainWindow::slotUpdateByTimer() {
410
    if (!statusRequested_) {
411
        statusRequested_ = true;
412
        igui_->registerCommand(static_cast<IGuiCmdHandler *>(this),
413
                               &cmdStatus_, true);
414
    }
415
    emit signalUpdateByTimer();
416
}
417
 
418
void DbgMainWindow::slotActionAbout() {
419
    char date[128];
420
    memcpy(date, __DATE__, sizeof(date));
421
    QString build;
422
    build.sprintf("Version: 1.0\nBuild:     %s\n", date);
423
    build += tr("Author: Sergey Khabarov\n");
424
    build += tr("git:    http://github.com/sergeykhbr/riscv_vhdl\n");
425
    build += tr("e-mail: sergeykhbr@gmail.com\n\n\n"
426
       "RISC-V debugger GUI plugin is the open source extension of\n"
427
       "the base RISC-V debugger functionality providing friendly interface\n"
428
       "with running SoC target or with the Simulated platform.\n"
429
       "\n"
430
       "This extension doesn't use any specific for GUI scripts or commands\n"
431
       "and all shown information maybe achievied using debugger's console\n"
432
       "commands. See 'help' command.\n\n"
433
    );
434
    build += tr("www.gnss-sensor.com\n");
435
 
436
    QMessageBox::about(this, tr("About GUI plugin"), build);
437
}
438
 
439
void DbgMainWindow::slotActionTargetRun() {
440
    actionRun_->setChecked(true);
441
    igui_->registerCommand(static_cast<IGuiCmdHandler *>(this),
442
                           &cmdRun_, true);
443
}
444
 
445
void DbgMainWindow::slotActionTargetHalt() {
446
    igui_->registerCommand(static_cast<IGuiCmdHandler *>(this),
447
                           &cmdHalt_, true);
448
}
449
 
450
void DbgMainWindow::slotActionTargetStepInto() {
451
    igui_->registerCommand(static_cast<IGuiCmdHandler *>(this),
452
                           &cmdStep_, true);
453
}
454
 
455
/** Redraw all opened disassembler views */
456
void DbgMainWindow::slotBreakpointsChanged() {
457
    emit signalRedrawDisasm();
458
}
459
 
460
}  // namespace debugger
461
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.