[CRIU] [PATCH 14/22] restorer: introduced the multiarch support into the restorer.
Pavel Emelyanov
xemul at parallels.com
Fri Dec 28 04:14:49 EST 2012
On 12/28/2012 01:07 PM, Alexander Kartashov wrote:
> On 12/28/2012 12:57 PM, Pavel Emelyanov wrote:
>> 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?
> This file may be included into the source that doesn't use this function
> that results in a compiler warning.
This declare it as static inline.
>>
>>> +
>>> #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.
> This is an eternal problem of integer types mismatch. long is 32-bit
> long in ARM
> that results in a compiler warning here. So I had to reduce the shift value.
> Is it better to make ret 64 bit long and specify it's type explicitly (u64)?
No, just describe this in 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