More work on x86_64 build, error handling and IDT
[tpg/acess2.git] / Kernel / syscalls.c
index a555720..9e7d35f 100644 (file)
@@ -32,6 +32,7 @@ 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);
@@ -60,6 +61,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,9 +124,10 @@ void SyscallHandler(tSyscallRegs *Regs)
        // -- Check for messages
        case SYS_GETMSG:
                CHECK_NUM_NULLOK(Regs->Arg1, sizeof(Uint));
-               //NOTE: Uncertain due to length being unknown
-               // (Proc_GetMessage should check itself)
-               CHECK_NUM_NULLOK(Regs->Arg2, sizeof(Uint)*4);
+               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;
@@ -167,7 +174,7 @@ void SyscallHandler(tSyscallRegs *Regs)
                if( !Syscall_ValidString(Regs->Arg1)
                ||  !Syscall_Valid(sizeof(Uint), Regs->Arg2) ) {
                        err = -EINVAL;
-                       ret = -1;
+                       ret = 0;
                        break;
                }
                // Path, *Entrypoint
@@ -191,7 +198,11 @@ void SyscallHandler(tSyscallRegs *Regs)
                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:
@@ -234,6 +245,16 @@ void SyscallHandler(tSyscallRegs *Regs)
                ret = VFS_ReadDir( Regs->Arg1, (void*)Regs->Arg2 );
                break;
        
+       // Open a file that is a entry in an open directory
+       case SYS_OPENCHILD:
+               if( !Syscall_ValidString(Regs->Arg2) ) {
+                       err = -EINVAL;
+                       ret = -1;
+                       break;
+               }
+               ret = VFS_OpenChild( &err, Regs->Arg1, (char*)Regs->Arg2, Regs->Arg3);
+               break;
+       
        // Change Directory
        case SYS_CHDIR:
                if( !Syscall_ValidString(Regs->Arg1) ) {

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