Replace rand() implementation - fixes threading lockups
[tpg/acess2.git] / Kernel / syscalls.c
index 3456797..d286d21 100644 (file)
@@ -26,12 +26,9 @@ 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_GetPID();
-extern int     Threads_GetTID();
-extern tUID    Threads_GetUID();
 extern int     Threads_SetUID(Uint *errno, tUID ID);
-extern tGID    Threads_GetGID();
 extern int     Threads_SetGID(Uint *errno, tGID ID);
+extern int     Threads_SetFaultHandler(Uint Handler);
 
 // === PROTOTYPES ===
  int   Syscall_ValidString(Uint Addr);
@@ -43,11 +40,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)
        {
@@ -60,6 +64,11 @@ void SyscallHandler(tSyscallRegs *Regs)
        // -- Yield current timeslice
        case SYS_YIELD: Threads_Yield();        break;
        
+       // -- Set Error Handler
+       case SYS_SETFAULTHANDLER:
+               Threads_SetFaultHandler(Regs->Arg1);
+               break;
+       
        // -- Clone the current thread
        case SYS_CLONE:
                // Call clone system call
@@ -118,14 +127,18 @@ void SyscallHandler(tSyscallRegs *Regs)
        // -- Check for messages
        case SYS_GETMSG:
                CHECK_NUM_NULLOK(Regs->Arg1, sizeof(Uint));
-               if( Regs->Arg2 && Regs->Arg2 != -1 && !MM_IsUser(Regs->Arg2) )
-               {
+               if( Regs->Arg2 && Regs->Arg2 != -1 && !MM_IsUser(Regs->Arg2) ) {
                        err = -EINVAL;  ret = -1;       break;
                }
                // *Source, *Data
                ret = Proc_GetMessage(&err, (Uint*)Regs->Arg1, (void*)Regs->Arg2);
                break;
        
+       // -- Get the current timestamp
+       case SYS_GETTIME:
+               ret = now();
+               break;
+       
        // -- Set the thread's name
        case SYS_SETNAME:
                CHECK_STR_NONULL(Regs->Arg1);
@@ -135,9 +148,10 @@ void SyscallHandler(tSyscallRegs *Regs)
        // ---
        // Binary Control
        // ---
+       // -- Replace the current process with another
        case SYS_EXECVE:
                CHECK_STR_NONULL(Regs->Arg1);
-               //Log(" Regs = {Arg2: %x, Arg3: %x}", Regs->Arg2, Regs->Arg3);
+               // Check the argument arrays
                {
                         int    i;
                        char    **tmp = (char**)Regs->Arg2;
@@ -162,8 +176,9 @@ 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:
                if( !Syscall_ValidString(Regs->Arg1)
                ||  !Syscall_Valid(sizeof(Uint), Regs->Arg2) ) {
@@ -184,15 +199,21 @@ 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;
        
        case SYS_SEEK:
+               #if BITS == 64
                ret = VFS_Seek( Regs->Arg1, Regs->Arg2, Regs->Arg3 );
+               #else
+               ret = VFS_Seek( Regs->Arg1, Regs->Arg2|(((Uint64)Regs->Arg3)<<32), Regs->Arg4 );
+               #endif
                break;
                
        case SYS_TELL:
@@ -316,11 +337,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