Skip to content

Commit e72fcaa

Browse files
committed
Add insn cmds to interactive debug mode
1 parent b6498b1 commit e72fcaa

File tree

2 files changed

+57
-19
lines changed

2 files changed

+57
-19
lines changed

riscv/interactive.cc

Lines changed: 55 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ void sim_t::interactive()
277277
funcs["fregs"] = &sim_t::interactive_fregs;
278278
funcs["fregd"] = &sim_t::interactive_fregd;
279279
funcs["pc"] = &sim_t::interactive_pc;
280+
funcs["insn"] = &sim_t::interactive_insn;
280281
funcs["priv"] = &sim_t::interactive_priv;
281282
funcs["mem"] = &sim_t::interactive_mem;
282283
funcs["str"] = &sim_t::interactive_str;
@@ -367,6 +368,7 @@ void sim_t::interactive_help(const std::string& cmd, const std::vector<std::stri
367368
"fregd <core> <reg> # Display double precision <reg> in <core>\n"
368369
"vreg <core> [reg] # Display vector [reg] (all if omitted) in <core>\n"
369370
"pc <core> # Show current PC in <core>\n"
371+
"insn <core> # Show current instruction corresponding to PC in <core>\n"
370372
"priv <core> # Show current privilege level in <core>\n"
371373
"mem [core] <hex addr> # Show contents of virtual memory <hex addr> in [core] (physical memory <hex addr> if omitted)\n"
372374
"str [core] <hex addr> # Show NUL-terminated C string at virtual address <hex addr> in [core] (physical address <hex addr> if omitted)\n"
@@ -377,6 +379,8 @@ void sim_t::interactive_help(const std::string& cmd, const std::vector<std::stri
377379
"untiln reg <core> <reg> <val> # Run noisy and stop when <reg> in <core> hits <val>\n"
378380
"until pc <core> <val> # Stop when PC in <core> hits <val>\n"
379381
"untiln pc <core> <val> # Run noisy and stop when PC in <core> hits <val>\n"
382+
"until insn <core> <val> # Stop when instruction corresponding to PC in <core> hits <val>\n"
383+
"untiln insn <core> <val> # Run noisy and stop when instruction corresponding to PC in <core> hits <val>\n"
380384
"until mem [core] <addr> <val> # Stop when virtual memory <addr> in [core] (physical address <addr> if omitted) becomes <val>\n"
381385
"untiln mem [core] <addr> <val> # Run noisy and stop when virtual memory <addr> in [core] (physical address <addr> if omitted) becomes <val>\n"
382386
"while reg <core> <reg> <val> # Run while <reg> in <core> is <val>\n"
@@ -448,6 +452,54 @@ void sim_t::interactive_pc(const std::string& cmd, const std::vector<std::string
448452
<< zext(get_pc(args), max_xlen) << std::endl;
449453
}
450454

455+
static reg_t load(mmu_t* mmu, reg_t addr) {
456+
reg_t val;
457+
458+
switch (addr % 8)
459+
{
460+
case 0:
461+
val = mmu->load<uint64_t>(addr);
462+
break;
463+
case 4:
464+
val = mmu->load<uint32_t>(addr);
465+
break;
466+
case 2:
467+
case 6:
468+
val = mmu->load<uint16_t>(addr);
469+
break;
470+
default:
471+
val = mmu->load<uint8_t>(addr);
472+
break;
473+
}
474+
return val;
475+
}
476+
477+
reg_t sim_t::get_insn(const std::vector<std::string>& args)
478+
{
479+
if (args.size() != 1)
480+
throw trap_interactive();
481+
482+
processor_t *p = get_core(args[0]);
483+
reg_t addr = p->get_state()->pc;
484+
mmu_t* mmu = p->get_mmu();
485+
return load(mmu, addr);
486+
}
487+
488+
void sim_t::interactive_insn(const std::string& cmd, const std::vector<std::string>& args)
489+
{
490+
if (args.size() != 1)
491+
throw trap_interactive();
492+
493+
processor_t *p = get_core(args[0]);
494+
int max_xlen = p->get_isa().get_max_xlen();
495+
496+
insn_t insn(get_insn(args));
497+
498+
std::ostream out(sout_.rdbuf());
499+
out << std::hex << std::setfill('0') << "0x" << std::setw(max_xlen/4)
500+
<< zext(insn.bits(), max_xlen) << " " << p->get_disassembler()->disassemble(insn) << std::endl;
501+
}
502+
451503
void sim_t::interactive_priv(const std::string& cmd, const std::vector<std::string>& args)
452504
{
453505
if (args.size() != 1)
@@ -647,27 +699,11 @@ reg_t sim_t::get_mem(const std::vector<std::string>& args)
647699
addr_str = args[1];
648700
}
649701

650-
reg_t addr = strtol(addr_str.c_str(),NULL,16), val;
702+
reg_t addr = strtol(addr_str.c_str(),NULL,16);
651703
if (addr == LONG_MAX)
652704
addr = strtoul(addr_str.c_str(),NULL,16);
653705

654-
switch (addr % 8)
655-
{
656-
case 0:
657-
val = mmu->load<uint64_t>(addr);
658-
break;
659-
case 4:
660-
val = mmu->load<uint32_t>(addr);
661-
break;
662-
case 2:
663-
case 6:
664-
val = mmu->load<uint16_t>(addr);
665-
break;
666-
default:
667-
val = mmu->load<uint8_t>(addr);
668-
break;
669-
}
670-
return val;
706+
return load(mmu, addr);
671707
}
672708

673709
void sim_t::interactive_mem(const std::string& cmd, const std::vector<std::string>& args)
@@ -743,6 +779,7 @@ void sim_t::interactive_until(const std::string& cmd, const std::vector<std::str
743779
auto func = args[0] == "reg" ? &sim_t::get_reg :
744780
args[0] == "pc" ? &sim_t::get_pc :
745781
args[0] == "mem" ? &sim_t::get_mem :
782+
args[0] == "insn" ? &sim_t::get_insn :
746783
NULL;
747784

748785
if (func == NULL)
@@ -800,4 +837,3 @@ void sim_t::interactive_mtimecmp(const std::string& cmd, const std::vector<std::
800837
out << std::hex << std::setfill('0') << "0x" << std::setw(16)
801838
<< clint->get_mtimecmp(p->get_id()) << std::endl;
802839
}
803-

riscv/sim.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ class sim_t : public htif_t, public simif_t
123123
void interactive_fregs(const std::string& cmd, const std::vector<std::string>& args);
124124
void interactive_fregd(const std::string& cmd, const std::vector<std::string>& args);
125125
void interactive_pc(const std::string& cmd, const std::vector<std::string>& args);
126+
void interactive_insn(const std::string& cmd, const std::vector<std::string>& args);
126127
void interactive_priv(const std::string& cmd, const std::vector<std::string>& args);
127128
void interactive_mem(const std::string& cmd, const std::vector<std::string>& args);
128129
void interactive_str(const std::string& cmd, const std::vector<std::string>& args);
@@ -136,6 +137,7 @@ class sim_t : public htif_t, public simif_t
136137
freg_t get_freg(const std::vector<std::string>& args, int size);
137138
reg_t get_mem(const std::vector<std::string>& args);
138139
reg_t get_pc(const std::vector<std::string>& args);
140+
reg_t get_insn(const std::vector<std::string>& args);
139141

140142
friend class processor_t;
141143
friend class mmu_t;

0 commit comments

Comments
 (0)