fixed code duplication with v86 interrupt redirection

This commit is contained in:
Stanislav Shwartsman 2012-01-10 08:13:34 +00:00
parent 8d698c7087
commit ba7887f31c
4 changed files with 9 additions and 42 deletions

View File

@ -763,11 +763,15 @@ void BX_CPU_C::interrupt(Bit8u vector, unsigned type, bx_bool push_error, Bit16u
{ {
RSP_SPECULATIVE; RSP_SPECULATIVE;
if(real_mode()) { // software interrupt can be redirefcted in v8086 mode
real_mode_int(vector, push_error, error_code); if (type != BX_SOFTWARE_INTERRUPT || !v8086_mode() || !v86_redirect_interrupt(vector))
} {
else { if(real_mode()) {
protected_mode_int(vector, soft_int, push_error, error_code); real_mode_int(vector, push_error, error_code);
}
else {
protected_mode_int(vector, soft_int, push_error, error_code);
}
} }
RSP_COMMIT; RSP_COMMIT;

View File

@ -141,19 +141,8 @@ BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::INT_Ib(bxInstruction_c *i)
BX_CPU_THIS_PTR show_flag |= Flag_softint; BX_CPU_THIS_PTR show_flag |= Flag_softint;
#endif #endif
RSP_SPECULATIVE;
if (v8086_mode()) {
// redirect interrupt through virtual-mode idt
if (v86_redirect_interrupt(vector)) goto done;
}
interrupt(vector, BX_SOFTWARE_INTERRUPT, 0, 0); interrupt(vector, BX_SOFTWARE_INTERRUPT, 0, 0);
done:
RSP_COMMIT;
BX_INSTR_FAR_BRANCH(BX_CPU_ID, BX_INSTR_IS_INT, BX_INSTR_FAR_BRANCH(BX_CPU_ID, BX_INSTR_IS_INT,
BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value,
EIP); EIP);

View File

@ -679,21 +679,8 @@ bx_bool BX_CPU_C::SvmInjectEvents(void)
ctrls->exitintinfo = ctrls->eventinj & ~0x80000000; ctrls->exitintinfo = ctrls->eventinj & ~0x80000000;
ctrls->exitintinfo_error_code = error_code; ctrls->exitintinfo_error_code = error_code;
RSP_SPECULATIVE;
if (type == BX_SOFTWARE_INTERRUPT) {
if (v8086_mode()) {
// redirect interrupt through virtual-mode idt
if (v86_redirect_interrupt(vector)) goto done;
}
}
interrupt(vector, type, push_error, error_code); interrupt(vector, type, push_error, error_code);
done:
RSP_COMMIT;
BX_CPU_THIS_PTR errorno = 0; // injection success BX_CPU_THIS_PTR errorno = 0; // injection success
BX_CPU_THIS_PTR EXT = 0; BX_CPU_THIS_PTR EXT = 0;

View File

@ -1694,21 +1694,8 @@ void BX_CPU_C::VMenterInjectEvents(void)
vm->idt_vector_info = vm->vmentry_interr_info & ~0x80000000; vm->idt_vector_info = vm->vmentry_interr_info & ~0x80000000;
vm->idt_vector_error_code = error_code; vm->idt_vector_error_code = error_code;
RSP_SPECULATIVE;
if (type == BX_SOFTWARE_INTERRUPT) {
if (v8086_mode()) {
// redirect interrupt through virtual-mode idt
if (v86_redirect_interrupt(vector)) goto done;
}
}
interrupt(vector, type, push_error, error_code); interrupt(vector, type, push_error, error_code);
done:
RSP_COMMIT;
BX_CPU_THIS_PTR errorno = 0; // injection success BX_CPU_THIS_PTR errorno = 0; // injection success
BX_CPU_THIS_PTR EXT = 0; BX_CPU_THIS_PTR EXT = 0;
} }