[CRIU] [PATCH 14/22] restorer: introduced the multiarch support into the restorer.
Pavel Emelyanov
xemul at parallels.com
Fri Dec 28 03:57:53 EST 2012
On 12/27/2012 10:51 AM, Alexander Kartashov wrote:
> * Introduced the macro RT_SIGFRAME_UC to access the user context of a sigframe.
>
> * Introduced TLS restoration for ARM.
>
> * Don't touch a VMA that lies outside the virtual address space area 0..TASK_SIZE,
> because VM above TASK_SIZE is read-only but some areas are mapped on ARM
> into the process address space.
>
> * Introduced the macro SIGFRAME_OFFSET to tune the beginning of a sigframe
> on different architectures.
>
> Signed-off-by: Alexander Kartashov <alekskartashov at parallels.com>
> ---
> arch/x86/include/asm/restorer.h | 4 ++++
> include/restorer.h | 14 +++++++++-----
> pie/restorer.c | 23 +++++++++++++++++++----
> 3 files changed, 32 insertions(+), 9 deletions(-)
>
> diff --git a/arch/x86/include/asm/restorer.h b/arch/x86/include/asm/restorer.h
> index 1ccc93c..4518064 100644
> --- a/arch/x86/include/asm/restorer.h
> +++ b/arch/x86/include/asm/restorer.h
> @@ -129,9 +129,13 @@ struct rt_sigframe {
> : "r"(ret) \
> : "memory")
>
> +#define RT_SIGFRAME_UC(rt_sigframe) rt_sigframe->uc
> +
>
> int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r);
>
> int restore_fpu(struct rt_sigframe *sigframe, struct thread_restore_args *args);
>
> +static void __attribute__ ((unused)) restore_tls(u32 tls) { }
Why unused?
> +
> #endif
> diff --git a/include/restorer.h b/include/restorer.h
> index 7548ae1..3bb40b9 100644
> --- a/include/restorer.h
> +++ b/include/restorer.h
> @@ -17,10 +17,6 @@
> #include "../protobuf/creds.pb-c.h"
> #include "../protobuf/core.pb-c.h"
>
> -#ifndef CONFIG_X86_64
> -# error Only x86-64 is supported
> -#endif
> -
> struct task_restore_core_args;
> struct thread_restore_args;
>
> @@ -67,7 +63,10 @@ struct thread_restore_args {
> struct restore_mem_zone mem_zone;
>
> int pid;
> - UserX86RegsEntry gpregs;
> + UserRegsEntry gpregs;
> +
> + u32 tls;
> +
> u64 clear_tid_addr;
>
> bool has_futex;
> @@ -126,6 +125,7 @@ struct task_restore_core_args {
> u64 mm_saved_auxv[AT_VECTOR_SIZE];
> u32 mm_saved_auxv_size;
> char comm[TASK_COMM_LEN];
> + uint32_t tls;
Master thread's tls should be on one of the thread_restore_args.
>
> int *rst_tcp_socks;
> int rst_tcp_socks_size;
> @@ -199,4 +199,8 @@ find_shmem(struct shmems *shmems, unsigned long shmid)
> (vma_entry_is(vma, VMA_ANON_PRIVATE) || \
> vma_entry_is(vma, VMA_FILE_PRIVATE)))
>
> +#define SIGFRAME_OFFSET 8
> +
> +#include "asm/memcpy_64.h"
> +
> #endif /* __CR_RESTORER_H__ */
> diff --git a/pie/restorer.c b/pie/restorer.c
> index 04e7ab5..a9b4448 100644
> --- a/pie/restorer.c
> +++ b/pie/restorer.c
> @@ -156,7 +156,7 @@ static int restore_thread_common(struct rt_sigframe *sigframe,
> }
>
> if (args->has_blk_sigset)
> - sigframe->uc.uc_sigmask.sig[0] = args->blk_sigset;
> + RT_SIGFRAME_UC(sigframe).uc_sigmask.sig[0] = args->blk_sigset;
>
> restore_sched_info(&args->sp);
> if (restore_fpu(sigframe, args))
> @@ -189,6 +189,7 @@ long __export_restore_thread(struct thread_restore_args *args)
>
> restore_creds(&args->ta->creds);
>
> + restore_tls(args->tls);
>
> pr_info("%ld: Restored\n", sys_gettid());
>
> @@ -197,7 +198,7 @@ long __export_restore_thread(struct thread_restore_args *args)
>
> futex_dec_and_wake(&thread_inprogress);
>
> - new_sp = (long)rt_sigframe + 8;
> + new_sp = (long)rt_sigframe + SIGFRAME_OFFSET;
> ARCH_RT_SIGRETURN(new_sp);
>
> core_restore_end:
> @@ -399,6 +400,10 @@ long __export_restore_task(struct task_restore_core_args *args)
> }
> }
>
> + if (vma_entry->end >= TASK_SIZE) {
> + continue;
> + }
> +
> if (vma_entry->end > premmapped_end) {
> if (vma_entry->start < premmapped_end)
> addr = premmapped_end;
> @@ -421,6 +426,10 @@ long __export_restore_task(struct task_restore_core_args *args)
> if (!vma_priv(vma_entry))
> continue;
>
> + if (vma_entry->end >= TASK_SIZE) {
> + continue;
> + }
> +
> if (vma_entry->start > vma_entry->shmid)
> break;
>
> @@ -438,6 +447,10 @@ long __export_restore_task(struct task_restore_core_args *args)
> if (!vma_priv(vma_entry))
> continue;
>
> + if (vma_entry->start > TASK_SIZE) {
> + continue;
> + }
> +
> if (vma_entry->start < vma_entry->shmid)
> break;
>
> @@ -684,14 +697,16 @@ long __export_restore_task(struct task_restore_core_args *args)
>
> ret = sys_munmap(args->task_entries, TASK_ENTRIES_SIZE);
> if (ret < 0) {
> - ret = ((long)__LINE__ << 32) | -ret;
> + ret = ((long)__LINE__ << 16) | ((-ret) & 0xffff);
This hunk is not described in patch comment.
> goto core_restore_failed;
> }
>
> + restore_tls(args->tls);
> +
> /*
> * Sigframe stack.
> */
> - new_sp = (long)rt_sigframe + 8;
> + new_sp = (long)rt_sigframe + SIGFRAME_OFFSET;
>
> /*
> * Prepare the stack and call for sigreturn,
>
More information about the CRIU
mailing list