flatten_strings: fix align (REQ-1)
This commit is contained in:
@ -125,10 +125,10 @@ static long mcexec_prepare_image(ihk_os_t os,
|
|||||||
|
|
||||||
pdesc->args = (void*)virt_to_phys(args);
|
pdesc->args = (void*)virt_to_phys(args);
|
||||||
printk("args: 0x%lX\n", (unsigned long)pdesc->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);
|
pdesc->envs = (void*)virt_to_phys(envs);
|
||||||
printk("envs: 0x%lX\n", (unsigned long)pdesc->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.msg = SCD_MSG_PREPARE_PROCESS;
|
||||||
isp.ref = pdesc->cpu;
|
isp.ref = pdesc->cpu;
|
||||||
|
|||||||
@ -776,7 +776,7 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Count full length */
|
/* 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) {
|
if (first) {
|
||||||
full_len += sizeof(char *) + strlen(first) + 1;
|
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 += sizeof(char *) + strlen(strings[string_i]) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
full_len = (full_len + sizeof(long) - 1) & ~(sizeof(long) - 1);
|
||||||
|
|
||||||
_flat = (char *)malloc(full_len);
|
_flat = (char *)malloc(full_len);
|
||||||
if (!_flat) {
|
if (!_flat) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -794,14 +796,14 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat)
|
|||||||
memset(_flat, 0, full_len);
|
memset(_flat, 0, full_len);
|
||||||
|
|
||||||
/* Number of strings */
|
/* Number of strings */
|
||||||
*((int*)_flat) = nr_strings + (first ? 1 : 0);
|
*((long *)_flat) = nr_strings + (first ? 1 : 0);
|
||||||
|
|
||||||
// Actual offset
|
// Actual offset
|
||||||
flat_offset = sizeof(int) + sizeof(char *) * (nr_strings + 1 +
|
flat_offset = sizeof(long) + sizeof(char *) * (nr_strings + 1 +
|
||||||
(first ? 1 : 0));
|
(first ? 1 : 0));
|
||||||
|
|
||||||
if (first) {
|
if (first) {
|
||||||
*((char **)(_flat + sizeof(int))) = (void *)flat_offset;
|
*((char **)(_flat + sizeof(long))) = (void *)flat_offset;
|
||||||
memcpy(_flat + flat_offset, first, strlen(first) + 1);
|
memcpy(_flat + flat_offset, first, strlen(first) + 1);
|
||||||
flat_offset += 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) {
|
for (string_i = 0; string_i < nr_strings; ++string_i) {
|
||||||
|
|
||||||
/* Fabricate the string */
|
/* 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;
|
* sizeof(char *))) = (void *)flat_offset;
|
||||||
memcpy(_flat + flat_offset, strings[string_i], strlen(strings[string_i]) + 1);
|
memcpy(_flat + flat_offset, strings[string_i], strlen(strings[string_i]) + 1);
|
||||||
flat_offset += strlen(strings[string_i]) + 1;
|
flat_offset += strlen(strings[string_i]) + 1;
|
||||||
|
|||||||
@ -242,7 +242,7 @@ int prepare_process_ranges_args_envs(struct thread *thread,
|
|||||||
p->args_len = args_len;
|
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);
|
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;
|
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);
|
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();
|
flush_tlb();
|
||||||
|
|
||||||
// Update variables
|
// Update variables
|
||||||
argc = *((int*)(args_envs));
|
argc = *((long *)(args_envs));
|
||||||
dkprintf("argc: %d\n", argc);
|
dkprintf("argc: %d\n", argc);
|
||||||
|
|
||||||
argv = (char **)(args_envs + (sizeof(int)));
|
argv = (char **)(args_envs + (sizeof(long)));
|
||||||
if(proc->saved_cmdline){
|
if(proc->saved_cmdline){
|
||||||
kfree(proc->saved_cmdline);
|
kfree(proc->saved_cmdline);
|
||||||
proc->saved_cmdline_len = 0;
|
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!
|
*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);
|
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) {
|
while (*env) {
|
||||||
char **_env = env;
|
char **_env = env;
|
||||||
//dkprintf("%s\n", args_envs + p->args_len + (unsigned long)*env);
|
//dkprintf("%s\n", args_envs + p->args_len + (unsigned long)*env);
|
||||||
*env = (char *)addr + p->args_len + (unsigned long)*env;
|
*env = (char *)addr + p->args_len + (unsigned long)*env;
|
||||||
env = ++_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");
|
dkprintf("env OK\n");
|
||||||
|
|
||||||
|
|||||||
12
lib/string.c
12
lib/string.c
@ -223,7 +223,7 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Count full length */
|
/* 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) {
|
if (first) {
|
||||||
full_len += sizeof(char *) + strlen(first) + 1;
|
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 += 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);
|
_flat = (char *)kmalloc(full_len, IHK_MC_AP_NOWAIT);
|
||||||
if (!_flat) {
|
if (!_flat) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -241,14 +243,14 @@ int flatten_strings(int nr_strings, char *first, char **strings, char **flat)
|
|||||||
memset(_flat, 0, full_len);
|
memset(_flat, 0, full_len);
|
||||||
|
|
||||||
/* Number of strings */
|
/* Number of strings */
|
||||||
*((int*)_flat) = nr_strings + (first ? 1 : 0);
|
*((long *)_flat) = nr_strings + (first ? 1 : 0);
|
||||||
|
|
||||||
// Actual offset
|
// Actual offset
|
||||||
flat_offset = sizeof(int) + sizeof(char *) * (nr_strings + 1 +
|
flat_offset = sizeof(long) + sizeof(char *) * (nr_strings + 1 +
|
||||||
(first ? 1 : 0));
|
(first ? 1 : 0));
|
||||||
|
|
||||||
if (first) {
|
if (first) {
|
||||||
*((char **)(_flat + sizeof(int))) = (void *)flat_offset;
|
*((char **)(_flat + sizeof(long))) = (void *)flat_offset;
|
||||||
memcpy(_flat + flat_offset, first, strlen(first) + 1);
|
memcpy(_flat + flat_offset, first, strlen(first) + 1);
|
||||||
flat_offset += 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) {
|
for (string_i = 0; string_i < nr_strings; ++string_i) {
|
||||||
|
|
||||||
/* Fabricate the string */
|
/* 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;
|
* sizeof(char *))) = (void *)flat_offset;
|
||||||
memcpy(_flat + flat_offset, strings[string_i], strlen(strings[string_i]) + 1);
|
memcpy(_flat + flat_offset, strings[string_i], strlen(strings[string_i]) + 1);
|
||||||
flat_offset += strlen(strings[string_i]) + 1;
|
flat_offset += strlen(strings[string_i]) + 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user