]> git.proxmox.com Git - qemu.git/commitdiff
Do not use load_seg_vm to load CS in real mode iret handling
authormalc <malc@c046a42c-6fe2-441c-8c8c-71466251a162>
Thu, 2 Oct 2008 20:02:27 +0000 (20:02 +0000)
committermalc <malc@c046a42c-6fe2-441c-8c8c-71466251a162>
Thu, 2 Oct 2008 20:02:27 +0000 (20:02 +0000)
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

target-i386/op_helper.c

index 32952b3a63b4c68eaad8130dbb48f94c5b073620..e9a6942440236d95f7e8b87002fafd3fca53c380 100644 (file)
@@ -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;