X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fsyscalls.c;h=2d52b7ee6157b3c8a581b7ba8e67382791d4d768;hb=6b2fddb7cfb3f4260565aff3f806d7497cfa3880;hp=8e02c5dec558a9dc43cb1b456410e975dc483147;hpb=f8528eeb40cbea394df23878f78ff9cb19f25771;p=tpg%2Facess2.git diff --git a/Kernel/syscalls.c b/Kernel/syscalls.c index 8e02c5de..2d52b7ee 100644 --- a/Kernel/syscalls.c +++ b/Kernel/syscalls.c @@ -11,19 +11,27 @@ // === IMPORTS === extern int Proc_Clone(Uint *Err, Uint Flags); +extern int Threads_WaitTID(int TID, int *status); extern Uint Proc_SendMessage(Uint *Err, Uint Dest, Uint Length, void *Data); 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 VFS_FInfo(int FD, void *Dest, int MaxACLs); +extern int VFS_GetACL(int FD, void *Dest); +extern int Threads_SetName(char *NewName); +extern int Threads_GetPID(); +extern int Threads_GetTID(); +extern int Threads_GetUID(); +extern int Threads_GetGID(); // === CODE === +// TODO: Do sanity checking on arguments, ATM the user can really fuck with the kernel void SyscallHandler(tSyscallRegs *Regs) { Uint64 ret = 0; Uint err = 0; #if DEBUG - ENTER("iThread iNum", gCurrentThread->TID, Regs->Num); + ENTER("iThread iNum", Threads_GetTID(), Regs->Num); if(Regs->Num < NUM_SYSCALLS) LOG("Syscall %s", cSYSCALL_NAMES[Regs->Num]); LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3); @@ -31,13 +39,13 @@ void SyscallHandler(tSyscallRegs *Regs) switch(Regs->Num) { // -- Exit the current thread - case SYS_EXIT: Proc_Exit(); break; + case SYS_EXIT: Threads_Exit(); break; // -- Put the current thread to sleep - case SYS_SLEEP: Proc_Sleep(); Log(" SyscallHandler: %i is alive", gCurrentThread->TID); break; + case SYS_SLEEP: Threads_Sleep(); break; // -- Yield current timeslice - case SYS_YIELD: Proc_Yield(); break; + case SYS_YIELD: Threads_Yield(); break; // -- Clone the current thread case SYS_CLONE: @@ -54,22 +62,32 @@ void SyscallHandler(tSyscallRegs *Regs) ret = -1; break; + // -- Wait for a thread + case SYS_WAITTID: + ret = Threads_WaitTID(Regs->Arg1, (void*)Regs->Arg2); + break; + + // -- Get the physical address of a page case SYS_GETPHYS: ret = MM_GetPhysAddr(Regs->Arg1); break; + // -- Map an address case SYS_MAP: MM_Map(Regs->Arg1, Regs->Arg2); break; + // -- Allocate an address case SYS_ALLOCATE: ret = MM_Allocate(Regs->Arg1); break; + // -- Unmap an address case SYS_UNMAP: MM_Deallocate(Regs->Arg1); break; // -- Get Thread/Process IDs - case SYS_GETTID: ret = gCurrentThread->TID; break; - case SYS_GETPID: ret = gCurrentThread->TGID; break; + case SYS_GETTID: ret = Threads_GetTID(); break; + case SYS_GETPID: ret = Threads_GetPID(); break; + // -- Get User/Group IDs - case SYS_GETUID: ret = gCurrentThread->UID; break; - case SYS_GETGID: ret = gCurrentThread->GID; break; + case SYS_GETUID: ret = Threads_GetUID(); break; + case SYS_GETGID: ret = Threads_GetGID(); break; // -- Send Message case SYS_SENDMSG: @@ -84,16 +102,7 @@ void SyscallHandler(tSyscallRegs *Regs) case SYS_SETNAME: // Sanity Check if(!Regs->Arg1) { ret = -1; err = -EINVAL; break; } - // Lock Process - LOCK( &gCurrentThread->IsLocked ); - // Free old name - if(gCurrentThread->ThreadName && (Uint)gCurrentThread->ThreadName > 0xE0800000) - free(gCurrentThread->ThreadName); - // Change name - gCurrentThread->ThreadName = malloc( strlen( (char*)Regs->Arg1 ) + 1 ); - strcpy(gCurrentThread->ThreadName, (char*)Regs->Arg1); - // Unlock - RELEASE( &gCurrentThread->IsLocked ); + Threads_SetName( (void*)Regs->Arg1 ); break; // --- @@ -136,6 +145,14 @@ void SyscallHandler(tSyscallRegs *Regs) case SYS_FINFO: ret = VFS_FInfo( Regs->Arg1, (void*)Regs->Arg2, Regs->Arg3 ); break; + + case SYS_GETACL: + ret = VFS_GetACL( Regs->Arg1, (void*)Regs->Arg2 ); + break; + + case SYS_READDIR: + ret = VFS_ReadDir( Regs->Arg1, (void*)Regs->Arg2 ); + break; // -- Debug case SYS_DEBUG: