Commit 4120f64d authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Andrei Vagin

pie: fix clobber registers for int 0x80

I managed to forgot that kernel erases R8...R11 regitster
prior returning to userspace from `int 0x80`:
https://lkml.org/lkml/2009/10/1/164

That was the reason for hang on gcc v6.1 on Jenkins/elsewhere:
https://ci.openvz.org/job/CRIU/job/CRIU-x86_64/branch/criu-dev/

Tested on gcc v6.1 locally, on Travis-CI:
https://travis-ci.org/0x7f454c46/criu/builds/183976899

travis-ci: success for pie: fix clobber registers for int 0x80 (rev2)
Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Tested-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 5e87137e
......@@ -185,7 +185,7 @@ struct rt_sigframe {
".code64 \n" \
: \
: "rdi"(new_sp) \
: "eax","esp","memory")
: "eax","esp", "r8", "r9", "r10", "r11", "memory")
#define ARCH_RT_SIGRETURN(new_sp, rt_sigframe) \
do { \
......
......@@ -38,12 +38,8 @@ static int arch_get_user_desc(user_desc_t *desc)
" mov %%eax,%0 \n"
: "+m"(ret)
: "m"(desc)
: "eax", "rbx", "memory");
: "rax", "rbx", "r8", "r9", "r10", "r11", "memory");
/*
* Fixup for Travis: on missing GDT entry get_thread_area()
* retruns -EINTR then descriptor with seg_not_preset = 1
*/
if (ret)
pr_err("Failed to dump TLS descriptor #%d: %d\n",
desc->entry_number, ret);
......
......@@ -79,7 +79,7 @@ void restore_tls(tls_t *ptls)
" mov %%eax,%0 \n"
: "=g"(ret)
: "r"(__NR32_set_thread_area), "r"((uint32_t)(uintptr_t)stack32)
: "eax", "ebx", "memory");
: "eax", "ebx", "r8", "r9", "r10", "r11", "memory");
if (ret)
pr_err("Failed to restore TLS descriptor %u in GDT: %d\n",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment