summaryrefslogtreecommitdiff
path: root/target-i386
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2005-01-04 01:06:58 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2005-01-04 01:06:58 +0000
commit06c2f5066e298d456e4a6ca24def8a84cc9ed31a (patch)
tree387e2d20ee2fa0f19a72f5dec384acaa49e6d252 /target-i386
parentbdfaf503dc395cf77d6b67df5229c5c7a3cb7631 (diff)
downloadqemu-06c2f5066e298d456e4a6ca24def8a84cc9ed31a.tar.gz
syscall insn fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1199 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-i386')
-rw-r--r--target-i386/exec.h2
-rw-r--r--target-i386/helper.c8
-rw-r--r--target-i386/op.c2
-rw-r--r--target-i386/translate.c2
4 files changed, 7 insertions, 7 deletions
diff --git a/target-i386/exec.h b/target-i386/exec.h
index 00eee80f99..5529c35524 100644
--- a/target-i386/exec.h
+++ b/target-i386/exec.h
@@ -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);
diff --git a/target-i386/helper.c b/target-i386/helper.c
index 3ae5b9113e..64d6f9e7ad 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -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;
diff --git a/target-i386/op.c b/target-i386/op.c
index 1daa551c25..f81d59b161 100644
--- a/target-i386/op.c
+++ b/target-i386/op.c
@@ -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)
diff --git a/target-i386/translate.c b/target-i386/translate.c
index a00ce0426f..743aff7653 100644
--- a/target-i386/translate.c
+++ b/target-i386/translate.c
@@ -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 */