From 13b1b405a501871d20f1bfea2194a63f2efa9e42 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Wed, 29 Oct 2008 20:01:31 +0200 Subject: [PATCH] Cleaned up libposix mmap() Now we have proper setting of errno and using pfn based mmap for both types of mmap calls. --- tasks/libl4/include/l4lib/ipcdefs.h | 2 +- tasks/libposix/mmap.c | 77 +++++++++++++++++++++-------- tasks/mm0/include/syscalls.h | 2 +- tasks/mm0/main.c | 8 +-- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/tasks/libl4/include/l4lib/ipcdefs.h b/tasks/libl4/include/l4lib/ipcdefs.h index 4bb51fd..d1ca887 100644 --- a/tasks/libl4/include/l4lib/ipcdefs.h +++ b/tasks/libl4/include/l4lib/ipcdefs.h @@ -40,7 +40,7 @@ #define L4_IPC_TAG_BRK 17 #define L4_IPC_TAG_READDIR 18 #define L4_IPC_TAG_MKDIR 19 -#define L4_IPC_TAG_MMAP2 20 +#define L4_IPC_TAG_EXECVE 20 #define L4_IPC_TAG_CHDIR 21 #define L4_IPC_TAG_FORK 22 #define L4_IPC_TAG_STAT 23 diff --git a/tasks/libposix/mmap.c b/tasks/libposix/mmap.c index dd5078d..4b4ca0a 100644 --- a/tasks/libposix/mmap.c +++ b/tasks/libposix/mmap.c @@ -26,7 +26,7 @@ struct mmap_descriptor { off_t offset; }; -void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) +static inline void *l4_mmap(void *start, size_t length, int prot, int flags, int fd, off_t pgoffset) { /* Not enough MRs for all arguments, therefore we fill in a structure */ struct mmap_descriptor desc = { @@ -35,38 +35,69 @@ void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset .prot = prot, .flags = flags, .fd = fd, - .offset = offset, + .offset = pgoffset, }; - int err; + int ret; write_mr(L4SYS_ARG0, (unsigned long)&desc); - /* Call pager with MMAP request. */ - if ((errno = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_MMAP)) < 0) { - printf("%s: IPC Error: %d.\n", __FUNCTION__, errno); + /* Call pager with MMAP request. Check ipc error. */ + if ((ret = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_MMAP)) < 0) { + printf("%s: IPC Error: %d.\n", __FUNCTION__, ret); + return PTR_ERR(ret); + } + + if (IS_ERR(ret = l4_get_retval())) + printf("%s: MMAP Error: %d.\n", __FUNCTION__, ret); + + return (void *)ret; +} + +void *mmap2(void *start, size_t length, int prot, int flags, int fd, off_t pgoffset) +{ + void *ret = l4_mmap(start, length, prot, flags, fd, pgoffset); + + if (IS_ERR(ret)) { + errno = -(int)ret; return MAP_FAILED; } + return 0; +} + + +void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) +{ + return mmap2(start, length, prot, flags, fd, __pfn(offset)); +} + +int l4_munmap(void *start, size_t length) +{ + int err; + + write_mr(L4SYS_ARG0, (unsigned long)start); + write_mr(L4SYS_ARG1, length); + + /* Call pager with MMAP request. */ + if ((err = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_MMAP)) < 0) { + printf("%s: IPC Error: %d.\n", __FUNCTION__, err); + return err; + } + /* Check if syscall itself was successful */ - if ((errno = l4_get_retval()) < 0) { - printf("%s: MMAP Error: %d.\n", __FUNCTION__, errno); - return MAP_FAILED; + if ((err = l4_get_retval()) < 0) { + printf("%s: MUNMAP Error: %d.\n", __FUNCTION__, err); + return err; } return 0; } int munmap(void *start, size_t length) { - write_mr(L4SYS_ARG0, (unsigned long)start); - write_mr(L4SYS_ARG1, length); + int ret = l4_munmap(start, length); - /* Call pager with MMAP request. */ - if ((errno = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_MMAP)) < 0) { - printf("%s: IPC Error: %d.\n", __FUNCTION__, errno); - return -1; - } - /* Check if syscall itself was successful */ - if ((errno = l4_get_retval()) < 0) { - printf("%s: MUNMAP Error: %d.\n", __FUNCTION__, errno); + /* If error, return positive error code */ + if (ret < 0) { + errno = -ret; return -1; } return 0; @@ -93,6 +124,12 @@ int l4_msync(void *start, size_t length, int flags) int msync(void *start, size_t length, int flags) { - return l4_msync(start, length, flags); + int ret = l4_msync(start, length, flags); + + if (ret < 0) { + errno = -ret; + return -1; + } + return 0; } diff --git a/tasks/mm0/include/syscalls.h b/tasks/mm0/include/syscalls.h index 7d210c2..5697f57 100644 --- a/tasks/mm0/include/syscalls.h +++ b/tasks/mm0/include/syscalls.h @@ -24,7 +24,7 @@ struct sys_mmap_args { }; void *sys_mmap(struct tcb *sender, void *start, size_t length, int prot, - int flags, int fd, off_t offset); + int flags, int fd, off_t pfn); int sys_munmap(struct tcb *sender, void *vaddr, unsigned long size); int sys_msync(struct tcb *task, void *start, unsigned long length, int flags); diff --git a/tasks/mm0/main.c b/tasks/mm0/main.c index dd6a32d..34c753e 100644 --- a/tasks/mm0/main.c +++ b/tasks/mm0/main.c @@ -110,17 +110,11 @@ void handle_requests(void) ret = sys_lseek(sender, (int)mr[0], (off_t)mr[1], (int)mr[2]); break; - case L4_IPC_TAG_MMAP2: { + case L4_IPC_TAG_MMAP: { struct sys_mmap_args *args = (struct sys_mmap_args *)mr[0]; ret = (int)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]; - ret = (int)sys_mmap(sender, args->start, args->length, args->prot, - args->flags, args->fd, __pfn(args->offset)); - break; - } case L4_IPC_TAG_MUNMAP: { ret = sys_munmap(sender, (void *)mr[0], (unsigned long)mr[1]); break;