fixed code duplication with v86 interrupt redirection
This commit is contained in:
parent
8d698c7087
commit
ba7887f31c
@ -763,11 +763,15 @@ void BX_CPU_C::interrupt(Bit8u vector, unsigned type, bx_bool push_error, Bit16u
|
||||
{
|
||||
RSP_SPECULATIVE;
|
||||
|
||||
if(real_mode()) {
|
||||
real_mode_int(vector, push_error, error_code);
|
||||
}
|
||||
else {
|
||||
protected_mode_int(vector, soft_int, push_error, error_code);
|
||||
// software interrupt can be redirefcted in v8086 mode
|
||||
if (type != BX_SOFTWARE_INTERRUPT || !v8086_mode() || !v86_redirect_interrupt(vector))
|
||||
{
|
||||
if(real_mode()) {
|
||||
real_mode_int(vector, push_error, error_code);
|
||||
}
|
||||
else {
|
||||
protected_mode_int(vector, soft_int, push_error, error_code);
|
||||
}
|
||||
}
|
||||
|
||||
RSP_COMMIT;
|
||||
|
@ -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;
|
||||
#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);
|
||||
|
||||
done:
|
||||
|
||||
RSP_COMMIT;
|
||||
|
||||
BX_INSTR_FAR_BRANCH(BX_CPU_ID, BX_INSTR_IS_INT,
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value,
|
||||
EIP);
|
||||
|
@ -679,21 +679,8 @@ bx_bool BX_CPU_C::SvmInjectEvents(void)
|
||||
ctrls->exitintinfo = ctrls->eventinj & ~0x80000000;
|
||||
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);
|
||||
|
||||
done:
|
||||
|
||||
RSP_COMMIT;
|
||||
|
||||
BX_CPU_THIS_PTR errorno = 0; // injection success
|
||||
BX_CPU_THIS_PTR EXT = 0;
|
||||
|
||||
|
@ -1694,21 +1694,8 @@ void BX_CPU_C::VMenterInjectEvents(void)
|
||||
vm->idt_vector_info = vm->vmentry_interr_info & ~0x80000000;
|
||||
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);
|
||||
|
||||
done:
|
||||
|
||||
RSP_COMMIT;
|
||||
|
||||
BX_CPU_THIS_PTR errorno = 0; // injection success
|
||||
BX_CPU_THIS_PTR EXT = 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user