mirror of
https://github.com/drasko/codezero.git
synced 2026-01-12 10:53:16 +01:00
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:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user