syscall insn fix
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 4 Jan 2005 01:06:58 +0000 (01:06 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 4 Jan 2005 01:06:58 +0000 (01:06 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1199 c046a42c-6fe2-441c-8c8c-71466251a162

target-i386/exec.h
target-i386/helper.c
target-i386/op.c
target-i386/translate.c

index 00eee80..5529c35 100644 (file)
@@ -199,7 +199,7 @@ void helper_cpuid(void);
 void helper_enter_level(int level, int data32);
 void helper_sysenter(void);
 void helper_sysexit(void);
-void helper_syscall(void);
+void helper_syscall(int next_eip_addend);
 void helper_sysret(int dflag);
 void helper_rdtsc(void);
 void helper_rdmsr(void);
index 3ae5b91..64d6f9e 100644 (file)
@@ -934,7 +934,7 @@ static void do_interrupt64(int intno, int is_int, int error_code,
     env->eflags &= ~(TF_MASK | VM_MASK | RF_MASK | NT_MASK);
 }
 
-void helper_syscall(void)
+void helper_syscall(int next_eip_addend)
 {
     int selector;
 
@@ -943,7 +943,7 @@ void helper_syscall(void)
     }
     selector = (env->star >> 32) & 0xffff;
     if (env->hflags & HF_LMA_MASK) {
-        ECX = env->eip;
+        ECX = env->eip + next_eip_addend;
         env->regs[11] = compute_eflags();
 
         cpu_x86_set_cpl(env, 0);
@@ -963,7 +963,7 @@ void helper_syscall(void)
         else
             env->eip = env->cstar;
     } else {
-        ECX = (uint32_t)env->eip;
+        ECX = (uint32_t)(env->eip + next_eip_addend);
         
         cpu_x86_set_cpl(env, 0);
         cpu_x86_load_seg_cache(env, R_CS, selector & 0xfffc, 
@@ -1119,8 +1119,8 @@ void do_interrupt(int intno, int is_int, int error_code,
                 fprintf(logfile, " EAX=" TARGET_FMT_lx, EAX);
             }
             fprintf(logfile, "\n");
-            cpu_dump_state(env, logfile, fprintf, X86_DUMP_CCOP);
 #if 0
+            cpu_dump_state(env, logfile, fprintf, X86_DUMP_CCOP);
             {
                 int i;
                 uint8_t *ptr;
index 1daa551..f81d59b 100644 (file)
@@ -938,7 +938,7 @@ void OPPROTO op_sysexit(void)
 #ifdef TARGET_X86_64
 void OPPROTO op_syscall(void)
 {
-    helper_syscall();
+    helper_syscall(PARAM1);
 }
 
 void OPPROTO op_sysret(void)
index a00ce04..743aff7 100644 (file)
@@ -4626,7 +4626,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
             s->cc_op = CC_OP_DYNAMIC;
         }
         gen_jmp_im(pc_start - s->cs_base);
-        gen_op_syscall();
+        gen_op_syscall(s->pc - pc_start);
         gen_eob(s);
         break;
     case 0x107: /* sysret */