提交 06c2f506 编写于 作者: B bellard

syscall insn fix


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1199 c046a42c-6fe2-441c-8c8c-71466251a162
上级 bdfaf503
...@@ -199,7 +199,7 @@ void helper_cpuid(void); ...@@ -199,7 +199,7 @@ void helper_cpuid(void);
void helper_enter_level(int level, int data32); void helper_enter_level(int level, int data32);
void helper_sysenter(void); void helper_sysenter(void);
void helper_sysexit(void); void helper_sysexit(void);
void helper_syscall(void); void helper_syscall(int next_eip_addend);
void helper_sysret(int dflag); void helper_sysret(int dflag);
void helper_rdtsc(void); void helper_rdtsc(void);
void helper_rdmsr(void); void helper_rdmsr(void);
......
...@@ -934,7 +934,7 @@ static void do_interrupt64(int intno, int is_int, int error_code, ...@@ -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); env->eflags &= ~(TF_MASK | VM_MASK | RF_MASK | NT_MASK);
} }
void helper_syscall(void) void helper_syscall(int next_eip_addend)
{ {
int selector; int selector;
...@@ -943,7 +943,7 @@ void helper_syscall(void) ...@@ -943,7 +943,7 @@ void helper_syscall(void)
} }
selector = (env->star >> 32) & 0xffff; selector = (env->star >> 32) & 0xffff;
if (env->hflags & HF_LMA_MASK) { if (env->hflags & HF_LMA_MASK) {
ECX = env->eip; ECX = env->eip + next_eip_addend;
env->regs[11] = compute_eflags(); env->regs[11] = compute_eflags();
cpu_x86_set_cpl(env, 0); cpu_x86_set_cpl(env, 0);
...@@ -963,7 +963,7 @@ void helper_syscall(void) ...@@ -963,7 +963,7 @@ void helper_syscall(void)
else else
env->eip = env->cstar; env->eip = env->cstar;
} else { } else {
ECX = (uint32_t)env->eip; ECX = (uint32_t)(env->eip + next_eip_addend);
cpu_x86_set_cpl(env, 0); cpu_x86_set_cpl(env, 0);
cpu_x86_load_seg_cache(env, R_CS, selector & 0xfffc, 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, ...@@ -1119,8 +1119,8 @@ void do_interrupt(int intno, int is_int, int error_code,
fprintf(logfile, " EAX=" TARGET_FMT_lx, EAX); fprintf(logfile, " EAX=" TARGET_FMT_lx, EAX);
} }
fprintf(logfile, "\n"); fprintf(logfile, "\n");
cpu_dump_state(env, logfile, fprintf, X86_DUMP_CCOP);
#if 0 #if 0
cpu_dump_state(env, logfile, fprintf, X86_DUMP_CCOP);
{ {
int i; int i;
uint8_t *ptr; uint8_t *ptr;
......
...@@ -938,7 +938,7 @@ void OPPROTO op_sysexit(void) ...@@ -938,7 +938,7 @@ void OPPROTO op_sysexit(void)
#ifdef TARGET_X86_64 #ifdef TARGET_X86_64
void OPPROTO op_syscall(void) void OPPROTO op_syscall(void)
{ {
helper_syscall(); helper_syscall(PARAM1);
} }
void OPPROTO op_sysret(void) void OPPROTO op_sysret(void)
......
...@@ -4626,7 +4626,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) ...@@ -4626,7 +4626,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
s->cc_op = CC_OP_DYNAMIC; s->cc_op = CC_OP_DYNAMIC;
} }
gen_jmp_im(pc_start - s->cs_base); gen_jmp_im(pc_start - s->cs_base);
gen_op_syscall(); gen_op_syscall(s->pc - pc_start);
gen_eob(s); gen_eob(s);
break; break;
case 0x107: /* sysret */ case 0x107: /* sysret */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册