create also for kernel tasks a new PGD

This commit is contained in:
Stefan Lankes 2011-02-24 18:44:11 +01:00
parent 54d636d25c
commit e157f93104
4 changed files with 12 additions and 18 deletions

View file

@ -103,12 +103,12 @@ int arch_paging_init(void);
/*
* Setup a kernel task with a valid entry to the kernel's page directory
*/
int get_kernel_pgd(task_t* task);
int get_boot_pgd(task_t* task);
/*
* Setup a new page directory for a new user-level task
*/
int get_user_pgd(task_t* task);
int create_pgd(task_t* task);
/*
* Delete page directory and its page tables

View file

@ -54,7 +54,7 @@ static page_dir_t boot_pgd = {{[0 ... 1023] = 0}};
static spinlock_t boot_pgd_lock = SPINLOCK_INIT;
static int paging_enabled = 0;
int get_kernel_pgd(task_t* task)
int get_boot_pgd(task_t* task)
{
if (BUILTIN_EXPECT(!task, 0))
return -EINVAL;
@ -65,7 +65,7 @@ int get_kernel_pgd(task_t* task)
return 0;
}
int get_user_pgd(task_t* task)
int create_pgd(task_t* task)
{
page_dir_t* pgd;
page_table_t* pgt;

View file

@ -52,7 +52,7 @@ int multitasking_init(void) {
atomic_int32_set(&task_table[i].mem_usage, 0);
memset(task_table[i].mbox, 0x00, sizeof(mailbox_int32_t*)*MAX_TASKS);
per_core(current_task) = task_table+i;
get_kernel_pgd(task_table+i);
get_boot_pgd(task_table+i);
return 0;
}
}
@ -124,7 +124,7 @@ void NORETURN abort(void) {
do_exit(-1);
}
static int create_task(tid_t* id, entry_point_t ep, void* arg, int user)
static int create_task(tid_t* id, entry_point_t ep, void* arg)
{
int ret = -ENOMEM;
unsigned int i;
@ -136,15 +136,7 @@ static int create_task(tid_t* id, entry_point_t ep, void* arg, int user)
for(i=0; i<MAX_TASKS; i++) {
if (task_table[i].status == TASK_INVALID) {
if (!user) {
ret = get_kernel_pgd(task_table+i);
atomic_int32_set(&task_table[i].mem_usage, 0);
} else {
ret = get_user_pgd(task_table+i);
// user-level pgd needs already a page
atomic_int32_set(&task_table[i].mem_usage, 1);
}
ret = create_pgd(task_table+i);
if (ret != 0) {
ret = -ENOMEM;
goto create_task_out;
@ -152,6 +144,8 @@ static int create_task(tid_t* id, entry_point_t ep, void* arg, int user)
task_table[i].id = i;
task_table[i].status = TASK_READY;
// user-level pgd needs already a page
atomic_int32_set(&task_table[i].mem_usage, 1);
spinlock_init(&task_table[i].vma_lock);
task_table[i].vma_list = NULL;
memset(task_table[i].mbox, 0x00, sizeof(mailbox_int32_t*)*MAX_TASKS);
@ -172,7 +166,7 @@ create_task_out:
int create_kernel_task(tid_t* id, entry_point_t ep, void* arg)
{
return create_task(id, ep, arg, 0);
return create_task(id, ep, arg);
}
static int STDCALL user_entry(void* arg)
@ -314,7 +308,7 @@ int create_user_task(tid_t* id, size_t sz, const char* fname, int argc, char** a
if (!node || !(node->type == FS_FILE))
return -EINVAL;
return create_task(id, user_entry, node, 1);
return create_task(id, user_entry, node);
}
int sys_fork(void)

View file

@ -104,7 +104,7 @@ int test_init(void)
sem_init(&consuming, 0);
mailbox_int32_init(&mbox);
//create_kernel_task(NULL, foo, "Hello from foo1\n");
create_kernel_task(NULL, foo, "Hello from foo1\n");
//create_kernel_task(NULL, join_test, NULL);
//create_kernel_task(NULL, producer, NULL);
//create_kernel_task(NULL, consumer, NULL);