#include "syscall.h" #include "keyboard.h" #include "klibc.h" #include "process.h" #include "stdarg.h" #include "thread.h" #include "types.h" #include "uaccess.h" #include "uaddrspace.h" #include "zero.h" int syscallExecute(int syscallId, const struct cpu_state *userCtx) { int ret = 0; switch (syscallId) { case SYSCALL_ID_EXIT: { uint status; ret = syscallGet1arg(userCtx, &status); if (ret != 0) break; threadExit(); assert(0); break; } case SYSCALL_ID_HELO: ret = printf("HELLO FROM USERSPACE\n"); break; case SYSCALL_ID_PUTC: { unsigned int c; ret = syscallGet1arg(userCtx, &c); putc(c); break; } case SYSCALL_ID_READ: ret = keyboardRead(); break; case SYSCALL_ID_TEST: { unsigned int arg1, arg2, arg3, arg4, arg5; ret = syscallGet5args(userCtx, &arg1, &arg2, &arg3, &arg4, &arg5); printf("Got 5args from userspace %d %d %d %d %d\n", arg1, arg2, arg3, arg4, arg5); break; } case SYSCALL_ID_BRK:{ struct uAddrSpace *as; uaddr_t newHeapTop; as = processGetAddrSpace(getCurrentThread()->process); ret = syscallGet1arg(userCtx, (unsigned int *)&newHeapTop); if (ret != 0) break; threadChangeCurrentContext(uAddrSpaceGetMMUContext(as)); //TODO : what if *newHeapTop raise page fault? ret = sysBrk(as, newHeapTop); threadChangeCurrentContext(NULL); break; } case SYSCALL_ID_MMAP: { struct uAddrSpace *as; uaddr_t uaddr; size_t size; uint32_t rights; uint32_t flags; uaddr_t userPath; char path[256]; as = processGetAddrSpace(getCurrentThread()->process); ret = syscallGet5args(userCtx, (unsigned int *)&uaddr, (unsigned int *)&size, (unsigned int *)&rights, (unsigned int *)&flags, (unsigned int *)&userPath); strzcpyFromUser((vaddr_t *)path, (uaddr_t *)userPath, sizeof(path)); printf("Trying mmap for device %s\n", path); if(strcmp(path, "/dev/zero") == 0){ zeroMmap(as, &uaddr, size, rights,flags); } (void)as; break; } default: printf("Unknon syscall id %d\n", syscallId); ret = -ENOENT; } return ret; }