mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-14 00:05:22 +00:00
syscall insn fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1199 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
bdfaf503dc
commit
06c2f5066e
@ -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,
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
#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)
|
|||||||
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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user