X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fsyscalls.c;h=7b4855ce5e2c6d8b852c714235fe1e2adf54a11e;hb=98bd9c0c8985c50c42231c116a4e18fedd47761e;hp=85fbbf8c7882242b8465ac4bf60b41ff0cb125ad;hpb=e7a76b0d8a0cc6aa77966509780973a6f8216ef7;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/syscalls.c b/KernelLand/Kernel/syscalls.c index 85fbbf8c..7b4855ce 100644 --- a/KernelLand/Kernel/syscalls.c +++ b/KernelLand/Kernel/syscalls.c @@ -37,6 +37,12 @@ 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,41 @@ 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_TRUNCATE: + ret = VFS_Truncate( + Regs->Arg1, + #if BITS == 32 + ARG64(2,3) + #else + Regs->Arg2 + #endif + ); + break; case SYS_FINFO: CHECK_NUM_NONULL( (void*)Regs->Arg2, sizeof(tFInfo) + Regs->Arg3*sizeof(tVFS_ACL) ); @@ -356,6 +405,21 @@ void SyscallHandler(tSyscallRegs *Regs) ); break; + case SYS_MMAP: + ret = (tVAddr)VFS_MMap( + (void*)Regs->Arg1, Regs->Arg2, + Regs->Arg3&0xFFFF, Regs->Arg3>>16, + Regs->Arg4, + #if BITS == 32 + ARG64(5,6) + #else + Regs->Arg5 + #endif + ); + break; + case SYS_MUNMAP: + ret = VFS_MUnmap( (void*)Regs->Arg1, Regs->Arg2 ); + break; // Create a directory case SYS_MKDIR: @@ -365,16 +429,37 @@ 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: + case SYS_DEBUGS: + CHECK_STR_NONULL( (char*)Regs->Arg1 ); + Log("Log: %08lli [%i] %s", now(), Threads_GetTID(), (const char*)Regs->Arg1); + break; + case SYS_DEBUGF: 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; + 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 +526,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 +543,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; }