diff options
author | Jincheng Miao <jmiao@redhat.com> | 2014-08-08 11:56:54 +0800 |
---|---|---|
committer | Riku Voipio <riku.voipio@linaro.org> | 2014-08-22 15:06:33 +0300 |
commit | 47575997be9e0cae44a4fcaecbd172fec3746c96 (patch) | |
tree | 4f5e143e0be83f4102e34da512d3727bcaa22be7 /linux-user | |
parent | 0b2effd744471adea1cc82966df8a54fd6afa200 (diff) | |
download | qemu-47575997be9e0cae44a4fcaecbd172fec3746c96.zip qemu-47575997be9e0cae44a4fcaecbd172fec3746c96.tar.gz qemu-47575997be9e0cae44a4fcaecbd172fec3746c96.tar.bz2 |
linux-user: Fix syscall instruction usermode emulation on X86_64
Currently syscall instruction is buggy on user mode X86_64,
the EIP is updated after do_syscall(), that is too late for
clone(). Because clone() will create a thread at the env->EIP
(the address of syscall insn), and then child thread enters
do_syscall() again, that is not expected. Sometimes it is tragic.
User mode syscall insn emulation is not used MSR, so the
action should be same to INT 0x80. INT 0x80 will update EIP in
do_interrupt(), ditto for syscall() for consistency.
Signed-off-by: Jincheng Miao <jmiao@redhat.com>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
Diffstat (limited to 'linux-user')
-rw-r--r-- | linux-user/main.c | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/linux-user/main.c b/linux-user/main.c index b453a39..472a16d 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -309,7 +309,6 @@ void cpu_loop(CPUX86State *env) env->regs[8], env->regs[9], 0, 0); - env->eip = env->exception_next_eip; break; #endif case EXCP0B_NOSEG: |