temp
This commit is contained in:
@@ -6,6 +6,13 @@
|
||||
#include <aal/debug.h>
|
||||
#include <page.h>
|
||||
|
||||
void init_process_vm(struct process_vm *vm)
|
||||
{
|
||||
aal_atomic_set(&vm->refcount, 1);
|
||||
INIT_LIST_HEAD(&vm->vm_range_list);
|
||||
vm->page_table = aal_mc_pt_create();
|
||||
}
|
||||
|
||||
struct process *create_process(unsigned long user_pc)
|
||||
{
|
||||
struct process *proc;
|
||||
@@ -17,8 +24,33 @@ struct process *create_process(unsigned long user_pc)
|
||||
aal_mc_init_user_process(&proc->ctx, &proc->uctx,
|
||||
((char *)proc) + PAGE_SIZE, user_pc, 0);
|
||||
|
||||
INIT_LIST_HEAD(&proc->vm_range_list);
|
||||
proc->page_table = aal_mc_pt_create();
|
||||
proc->vm = (struct process_vm *)(proc + 1);
|
||||
|
||||
init_process_vm(proc->vm);
|
||||
|
||||
return proc;
|
||||
}
|
||||
|
||||
struct process *clone_process(struct process *org, unsigned long pc,
|
||||
unsigned long sp)
|
||||
{
|
||||
struct process *proc;
|
||||
|
||||
proc = aal_mc_alloc_pages(1, 0);
|
||||
|
||||
memset(proc, 0, sizeof(struct process));
|
||||
|
||||
aal_mc_init_user_process(&proc->ctx, &proc->uctx,
|
||||
((char *)proc) + PAGE_SIZE, pc, sp);
|
||||
|
||||
memcpy(proc->uctx, org->uctx, sizeof(*org->uctx));
|
||||
aal_mc_modify_user_context(proc->uctx, AAL_UCR_STACK_POINTER,
|
||||
sp);
|
||||
aal_mc_modify_user_context(proc->uctx, AAL_UCR_PROGRAM_COUNTER,
|
||||
pc);
|
||||
|
||||
aal_atomic_inc(&org->vm->refcount);
|
||||
proc->vm = org->vm;
|
||||
|
||||
return proc;
|
||||
}
|
||||
@@ -33,7 +65,7 @@ void update_process_page_table(struct process *process, struct vm_range *range,
|
||||
|
||||
p = range->start;
|
||||
while (p < range->end) {
|
||||
aal_mc_pt_set_page(process->page_table, (void *)p,
|
||||
aal_mc_pt_set_page(process->vm->page_table, (void *)p,
|
||||
pa, PTATTR_WRITABLE | PTATTR_USER | flag);
|
||||
|
||||
pa += PAGE_SIZE;
|
||||
@@ -73,7 +105,7 @@ int add_process_memory_range(struct process *process,
|
||||
__host_update_process_range(process, range);
|
||||
}
|
||||
|
||||
list_add_tail(&range->list, &process->vm_range_list);
|
||||
list_add_tail(&range->list, &process->vm->vm_range_list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -90,22 +122,20 @@ void init_process_stack(struct process *process)
|
||||
virt_to_phys(stack), VR_STACK);
|
||||
|
||||
/* TODO: fill with actual value of argc, argv, envp */
|
||||
kprintf("%lx, %p\n", virt_to_phys(stack), p);
|
||||
|
||||
p[-1] = 0; /* AT_NULL */
|
||||
p[-2] = 0;
|
||||
p[-3] = USER_END - sizeof(unsigned long) * 2;
|
||||
p[-4] = 0; /* env: "" */
|
||||
p[-5] = 0x41; /* argv(0): "a" */
|
||||
p[-6] = USER_END - sizeof(unsigned long) * 4; /* envp: END - 8 */
|
||||
p[-6] = 0; /* envp: NULL */
|
||||
p[-7] = 0; /* argv[1] = NULL */
|
||||
p[-8] = USER_END - sizeof(unsigned long) * 5; /* argv[0] = END - 16 */
|
||||
p[-9] = 1; /* argc */
|
||||
|
||||
aal_mc_modify_user_context(process->uctx, AAL_UCR_STACK_POINTER,
|
||||
USER_END - sizeof(unsigned long) * 8);
|
||||
process->region.stack_end = USER_END;
|
||||
process->region.stack_start = USER_END - PAGE_SIZE;
|
||||
USER_END - sizeof(unsigned long) * 9);
|
||||
process->vm->region.stack_end = USER_END;
|
||||
process->vm->region.stack_start = USER_END - PAGE_SIZE;
|
||||
}
|
||||
|
||||
|
||||
@@ -148,7 +178,7 @@ int remove_process_region(struct process *proc,
|
||||
|
||||
/* We defer freeing to the time of exit */
|
||||
while (start < end) {
|
||||
aal_mc_pt_clear_page(proc->page_table, (void *)start);
|
||||
aal_mc_pt_clear_page(proc->vm->page_table, (void *)start);
|
||||
start += PAGE_SIZE;
|
||||
}
|
||||
|
||||
@@ -160,7 +190,11 @@ void free_process_memory(struct process *proc)
|
||||
{
|
||||
struct vm_range *range, *next;
|
||||
|
||||
list_for_each_entry_safe(range, next, &proc->vm_range_list,
|
||||
if (!aal_atomic_dec_and_test(&proc->vm->refcount)) {
|
||||
return;
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(range, next, &proc->vm->vm_range_list,
|
||||
list) {
|
||||
if (!(range->flag & VR_REMOTE) &&
|
||||
!(range->flag & VR_IO_NOCACHE) &&
|
||||
@@ -195,6 +229,9 @@ void sched_init(void)
|
||||
struct process *idle_process = &cpu_local_var(idle);
|
||||
|
||||
memset(idle_process, 0, sizeof(struct process));
|
||||
memset(&cpu_local_var(idle_vm), 0, sizeof(struct process_vm));
|
||||
|
||||
idle_process->vm = &cpu_local_var(idle_vm);
|
||||
|
||||
aal_mc_init_context(&idle_process->ctx, NULL, idle);
|
||||
|
||||
@@ -220,9 +257,11 @@ void schedule(void)
|
||||
cpu_enable_interrupt();
|
||||
|
||||
if (switch_ctx) {
|
||||
kprintf("schedule: %p (%p) => %p (%p) \n", prev,
|
||||
prev ? prev->page_table : NULL, next, next->page_table);
|
||||
aal_mc_load_page_table(next->page_table);
|
||||
kprintf("[%d] schedule: %d => %d \n",
|
||||
aal_mc_get_processor_id(),
|
||||
prev ? prev->pid : 0, next ? next->pid : 0);
|
||||
|
||||
aal_mc_load_page_table(next->vm->page_table);
|
||||
|
||||
if (prev) {
|
||||
aal_mc_switch_context(&prev->ctx, &next->ctx);
|
||||
|
||||
Reference in New Issue
Block a user