@@ -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+
451503void 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
673709void 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-
0 commit comments