adjust prepare_process_ranges_args_envs() so that it can initialize arguments and environmnt variables from kernel space strings
This commit is contained in:
@@ -235,44 +235,69 @@ int prepare_process_ranges_args_envs(struct process *proc,
|
|||||||
|
|
||||||
dkprintf("args: 0x%lX, args_len: %d\n", p->args, p->args_len);
|
dkprintf("args: 0x%lX, args_len: %d\n", p->args, p->args_len);
|
||||||
|
|
||||||
// Map in remote physical addr of args and copy it
|
/* Only map remote address if it wasn't specified as an argument */
|
||||||
args_envs_npages = (p->args_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
if (!args) {
|
||||||
dkprintf("args_envs_npages: %d\n", args_envs_npages);
|
// Map in remote physical addr of args and copy it
|
||||||
args_envs_rp = ihk_mc_map_memory(NULL, (unsigned long)p->args, p->args_len);
|
args_envs_npages = (p->args_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||||
dkprintf("args_envs_rp: 0x%lX\n", args_envs_rp);
|
dkprintf("args_envs_npages: %d\n", args_envs_npages);
|
||||||
if((args_envs_r = (char *)ihk_mc_map_virtual(args_envs_rp, args_envs_npages,
|
args_envs_rp = ihk_mc_map_memory(NULL,
|
||||||
attr)) == NULL){
|
(unsigned long)p->args, p->args_len);
|
||||||
goto err;
|
|
||||||
|
dkprintf("args_envs_rp: 0x%lX\n", args_envs_rp);
|
||||||
|
if ((args_envs_r = (char *)ihk_mc_map_virtual(args_envs_rp,
|
||||||
|
args_envs_npages, attr)) == NULL){
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
dkprintf("args_envs_r: 0x%lX\n", args_envs_r);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
args_envs_r = args;
|
||||||
|
p->args_len = args_len;
|
||||||
}
|
}
|
||||||
dkprintf("args_envs_r: 0x%lX\n", args_envs_r);
|
|
||||||
|
|
||||||
dkprintf("args copy, nr: %d\n", *((int*)args_envs_r));
|
dkprintf("args copy, nr: %d\n", *((int*)args_envs_r));
|
||||||
|
|
||||||
memcpy_long(args_envs, args_envs_r, p->args_len + 8);
|
memcpy_long(args_envs, args_envs_r, p->args_len + 8);
|
||||||
|
|
||||||
ihk_mc_unmap_virtual(args_envs_r, args_envs_npages, 0);
|
/* Only unmap remote address if it wasn't specified as an argument */
|
||||||
ihk_mc_unmap_memory(NULL, args_envs_rp, p->args_len);
|
if (!args) {
|
||||||
|
ihk_mc_unmap_virtual(args_envs_r, args_envs_npages, 0);
|
||||||
|
ihk_mc_unmap_memory(NULL, args_envs_rp, p->args_len);
|
||||||
|
}
|
||||||
flush_tlb();
|
flush_tlb();
|
||||||
|
|
||||||
dkprintf("envs: 0x%lX, envs_len: %d\n", p->envs, p->envs_len);
|
dkprintf("envs: 0x%lX, envs_len: %d\n", p->envs, p->envs_len);
|
||||||
|
|
||||||
// Map in remote physical addr of envs and copy it after args
|
/* Only map remote address if it wasn't specified as an argument */
|
||||||
args_envs_npages = (p->envs_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
if (!envs) {
|
||||||
dkprintf("args_envs_npages: %d\n", args_envs_npages);
|
// Map in remote physical addr of envs and copy it after args
|
||||||
args_envs_rp = ihk_mc_map_memory(NULL, (unsigned long)p->envs, p->envs_len);
|
args_envs_npages = (p->envs_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||||
dkprintf("args_envs_rp: 0x%lX\n", args_envs_rp);
|
dkprintf("args_envs_npages: %d\n", args_envs_npages);
|
||||||
if((args_envs_r = (char *)ihk_mc_map_virtual(args_envs_rp, args_envs_npages,
|
args_envs_rp = ihk_mc_map_memory(NULL, (unsigned long)p->envs,
|
||||||
attr)) == NULL){
|
p->envs_len);
|
||||||
goto err;
|
|
||||||
|
dkprintf("args_envs_rp: 0x%lX\n", args_envs_rp);
|
||||||
|
|
||||||
|
if ((args_envs_r = (char *)ihk_mc_map_virtual(args_envs_rp,
|
||||||
|
args_envs_npages, attr)) == NULL) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
dkprintf("args_envs_r: 0x%lX\n", args_envs_r);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
args_envs_r = envs;
|
||||||
|
p->envs_len = envs_len;
|
||||||
}
|
}
|
||||||
dkprintf("args_envs_r: 0x%lX\n", args_envs_r);
|
|
||||||
|
|
||||||
dkprintf("envs copy, nr: %d\n", *((int*)args_envs_r));
|
dkprintf("envs copy, nr: %d\n", *((int*)args_envs_r));
|
||||||
|
|
||||||
memcpy_long(args_envs + p->args_len, args_envs_r, p->envs_len + 8);
|
memcpy_long(args_envs + p->args_len, args_envs_r, p->envs_len + 8);
|
||||||
|
|
||||||
ihk_mc_unmap_virtual(args_envs_r, args_envs_npages, 0);
|
/* Only map remote address if it wasn't specified as an argument */
|
||||||
ihk_mc_unmap_memory(NULL, args_envs_rp, p->envs_len);
|
if (!envs) {
|
||||||
|
ihk_mc_unmap_virtual(args_envs_r, args_envs_npages, 0);
|
||||||
|
ihk_mc_unmap_memory(NULL, args_envs_rp, p->envs_len);
|
||||||
|
}
|
||||||
flush_tlb();
|
flush_tlb();
|
||||||
|
|
||||||
// Update variables
|
// Update variables
|
||||||
|
|||||||
Reference in New Issue
Block a user