X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fsyscalls.c;h=ba9051a92cb24ff96231fec60a8cdf8ffedf1cb2;hb=975f0f89b7a643abd7cc463d788dad34ac014b65;hp=fb574ef267b4fe7066dd5af8af33a1c73804fb4e;hpb=04b368645c34cc3853fc13f93e33ac7878be8479;p=tpg%2Facess2.git diff --git a/Kernel/syscalls.c b/Kernel/syscalls.c index fb574ef2..ba9051a9 100644 --- a/Kernel/syscalls.c +++ b/Kernel/syscalls.c @@ -4,23 +4,19 @@ */ #define DEBUG 0 -#include +#include #include #include #include -#define CHECK_NUM_NULLOK(v,size) do {\ - if((v)&&!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}\ - }while(0) -#define CHECK_STR_NULLOK(v) do {\ - if((v)&&!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}\ - }while(0) -#define CHECK_NUM_NONULL(v,size) do {\ - if(!(v)||!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}\ - }while(0) -#define CHECK_STR_NONULL(v) do {\ - if(!(v)||!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}\ - }while(0) +#define CHECK_NUM_NULLOK(v,size) \ + if((v)&&!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;} +#define CHECK_STR_NULLOK(v) \ + if((v)&&!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;} +#define CHECK_NUM_NONULL(v,size) \ + if(!(v)||!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;} +#define CHECK_STR_NONULL(v) \ + if(!(v)||!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;} // === IMPORTS === extern int Proc_Clone(Uint *Err, Uint Flags); @@ -29,9 +25,6 @@ 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 VFS_ChDir(char *Dest); extern int Threads_SetName(char *NewName); extern int Threads_GetPID(); extern int Threads_GetTID(); @@ -48,12 +41,11 @@ void SyscallHandler(tSyscallRegs *Regs) { Uint64 ret = 0; Uint err = 0; - #if DEBUG + 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); - #endif + LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x, Arg4: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3, Regs->Arg4); switch(Regs->Num) { @@ -142,13 +134,15 @@ void SyscallHandler(tSyscallRegs *Regs) // --- case SYS_EXECVE: CHECK_STR_NONULL(Regs->Arg1); + //Log(" Regs = {Arg2: %x, Arg3: %x}", Regs->Arg2, Regs->Arg3); { int i; char **tmp = (char**)Regs->Arg2; // Check ArgV (traverse array checking all string pointers) CHECK_NUM_NONULL( tmp, sizeof(char**) ); + //Log("tmp = %p", tmp); for(i=0;tmp[i];i++) { - CHECK_NUM_NULLOK( &tmp[i], sizeof(char*) ); + CHECK_NUM_NONULL( &tmp[i], sizeof(char*) ); CHECK_STR_NONULL( tmp[i] ); } // Check EnvP also @@ -156,12 +150,14 @@ void SyscallHandler(tSyscallRegs *Regs) if( Regs->Arg3 ) { tmp = (char**)Regs->Arg3; + //Log("tmp = %p", tmp); for(i=0;tmp[i];i++) { CHECK_NUM_NULLOK( &tmp[i], sizeof(char*) ); CHECK_STR_NONULL( tmp[i] ); } } } + LEAVE('s', "Assuming 0"); // Path, **Argv, **Envp ret = Proc_Execve((char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3); break; @@ -211,7 +207,7 @@ void SyscallHandler(tSyscallRegs *Regs) break; case SYS_FINFO: - CHECK_NUM_NONULL( Regs->Arg2, sizeof(struct s_sysFInfo) + Regs->Arg3*sizeof(tVFS_ACL) ); + CHECK_NUM_NONULL( Regs->Arg2, sizeof(tFInfo) + Regs->Arg3*sizeof(tVFS_ACL) ); // FP, Dest, MaxACLs ret = VFS_FInfo( Regs->Arg1, (void*)Regs->Arg2, Regs->Arg3 ); break; @@ -278,12 +274,12 @@ void SyscallHandler(tSyscallRegs *Regs) break; // -- Debug - #if DEBUG_BUILD + //#if DEBUG_BUILD case SYS_DEBUG: Log((char*)Regs->Arg1, Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6); break; - #endif + //#endif // -- Default (Return Error) default: @@ -294,6 +290,11 @@ void SyscallHandler(tSyscallRegs *Regs) ret = -1; break; } + + if(err != 0) { + LOG("ID: %i, Return errno = %i", Regs->Num, err); + } + #if BITS < 64 Regs->Return = ret&0xFFFFFFFF; Regs->RetHi = ret >> 32; @@ -303,7 +304,10 @@ void SyscallHandler(tSyscallRegs *Regs) Regs->Error = err; #if DEBUG LOG("err = %i", err); - LEAVE('x', ret); + if(Regs->Num != SYS_EXECVE) + LEAVE('x', ret); + else + LOG("Actual %i", ret); #endif }