[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