Restore correct CS value when aborting in stack operations in CALL far instructions.
This commit is contained in:
parent
56a01a0e04
commit
efef231d7d
1 changed files with 8 additions and 8 deletions
|
|
@ -16,14 +16,14 @@
|
||||||
if (cgate32) \
|
if (cgate32) \
|
||||||
{ \
|
{ \
|
||||||
uint32_t old_esp = ESP; \
|
uint32_t old_esp = ESP; \
|
||||||
PUSH_L(old_cs); if (cpu_state.abrt) { cgate16 = cgate32 = 0; return 1; } \
|
PUSH_L(old_cs); if (cpu_state.abrt) { CS = old_cs; cgate16 = cgate32 = 0; return 1; } \
|
||||||
PUSH_L(old_pc); if (cpu_state.abrt) { ESP = old_esp; return 1; } \
|
PUSH_L(old_pc); if (cpu_state.abrt) { CS = old_cs; ESP = old_esp; return 1; } \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
uint32_t old_esp = ESP; \
|
uint32_t old_esp = ESP; \
|
||||||
PUSH_W(old_cs); if (cpu_state.abrt) { cgate16 = cgate32 = 0; return 1; } \
|
PUSH_W(old_cs); if (cpu_state.abrt) { CS = old_cs; cgate16 = cgate32 = 0; return 1; } \
|
||||||
PUSH_W(old_pc); if (cpu_state.abrt) { ESP = old_esp; return 1; } \
|
PUSH_W(old_pc); if (cpu_state.abrt) { CS = old_cs; ESP = old_esp; return 1; } \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CALL_FAR_l(new_seg, new_pc) \
|
#define CALL_FAR_l(new_seg, new_pc) \
|
||||||
|
|
@ -44,14 +44,14 @@
|
||||||
if (cgate16) \
|
if (cgate16) \
|
||||||
{ \
|
{ \
|
||||||
uint32_t old_esp = ESP; \
|
uint32_t old_esp = ESP; \
|
||||||
PUSH_W(old_cs); if (cpu_state.abrt) { cgate16 = cgate32 = 0; return 1; } \
|
PUSH_W(old_cs); if (cpu_state.abrt) { CS = old_cs; cgate16 = cgate32 = 0; return 1; } \
|
||||||
PUSH_W(old_pc); if (cpu_state.abrt) { ESP = old_esp; return 1; } \
|
PUSH_W(old_pc); if (cpu_state.abrt) { CS = old_cs; ESP = old_esp; return 1; } \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
uint32_t old_esp = ESP; \
|
uint32_t old_esp = ESP; \
|
||||||
PUSH_L(old_cs); if (cpu_state.abrt) { cgate16 = cgate32 = 0; return 1; } \
|
PUSH_L(old_cs); if (cpu_state.abrt) { CS = old_cs; cgate16 = cgate32 = 0; return 1; } \
|
||||||
PUSH_L(old_pc); if (cpu_state.abrt) { ESP = old_esp; return 1; } \
|
PUSH_L(old_pc); if (cpu_state.abrt) { CS = old_cs; ESP = old_esp; return 1; } \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue