From cb4f3a4d654004bddcd1d3c1eab2b10eac0f9548 Mon Sep 17 00:00:00 2001 From: NAKAMURA Gou Date: Thu, 1 Oct 2015 21:04:29 +0900 Subject: [PATCH] take into account args/envs' offset in page - prepare_process_ranges_args_envs() --- kernel/host.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel/host.c b/kernel/host.c index fb37d290..f5351048 100644 --- a/kernel/host.c +++ b/kernel/host.c @@ -80,6 +80,7 @@ int prepare_process_ranges_args_envs(struct process *proc, unsigned long flags; uintptr_t interp_obase = -1; uintptr_t interp_nbase = -1; + size_t map_size; n = p->num_sections; @@ -205,7 +206,8 @@ int prepare_process_ranges_args_envs(struct process *proc, /* Only map remote address if it wasn't specified as an argument */ if (!args) { // Map in remote physical addr of args and copy it - args_envs_npages = (p->args_len + PAGE_SIZE - 1) >> PAGE_SHIFT; + map_size = ((uintptr_t)p->args & (PAGE_SIZE - 1)) + p->args_len; + args_envs_npages = (map_size + PAGE_SIZE - 1) >> PAGE_SHIFT; dkprintf("args_envs_npages: %d\n", args_envs_npages); args_envs_rp = ihk_mc_map_memory(NULL, (unsigned long)p->args, p->args_len); @@ -238,7 +240,8 @@ int prepare_process_ranges_args_envs(struct process *proc, /* Only map remote address if it wasn't specified as an argument */ if (!envs) { // Map in remote physical addr of envs and copy it after args - args_envs_npages = (p->envs_len + PAGE_SIZE - 1) >> PAGE_SHIFT; + map_size = ((uintptr_t)p->envs & (PAGE_SIZE - 1)) + p->envs_len; + args_envs_npages = (map_size + PAGE_SIZE - 1) >> PAGE_SHIFT; dkprintf("args_envs_npages: %d\n", args_envs_npages); args_envs_rp = ihk_mc_map_memory(NULL, (unsigned long)p->envs, p->envs_len);