Revised task initialisation, revising mmap yet.

This commit is contained in:
Bahadir Balban
2008-03-06 20:55:46 +00:00
parent 5681f3d1cb
commit 783904574d
12 changed files with 589 additions and 308 deletions

View File

@@ -1,7 +1,4 @@
/*
* Anonymous files for the process (e.g. stack, data, env)
* are implemented here.
*
* Copyright (C) 2008 Bahadir Balban
*/
#include <l4lib/types.h>
@@ -15,99 +12,6 @@
#include <task.h>
#include <proc.h>
static void *zpage_phys;
static struct page *zpage;
static struct vm_file *devzero;
/* TODO: Associate devzero with zero page */
void init_zero_page(void)
{
void *zpage_virt;
zpage_phys = alloc_page(1);
zpage = phys_to_page(zpage_phys);
/* Map it to self */
zpage_virt = l4_map_helper(zpage_phys, 1);
/* Zero it */
memset(zpage_virt, 0, PAGE_SIZE);
/* Unmap it */
l4_unmap_helper(zpage_virt, 1);
/* Update page struct. All other fields are zero */
spin_lock(&page->lock);
zpage->count++;
spin_unlock(&page->lock);
}
#define VM_OBJ_MASK 0xFFFF
#define VM_OBJ_DEVZERO (1 << 0) /* Devzero special file */
#define VM_OBJ_FILE (1 << 1) /* Regular VFS file */
#define VM_OBJ_SHADOW (1 << 2) /* Shadow of another object */
#define VM_OBJ_COW (1 << 3) /* Copy-on-write semantics */
struct vm_object *get_devzero(void)
{
return &devzero;
}
struct page *get_zero_page(void)
{
/* Update zero page struct. */
spin_lock(&page->lock);
zpage->count++;
spin_unlock(&page->lock);
return zpage;
}
void put_zero_page(void)
{
spin_lock(&page->lock);
zpage->count--;
spin_unlock(&page->lock);
BUG_ON(zpage->count < 0);
}
#define vm_object_to_file(obj) \
(struct vm_file *)container_of(obj, struct vm_file, vm_obj)
/* Returns the page with given offset in this vm_object */
struct page *devzero_pager_page_in(struct vm_object *vm_obj,
unsigned long page_offset)
{
struct vm_file *devzero = container_of(vm_obj, struct vm_file, vm_obj);
struct page *zpage = devzero->priv_data;
/* Update zero page struct. */
spin_lock(&page->lock);
zpage->count++;
spin_unlock(&page->lock);
return zpage;
}
struct vm_pager devzero_pager {
.page_in = devzero_pager_page_in,
};
void init_devzero(void)
{
init_zero_page();
INIT_LIST_HEAD(&devzero.list);
INIT_LIST_HEAD(&devzero.shadows);
INIT_LIST_HEAD(&devzero.page_cache);
/* Devzero has infinitely many pages ;-) */
devzero.npages = -1;
devzero.type = VM_OBJ_DEVZERO;
devzero.pager = &devzero_pager;
}
/* Allocates and fills in the env page. This is like a pre-faulted file. */
int task_populate_env(struct task *task)