Kernel/VFS - Kernel-side implementation of marshalled FDs
[tpg/acess2.git] / KernelLand / Kernel / syscalls.c
index 85fbbf8..75ed874 100644 (file)
        if(tmp[i]) break;\
 } while(0)
 
+#if BITS==64
+#define ARG64(idx1,idx2)       ***ARG64 not used on 64-bit***
+#else
+#define ARG64(idx1, idx2)      (Regs->Arg##idx1|(((Uint64)Regs->Arg##idx2)<<32))
+#endif
+
 // === IMPORTS ===
 extern Uint    Binary_Load(const char *file, Uint *entryPoint);
 
@@ -44,7 +50,7 @@ extern Uint   Binary_Load(const char *file, Uint *entryPoint);
 void   SyscallHandler(tSyscallRegs *Regs);
  int   Syscall_ValidString(const char *Addr);
  int   Syscall_Valid(int Size, const void *Addr);
- int   Syscall_MM_SetFlags(const void *Addr, Uint Flags, Uint Mask);
+ int   Syscall_MM_SetFlags(void *Addr, Uint Flags, Uint Mask);
 
 // === CODE ===
 // TODO: Do sanity checking on arguments, ATM the user can really fuck with the kernel
@@ -117,13 +123,13 @@ void SyscallHandler(tSyscallRegs *Regs)
                break;
        
        // -- Map an address
-       case SYS_MAP:   MM_Map(Regs->Arg1, Regs->Arg2); break;
+       case SYS_MAP:   MM_Map((void*)Regs->Arg1, Regs->Arg2);  break;
        
        // -- Allocate an address
-       case SYS_ALLOCATE:      ret = MM_Allocate(Regs->Arg1);  break;
+       case SYS_ALLOCATE:      ret = MM_Allocate((void*)Regs->Arg1);   break;
        
        // -- Unmap an address
-       case SYS_UNMAP:         MM_Deallocate(Regs->Arg1);      break;
+       case SYS_UNMAP:         MM_Deallocate((void*)Regs->Arg1);       break;
        
        // -- Change the protection on an address
        case SYS_SETFLAGS:
@@ -203,7 +209,20 @@ void SyscallHandler(tSyscallRegs *Regs)
                // Path, *Entrypoint
                ret = Binary_Load((char*)Regs->Arg1, (Uint*)Regs->Arg2);
                break;
-       
+
+       // -- Load a kernel module
+       case SYS_LOADMOD:
+               CHECK_STR_NONULL( (const char *)Regs->Arg1 );
+               if( Threads_GetUID() != 0 ) {
+                       MERR("Not root");
+                       ret = EACCES;
+               }
+               else {
+                       LOG("Module_LoadFile(\"%s\", NULL)", (const char *)Regs->Arg1);
+                       ret = Module_LoadFile( (const char *)Regs->Arg1, NULL );
+               }
+               break;
+
        // ---
        // Virtual Filesystem
        // ---
@@ -237,7 +256,7 @@ void SyscallHandler(tSyscallRegs *Regs)
                #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 );
+               ret = VFS_Seek( Regs->Arg1, ARG64(2, 3), Regs->Arg4 );
                #endif
                break;
                
@@ -249,11 +268,30 @@ void SyscallHandler(tSyscallRegs *Regs)
                CHECK_NUM_NONULL( (void*)Regs->Arg2, Regs->Arg3 );
                ret = VFS_Write( Regs->Arg1, Regs->Arg3, (void*)Regs->Arg2 );
                break;
+       case SYS_WRITEAT:
+               #if BITS == 64
+               CHECK_NUM_NONULL( (void*)Regs->Arg5, Regs->Arg3 );
+               ret = VFS_WriteAt( Regs->Arg1, Regs->Arg2, Regs->Arg3, (void*)Regs->Arg4 );
+               #else
+               CHECK_NUM_NONULL( (void*)Regs->Arg5, Regs->Arg4 );
+               Debug("VFS_WriteAt(%i, %lli, %i, %p)",
+                       Regs->Arg1, ARG64(2, 3), Regs->Arg4, (void*)Regs->Arg5);
+               ret = VFS_WriteAt( Regs->Arg1, ARG64(2, 3), Regs->Arg4, (void*)Regs->Arg5 );
+               #endif
+               break;
        
        case SYS_READ:
                CHECK_NUM_NONULL( (void*)Regs->Arg2, Regs->Arg3 );
                ret = VFS_Read( Regs->Arg1, Regs->Arg3, (void*)Regs->Arg2 );
                break;
+       case SYS_READAT:
+               CHECK_NUM_NONULL( (void*)Regs->Arg5, Regs->Arg2 );
+               #if BITS == 64
+               ret = VFS_ReadAt( Regs->Arg1, Regs->Arg2, Regs->Arg3, (void*)Regs->Arg4 );
+               #else
+               ret = VFS_ReadAt( Regs->Arg1, Regs->Arg2, ARG64(3, 4), (void*)Regs->Arg5 );
+               #endif
+               break;
        
        case SYS_FINFO:
                CHECK_NUM_NONULL( (void*)Regs->Arg2, sizeof(tFInfo) + Regs->Arg3*sizeof(tVFS_ACL) );
@@ -365,7 +403,19 @@ void SyscallHandler(tSyscallRegs *Regs)
        
        case SYS_UNLINK:
                Log_Error("Syscalls", "TODO: Impliment SYS_UNLINK");
-               // Fall
+               break;
+       
+       case SYS_MARSHALFD:
+               ret = VFS_MarshalHandle(Regs->Arg1);
+               break;
+       case SYS_UNMARSHALFD:
+               #if BITS == 64
+               ret = VFS_UnmarshalHandle( Regs->Arg1 );
+               #else
+               ret = VFS_UnmarshalHandle( ARG64(1,2) );
+               #endif
+               break;
+
        // -- Debug
        //#if DEBUG_BUILD
        case SYS_DEBUG:
@@ -375,6 +425,11 @@ void SyscallHandler(tSyscallRegs *Regs)
                        Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
                LogF("\r\n");
                break;
+       case SYS_DEBUGHEX:
+               CHECK_STR_NONULL( (char*)Regs->Arg1 );
+               CHECK_NUM_NONULL( (void*)Regs->Arg2, Regs->Arg3 );
+               Debug_HexDump( (const char*)Regs->Arg1, (void*)Regs->Arg2, Regs->Arg3 );
+               break;
        //#endif
        
        // -- Default (Return Error)
@@ -441,7 +496,7 @@ int Syscall_Valid(int Size, const void *Addr)
        return CheckMem( Addr, Size );
 }
 
-int Syscall_MM_SetFlags(const void *Addr, Uint Flags, Uint Mask)
+int Syscall_MM_SetFlags(void *Addr, Uint Flags, Uint Mask)
 {
        tPAddr  paddr = MM_GetPhysAddr(Addr);
        Flags &= MM_PFLAG_RO|MM_PFLAG_EXEC;
@@ -458,6 +513,6 @@ int Syscall_MM_SetFlags(const void *Addr, Uint Flags, Uint Mask)
                        Mask |= MM_PFLAG_COW;
                }
        }
-       MM_SetFlags((tVAddr)Addr, Flags, Mask);
+       MM_SetFlags(Addr, Flags, Mask);
        return 0;
 }

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