mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-01-23 02:14:37 +00:00
restorer: shstk: allocate restorer shadow stack
* reserve space for restorer shadow stack * set tmp_shstk at mem, advance mem by PAGE_SIZE * forget the extra PAGE_SIZE (shstk) for premapped VMAs Signed-off-by: Igor Svilenkov Bozic <svilenkov@gmail.com> Co-Authored-By: Andrei Vagin <avagin@gmail.com> [ alex: small code cleanups ] Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>
This commit is contained in:
parent
b18c07d8a8
commit
02462c19c4
3 changed files with 5 additions and 11 deletions
|
|
@ -45,7 +45,6 @@ static int shstk_prepare_task(struct vm_area_list *vmas,
|
|||
shstk->vma_start = vma->e->start;
|
||||
shstk->vma_size = size;
|
||||
shstk->premmaped_addr = premmaped_addr;
|
||||
shstk->tmp_shstk = premmaped_addr + size;
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3195,7 +3195,7 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns
|
|||
|
||||
rst_mem_size = rst_mem_lock();
|
||||
memzone_size = round_up(sizeof(struct restore_mem_zone) * current->nr_threads, page_size());
|
||||
task_args->bootstrap_len = restorer_len + memzone_size + alen + rst_mem_size;
|
||||
task_args->bootstrap_len = restorer_len + memzone_size + alen + rst_mem_size + shstk_restorer_stack_size();
|
||||
BUG_ON(task_args->bootstrap_len & (PAGE_SIZE - 1));
|
||||
pr_info("%d threads require %ldK of memory\n", current->nr_threads, KBYTES(task_args->bootstrap_len));
|
||||
|
||||
|
|
@ -3466,6 +3466,10 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns
|
|||
* self-vmas are unmaped.
|
||||
*/
|
||||
mem += rst_mem_size;
|
||||
|
||||
shstk_set_restorer_stack(&task_args->shstk, mem);
|
||||
mem += shstk_restorer_stack_size();
|
||||
|
||||
task_args->vdso_rt_parked_at = (unsigned long)mem;
|
||||
task_args->vdso_maps_rt = vdso_maps_rt;
|
||||
task_args->vdso_rt_size = vdso_rt_size;
|
||||
|
|
|
|||
|
|
@ -787,8 +787,6 @@ int prepare_mm_pid(struct pstree_item *i)
|
|||
ri->vmas.rst_priv_size += vma_area_len(vma);
|
||||
if (vma_has_guard_gap_hidden(vma))
|
||||
ri->vmas.rst_priv_size += PAGE_SIZE;
|
||||
if (vma_area_is(vma, VMA_AREA_SHSTK))
|
||||
ri->vmas.rst_priv_size += PAGE_SIZE;
|
||||
}
|
||||
|
||||
pr_info("vma 0x%" PRIx64 " 0x%" PRIx64 "\n", vma->e->start, vma->e->end);
|
||||
|
|
@ -931,13 +929,6 @@ static int premap_private_vma(struct pstree_item *t, struct vma_area *vma, void
|
|||
|
||||
size = vma_entry_len(vma->e);
|
||||
|
||||
/*
|
||||
* map an extra page for shadow stack VMAs, it will be used as a
|
||||
* temporary shadow stack
|
||||
*/
|
||||
if (vma_area_is(vma, VMA_AREA_SHSTK))
|
||||
size += PAGE_SIZE;
|
||||
|
||||
if (!vma_inherited(vma)) {
|
||||
int flag = 0;
|
||||
/*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue