[CRIU] [PATCH 11/22] restorer: wrapped the assembly calling sys_rt_sigreturn into the macro ARCH_RT_SIGRETURN

Pavel Emelyanov xemul at parallels.com
Fri Dec 28 03:54:41 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 |   12 ++++++++++++
>  pie/restorer.c                  |   19 +++----------------
>  2 files changed, 15 insertions(+), 16 deletions(-)
> 
> diff --git a/arch/x86/include/asm/restorer.h b/arch/x86/include/asm/restorer.h
> index edbcae2..b3e927d 100644
> --- a/arch/x86/include/asm/restorer.h
> +++ b/arch/x86/include/asm/restorer.h
> @@ -71,6 +71,18 @@ struct rt_sigframe {
>  	/* fp state follows here */
>  };
>  
> +
> +#define ARCH_RT_SIGRETURN(new_sp)					\
> +	asm volatile(							\
> +		     "movq %0, %%rax				    \n"	\
> +		     "movq %%rax, %%rsp				    \n"	\
> +		     "movl $"__stringify(__NR_rt_sigreturn)", %%eax \n" \
> +		     "syscall					    \n"	\
> +		     :							\
> +		     : "r"(new_sp)					\
> +		     : "rax","rsp","memory")
> +
> +

I'd prefer seeing this in some .S file, rather than in a header. How complex
would it be to do so?

>  int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r);
>  
>  int restore_fpu(struct rt_sigframe *sigframe, struct thread_restore_args *args);
> diff --git a/pie/restorer.c b/pie/restorer.c
> index dab1450..adf7af0 100644
> --- a/pie/restorer.c
> +++ b/pie/restorer.c
> @@ -198,14 +198,8 @@ long __export_restore_thread(struct thread_restore_args *args)
>  	futex_dec_and_wake(&thread_inprogress);
>  
>  	new_sp = (long)rt_sigframe + 8;
> -	asm volatile(
> -		"movq %0, %%rax					\n"
> -		"movq %%rax, %%rsp				\n"
> -		"movl $"__stringify(__NR_rt_sigreturn)", %%eax	\n"
> -		"syscall					\n"
> -		:
> -		: "r"(new_sp)
> -		: "rax","rsp","memory");
> +	ARCH_RT_SIGRETURN(new_sp);
> +
>  core_restore_end:
>  	pr_err("Restorer abnormal termination for %ld\n", sys_getpid());
>  	sys_exit_group(1);
> @@ -737,14 +731,7 @@ long __export_restore_task(struct task_restore_core_args *args)
>  	 * pure assembly since we don't need any additional
>  	 * code insns from gcc.
>  	 */
> -	asm volatile(
> -		"movq %0, %%rax					\n"
> -		"movq %%rax, %%rsp				\n"
> -		"movl $"__stringify(__NR_rt_sigreturn)", %%eax	\n"
> -		"syscall					\n"
> -		:
> -		: "r"(new_sp)
> -		: "rax","rsp","memory");
> +	ARCH_RT_SIGRETURN(new_sp);
>  
>  core_restore_end:
>  	pr_err("Restorer fail %ld\n", sys_getpid());
> 




More information about the CRIU mailing list