From a6c7ac7766668be9fef209ff3c54edf834b81335 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Mon, 5 Oct 2009 19:05:56 +0300 Subject: [PATCH] Fixed mmap'ing of pager address space An anonymous never-to-be-faulted VMA is created for mm0's task region that is already mapped. --- conts/posix/mm0/mm/file.c | 70 +++++++++++++++++++++------------------ conts/posix/mm0/mm/init.c | 50 ++++++++++------------------ 2 files changed, 55 insertions(+), 65 deletions(-) diff --git a/conts/posix/mm0/mm/file.c b/conts/posix/mm0/mm/file.c index a18a5b5..6934db8 100644 --- a/conts/posix/mm0/mm/file.c +++ b/conts/posix/mm0/mm/file.c @@ -129,36 +129,6 @@ out: return retval; } -/* - * When a task does a read/write/mmap request on a file, if - * the file descriptor is unknown to the pager, this call - * asks vfs if that file has been opened, and any other - * relevant information. - */ -int vfs_open(l4id_t opener, int fd, unsigned long *vnum, unsigned long *length) -{ - struct tcb *task; - struct vnode *v; - - /* Check if such task exists */ - if (!(task = find_task(opener))) - return -ESRCH; - - /* Check if that fd has been opened */ - if (!task->files->fd[fd].vnum) - return -EBADF; - - /* Search the vnode by that vnum */ - if (IS_ERR(v = vfs_lookup_byvnum(vfs_root.pivot->sb, - task->files->fd[fd].vnum))) - return (int)v; - - /* Read file information */ - *vnum = v->vnum; - *length = v->size; - - return 0; -} /* Creates a node under a directory, e.g. a file, directory. */ struct vnode *vfs_create(struct tcb *task, struct pathdata *pdata, @@ -226,8 +196,13 @@ int sys_open(struct tcb *task, const char *pathname, int flags, unsigned int mod BUG_ON((fd = id_new(task->files->fdpool)) < 0); retval = fd; - /* Why assign just vnum? Why not vmfile, vnode etc? */ - BUG(); + /* TODO: + * Why assign just vnum? Why not vmfile, vnode etc? + * + * This is because vmfile is going to be created when + * the file pages are accessed. Need to trace this + * behaviour. + */ /* Assign the new fd with the vnode's number */ task->files->fd[fd].vnum = v->vnum; @@ -418,6 +393,37 @@ struct vm_file *do_open2(struct tcb *task, int fd, unsigned long vnum, unsigned return vmfile; } +/* + * When a task does a read/write/mmap request on a file, if + * the file descriptor is unknown to the pager, this call + * asks vfs if that file has been opened, and any other + * relevant information. + */ +int vfs_open(l4id_t opener, int fd, unsigned long *vnum, unsigned long *length) +{ + struct tcb *task; + struct vnode *v; + + /* Check if such task exists */ + if (!(task = find_task(opener))) + return -ESRCH; + + /* Check if that fd has been opened */ + if (!task->files->fd[fd].vnum) + return -EBADF; + + /* Search the vnode by that vnum */ + if (IS_ERR(v = vfs_lookup_byvnum(vfs_root.pivot->sb, + task->files->fd[fd].vnum))) + return (int)v; + + /* Read file information */ + *vnum = v->vnum; + *length = v->size; + + return 0; +} + /* Initialise a new file and the descriptor for it from given file data */ int do_open(struct tcb *task, int fd, unsigned long vnum, unsigned long length) { diff --git a/conts/posix/mm0/mm/init.c b/conts/posix/mm0/mm/init.c index f4d3cc4..4e2afcd 100644 --- a/conts/posix/mm0/mm/init.c +++ b/conts/posix/mm0/mm/init.c @@ -101,49 +101,33 @@ int pager_setup_task(void) task->data_start = (unsigned long)__start_data; task->data_end = (unsigned long)__end_data; + /* BSS markers */ + task->bss_start = (unsigned long)__start_bss; + task->bss_end = (unsigned long)__end_bss; + /* Task's region available for mmap */ - task->map_start = (unsigned long)__stack; + task->map_start = page_align_up((unsigned long)__stack); task->map_end = 0xF0000000; /* FIXME: Fix this */ + /* Task's total map boundaries */ + task->start = task->text_start; + task->end = 0xF0000000; + /* - * Map all regions as anonymous - * (since no real file could back) + * Map all regions as anonymous (since no real + * file could back) All already-mapped areas + * are mapped at once. */ - - /* Map text */ if (IS_ERR(mapped = - do_mmap(0, 0, task, task->text_start, - VMA_ANONYMOUS | VM_READ | + do_mmap(0, 0, task, task->start, + VMA_ANONYMOUS | VM_READ | VMA_FIXED | VM_WRITE | VM_EXEC | VMA_PRIVATE, - __pfn(page_align_up(task->text_end) - - task->text_start)))) { + __pfn(page_align_up(task->map_start) - + task->start)))) { printf("do_mmap: failed with %d.\n", (int)mapped); return (int)mapped; } - /* Map data */ - if (IS_ERR(mapped = - do_mmap(0, 0, task, task->data_start, - VMA_ANONYMOUS | VM_READ | - VM_WRITE | VM_EXEC | VMA_PRIVATE, - __pfn(page_align_up(task->data_end) - - task->data_start)))) { - printf("do_mmap: failed with %d.\n", (int)mapped); - return (int)mapped; - } - - /* Map stack */ - if (IS_ERR(mapped = - do_mmap(0, 0, task, task->stack_start, - VMA_ANONYMOUS | VM_READ | - VM_WRITE | VMA_PRIVATE, - __pfn(task->stack_end - - task->stack_start)))) { - printf("do_mmap: Mapping stack failed with %d.\n", - (int)mapped); - return (int)mapped; - } - task_setup_utcb(task); /* Set pager as child and parent of itself */ @@ -471,7 +455,7 @@ void copy_init_process(void) void *init_img_start, *init_img_end; if ((fd = sys_open(find_task(self_tid()), - "/test0", O_TRUNC | O_RDWR, + "/test0", O_TRUNC | O_RDWR | O_CREAT, 0)) < 0) { printf("FATAL: Could not open file " "to write initial task.\n");