changes template: adds correct illegal instruction, reorders gen_sync to allow correct instr id eve when trapping, adds newly generated vm
This commit is contained in:
@ -173,8 +173,8 @@ private:
|
||||
/*generate behavior*/
|
||||
<%instr.behavior.eachLine{%>${it}
|
||||
<%}%>
|
||||
gen_instr_epilogue(jh);
|
||||
gen_sync(jh, POST_SYNC, ${idx});
|
||||
gen_instr_epilogue(jh);
|
||||
return returnValue;
|
||||
}
|
||||
<%}%>
|
||||
@ -183,13 +183,27 @@ private:
|
||||
****************************************************************************/
|
||||
continuation_e illegal_instruction(virt_addr_t &pc, code_word_t instr, jit_holder& jh ) {
|
||||
x86::Compiler& cc = jh.cc;
|
||||
if(this->disass_enabled){
|
||||
auto mnemonic = std::string("illegal_instruction");
|
||||
InvokeNode* call_print_disass;
|
||||
char* mnemonic_ptr = strdup(mnemonic.c_str());
|
||||
jh.disass_collection.push_back(mnemonic_ptr);
|
||||
jh.cc.invoke(&call_print_disass, &print_disass, FuncSignature::build<void, void *, uint64_t, char *>());
|
||||
call_print_disass->setArg(0, jh.arch_if_ptr);
|
||||
call_print_disass->setArg(1, pc.val);
|
||||
call_print_disass->setArg(2, mnemonic_ptr);
|
||||
}
|
||||
cc.comment(fmt::format("illegal_instruction{:#x}:",pc.val).c_str());
|
||||
gen_sync(jh, PRE_SYNC, instr_descr.size());
|
||||
mov(cc, jh.pc, pc.val);
|
||||
gen_set_tval(jh, instr);
|
||||
pc = pc + ((instr & 3) == 3 ? 4 : 2);
|
||||
mov(cc, jh.next_pc, pc.val);
|
||||
gen_instr_prologue(jh);
|
||||
cc.comment("//behavior:");
|
||||
gen_instr_epilogue(jh);
|
||||
gen_raise(jh, 0, 2);
|
||||
gen_sync(jh, POST_SYNC, instr_descr.size());
|
||||
gen_instr_epilogue(jh);
|
||||
return BRANCH;
|
||||
}
|
||||
|
||||
@ -283,7 +297,6 @@ void vm_impl<ARCH>::gen_instr_prologue(jit_holder& jh) {
|
||||
auto& cc = jh.cc;
|
||||
|
||||
cc.comment("//gen_instr_prologue");
|
||||
cc.inc(get_ptr_for(jh, traits::ICOUNT));
|
||||
|
||||
x86_reg_t current_trap_state = get_reg_for(cc, traits::TRAP_STATE);
|
||||
mov(cc, current_trap_state, get_ptr_for(jh, traits::TRAP_STATE));
|
||||
@ -299,6 +312,7 @@ void vm_impl<ARCH>::gen_instr_epilogue(jit_holder& jh) {
|
||||
mov(cc, current_trap_state, get_ptr_for(jh, traits::TRAP_STATE));
|
||||
cmp(cc, current_trap_state, 0);
|
||||
cc.jne(jh.trap_entry);
|
||||
cc.inc(get_ptr_for(jh, traits::ICOUNT));
|
||||
}
|
||||
template <typename ARCH>
|
||||
void vm_impl<ARCH>::gen_block_prologue(jit_holder& jh){
|
||||
|
Reference in New Issue
Block a user