2 #include "hwacha_xcpt.h"
6 void ct_state_t::reset()
19 void ut_state_t::reset()
26 void hwacha_t::reset()
29 for (int i
=0; i
<max_uts
; i
++)
33 static reg_t
custom(processor_t
* p
, insn_t insn
, reg_t pc
)
35 hwacha_t
* h
= static_cast<hwacha_t
*>(p
->get_extension());
41 #define DECLARE_INSN(name, match, mask) \
42 extern reg_t hwacha_##name(processor_t*, insn_t, reg_t); \
43 if ((insn.bits() & mask) == match) { \
44 npc = hwacha_##name(p, insn, pc); \
47 #include "opcodes_hwacha.h"
50 catch (trap_instruction_access_fault
& t
)
52 h
->take_exception(HWACHA_CAUSE_VF_FAULT_FETCH
, h
->get_ct_state()->vf_pc
);
54 catch (trap_illegal_instruction
& t
)
56 h
->take_exception(HWACHA_CAUSE_VF_ILLEGAL_INSTRUCTION
, h
->get_ct_state()->vf_pc
);
58 catch (trap_load_address_misaligned
& t
)
60 h
->take_exception(HWACHA_CAUSE_MISALIGNED_LOAD
, t
.get_badvaddr());
62 catch (trap_store_address_misaligned
& t
)
64 h
->take_exception(HWACHA_CAUSE_MISALIGNED_STORE
, t
.get_badvaddr());
66 catch (trap_load_access_fault
& t
)
68 h
->take_exception(HWACHA_CAUSE_FAULT_LOAD
, t
.get_badvaddr());
70 catch (trap_store_access_fault
& t
)
72 h
->take_exception(HWACHA_CAUSE_FAULT_STORE
, t
.get_badvaddr());
76 h
->take_exception(HWACHA_CAUSE_ILLEGAL_INSTRUCTION
, insn
.bits());
81 std::vector
<insn_desc_t
> hwacha_t::get_instructions()
83 std::vector
<insn_desc_t
> insns
;
84 insns
.push_back((insn_desc_t
){0x0b, 0x7f, &::illegal_instruction
, custom
});
85 insns
.push_back((insn_desc_t
){0x2b, 0x7f, &::illegal_instruction
, custom
});
86 insns
.push_back((insn_desc_t
){0x5b, 0x7f, &::illegal_instruction
, custom
});
87 insns
.push_back((insn_desc_t
){0x7b, 0x7f, &::illegal_instruction
, custom
});
91 bool hwacha_t::vf_active()
93 for (uint32_t i
=0; i
<get_ct_state()->vl
; i
++) {
94 if (get_ut_state(i
)->run
)
100 void hwacha_t::take_exception(reg_t cause
, reg_t aux
)
102 get_ct_state()->cause
= cause
;
103 get_ct_state()->aux
= aux
;
105 if (!(p
->get_state()->sr
& SR_EI
))
106 throw std::logic_error("hwacha exception posted, but SR_EI bit not set!");
107 throw std::logic_error("hwacha exception posted, but IM[COP] bit not set!");