X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fsyscalls.c;h=82389bbb2f2efb1cd5d611347b47b4e7712e9637;hb=018c8816a23abe82a8c71d1d7583fd49b2f9ce74;hp=0348d57ada02980199fe27f2a9df79bf9fc79da2;hpb=6804038d728db78026b05507944bd1eb6587e22b;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/syscalls.c b/KernelLand/Kernel/syscalls.c index 0348d57a..82389bbb 100644 --- a/KernelLand/Kernel/syscalls.c +++ b/KernelLand/Kernel/syscalls.c @@ -13,13 +13,13 @@ #include #define CHECK_NUM_NULLOK(v,size) \ - if((v)&&!Syscall_Valid((size),(v))){ret=-1;err=-EINVAL;break;} + if((v)&&!Syscall_Valid((size),(v))){LOG("CHECK_NUM_NULLOK: %p(%x) FAIL",v,size);ret=-1;err=-EINVAL;break;} #define CHECK_STR_NULLOK(v) \ - if((v)&&!Syscall_ValidString((v))){ret=-1;err=-EINVAL;break;} + if((v)&&!Syscall_ValidString((v))){LOG("CHECK_STR_NULLOK: %p FAIL",v);ret=-1;err=-EINVAL;break;} #define CHECK_NUM_NONULL(v,size) \ - if(!(v)||!Syscall_Valid((size),(v))){ret=-1;err=-EINVAL;break;} + if(!(v)||!Syscall_Valid((size),(v))){LOG("CHECK_NUM_NONULL: %p(%x) FAIL",v,size);ret=-1;err=-EINVAL;break;} #define CHECK_STR_NONULL(v) \ - if(!(v)||!Syscall_ValidString((v))){ret=-1;err=-EINVAL;break;} + if(!(v)||!Syscall_ValidString((v))){LOG("CHECK_STR_NONULL: %p FAIL",v);ret=-1;err=-EINVAL;break;} #define CHECK_STR_ARRAY(arr) do {\ int i;\ char **tmp = (char**)arr; \ @@ -38,6 +38,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); // === CODE === // TODO: Do sanity checking on arguments, ATM the user can really fuck with the kernel @@ -114,6 +115,11 @@ void SyscallHandler(tSyscallRegs *Regs) // -- Unmap an address case SYS_UNMAP: MM_Deallocate(Regs->Arg1); break; + // -- Change the protection on an address + case SYS_SETFLAGS: + ret = Syscall_MM_SetFlags((void*)Regs->Arg1, Regs->Arg2, Regs->Arg3); + break; + // -- Get Thread/Process IDs case SYS_GETTID: ret = Threads_GetTID(); break; case SYS_GETPID: ret = Threads_GetPID(); break; @@ -135,13 +141,10 @@ void SyscallHandler(tSyscallRegs *Regs) // -- Check for messages case SYS_GETMSG: CHECK_NUM_NULLOK( (Uint*)Regs->Arg1, sizeof(Uint) ); - // NOTE: Can't do range checking as we don't know the size - // - Should be done by Proc_GetMessage - if( Regs->Arg2 && Regs->Arg2 != -1 && !MM_IsUser(Regs->Arg2) ) { - err = -EINVAL; ret = -1; break; - } + if( Regs->Arg3 != -1 ) + CHECK_NUM_NULLOK((void*)Regs->Arg3, Regs->Arg2); // *Source, *Data - ret = Proc_GetMessage((Uint*)Regs->Arg1, (void*)Regs->Arg2); + ret = Proc_GetMessage((Uint*)Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3); break; // -- Get the current timestamp @@ -163,7 +166,7 @@ void SyscallHandler(tSyscallRegs *Regs) CHECK_STR_NONULL((const char*)Regs->Arg1); CHECK_STR_ARRAY((const char**)Regs->Arg2); CHECK_STR_ARRAY((const char**)Regs->Arg3); - CHECK_NUM_NONULL((void*)Regs->Arg5, Regs->Arg4*sizeof(int)); + CHECK_NUM_NULLOK((void*)Regs->Arg5, Regs->Arg4*sizeof(int)); ret = Proc_SysSpawn( (const char*)Regs->Arg1, (const char**)Regs->Arg2, (const char**)Regs->Arg3, Regs->Arg4, (int*)Regs->Arg5 @@ -397,7 +400,31 @@ int Syscall_ValidString(const char *Addr) */ int Syscall_Valid(int Size, const void *Addr) { - if(!MM_IsUser( (tVAddr)Addr )) return 0; + if(!MM_IsUser( (tVAddr)Addr )) { + Log_Debug("Syscalls", "Syscall_Valid - %p not user", Addr); + return 0; + } return CheckMem( Addr, Size ); } + +int Syscall_MM_SetFlags(const void *Addr, Uint Flags, Uint Mask) +{ + tPAddr paddr = MM_GetPhysAddr(Addr); + Flags &= MM_PFLAG_RO|MM_PFLAG_EXEC; + Mask &= MM_PFLAG_RO|MM_PFLAG_EXEC; + + //Log_Debug("Syscalls", "SYS_SETFLAGS: %p %x %x", Addr, Flags, Mask); + + // Enable write? + if( (Mask & MM_PFLAG_RO) && !(Flags & MM_PFLAG_RO) ) { + void *node; + // HACK - Assume that RO mmap'd files are immutable + if( MM_GetPageNode(paddr, &node) == 0 && node ) { + Flags |= MM_PFLAG_COW; + Mask |= MM_PFLAG_COW; + } + } + MM_SetFlags((tVAddr)Addr, Flags, Mask); + return 0; +}