Added per-task curdir. and chdir, pager_read/write, mmap and munmap calls.

They look like what they should look like, but untested.
This commit is contained in:
Bahadir Balban
2008-02-20 00:50:03 +00:00
parent a160f6f151
commit f078116901
15 changed files with 200 additions and 59 deletions

View File

@@ -24,6 +24,8 @@ struct sys_mmap_args {
int sys_mmap(l4id_t sender, void *start, size_t length, int prot,
int flags, int fd, off_t offset);
int sys_munmap(l4id_t sender, void *vaddr, unsigned long size);
struct sys_shmat_args {
l4id_t shmid;
const void *shmaddr;

View File

@@ -65,6 +65,7 @@ void handle_requests(void)
break;
case L4_IPC_TAG_TASKDATA:
/* Send runnable task information to fs0 */
send_task_data(sender);
break;
@@ -84,7 +85,7 @@ void handle_requests(void)
sys_shmdt(sender, (void *)mr[0]);
break;
case L4_IPC_TAG_PAGER_SYSOPEN:
case L4_IPC_TAG_PAGER_OPEN:
/* vfs opens a file and tells us about it here. */
vfs_receive_sys_open(sender, (l4id_t)mr[0], (int)mr[1],
(unsigned long)mr[2], (unsigned long)mr[3]);
@@ -98,19 +99,24 @@ void handle_requests(void)
sys_write(sender, (int)mr[0], (void *)mr[1], (int)mr[2]);
break;
case L4_IPC_TAG_MMAP2: {
struct sys_mmap_args *args = (struct sys_mmap_args *)mr[0];
sys_mmap(sender, args->start, args->length, args->prot,
args->flags, args->fd, args->offset);
}
case L4_IPC_TAG_MMAP: {
struct sys_mmap_args *args = (struct sys_mmap_args *)&mr[0];
BUG(); /* FIXME: There are 8 arguments to ipc whereas there are 7 mrs available. Fix this by increasing MRs to 8 ??? */
sys_mmap(sender, args->start, args->length, args->prot, args->flags, args->fd, args->offset);
sys_mmap(sender, args->start, args->length, args->prot,
args->flags, args->fd, __pfn(args->offset));
break;
}
case L4_IPC_TAG_BRK: {
// sys_brk(sender, (void *)mr[0]);
// break;
}
case L4_IPC_TAG_MUNMAP: {
/* TODO: Use arg struct instead */
// sys_munmap(sender, (void *)mr[0], (int)mr[1]);
sys_munmap(sender, (void *)mr[0], (unsigned long)mr[1]);
break;
}
case L4_IPC_TAG_MSYNC: {

View File

@@ -194,7 +194,6 @@ struct vm_area *vma_split(struct vm_area *vma, struct tcb *task,
if (!(new = vma_new(0, 0, 0, 0, 0)))
return 0;
/*
* Some sanity checks to show that splitter range does end up
* producing two smaller vmas.
@@ -367,6 +366,15 @@ pgtable_unmap:
return 0;
}
int sys_munmap(l4id_t sender, void *vaddr, unsigned long size)
{
struct tcb *task;
BUG_ON(!(task = find_task(sender)));
return do_munmap(vaddr, size, task);
}
static struct vm_area *
is_vma_mergeable(unsigned long pfn_start, unsigned long pfn_end,
unsigned int flags, struct vm_area *vma)
@@ -480,15 +488,35 @@ int do_mmap(struct vm_file *mapfile, unsigned long f_offset, struct tcb *t,
/* mmap system call implementation */
int sys_mmap(l4id_t sender, void *start, size_t length, int prot,
int flags, int fd, off_t offset)
int flags, int fd, unsigned long pfn)
{
unsigned long npages = __pfn(page_align_up(length));
struct tcb * task;
int err;
BUG_ON(!(task = find_task(sender)));
if (fd < 0 || fd > TASK_OFILES_MAX)
return -EINVAL;
if ((unsigned long)start < USER_AREA_START || (unsigned long)start >= USER_AREA_END)
return -EINVAL;
/* TODO:
* Check that @start does not already have a mapping.
* Check that pfn + npages range is within the file range.
* Check that posix flags passed match those defined in vm_area.h
*/
if ((err = do_mmap(task->fd[fd].vmfile, __pfn_to_addr(pfn), task,
(unsigned long)start, flags, npages)) < 0)
return err;
return 0;
}
/* Sets the end of data segment for sender */
int sys_brk(l4id_t sender, void *ds_end)
{
// do_brk(find_task(sender), ds_end);
return 0;
}

View File

@@ -173,6 +173,7 @@ error:
BUG();
}
void init_pm(struct initdata *initdata)
{
start_boot_tasks(initdata, &tcb_head);