X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fsyscalls.c;h=8d17e74d2120967ba5d058f1b7ec0111cff17679;hb=391af300bd045791b8aaf50cf44b2d503c763213;hp=1eee53bb445401294f40402670781686ef0a2428;hpb=db4bf715d2fa57a2d07ea5e5ca9aafb741519569;p=tpg%2Facess2.git diff --git a/Kernel/syscalls.c b/Kernel/syscalls.c index 1eee53bb..8d17e74d 100644 --- a/Kernel/syscalls.c +++ b/Kernel/syscalls.c @@ -45,7 +45,7 @@ void SyscallHandler(tSyscallRegs *Regs) switch(Regs->Num) { // -- Exit the current thread - case SYS_EXIT: Threads_Exit(); break; + case SYS_EXIT: Threads_Exit(0, Regs->Arg1); break; // -- Put the current thread to sleep case SYS_SLEEP: Threads_Sleep(); break; @@ -57,9 +57,8 @@ void SyscallHandler(tSyscallRegs *Regs) case SYS_CLONE: // Call clone system call ret = Proc_Clone(&err, Regs->Arg1); - Log("ret = %i"); - // Change user stack if requested - if(ret == 0 && !(Regs->Arg1 & CLONE_VM)) + // Change user stack if a new stack address is passed + if(ret == 0 && Regs->Arg2) Regs->StackPointer = Regs->Arg2; break; @@ -96,6 +95,10 @@ void SyscallHandler(tSyscallRegs *Regs) case SYS_GETUID: ret = Threads_GetUID(); break; case SYS_GETGID: ret = Threads_GetGID(); break; + // -- Set User/Group IDs + case SYS_SETUID: Log("Setting User ID to %i", Regs->Arg1); break; + case SYS_SETGID: Log("Setting Group ID to %i", Regs->Arg1); break; + // -- Send Message case SYS_SENDMSG: ret = Proc_SendMessage(&err, Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3); @@ -116,9 +119,20 @@ void SyscallHandler(tSyscallRegs *Regs) // Binary Control // --- case SYS_EXECVE: + if( !Syscall_ValidString(Regs->Arg1) ) { + err = -EINVAL; + ret = -1; + break; + } ret = Proc_Execve((char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3); break; case SYS_LOADBIN: + if( !Syscall_ValidString(Regs->Arg1) + || !Syscall_Valid(sizeof(Uint), Regs->Arg2) ) { + err = -EINVAL; + ret = -1; + break; + } ret = Binary_Load((char*)Regs->Arg1, (Uint*)Regs->Arg2); break; @@ -126,6 +140,11 @@ void SyscallHandler(tSyscallRegs *Regs) // Virtual Filesystem // --- case SYS_OPEN: + if( !Syscall_ValidString(Regs->Arg1) ) { + err = -EINVAL; + ret = -1; + break; + } ret = VFS_Open((char*)Regs->Arg1, Regs->Arg2 | VFS_OPENFLAG_USER); break; @@ -133,19 +152,27 @@ void SyscallHandler(tSyscallRegs *Regs) VFS_Close( Regs->Arg1 ); break; + case SYS_SEEK: + ret = VFS_Seek( Regs->Arg1, Regs->Arg2, Regs->Arg3); + break; + + case SYS_TELL: + ret = VFS_Tell( Regs->Arg1 ); + break; + case SYS_WRITE: #if BITS < 64 - VFS_Write( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 ); + ret = VFS_Write( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 ); #else - VFS_Write( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 ); + ret = VFS_Write( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 ); #endif break; case SYS_READ: #if BITS < 64 - VFS_Read( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 ); + ret = VFS_Read( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 ); #else - VFS_Read( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 ); + ret = VFS_Read( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 ); #endif break; @@ -183,6 +210,36 @@ void SyscallHandler(tSyscallRegs *Regs) ret = VFS_ChDir( (void*)Regs->Arg1 ); break; + // IO Control + case SYS_IOCTL: + ret = VFS_IOCtl( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 ); + break; + + // Mount a filesystem + case SYS_MOUNT: + // Only root can mount filesystems + if(Threads_GetUID() != 0) { + err = -EACCES; + ret = -1; + break; + } + // Sanity check the paths + if(!Syscall_ValidString(Regs->Arg1) + || !Syscall_ValidString(Regs->Arg2) + || !Syscall_ValidString(Regs->Arg3) + || !Syscall_ValidString(Regs->Arg4) ) { + err = -EINVAL; + ret = -1; + break; + } + ret = VFS_Mount( + (char*)Regs->Arg1, // Device + (char*)Regs->Arg2, // Mount point + (char*)Regs->Arg3, // Filesystem + (char*)Regs->Arg4 // Options + ); + break; + // -- Debug case SYS_DEBUG: Log((char*)Regs->Arg1,