mirror of
https://github.com/drasko/codezero.git
synced 2026-09-29 16:50:22 +02:00
Cleaned up libposix mmap()
Now we have proper setting of errno and using pfn based mmap for both types of mmap calls.
This commit is contained in:
@@ -40,7 +40,7 @@
|
|||||||
#define L4_IPC_TAG_BRK 17
|
#define L4_IPC_TAG_BRK 17
|
||||||
#define L4_IPC_TAG_READDIR 18
|
#define L4_IPC_TAG_READDIR 18
|
||||||
#define L4_IPC_TAG_MKDIR 19
|
#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_CHDIR 21
|
||||||
#define L4_IPC_TAG_FORK 22
|
#define L4_IPC_TAG_FORK 22
|
||||||
#define L4_IPC_TAG_STAT 23
|
#define L4_IPC_TAG_STAT 23
|
||||||
|
|||||||
+57
-20
@@ -26,7 +26,7 @@ struct mmap_descriptor {
|
|||||||
off_t offset;
|
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 */
|
/* Not enough MRs for all arguments, therefore we fill in a structure */
|
||||||
struct mmap_descriptor desc = {
|
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,
|
.prot = prot,
|
||||||
.flags = flags,
|
.flags = flags,
|
||||||
.fd = fd,
|
.fd = fd,
|
||||||
.offset = offset,
|
.offset = pgoffset,
|
||||||
};
|
};
|
||||||
int err;
|
int ret;
|
||||||
|
|
||||||
write_mr(L4SYS_ARG0, (unsigned long)&desc);
|
write_mr(L4SYS_ARG0, (unsigned long)&desc);
|
||||||
|
|
||||||
/* Call pager with MMAP request. */
|
/* Call pager with MMAP request. Check ipc error. */
|
||||||
if ((errno = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_MMAP)) < 0) {
|
if ((ret = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_MMAP)) < 0) {
|
||||||
printf("%s: IPC Error: %d.\n", __FUNCTION__, errno);
|
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 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 */
|
/* Check if syscall itself was successful */
|
||||||
if ((errno = l4_get_retval()) < 0) {
|
if ((err = l4_get_retval()) < 0) {
|
||||||
printf("%s: MMAP Error: %d.\n", __FUNCTION__, errno);
|
printf("%s: MUNMAP Error: %d.\n", __FUNCTION__, err);
|
||||||
return MAP_FAILED;
|
return err;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int munmap(void *start, size_t length)
|
int munmap(void *start, size_t length)
|
||||||
{
|
{
|
||||||
write_mr(L4SYS_ARG0, (unsigned long)start);
|
int ret = l4_munmap(start, length);
|
||||||
write_mr(L4SYS_ARG1, length);
|
|
||||||
|
|
||||||
/* Call pager with MMAP request. */
|
/* If error, return positive error code */
|
||||||
if ((errno = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_MMAP)) < 0) {
|
if (ret < 0) {
|
||||||
printf("%s: IPC Error: %d.\n", __FUNCTION__, errno);
|
errno = -ret;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* Check if syscall itself was successful */
|
|
||||||
if ((errno = l4_get_retval()) < 0) {
|
|
||||||
printf("%s: MUNMAP Error: %d.\n", __FUNCTION__, errno);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
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)
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ struct sys_mmap_args {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void *sys_mmap(struct tcb *sender, void *start, size_t length, int prot,
|
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_munmap(struct tcb *sender, void *vaddr, unsigned long size);
|
||||||
int sys_msync(struct tcb *task, void *start, unsigned long length, int flags);
|
int sys_msync(struct tcb *task, void *start, unsigned long length, int flags);
|
||||||
|
|||||||
+1
-7
@@ -110,17 +110,11 @@ void handle_requests(void)
|
|||||||
ret = sys_lseek(sender, (int)mr[0], (off_t)mr[1], (int)mr[2]);
|
ret = sys_lseek(sender, (int)mr[0], (off_t)mr[1], (int)mr[2]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case L4_IPC_TAG_MMAP2: {
|
case L4_IPC_TAG_MMAP: {
|
||||||
struct sys_mmap_args *args = (struct sys_mmap_args *)mr[0];
|
struct sys_mmap_args *args = (struct sys_mmap_args *)mr[0];
|
||||||
ret = (int)sys_mmap(sender, args->start, args->length, args->prot,
|
ret = (int)sys_mmap(sender, args->start, args->length, args->prot,
|
||||||
args->flags, args->fd, args->offset);
|
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: {
|
case L4_IPC_TAG_MUNMAP: {
|
||||||
ret = sys_munmap(sender, (void *)mr[0], (unsigned long)mr[1]);
|
ret = sys_munmap(sender, (void *)mr[0], (unsigned long)mr[1]);
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user