From a2917ffc87626a0cffaa317e52693ca19afc0ed3 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Fri, 8 Nov 2013 17:57:04 +0400 Subject: [PATCH] rst: Initialize task restore args after rst-mem remap The plan is to move the args on rst-mem itself. Thus we need to make sure it's initialized _after_ remap into restorer space. Signed-off-by: Pavel Emelyanov --- cr-restore.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/cr-restore.c b/cr-restore.c index 07b2d8896..3fa55dcca 100644 --- a/cr-restore.c +++ b/cr-restore.c @@ -2306,14 +2306,12 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) goto err; } + exec_mem_hint -= restorer_len; + memzero(mem, args_len); task_args = mem; thread_args = (struct thread_restore_args *)(task_args + 1); - task_args->bootstrap_start = (void *)exec_mem_hint - restorer_len; - task_args->bootstrap_len = restore_bootstrap_len; - task_args->vdso_rt_size = vdso_rt_size; - /* * Get a reference to shared memory area which is * used to signal if shmem restoration complete @@ -2329,17 +2327,22 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ret = shmem_remap(task_entries, mem, TASK_ENTRIES_SIZE); if (ret < 0) goto err; - task_args->task_entries = mem; - mem += TASK_ENTRIES_SIZE; - task_args->premmapped_addr = (unsigned long) current->rst->premmapped_addr; - task_args->premmapped_len = current->rst->premmapped_len; + if (rst_mem_remap(mem)) + goto err; + + task_args->task_entries = mem - TASK_ENTRIES_SIZE; task_args->rst_mem = mem; task_args->rst_mem_size = rst_mem_remap_size(); - if (rst_mem_remap(mem)) - goto err; + + task_args->bootstrap_start = (void *)exec_mem_hint; + task_args->bootstrap_len = restore_bootstrap_len; + task_args->vdso_rt_size = vdso_rt_size; + + task_args->premmapped_addr = (unsigned long) current->rst->premmapped_addr; + task_args->premmapped_len = current->rst->premmapped_len; task_args->shmems = rst_mem_remap_ptr(rst_shmems, RM_SHREMAP); task_args->nr_shmems = nr_shmems;