X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fsyscalls.c;h=d2f91858a6d2f91c02491f6af2ef6c49e9d7108f;hb=7efc14b23fca7b88126f27d34e99d7e8046e817a;hp=85fbbf8c7882242b8465ac4bf60b41ff0cb125ad;hpb=97629e9f86a9cf7162649550b74b112a4fb1765f;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/syscalls.c b/KernelLand/Kernel/syscalls.c index 85fbbf8c..d2f91858 100644 --- a/KernelLand/Kernel/syscalls.c +++ b/KernelLand/Kernel/syscalls.c @@ -44,7 +44,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 +117,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 +203,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 // --- @@ -441,7 +454,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 +471,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; }