[CRIU] [PATCH 12/22] restorer: wrapped the assembly code colling sys_clone into the macro RUN_CLONE_RESTORE_FN
Pavel Emelyanov
xemul at parallels.com
Fri Dec 28 03:55:01 EST 2012
On 12/27/2012 10:51 AM, Alexander Kartashov wrote:
>
> Signed-off-by: Alexander Kartashov <alekskartashov at parallels.com>
> ---
> arch/x86/include/asm/restorer.h | 38 ++++++++++++++++++++++++++++++++++++++
> pie/restorer.c | 37 ++-----------------------------------
> 2 files changed, 40 insertions(+), 35 deletions(-)
>
> diff --git a/arch/x86/include/asm/restorer.h b/arch/x86/include/asm/restorer.h
> index b3e927d..5172170 100644
> --- a/arch/x86/include/asm/restorer.h
> +++ b/arch/x86/include/asm/restorer.h
> @@ -82,6 +82,44 @@ struct rt_sigframe {
> : "r"(new_sp) \
> : "rax","rsp","memory")
>
> +#define RUN_CLONE_RESTORE_FN(ret, clone_flags, new_sp, parent_tid, \
> + thread_args, clone_restore_fn) \
> + asm volatile( \
> + "clone_emul: \n" \
> + "movq %2, %%rsi \n" \
> + "subq $16, %%rsi \n" \
> + "movq %6, %%rdi \n" \
> + "movq %%rdi, 8(%%rsi) \n" \
> + "movq %5, %%rdi \n" \
> + "movq %%rdi, 0(%%rsi) \n" \
> + "movq %1, %%rdi \n" \
> + "movq %3, %%rdx \n" \
> + "movq %4, %%r10 \n" \
> + "movl $"__stringify(__NR_clone)", %%eax \n" \
> + "syscall \n" \
> + \
> + "testq %%rax,%%rax \n" \
> + "jz thread_run \n" \
> + \
> + "movq %%rax, %0 \n" \
> + "jmp clone_end \n" \
> + \
> + "thread_run: \n" \
> + "xorq %%rbp, %%rbp \n" \
> + "popq %%rax \n" \
> + "popq %%rdi \n" \
> + "callq *%%rax \n" \
> + \
> + "clone_end: \n" \
> + : "=r"(ret) \
> + : "g"(clone_flags), \
> + "g"(new_sp), \
> + "g"(&parent_tid), \
> + "g"(&thread_args[i].pid), \
> + "g"(clone_restore_fn), \
> + "g"(&thread_args[i]) \
> + : "rax", "rdi", "rsi", "rdx", "r10", "memory")
> +
>
I'd prefer seeing this in some .S file as well.
> int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r);
>
> diff --git a/pie/restorer.c b/pie/restorer.c
> index adf7af0..69e056c 100644
> --- a/pie/restorer.c
> +++ b/pie/restorer.c
> @@ -629,41 +629,8 @@ long __export_restore_task(struct task_restore_core_args *args)
> * thread will run with own stack and we must not
> * have any additional instructions... oh, dear...
> */
> - asm volatile(
> - "clone_emul: \n"
> - "movq %2, %%rsi \n"
> - "subq $16, %%rsi \n"
> - "movq %6, %%rdi \n"
> - "movq %%rdi, 8(%%rsi) \n"
> - "movq %5, %%rdi \n"
> - "movq %%rdi, 0(%%rsi) \n"
> - "movq %1, %%rdi \n"
> - "movq %3, %%rdx \n"
> - "movq %4, %%r10 \n"
> - "movl $"__stringify(__NR_clone)", %%eax \n"
> - "syscall \n"
> -
> - "testq %%rax,%%rax \n"
> - "jz thread_run \n"
> -
> - "movq %%rax, %0 \n"
> - "jmp clone_end \n"
> -
> - "thread_run: \n" /* new stack here */
> - "xorq %%rbp, %%rbp \n" /* clear ABI frame pointer */
> - "popq %%rax \n" /* clone_restore_fn -- restore_thread */
> - "popq %%rdi \n" /* arguments */
> - "callq *%%rax \n"
> -
> - "clone_end: \n"
> - : "=r"(ret)
> - : "g"(clone_flags),
> - "g"(new_sp),
> - "g"(&parent_tid),
> - "g"(&thread_args[i].pid),
> - "g"(args->clone_restore_fn),
> - "g"(&thread_args[i])
> - : "rax", "rdi", "rsi", "rdx", "r10", "memory");
> +
> + RUN_CLONE_RESTORE_FN(ret, clone_flags, new_sp, parent_tid, thread_args, args->clone_restore_fn);
> }
>
> ret = sys_flock(fd, LOCK_UN);
>
More information about the CRIU
mailing list