Nice job, making umoddi3 call umoddi3 in the usermode stuff :(
[tpg/acess2.git] / Kernel / syscalls.c
index 3456797..02b9008 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);
@@ -60,6 +57,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 +120,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 +141,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;
@@ -164,6 +171,7 @@ void SyscallHandler(tSyscallRegs *Regs)
                // Path, **Argv, **Envp
                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) ) {
@@ -192,7 +200,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:

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