9 processor_t::processor_t(int _id
, char* _mem
, size_t _memsz
)
10 : id(_id
), mmu(_mem
,_memsz
)
12 memset(R
,0,sizeof(R
));
19 memset(counters
,0,sizeof(counters
));
22 void processor_t::set_sr(uint32_t val
)
28 sr
&= ~(SR_KX
| SR_UX
);
30 gprlen
= ((sr
& SR_S
) ? (sr
& SR_KX
) : (sr
& SR_UX
)) ? 64 : 32;
33 void processor_t::step(size_t n
, bool noisy
)
40 insn_t insn
= mmu
.load_insn(pc
);
42 int opcode
= insn
.rtype
.opcode
;
43 int funct
= insn
.rtype
.funct
;
44 reg_t npc
= pc
+sizeof(insn
);
65 void processor_t::take_trap(trap_t t
)
67 demand(t
< NUM_TRAPS
, "internal error: bad trap number %d", int(t
));
68 demand(sr
& SR_ET
, "error mode on core %d!\ntrap %s, pc 0x%016llx",
69 id
, trap_name(t
), (unsigned long long)pc
);
71 set_sr((((sr
& ~SR_ET
) | SR_S
) & ~SR_PS
) | ((sr
& SR_S
) ? SR_PS
: 0));
74 badvaddr
= mmu
.get_badvaddr();
77 void processor_t::disasm(insn_t insn
, reg_t pc
)
79 printf("core %3d: 0x%016llx (0x%08x) ",id
,(unsigned long long)pc
,insn
.bits
);
81 #ifdef RISCV_HAVE_LIBOPCODES
82 disassemble_info info
;
83 INIT_DISASSEMBLE_INFO(info
, stdout
, fprintf
);
84 info
.flavour
= bfd_target_unknown_flavour
;
85 info
.arch
= bfd_arch_mips
;
86 info
.mach
= 101; // XXX bfd_mach_mips_riscv requires modified bfd.h
87 info
.endian
= BFD_ENDIAN_LITTLE
;
88 info
.buffer
= (bfd_byte
*)&insn
;
89 info
.buffer_length
= sizeof(insn
);
92 demand(print_insn_little_mips(pc
, &info
) == sizeof(insn
), "disasm bug!");