Kernel - Cleaning up messages
[tpg/acess2.git] / Kernel / syscalls.c
index 02b9008..b032983 100644 (file)
@@ -8,6 +8,7 @@
 #include <syscalls.h>
 #include <proc.h>
 #include <errno.h>
+#include <threads.h>
 
 #define CHECK_NUM_NULLOK(v,size)       \
        if((v)&&!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}
        if(!(v)||!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}
 
 // === IMPORTS ===
-extern int     Proc_Clone(Uint *Err, Uint Flags);
-extern int     Threads_WaitTID(int TID, int *status);
-extern Uint    Proc_SendMessage(Uint *Err, Uint Dest, Uint Length, void *Data);
-extern int     Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer);
 extern int     Proc_Execve(char *File, char **ArgV, char **EnvP);
 extern Uint    Binary_Load(char *file, Uint *entryPoint);
-extern int     Threads_SetName(char *NewName);
-extern int     Threads_SetUID(Uint *errno, tUID ID);
-extern int     Threads_SetGID(Uint *errno, tGID ID);
-extern int     Threads_SetFaultHandler(Uint Handler);
 
 // === PROTOTYPES ===
+void   SyscallHandler(tSyscallRegs *Regs);
  int   Syscall_ValidString(Uint Addr);
  int   Syscall_Valid(int Size, Uint Addr);
 
@@ -40,11 +34,18 @@ void SyscallHandler(tSyscallRegs *Regs)
 {
        Uint64  ret = 0;
        Uint    err = -EOK;
+        int    callNum = Regs->Num;
        
-       ENTER("iThread iNum", Threads_GetTID(), Regs->Num);
-       if(Regs->Num < NUM_SYSCALLS)
-               LOG("Syscall %s", cSYSCALL_NAMES[Regs->Num]);
+       #if DEBUG < 2
+       if(callNum != SYS_READ && callNum != SYS_WRITE) {
+       #endif
+       ENTER("iThread iNum", Threads_GetTID(), callNum);
+       if(callNum < NUM_SYSCALLS)
+               LOG("Syscall %s", cSYSCALL_NAMES[callNum]);
        LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x, Arg4: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3, Regs->Arg4);
+       #if DEBUG < 2
+       }
+       #endif
        
        switch(Regs->Num)
        {
@@ -169,7 +170,7 @@ void SyscallHandler(tSyscallRegs *Regs)
                }
                LEAVE('s', "Assuming 0");
                // Path, **Argv, **Envp
-               ret = Proc_Execve((char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3);
+               ret = Proc_Execve( (char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3 );
                break;
        // -- Load a binary into the current process
        case SYS_LOADBIN:
@@ -192,10 +193,12 @@ void SyscallHandler(tSyscallRegs *Regs)
                        ret = -1;
                        break;
                }
+               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_CLOSE:
+               LOG("VFS_Close(%i)", Regs->Arg1);
                VFS_Close( Regs->Arg1 );
                break;
        
@@ -239,6 +242,8 @@ void SyscallHandler(tSyscallRegs *Regs)
        
        // Read Directory
        case SYS_READDIR:
+               // TODO: What if the filename is longer?
+               // Maybe force it to be a 256 byte buffer
                if( !Syscall_Valid(8, Regs->Arg2) ) {
                        err = -EINVAL;
                        ret = -1;
@@ -297,12 +302,37 @@ void SyscallHandler(tSyscallRegs *Regs)
                        (char*)Regs->Arg4       // Options
                        );
                break;
+               
+       // Wait on a set of handles
+       case SYS_SELECT:
+               // Sanity checks
+               if( (Regs->Arg2 && !Syscall_Valid(sizeof(fd_set), Regs->Arg2))
+                || (Regs->Arg3 && !Syscall_Valid(sizeof(fd_set), Regs->Arg3))
+                || (Regs->Arg4 && !Syscall_Valid(sizeof(fd_set), Regs->Arg4))
+                || (Regs->Arg5 && !Syscall_Valid(sizeof(tTime), Regs->Arg5)) )
+               {
+                       err = -EINVAL;
+                       ret = -1;
+                       break;
+               }
+               // Perform the call
+               ret = VFS_Select(
+                       Regs->Arg1,     // Max handle
+                       (fd_set *)Regs->Arg2,   // Read
+                       (fd_set *)Regs->Arg3,   // Write
+                       (fd_set *)Regs->Arg4,   // Errors
+                       (tTime *)Regs->Arg5,    // Timeout
+                       0       // User handles
+                       );
+               break;
        
        // -- Debug
        //#if DEBUG_BUILD
        case SYS_DEBUG:
-               Log((char*)Regs->Arg1,
+               LogF("Log: [%i] ", Threads_GetTID());
+               LogF((char*)Regs->Arg1,
                        Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
+               LogF("\n");
                break;
        //#endif
        
@@ -328,11 +358,17 @@ void SyscallHandler(tSyscallRegs *Regs)
        #endif
        Regs->Error = err;
        #if DEBUG
+       # if DEBUG < 2
+       if( callNum != SYS_READ && callNum != SYS_WRITE ) {
+       # endif
        LOG("err = %i", err);
        if(Regs->Num != SYS_EXECVE)
                LEAVE('x', ret);
        else
                LOG("Actual %i", ret);
+       # if DEBUG < 2
+       }
+       # endif
        #endif
 }
 

UCC git Repository :: git.ucc.asn.au