[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 04/24] linux-user: Fix syscall instruction usermode e
From: |
riku . voipio |
Subject: |
[Qemu-devel] [PULL 04/24] linux-user: Fix syscall instruction usermode emulation on X86_64 |
Date: |
Fri, 15 Aug 2014 14:01:22 +0300 |
From: Jincheng Miao <address@hidden>
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 <address@hidden>
Reviewed-by: Richard Henderson <address@hidden>
Signed-off-by: Riku Voipio <address@hidden>
---
linux-user/main.c | 1 -
target-i386/seg_helper.c | 4 ++--
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/linux-user/main.c b/linux-user/main.c
index c5878f9..bc1ff46 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:
diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c
index 2d970d0..13eefba 100644
--- a/target-i386/seg_helper.c
+++ b/target-i386/seg_helper.c
@@ -1127,8 +1127,8 @@ static void do_interrupt_user(CPUX86State *env, int
intno, int is_int,
/* Since we emulate only user space, we cannot do more than
exiting the emulation with the suitable exception and error
- code */
- if (is_int) {
+ code. So update EIP for INT 0x80 and EXCP_SYSCALL. */
+ if (is_int || intno == EXCP_SYSCALL) {
env->eip = next_eip;
}
}
--
2.0.1
- [Qemu-devel] [PULL 05/24] linux-user: Fix conversion of sigevent argument to timer_create, (continued)
- [Qemu-devel] [PULL 05/24] linux-user: Fix conversion of sigevent argument to timer_create, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 14/24] linux-user: Make ipc syscall's third argument an abi_long, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 03/24] linux-user: make binfmt flag O require P, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 10/24] linux-user: add setns and unshare, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 08/24] linux-user: support ioprio_{get, set} syscalls, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 12/24] linux-user: Dereference Pointer Argument to ipc/semctl Sys Call, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 15/24] linux-user: Conditionally Pass Attribute Pointer to mq_open(), riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 24/24] linux-user: check return value of malloc(), riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 23/24] linux-user: writev Partial Writes, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 18/24] linux-user: Detect fault in sched_rr_get_interval, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 04/24] linux-user: Fix syscall instruction usermode emulation on X86_64,
riku . voipio <=
- [Qemu-devel] [PULL 01/24] linux-user: /proc/self/maps content, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 22/24] linux-user: Support target-to-host translation of mlockall argument, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 19/24] linux-user: Move get_ppc64_abi, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 20/24] linux-user: Minimum Sig Handler Stack Size for PPC64 ELF V2, riku . voipio, 2014/08/15
- [Qemu-devel] [PULL 21/24] linux-user: clock_nanosleep errno Handling on PPC, riku . voipio, 2014/08/15
- Re: [Qemu-devel] [PULL 00/24] Linux-user updates, Peter Maydell, 2014/08/15