@@ -277,6 +277,7 @@ void sim_t::interactive()
277
277
funcs[" fregs" ] = &sim_t ::interactive_fregs;
278
278
funcs[" fregd" ] = &sim_t ::interactive_fregd;
279
279
funcs[" pc" ] = &sim_t ::interactive_pc;
280
+ funcs[" insn" ] = &sim_t ::interactive_insn;
280
281
funcs[" priv" ] = &sim_t ::interactive_priv;
281
282
funcs[" mem" ] = &sim_t ::interactive_mem;
282
283
funcs[" str" ] = &sim_t ::interactive_str;
@@ -367,6 +368,7 @@ void sim_t::interactive_help(const std::string& cmd, const std::vector<std::stri
367
368
" fregd <core> <reg> # Display double precision <reg> in <core>\n "
368
369
" vreg <core> [reg] # Display vector [reg] (all if omitted) in <core>\n "
369
370
" pc <core> # Show current PC in <core>\n "
371
+ " insn <core> # Show current instruction corresponding to PC in <core>\n "
370
372
" priv <core> # Show current privilege level in <core>\n "
371
373
" mem [core] <hex addr> # Show contents of virtual memory <hex addr> in [core] (physical memory <hex addr> if omitted)\n "
372
374
" 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
377
379
" untiln reg <core> <reg> <val> # Run noisy and stop when <reg> in <core> hits <val>\n "
378
380
" until pc <core> <val> # Stop when PC in <core> hits <val>\n "
379
381
" 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 "
380
384
" until mem [core] <addr> <val> # Stop when virtual memory <addr> in [core] (physical address <addr> if omitted) becomes <val>\n "
381
385
" untiln mem [core] <addr> <val> # Run noisy and stop when virtual memory <addr> in [core] (physical address <addr> if omitted) becomes <val>\n "
382
386
" 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
448
452
<< zext (get_pc (args), max_xlen) << std::endl;
449
453
}
450
454
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
+
451
503
void sim_t::interactive_priv (const std::string& cmd, const std::vector<std::string>& args)
452
504
{
453
505
if (args.size () != 1 )
@@ -647,27 +699,11 @@ reg_t sim_t::get_mem(const std::vector<std::string>& args)
647
699
addr_str = args[1 ];
648
700
}
649
701
650
- reg_t addr = strtol (addr_str.c_str (),NULL ,16 ), val ;
702
+ reg_t addr = strtol (addr_str.c_str (),NULL ,16 );
651
703
if (addr == LONG_MAX)
652
704
addr = strtoul (addr_str.c_str (),NULL ,16 );
653
705
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);
671
707
}
672
708
673
709
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
743
779
auto func = args[0 ] == " reg" ? &sim_t ::get_reg :
744
780
args[0 ] == " pc" ? &sim_t ::get_pc :
745
781
args[0 ] == " mem" ? &sim_t ::get_mem :
782
+ args[0 ] == " insn" ? &sim_t ::get_insn :
746
783
NULL ;
747
784
748
785
if (func == NULL )
@@ -800,4 +837,3 @@ void sim_t::interactive_mtimecmp(const std::string& cmd, const std::vector<std::
800
837
out << std::hex << std::setfill (' 0' ) << " 0x" << std::setw (16 )
801
838
<< clint->get_mtimecmp (p->get_id ()) << std::endl;
802
839
}
803
-
0 commit comments