From 473b28e10956e022b8c809a09283f3581af917a2 Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Tue, 25 Jun 2019 23:12:22 +0200 Subject: Allow to create simulator without loaded executable. This allows to test simple instruction sequences without need to install compiler. Signed-off-by: Pavel Pisa --- qtmips_machine/qtmipsmachine.cpp | 33 ++++++++++++++++++++++----------- qtmips_machine/qtmipsmachine.h | 3 ++- 2 files changed, 24 insertions(+), 12 deletions(-) (limited to 'qtmips_machine') diff --git a/qtmips_machine/qtmipsmachine.cpp b/qtmips_machine/qtmipsmachine.cpp index 35843f4..362b243 100644 --- a/qtmips_machine/qtmipsmachine.cpp +++ b/qtmips_machine/qtmipsmachine.cpp @@ -39,22 +39,28 @@ using namespace machine; -QtMipsMachine::QtMipsMachine(const MachineConfig &cc, bool load_symtab) : +QtMipsMachine::QtMipsMachine(const MachineConfig &cc, bool load_symtab, bool load_executable) : QObject(), mcnf(&cc) { MemoryAccess *cpu_mem; stat = ST_READY; symtab = nullptr; - ProgramLoader program(cc.elf()); - mem_program_only = new Memory(); - program.to_memory(mem_program_only); - if (load_symtab) - symtab = program.get_symbol_table(); - program_end = program.end(); regs = new Registers(); - if (program.get_executable_entry()) - regs->pc_abs_jmp(program.get_executable_entry()); - mem = new Memory(*mem_program_only); + if (load_executable) { + ProgramLoader program(cc.elf()); + mem_program_only = new Memory(); + program.to_memory(mem_program_only); + if (load_symtab) + symtab = program.get_symbol_table(); + program_end = program.end(); + if (program.get_executable_entry()) + regs->pc_abs_jmp(program.get_executable_entry()); + mem = new Memory(*mem_program_only); + } else { + program_end = 0xf0000000; + mem_program_only = nullptr; + mem = new Memory(); + } physaddrspace = new PhysAddrSpace(); physaddrspace->insert_range(mem, 0x00000000, 0xefffffff, false); @@ -201,6 +207,10 @@ const CorePipelined *QtMipsMachine::core_pipelined() { return mcnf.pipelined() ? (const CorePipelined*)cr : nullptr; } +bool QtMipsMachine::executable_loaded() const { + return (mem_program_only != nullptr); +} + enum QtMipsMachine::Status QtMipsMachine::status() { return stat; } @@ -266,7 +276,8 @@ void QtMipsMachine::step_timer() { void QtMipsMachine::restart() { pause(); regs->reset(); - mem->reset(*mem_program_only); + if (mem_program_only != nullptr) + mem->reset(*mem_program_only); cch_program->reset(); cch_data->reset(); cr->reset(); diff --git a/qtmips_machine/qtmipsmachine.h b/qtmips_machine/qtmipsmachine.h index 5cb4100..6c0c007 100644 --- a/qtmips_machine/qtmipsmachine.h +++ b/qtmips_machine/qtmipsmachine.h @@ -56,7 +56,7 @@ namespace machine { class QtMipsMachine : public QObject { Q_OBJECT public: - QtMipsMachine(const MachineConfig &cc, bool load_symtab = false); + QtMipsMachine(const MachineConfig &cc, bool load_symtab = false, bool load_executable = true); ~QtMipsMachine(); const MachineConfig &config(); @@ -75,6 +75,7 @@ public: const Core *core(); const CoreSingle *core_singe(); const CorePipelined *core_pipelined(); + bool executable_loaded() const; enum Status { ST_READY, // Machine is ready to be started or step to be called -- cgit v1.2.3