mirror of
https://github.com/drasko/codezero.git
synced 2026-01-12 10:53:16 +01:00
utcb as a shared page instead of the message registers. Implemented the code that passes task information from mm0 to fs0 using the fs0 utcb. The code seems to work OK but: There's an issue with anon pages that they end up on the same swapfile and with same file offsets (e.g. utcb and stack at offset 0). Need to fix this issue but otherwise this implementation seems to work. TODO: - Separate anon regions into separate vmfiles. - Possibly map the stacks from virtual files so that they can be read from userspace in the future for debugging. - Possibly utcb could be created as a shared memory object using shmget/shmat during startup.
73 lines
1.5 KiB
C
73 lines
1.5 KiB
C
/*
|
|
* l4/posix glue for open()
|
|
*
|
|
* Copyright (C) 2007 Bahadir Balban
|
|
*/
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <sys/shm.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <l4lib/arch/syscalls.h>
|
|
#include <l4lib/arch/syslib.h>
|
|
#include <l4lib/ipcdefs.h>
|
|
#include <fcntl.h>
|
|
|
|
/*
|
|
* Arguments that are too large to fit in message registers are
|
|
* copied onto another area that is still on the utcb, and the servers
|
|
* map-in the task utcb and read those arguments from there.
|
|
*/
|
|
void *copy_to_utcb(void *arg, int size)
|
|
{
|
|
BUG_ON(size > PAGE_SIZE);
|
|
memcpy(utcb->buf, arg, size);
|
|
}
|
|
|
|
static inline int l4_open(const char *pathname, int flags, mode_t mode)
|
|
{
|
|
int fd;
|
|
|
|
// write_mr(L4SYS_ARG0, (unsigned long)pathname);
|
|
copy_to_utcb(pathname, strlen(pathname));
|
|
write_mr(L4SYS_ARG1, flags);
|
|
write_mr(L4SYS_ARG2, (u32)mode);
|
|
|
|
/* Call pager with shmget() request. Check ipc error. */
|
|
if ((fd = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_OPEN)) < 0) {
|
|
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, fd);
|
|
return fd;
|
|
}
|
|
/* Check if syscall itself was successful */
|
|
if ((fd = l4_get_retval()) < 0) {
|
|
printf("%s: OPEN Error: %d.\n", __FUNCTION__, fd);
|
|
return fd;
|
|
}
|
|
return fd;
|
|
}
|
|
|
|
int open(const char *pathname, int oflag, ...)
|
|
{
|
|
int ret;
|
|
mode_t mode = 0;
|
|
|
|
if (oflag & O_CREAT) {
|
|
va_list arg;
|
|
va_start(arg, oflag);
|
|
mode = va_arg(arg, mode_t);
|
|
va_end(arg);
|
|
}
|
|
ret = l4_open(pathname, oflag, mode);
|
|
|
|
/* If error, return positive error code */
|
|
if (ret < 0) {
|
|
errno = -ret;
|
|
return -1;
|
|
}
|
|
/* else return value */
|
|
return ret;
|
|
|
|
}
|
|
|