X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fsyscalls.c;h=6b970d6a11797724a7479bf2286352800f1dc3ce;hb=e785cf0b01276ae9ebbb018dae2fe83d11e77701;hp=635f69acf37587404fddfe1d78c80cd202a1b75b;hpb=b0da731b2d89b9dd58de2c98eaf6218a41a21920;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/syscalls.c b/KernelLand/Kernel/syscalls.c index 635f69ac..6b970d6a 100644 --- a/KernelLand/Kernel/syscalls.c +++ b/KernelLand/Kernel/syscalls.c @@ -44,7 +44,7 @@ extern Uint Binary_Load(const char *file, Uint *entryPoint); void SyscallHandler(tSyscallRegs *Regs); int Syscall_ValidString(const char *Addr); int Syscall_Valid(int Size, const void *Addr); - int Syscall_MM_SetFlags(const void *Addr, Uint Flags, Uint Mask); + int Syscall_MM_SetFlags(void *Addr, Uint Flags, Uint Mask); // === CODE === // TODO: Do sanity checking on arguments, ATM the user can really fuck with the kernel @@ -72,6 +72,10 @@ void SyscallHandler(tSyscallRegs *Regs) // -- Put the current thread to sleep case SYS_SLEEP: Threads_Sleep(); break; + + case SYS_TIMEDSLEEP: + Time_Delay(Regs->Arg1); + break; // -- Yield current timeslice case SYS_YIELD: Threads_Yield(); break; @@ -113,13 +117,13 @@ void SyscallHandler(tSyscallRegs *Regs) break; // -- Map an address - case SYS_MAP: MM_Map(Regs->Arg1, Regs->Arg2); break; + case SYS_MAP: MM_Map((void*)Regs->Arg1, Regs->Arg2); break; // -- Allocate an address - case SYS_ALLOCATE: ret = MM_Allocate(Regs->Arg1); break; + case SYS_ALLOCATE: ret = MM_Allocate((void*)Regs->Arg1); break; // -- Unmap an address - case SYS_UNMAP: MM_Deallocate(Regs->Arg1); break; + case SYS_UNMAP: MM_Deallocate((void*)Regs->Arg1); break; // -- Change the protection on an address case SYS_SETFLAGS: @@ -199,7 +203,20 @@ void SyscallHandler(tSyscallRegs *Regs) // Path, *Entrypoint ret = Binary_Load((char*)Regs->Arg1, (Uint*)Regs->Arg2); break; - + + // -- Load a kernel module + case SYS_LOADMOD: + CHECK_STR_NONULL( (const char *)Regs->Arg1 ); + if( Threads_GetUID() != 0 ) { + MERR("Not root"); + ret = EACCES; + } + else { + LOG("Module_LoadFile(\"%s\", NULL)", (const char *)Regs->Arg1); + ret = Module_LoadFile( (const char *)Regs->Arg1, NULL ); + } + break; + // --- // Virtual Filesystem // --- @@ -208,12 +225,27 @@ void SyscallHandler(tSyscallRegs *Regs) LOG("VFS_Open(\"%s\", 0x%x)", (char*)Regs->Arg1, Regs->Arg2 | VFS_OPENFLAG_USER); ret = VFS_Open((char*)Regs->Arg1, Regs->Arg2 | VFS_OPENFLAG_USER); break; + case SYS_REOPEN: + CHECK_STR_NONULL( (char*)Regs->Arg2 ); + LOG("VFS_Reopen(%i, \"%s\", 0x%x)", Regs->Arg1, (char*)Regs->Arg2, Regs->Arg3 | VFS_OPENFLAG_USER); + ret = VFS_Reopen(Regs->Arg1, (char*)Regs->Arg2, Regs->Arg3 | VFS_OPENFLAG_USER); + break; case SYS_CLOSE: LOG("VFS_Close(%i)", Regs->Arg1); VFS_Close( Regs->Arg1 ); break; + case SYS_COPYFD: + LOG("VFS_DuplicateFD(%i,%i)", Regs->Arg1, Regs->Arg2); + ret = VFS_DuplicateFD(Regs->Arg1, Regs->Arg2); + break; + + case SYS_FDCTL: + LOG("VFS_SetFDFlags(%i,0%o,0%o)", Regs->Arg1, Regs->Arg2, Regs->Arg3); + ret = VFS_SetFDFlags(Regs->Arg1, Regs->Arg2, Regs->Arg3); + break; + case SYS_SEEK: #if BITS == 64 ret = VFS_Seek( Regs->Arg1, Regs->Arg2, Regs->Arg3 ); @@ -300,14 +332,10 @@ void SyscallHandler(tSyscallRegs *Regs) else { // Sanity check the paths - if(!Syscall_ValidString((char*)Regs->Arg1) - || !Syscall_ValidString((char*)Regs->Arg2) - || (Regs->Arg3 && !Syscall_ValidString((char*)Regs->Arg3)) - || !Syscall_ValidString((char*)Regs->Arg4) ) { - err = -EINVAL; - ret = -1; - break; - } + CHECK_STR_NONULL((char*)Regs->Arg1); + CHECK_STR_NONULL((char*)Regs->Arg2); + CHECK_STR_NULLOK((char*)Regs->Arg3); + CHECK_STR_NONULL((char*)Regs->Arg4); ret = VFS_Mount( (char*)Regs->Arg1, // Device (char*)Regs->Arg2, // Mount point @@ -340,7 +368,17 @@ void SyscallHandler(tSyscallRegs *Regs) 0 // User handles ); break; + + + // Create a directory + case SYS_MKDIR: + CHECK_STR_NONULL( (char*)Regs->Arg1 ); + ret = VFS_MkDir( (char*)Regs->Arg1 ); + break; + case SYS_UNLINK: + Log_Error("Syscalls", "TODO: Impliment SYS_UNLINK"); + // Fall // -- Debug //#if DEBUG_BUILD case SYS_DEBUG: @@ -350,6 +388,11 @@ void SyscallHandler(tSyscallRegs *Regs) Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6); LogF("\r\n"); break; + case SYS_DEBUGHEX: + CHECK_STR_NONULL( (char*)Regs->Arg1 ); + CHECK_NUM_NONULL( (void*)Regs->Arg2, Regs->Arg3 ); + Debug_HexDump( (const char*)Regs->Arg1, (void*)Regs->Arg2, Regs->Arg3 ); + break; //#endif // -- Default (Return Error) @@ -416,7 +459,7 @@ int Syscall_Valid(int Size, const void *Addr) return CheckMem( Addr, Size ); } -int Syscall_MM_SetFlags(const void *Addr, Uint Flags, Uint Mask) +int Syscall_MM_SetFlags(void *Addr, Uint Flags, Uint Mask) { tPAddr paddr = MM_GetPhysAddr(Addr); Flags &= MM_PFLAG_RO|MM_PFLAG_EXEC; @@ -433,6 +476,6 @@ int Syscall_MM_SetFlags(const void *Addr, Uint Flags, Uint Mask) Mask |= MM_PFLAG_COW; } } - MM_SetFlags((tVAddr)Addr, Flags, Mask); + MM_SetFlags(Addr, Flags, Mask); return 0; }