X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fsyscalls.c;h=9775be394ca919356499fb5f95a4f716467953d2;hb=066ea7cb8cd5c873734405d0b713cb330c79ed49;hp=4eb3c71977946093b5fc6b28b26de3e28cf8528a;hpb=89366ca2a9eccc040127d193e55da74507d6026f;p=tpg%2Facess2.git diff --git a/Kernel/syscalls.c b/Kernel/syscalls.c index 4eb3c719..9775be39 100644 --- a/Kernel/syscalls.c +++ b/Kernel/syscalls.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -66,10 +67,7 @@ void SyscallHandler(tSyscallRegs *Regs) // -- Clone the current thread case SYS_CLONE: // Call clone system call - ret = Proc_Clone(&err, Regs->Arg1); - // Change user stack if a new stack address is passed - if(ret == 0 && Regs->Arg2) - Regs->StackPointer = Regs->Arg2; + ret = Proc_Clone(Regs->Arg1); break; // -- Send a signal @@ -158,16 +156,19 @@ void SyscallHandler(tSyscallRegs *Regs) CHECK_NUM_NONULL( &tmp[i], sizeof(char*) ); CHECK_STR_NONULL( tmp[i] ); } + if(ret == -1) break; // Check EnvP also // - EnvP can be NULL if( Regs->Arg3 ) { tmp = (char**)Regs->Arg3; - //Log("tmp = %p", tmp); + 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] ); } + if(ret == -1) break; } } LEAVE('s', "Assuming 0"); @@ -245,7 +246,7 @@ void SyscallHandler(tSyscallRegs *Regs) // Open a file that is a entry in an open directory case SYS_OPENCHILD: CHECK_STR_NONULL( (char*)Regs->Arg2 ); - ret = VFS_OpenChild( &err, Regs->Arg1, (char*)Regs->Arg2, Regs->Arg3); + ret = VFS_OpenChild( Regs->Arg1, (char*)Regs->Arg2, Regs->Arg3); break; // Change Directory @@ -314,22 +315,25 @@ void SyscallHandler(tSyscallRegs *Regs) // -- Debug //#if DEBUG_BUILD case SYS_DEBUG: + CHECK_STR_NONULL( (char*)Regs->Arg1 ); LogF("Log: [%i] ", Threads_GetTID()); - LogF((char*)Regs->Arg1, + LogF((const char*)Regs->Arg1, Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6); - LogF("\n"); + LogF("\r\n"); break; //#endif // -- Default (Return Error) default: - Warning("SyscallHandler: Unknown System Call %i", Regs->Num); + Log_Warning("Syscalls", "Unknown System Call %i", Regs->Num); if(Regs->Num < NUM_SYSCALLS) - Warning(" Syscall '%s'", cSYSCALL_NAMES[Regs->Num]); + Log_Warning("Syscall", " named '%s'", cSYSCALL_NAMES[Regs->Num]); err = -ENOSYS; ret = -1; break; } + + if(err == 0) err = errno; if(err != 0) { LOG("ID: %i, Return errno = %i", Regs->Num, err); @@ -347,10 +351,10 @@ void SyscallHandler(tSyscallRegs *Regs) if( callNum != SYS_READ && callNum != SYS_WRITE ) { # endif LOG("err = %i", err); - if(Regs->Num != SYS_EXECVE) - LEAVE('x', ret); - else + if( callNum == SYS_EXECVE ) LOG("Actual %i", ret); + else + LEAVE('x', ret); # if DEBUG < 2 } # endif