diff --git a/cr-restore.c b/cr-restore.c index aa00dc2eb..979204452 100644 --- a/cr-restore.c +++ b/cr-restore.c @@ -2848,9 +2848,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) task_args->bootstrap_start = (void *)exec_mem_hint; task_args->bootstrap_len = restore_bootstrap_len; -#ifdef CONFIG_VDSO - task_args->vdso_rt_size = vdso_rt_size; -#endif task_args->premmapped_addr = (unsigned long)rsti(current)->premmapped_addr; task_args->premmapped_len = rsti(current)->premmapped_len; @@ -2984,6 +2981,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) mem += rst_mem_remap_size(); task_args->vdso_rt_parked_at = (unsigned long)mem + vdso_rt_delta; task_args->vdso_sym_rt = vdso_sym_rt; + task_args->vdso_rt_size = vdso_rt_size; #endif new_sp = restorer_stack(task_args->t); diff --git a/pie/parasite.c b/pie/parasite.c index 9961b2fba..1ceb821bf 100644 --- a/pie/parasite.c +++ b/pie/parasite.c @@ -480,6 +480,12 @@ static int parasite_check_vdso_mark(struct parasite_vdso_vma_entry *args) return 0; } +#else +static inline int parasite_check_vdso_mark(struct parasite_vdso_vma_entry *args) +{ + pr_err("Unexpected VDSO check command\n"); + return -1; +} #endif static int __parasite_daemon_reply_ack(unsigned int cmd, int err) @@ -609,11 +615,9 @@ static noinline __used int noinline parasite_daemon(void *args) case PARASITE_CMD_CHECK_AIOS: ret = parasite_check_aios(args); break; -#ifdef CONFIG_VDSO case PARASITE_CMD_CHECK_VDSO_MARK: ret = parasite_check_vdso_mark(args); break; -#endif default: pr_err("Unknown command in parasite daemon thread leader: %d\n", m.cmd); ret = -1; diff --git a/pie/restorer.c b/pie/restorer.c index 8713c6a96..e2af72c22 100644 --- a/pie/restorer.c +++ b/pie/restorer.c @@ -649,16 +649,14 @@ static unsigned int bootstrap_len; */ #ifdef CONFIG_VDSO static unsigned long vdso_rt_size; +#else +#define vdso_rt_size (0) +#endif + void __export_unmap(void) { sys_munmap(bootstrap_start, bootstrap_len - vdso_rt_size); } -#else -void __export_unmap(void) -{ - sys_munmap(bootstrap_start, bootstrap_len); -} -#endif /* * This function unmaps all VMAs, which don't belong to @@ -805,10 +803,8 @@ long __export_restore_task(struct task_restore_args *args) pr_info("Switched to the restorer %d\n", my_pid); -#ifdef CONFIG_VDSO if (vdso_do_park(&args->vdso_sym_rt, args->vdso_rt_parked_at, vdso_rt_size)) goto core_restore_end; -#endif if (unmap_old_vmas((void *)args->premmapped_addr, args->premmapped_len, bootstrap_start, bootstrap_len)) diff --git a/proc_parse.c b/proc_parse.c index e6ea957ba..979568923 100644 --- a/proc_parse.c +++ b/proc_parse.c @@ -149,13 +149,11 @@ static int parse_vmflags(char *buf, struct vma_area *vma_area) /* vmsplice doesn't work for VM_IO and VM_PFNMAP mappings. */ if (_vmflag_match(tok, "io") || _vmflag_match(tok, "pf")) { -#ifdef CONFIG_VDSO /* * VVAR area mapped by the kernel as * VM_IO | VM_PFNMAP| VM_DONTEXPAND | VM_DONTDUMP */ if (!vma_area_is(vma_area, VMA_AREA_VVAR)) -#endif vma_area->e->status |= VMA_UNSUPP; } @@ -336,6 +334,36 @@ int parse_self_maps_lite(struct vm_area_list *vms) return 0; } +#ifdef CONFIG_VDSO +static inline int handle_vdso_vma(struct vma_area *vma) +{ + vma->e->status |= VMA_AREA_REGULAR; + if ((vma->e->prot & VDSO_PROT) == VDSO_PROT) + vma->e->status |= VMA_AREA_VDSO; + return 0; +} + +static inline int handle_vvar_vma(struct vma_area *vma) +{ + vma->e->status |= VMA_AREA_REGULAR; + if ((vma->e->prot & VVAR_PROT) == VVAR_PROT) + vma->e->status |= VMA_AREA_VVAR; + return 0; +} +#else +static inline int handle_vdso_vma(struct vma_area *vma) +{ + pr_warn_once("Found vDSO area without support\n"); + return -1; +} + +static inline int handle_vvar_vma(struct vma_area *vma) +{ + pr_warn_once("Found VVAR area without support\n"); + return -1; +} +#endif + static int handle_vma(pid_t pid, struct vma_area *vma_area, char *file_path, DIR *map_files_dir, struct vma_file_info *vfi, @@ -353,23 +381,11 @@ static int handle_vma(pid_t pid, struct vma_area *vma_area, !strcmp(file_path, "[vectors]")) { vma_area->e->status |= VMA_AREA_VSYSCALL; } else if (!strcmp(file_path, "[vdso]")) { -#ifdef CONFIG_VDSO - vma_area->e->status |= VMA_AREA_REGULAR; - if ((vma_area->e->prot & VDSO_PROT) == VDSO_PROT) - vma_area->e->status |= VMA_AREA_VDSO; -#else - pr_warn_once("Found vDSO area without support\n"); - goto err; -#endif + if (handle_vdso_vma(vma_area)) + goto err; } else if (!strcmp(file_path, "[vvar]")) { -#ifdef CONFIG_VDSO - vma_area->e->status |= VMA_AREA_REGULAR; - if ((vma_area->e->prot & VVAR_PROT) == VVAR_PROT) - vma_area->e->status |= VMA_AREA_VVAR; -#else - pr_warn_once("Found VVAR area without support\n"); - goto err; -#endif + if (handle_vvar_vma(vma_area)) + goto err; } else if (!strcmp(file_path, "[heap]")) { vma_area->e->status |= VMA_AREA_REGULAR | VMA_AREA_HEAP; } else {