PTE clearing bug due to wrong unmap fixed
This commit is contained in:
@@ -18,6 +18,18 @@
|
|||||||
#define dkprintf(...)
|
#define dkprintf(...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void check_mapping_for_proc(struct process *proc, unsigned long addr)
|
||||||
|
{
|
||||||
|
unsigned long __phys;
|
||||||
|
|
||||||
|
if (aal_mc_pt_virt_to_phys(proc->vm->page_table, (void*)addr, &__phys)) {
|
||||||
|
kprintf("check_map: no mapping for 0x%lX\n", addr);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
kprintf("check_map: 0x%lX -> 0x%lX\n", addr, __phys);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Communication with host
|
* Communication with host
|
||||||
*/
|
*/
|
||||||
@@ -71,13 +83,18 @@ static void process_msg_prepare_process(unsigned long rphys)
|
|||||||
{
|
{
|
||||||
void *_virt = (void *)s;
|
void *_virt = (void *)s;
|
||||||
unsigned long _phys;
|
unsigned long _phys;
|
||||||
aal_mc_pt_virt_to_phys(cpu_local_var(current)->vm->page_table,
|
if (aal_mc_pt_virt_to_phys(proc->vm->page_table,
|
||||||
_virt, &_phys);
|
_virt, &_phys)) {
|
||||||
|
kprintf("ERROR: no mapping for 0x%lX\n", _virt);
|
||||||
|
}
|
||||||
for (_virt = (void *)s + PAGE_SIZE;
|
for (_virt = (void *)s + PAGE_SIZE;
|
||||||
(unsigned long)_virt < e; _virt += PAGE_SIZE) {
|
(unsigned long)_virt < e; _virt += PAGE_SIZE) {
|
||||||
unsigned long __phys;
|
unsigned long __phys;
|
||||||
aal_mc_pt_virt_to_phys(cpu_local_var(current)->vm->page_table,
|
if (aal_mc_pt_virt_to_phys(proc->vm->page_table,
|
||||||
_virt, &__phys);
|
_virt, &__phys)) {
|
||||||
|
kprintf("ERROR: no mapping for 0x%lX\n", _virt);
|
||||||
|
panic("mapping");
|
||||||
|
}
|
||||||
if (__phys != _phys + PAGE_SIZE) {
|
if (__phys != _phys + PAGE_SIZE) {
|
||||||
kprintf("0x%lX + PAGE_SIZE is not physically contigous, from 0x%lX to 0x%lX\n", _virt - PAGE_SIZE, _phys, __phys);
|
kprintf("0x%lX + PAGE_SIZE is not physically contigous, from 0x%lX to 0x%lX\n", _virt - PAGE_SIZE, _phys, __phys);
|
||||||
panic("mondai");
|
panic("mondai");
|
||||||
@@ -137,6 +154,7 @@ static void process_msg_prepare_process(unsigned long rphys)
|
|||||||
e : proc->vm->region.data_end);
|
e : proc->vm->region.data_end);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
proc->vm->region.brk_start = proc->vm->region.brk_end =
|
proc->vm->region.brk_start = proc->vm->region.brk_end =
|
||||||
proc->vm->region.data_end;
|
proc->vm->region.data_end;
|
||||||
proc->vm->region.map_start = proc->vm->region.map_end =
|
proc->vm->region.map_start = proc->vm->region.map_end =
|
||||||
@@ -187,12 +205,9 @@ static void process_msg_prepare_process(unsigned long rphys)
|
|||||||
|
|
||||||
memcpy_long(args_envs, args_envs_r, p->args_len + 8);
|
memcpy_long(args_envs, args_envs_r, p->args_len + 8);
|
||||||
|
|
||||||
/* TODO: add a virtual_unmap function, that really does only unmap
|
aal_mc_unmap_virtual(args_envs_r, args_envs_npages, 0);
|
||||||
* the virtual address and doesn't drop the physical page itself!! */
|
aal_mc_unmap_memory(NULL, args_envs_rp, p->args_len);
|
||||||
|
|
||||||
//aal_mc_unmap_virtual(args_envs_r, args_envs_npages);
|
|
||||||
//aal_mc_unmap_memory(NULL, args_envs_rp, p->args_len);
|
|
||||||
|
|
||||||
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
|
// Map in remote physical addr of envs and copy it after args
|
||||||
@@ -208,8 +223,8 @@ static void process_msg_prepare_process(unsigned long rphys)
|
|||||||
|
|
||||||
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);
|
||||||
|
|
||||||
//aal_mc_unmap_virtual(args_envs_r, args_envs_npages);
|
aal_mc_unmap_virtual(args_envs_r, args_envs_npages, 0);
|
||||||
//aal_mc_unmap_memory(NULL, args_envs_rp, p->envs_len);
|
aal_mc_unmap_memory(NULL, args_envs_rp, p->envs_len);
|
||||||
|
|
||||||
// Update variables
|
// Update variables
|
||||||
argc = *((int*)(args_envs));
|
argc = *((int*)(args_envs));
|
||||||
@@ -238,8 +253,6 @@ static void process_msg_prepare_process(unsigned long rphys)
|
|||||||
|
|
||||||
dkprintf("env OK\n");
|
dkprintf("env OK\n");
|
||||||
|
|
||||||
aal_mc_unmap_virtual(args_envs, ARGENV_PAGE_COUNT, 0);
|
|
||||||
|
|
||||||
p->rprocess = (unsigned long)proc;
|
p->rprocess = (unsigned long)proc;
|
||||||
init_process_stack(proc, argc, argv, envc, env);
|
init_process_stack(proc, argc, argv, envc, env);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user