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.
This commit is contained in:
Bahadir Balban
2009-10-05 19:05:56 +03:00
parent 114a59351f
commit a6c7ac7766
2 changed files with 55 additions and 65 deletions

View File

@@ -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)
{

View File

@@ -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");