Kernel - Split per-process and per-thread data
[tpg/acess2.git] / Kernel / syscalls.c
index e304b40..4e4527e 100644 (file)
@@ -10,6 +10,7 @@
 #include <hal_proc.h>
 #include <errno.h>
 #include <threads.h>
+#include <events.h>
 
 #define CHECK_NUM_NULLOK(v,size)       \
        if((v)&&!Syscall_Valid((size),(v))){ret=-1;err=-EINVAL;break;}
@@ -68,9 +69,6 @@ void SyscallHandler(tSyscallRegs *Regs)
        case SYS_CLONE:
                // Call clone system call
                ret = Proc_Clone(Regs->Arg1);
-               // Change user stack if a new stack address is passed
-               if(ret == 0 && Regs->Arg2)
-                       Regs->StackPointer = Regs->Arg2;
                break;
        
        // -- Send a signal
@@ -78,7 +76,13 @@ void SyscallHandler(tSyscallRegs *Regs)
                err = -ENOSYS;
                ret = -1;
                break;
-       
+
+       // -- Wait fr an event  
+       case SYS_WAITEVENT:
+               // Message mask
+               ret = Threads_WaitEvents(Regs->Arg1);
+               break;
+
        // -- Wait for a thread
        case SYS_WAITTID:
                // Sanity Check (Status can be NULL)
@@ -110,14 +114,14 @@ void SyscallHandler(tSyscallRegs *Regs)
        case SYS_GETGID:        ret = Threads_GetGID(); break;
        
        // -- Set User/Group IDs
-       case SYS_SETUID:        ret = Threads_SetUID(&err, Regs->Arg1); break;
-       case SYS_SETGID:        ret = Threads_SetGID(&err, Regs->Arg1); break;
+       case SYS_SETUID:        ret = Threads_SetUID(Regs->Arg1);       break;
+       case SYS_SETGID:        ret = Threads_SetGID(Regs->Arg1);       break;
        
        // -- Send Message
        case SYS_SENDMSG:
                CHECK_NUM_NONULL( (void*)Regs->Arg3, Regs->Arg2 );
                // Destination, Size, *Data
-               ret = Proc_SendMessage(&err, Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3);
+               ret = Proc_SendMessage(Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3);
                break;
        // -- Check for messages
        case SYS_GETMSG:
@@ -128,7 +132,7 @@ void SyscallHandler(tSyscallRegs *Regs)
                        err = -EINVAL;  ret = -1;       break;
                }
                // *Source, *Data
-               ret = Proc_GetMessage(&err, (Uint*)Regs->Arg1, (void*)Regs->Arg2);
+               ret = Proc_GetMessage((Uint*)Regs->Arg1, (void*)Regs->Arg2);
                break;
        
        // -- Get the current timestamp
@@ -159,16 +163,18 @@ void SyscallHandler(tSyscallRegs *Regs)
                                CHECK_NUM_NONULL( &tmp[i], sizeof(char*) );
                                CHECK_STR_NONULL( tmp[i] );
                        }
+                       if(ret == -1) break;
                        // Check EnvP also
                        // - EnvP can be NULL
                        if( Regs->Arg3 )
                        {
                                tmp = (char**)Regs->Arg3;
-                               //Log("tmp = %p", tmp);
+                               CHECK_NUM_NONULL(tmp, sizeof(char**));
                                for(i=0;tmp[i];i++) {
-                                       CHECK_NUM_NULLOK( &tmp[i], sizeof(char*) );
+                                       CHECK_NUM_NONULL( &tmp[i], sizeof(char*) );
                                        CHECK_STR_NONULL( tmp[i] );
                                }
+                               if(ret == -1) break;
                        }
                }
                LEAVE('s', "Assuming 0");
@@ -308,6 +314,7 @@ void SyscallHandler(tSyscallRegs *Regs)
                        (fd_set *)Regs->Arg3,   // Write
                        (fd_set *)Regs->Arg4,   // Errors
                        (tTime *)Regs->Arg5,    // Timeout
+                       (Uint32)Regs->Arg6,     // Extra wakeup events
                        0       // User handles
                        );
                break;
@@ -315,8 +322,9 @@ void SyscallHandler(tSyscallRegs *Regs)
        // -- Debug
        //#if DEBUG_BUILD
        case SYS_DEBUG:
-               LogF("Log: [%i] ", Threads_GetTID());
-               LogF((char*)Regs->Arg1,
+               CHECK_STR_NONULL( (char*)Regs->Arg1 );
+               LogF("Log: %08lli [%i] ", now(), Threads_GetTID());
+               LogF((const char*)Regs->Arg1,
                        Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
                LogF("\r\n");
                break;

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