aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormalc <malc@c046a42c-6fe2-441c-8c8c-71466251a162>2008-10-02 20:02:27 +0000
committermalc <malc@c046a42c-6fe2-441c-8c8c-71466251a162>2008-10-02 20:02:27 +0000
commitbdadc0b5b6c396a77c9faed8eb6829789bfb6151 (patch)
tree6fa0abbbc1503777cede8cc22a391d0394ed6b4c
parent78f5bf1e6f1abc6b264da9e00e95ab228f3937a8 (diff)
Do not use load_seg_vm to load CS in real mode iret handling
load_seg_vm calls cpu_x86_load_seg_cache which updates hflags of current env, real hardware doesn't do this, nor the code that handles real mode lret/lcall/ljmp. This unbreaks "unreal mode" and makes QEMU the first emulator being able to run Project Angel demo by IMPACT Studios. (Not that there are many physical machines out there capable of doing the same) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5403 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--target-i386/op_helper.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/target-i386/op_helper.c b/target-i386/op_helper.c
index 32952b3a63..e9a6942440 100644
--- a/target-i386/op_helper.c
+++ b/target-i386/op_helper.c
@@ -2651,7 +2651,8 @@ void helper_iret_real(int shift)
POPW(ssp, sp, sp_mask, new_eflags);
}
ESP = (ESP & ~sp_mask) | (sp & sp_mask);
- load_seg_vm(R_CS, new_cs);
+ env->segs[R_CS].selector = new_cs;
+ env->segs[R_CS].base = (new_cs << 4);
env->eip = new_eip;
if (env->eflags & VM_MASK)
eflags_mask = TF_MASK | AC_MASK | ID_MASK | IF_MASK | RF_MASK | NT_MASK;