create also for kernel tasks a new PGD
This commit is contained in:
parent
54d636d25c
commit
e157f93104
4 changed files with 12 additions and 18 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue