From 2d3fda1d0b4f36fbab3d06198a45462b7db0d0bb Mon Sep 17 00:00:00 2001 From: Tomoki Shirasawa Date: Sun, 14 Feb 2016 22:36:58 +0900 Subject: [PATCH] flatten_strings: fix align (REQ-1) --- executer/kernel/mcctrl/control.c | 4 ++-- executer/user/mcexec.c | 12 +++++++----- kernel/host.c | 14 +++++++------- lib/string.c | 12 +++++++----- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/executer/kernel/mcctrl/control.c b/executer/kernel/mcctrl/control.c index f8362e66..fddc84e0 100644 --- a/executer/kernel/mcctrl/control.c +++ b/executer/kernel/mcctrl/control.c @@ -125,10 +125,10 @@ static long mcexec_prepare_image(ihk_os_t os, pdesc->args = (void*)virt_to_phys(args); printk("args: 0x%lX\n", (unsigned long)pdesc->args); - printk("argc: %d\n", *(int*)args); + printk("argc: %ld\n", *(long *)args); pdesc->envs = (void*)virt_to_phys(envs); printk("envs: 0x%lX\n", (unsigned long)pdesc->envs); - printk("envc: %d\n", *(int*)envs); + printk("envc: %ld\n", *(long *)envs); isp.msg = SCD_MSG_PREPARE_PROCESS; isp.ref = pdesc->cpu; diff --git a/executer/user/mcexec.c b/executer/user/mcexec.c index 1992a449..2216dba9 100644 --- a/executer/user/mcexec.c +++ b/executer/user/mcexec.c @@ -776,7 +776,7 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat) } /* Count full length */ - full_len = sizeof(int) + sizeof(char *); // Counter and terminating NULL + full_len = sizeof(long) + sizeof(char *); // Counter and terminating NULL if (first) { full_len += sizeof(char *) + strlen(first) + 1; } @@ -786,6 +786,8 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat) full_len += sizeof(char *) + strlen(strings[string_i]) + 1; } + full_len = (full_len + sizeof(long) - 1) & ~(sizeof(long) - 1); + _flat = (char *)malloc(full_len); if (!_flat) { return 0; @@ -794,14 +796,14 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat) memset(_flat, 0, full_len); /* Number of strings */ - *((int*)_flat) = nr_strings + (first ? 1 : 0); + *((long *)_flat) = nr_strings + (first ? 1 : 0); // Actual offset - flat_offset = sizeof(int) + sizeof(char *) * (nr_strings + 1 + + flat_offset = sizeof(long) + sizeof(char *) * (nr_strings + 1 + (first ? 1 : 0)); if (first) { - *((char **)(_flat + sizeof(int))) = (void *)flat_offset; + *((char **)(_flat + sizeof(long))) = (void *)flat_offset; memcpy(_flat + flat_offset, first, strlen(first) + 1); flat_offset += strlen(first) + 1; } @@ -809,7 +811,7 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat) for (string_i = 0; string_i < nr_strings; ++string_i) { /* Fabricate the string */ - *((char **)(_flat + sizeof(int) + (string_i + (first ? 1 : 0)) + *((char **)(_flat + sizeof(long) + (string_i + (first ? 1 : 0)) * sizeof(char *))) = (void *)flat_offset; memcpy(_flat + flat_offset, strings[string_i], strlen(strings[string_i]) + 1); flat_offset += strlen(strings[string_i]) + 1; diff --git a/kernel/host.c b/kernel/host.c index 6376a6b9..78ed7f7e 100644 --- a/kernel/host.c +++ b/kernel/host.c @@ -242,7 +242,7 @@ int prepare_process_ranges_args_envs(struct thread *thread, p->args_len = args_len; } - dkprintf("args copy, nr: %d\n", *((int*)args_envs_r)); + dkprintf("args copy, nr: %d\n", *((long *)args_envs_r)); memcpy_long(args_envs, args_envs_r, p->args_len + sizeof(long) - 1); @@ -277,7 +277,7 @@ int prepare_process_ranges_args_envs(struct thread *thread, p->envs_len = envs_len; } - dkprintf("envs copy, nr: %d\n", *((int*)args_envs_r)); + dkprintf("envs copy, nr: %d\n", *((long *)args_envs_r)); memcpy_long(args_envs + p->args_len, args_envs_r, p->envs_len + sizeof(long) - 1); @@ -289,10 +289,10 @@ int prepare_process_ranges_args_envs(struct thread *thread, flush_tlb(); // Update variables - argc = *((int*)(args_envs)); + argc = *((long *)(args_envs)); dkprintf("argc: %d\n", argc); - argv = (char **)(args_envs + (sizeof(int))); + argv = (char **)(args_envs + (sizeof(long))); if(proc->saved_cmdline){ kfree(proc->saved_cmdline); proc->saved_cmdline_len = 0; @@ -309,17 +309,17 @@ int prepare_process_ranges_args_envs(struct thread *thread, *a = (char *)addr + (unsigned long)*a; // Process' address space! } - envc = *((int*)(args_envs + p->args_len)); + envc = *((long *)(args_envs + p->args_len)); dkprintf("envc: %d\n", envc); - env = (char **)(args_envs + p->args_len + sizeof(int)); + env = (char **)(args_envs + p->args_len + sizeof(long)); while (*env) { char **_env = env; //dkprintf("%s\n", args_envs + p->args_len + (unsigned long)*env); *env = (char *)addr + p->args_len + (unsigned long)*env; env = ++_env; } - env = (char **)(args_envs + p->args_len + sizeof(int)); + env = (char **)(args_envs + p->args_len + sizeof(long)); dkprintf("env OK\n"); diff --git a/lib/string.c b/lib/string.c index 010b9c53..2e9bfb2e 100644 --- a/lib/string.c +++ b/lib/string.c @@ -223,7 +223,7 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat) } /* Count full length */ - full_len = sizeof(int) + sizeof(char *); // Counter and terminating NULL + full_len = sizeof(long) + sizeof(char *); // Counter and terminating NULL if (first) { full_len += sizeof(char *) + strlen(first) + 1; } @@ -233,6 +233,8 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat) full_len += sizeof(char *) + strlen(strings[string_i]) + 1; } + full_len = (full_len + sizeof(long) - 1) & ~(sizeof(long) - 1); + _flat = (char *)kmalloc(full_len, IHK_MC_AP_NOWAIT); if (!_flat) { return 0; @@ -241,14 +243,14 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat) memset(_flat, 0, full_len); /* Number of strings */ - *((int*)_flat) = nr_strings + (first ? 1 : 0); + *((long *)_flat) = nr_strings + (first ? 1 : 0); // Actual offset - flat_offset = sizeof(int) + sizeof(char *) * (nr_strings + 1 + + flat_offset = sizeof(long) + sizeof(char *) * (nr_strings + 1 + (first ? 1 : 0)); if (first) { - *((char **)(_flat + sizeof(int))) = (void *)flat_offset; + *((char **)(_flat + sizeof(long))) = (void *)flat_offset; memcpy(_flat + flat_offset, first, strlen(first) + 1); flat_offset += strlen(first) + 1; } @@ -256,7 +258,7 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat) for (string_i = 0; string_i < nr_strings; ++string_i) { /* Fabricate the string */ - *((char **)(_flat + sizeof(int) + (string_i + (first ? 1 : 0)) + *((char **)(_flat + sizeof(long) + (string_i + (first ? 1 : 0)) * sizeof(char *))) = (void *)flat_offset; memcpy(_flat + flat_offset, strings[string_i], strlen(strings[string_i]) + 1); flat_offset += strlen(strings[string_i]) + 1;