AcessNative - Mouse implimented, woot!
[tpg/acess2.git] / AcessNative / acesskernel_src / syscalls.c
index 4d85e8c..86c6d71 100644 (file)
@@ -4,9 +4,10 @@
  *
  * Syscall Distribution
  */
-#define DEBUG  1
+#define DEBUG  0
 #include <acess.h>
 #include <threads.h>
+#include <events.h>
 #include "../syscalls.h"
 
 // === IMPORTS ===
@@ -136,7 +137,7 @@ SYSCALL2(Syscall_ReadDir, "id", int, char *,
                return -1;
        return VFS_ReadDir(a0, a1);
 );
-SYSCALL6(Syscall_select, "iddddi", int, fd_set *, fd_set *, fd_set *, time_t *, unsigned int,
+SYSCALL6(Syscall_select, "iddddi", int, fd_set *, fd_set *, fd_set *, tTime *, unsigned int,
        return VFS_Select(a0, a1, a2, a3, a4, a5, 0);
 );
 SYSCALL3(Syscall_OpenChild, "isi", int, const char *, int,
@@ -177,13 +178,43 @@ SYSCALL1(Syscall_SetGID, "i", int,
        return Threads_SetGID(a0);
 );
 
-SYSCALL1(Syscall_Fork, "d", int *,
+SYSCALL0(Syscall_GetTID, return Threads_GetTID());
+SYSCALL0(Syscall_GetPID, return Threads_GetPID());
+SYSCALL0(Syscall_GetUID, return Threads_GetUID());
+SYSCALL0(Syscall_GetGID, return Threads_GetGID());
+
+SYSCALL1(Syscall_AN_Fork, "d", int *,
        if(Sizes[0] < sizeof(int))
                return -1;
        *a0 = Threads_Fork();
        return *a0;
 );
 
+SYSCALL2(Syscall_SendMessage, "id", int, void *,
+       return Proc_SendMessage(a0, Sizes[1], a1);
+);
+
+SYSCALL2(Syscall_GetMessage, "dd", uint32_t *, void *,
+       if( a0 && Sizes[0] < sizeof(*a0) ) {
+               Log_Notice("Syscalls", "Syscall_GetMessage - Arg 1 Undersize (%i < %i)",
+                       Sizes[0], sizeof(*a0));
+               return -1;
+       }
+       Uint    tmp;
+        int    rv;
+       if( a0 ) {
+               rv = Proc_GetMessage(&tmp, Sizes[1], a1);
+               *a0 = tmp;
+       }
+       else
+               rv = Proc_GetMessage(NULL, Sizes[1], a1);
+       return rv;
+);
+
+SYSCALL1(Syscall_WaitEvent, "i", int,
+       return Threads_WaitEvents(a0);
+);
+
 const tSyscallHandler  caSyscalls[] = {
        Syscall_Null,
        Syscall_Exit,
@@ -206,12 +237,18 @@ const tSyscallHandler     caSyscalls[] = {
        Syscall_SetUID,
        Syscall_SetGID,
        
+       Syscall_GetTID,
+       Syscall_GetPID,
+       Syscall_GetUID,
+       Syscall_GetGID,
+
        Syscall_Sleep,
-       Syscall_Fork,
+       Syscall_AN_Fork,
 
-       NULL,
-       NULL,
-       Syscall_select
+       Syscall_SendMessage,
+       Syscall_GetMessage,
+       Syscall_select,
+       Syscall_WaitEvent
 };
 const int      ciNumSyscalls = sizeof(caSyscalls)/sizeof(caSyscalls[0]);
 /**
@@ -286,19 +323,19 @@ tRequestHeader *SyscallRecieve(tRequestHeader *Request, int *ReturnLength)
                        case ARG_TYPE_VOID:
                                break;
                        case ARG_TYPE_INT32:
-                               LOG("%i INT32: 0x%x", i, *(Uint32*)inData);
+                               //LOG("%i INT32: 0x%x", i, *(Uint32*)inData);
                                *(Uint32*)&argListData[argListLen] = *(Uint32*)inData;
                                argListLen += sizeof(Uint32);
                                inData += sizeof(Uint32);
                                break;
                        case ARG_TYPE_INT64:
-                               LOG("%i INT64: 0x%llx", i, *(Uint64*)inData);
+                               //LOG("%i INT64: 0x%llx", i, *(Uint64*)inData);
                                *(Uint64*)&argListData[argListLen] = *(Uint64*)inData;
                                argListLen += sizeof(Uint64);
                                inData += sizeof(Uint64);
                                break;
                        case ARG_TYPE_STRING:
-                               LOG("%i STR: '%s'", i, (char*)inData);
+                               //LOG("%i STR: '%s'", i, (char*)inData);
                                *(char**)&argListData[argListLen] = (char*)inData;
                                argListLen += sizeof(void*);
                                inData += Request->Params[i].Length;
@@ -315,20 +352,26 @@ tRequestHeader *SyscallRecieve(tRequestHeader *Request, int *ReturnLength)
                                }
                                
                                // Check for non-resident data
-                               if( Request->Params[i].Flags & ARG_FLAG_ZEROED )
+                               if( Request->Params[i].Length == 0 )
+                               {
+                                       returnData[i] = NULL;
+                                       *(void**)&argListData[argListLen] = NULL;
+                                       argListLen += sizeof(void*);
+                               }
+                               else if( Request->Params[i].Flags & ARG_FLAG_ZEROED )
                                {
                                        // Allocate and zero the buffer
                                        returnData[i] = calloc(1, Request->Params[i].Length);
-                                       LOG("%i ZDAT: %i %p", i,
-                                               Request->Params[i].Length, returnData[i]);
+                                       //LOG("%i ZDAT: %i %p", i,
+                                       //      Request->Params[i].Length, returnData[i]);
                                        *(void**)&argListData[argListLen] = returnData[i];
                                        argListLen += sizeof(void*);
                                }
                                else
                                {
                                        returnData[i] = (void*)inData;
-                                       LOG("%i DATA: %i %p", i,
-                                               Request->Params[i].Length, returnData[i]);
+                                       //LOG("%i DATA: %i %p", i,
+                                       //      Request->Params[i].Length, returnData[i]);
                                        *(void**)&argListData[argListLen] = (void*)inData;
                                        argListLen += sizeof(void*);
                                        inData += Request->Params[i].Length;
@@ -341,11 +384,12 @@ tRequestHeader *SyscallRecieve(tRequestHeader *Request, int *ReturnLength)
        }
        
        // Allocate the return
-       ret = malloc(sizeof(tRequestHeader) + retValueCount * sizeof(tRequestValue)
-               + retDataLen);
+       size_t  msglen = sizeof(tRequestHeader) + retValueCount * sizeof(tRequestValue) + retDataLen;
+       ret = malloc(msglen);
        ret->ClientID = Request->ClientID;
        ret->CallID = Request->CallID;
        ret->NParams = retValueCount;
+       ret->MessageLength = msglen;
        inData = (char*)&ret->Params[ ret->NParams ];
        
        // Static Uint64 return value
@@ -367,7 +411,7 @@ tRequestHeader *SyscallRecieve(tRequestHeader *Request, int *ReturnLength)
                ret->Params[retValueCount].Flags = 0;
                ret->Params[retValueCount].Length = Request->Params[i].Length;
                
-               LOG("Syscalls", "Ret %i: Type %i, Len %i",
+               LOG("Ret %i: Type %i, Len %i",
                        i, Request->Params[i].Type, Request->Params[i].Length);
                
                memcpy(inData, returnData[i], Request->Params[i].Length);

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