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
// -- Put the current thread to sleep
case SYS_SLEEP: Threads_Sleep(); break;
+
+ case SYS_TIMEDSLEEP:
+ Time_Delay(Regs->Arg1);
+ break;
// -- Yield current timeslice
case SYS_YIELD: Threads_Yield(); break;
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:
// 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
// ---
LOG("VFS_Open(\"%s\", 0x%x)", (char*)Regs->Arg1, Regs->Arg2 | VFS_OPENFLAG_USER);
ret = VFS_Open((char*)Regs->Arg1, Regs->Arg2 | VFS_OPENFLAG_USER);
break;
+ case SYS_REOPEN:
+ CHECK_STR_NONULL( (char*)Regs->Arg2 );
+ LOG("VFS_Reopen(%i, \"%s\", 0x%x)", Regs->Arg1, (char*)Regs->Arg2, Regs->Arg3 | VFS_OPENFLAG_USER);
+ ret = VFS_Reopen(Regs->Arg1, (char*)Regs->Arg2, Regs->Arg3 | VFS_OPENFLAG_USER);
+ break;
case SYS_CLOSE:
LOG("VFS_Close(%i)", Regs->Arg1);
else
{
// Sanity check the paths
- if(!Syscall_ValidString((char*)Regs->Arg1)
- || !Syscall_ValidString((char*)Regs->Arg2)
- || (Regs->Arg3 && !Syscall_ValidString((char*)Regs->Arg3))
- || !Syscall_ValidString((char*)Regs->Arg4) ) {
- err = -EINVAL;
- ret = -1;
- break;
- }
+ CHECK_STR_NONULL((char*)Regs->Arg1);
+ CHECK_STR_NONULL((char*)Regs->Arg2);
+ CHECK_STR_NULLOK((char*)Regs->Arg3);
+ CHECK_STR_NONULL((char*)Regs->Arg4);
ret = VFS_Mount(
(char*)Regs->Arg1, // Device
(char*)Regs->Arg2, // Mount point
0 // User handles
);
break;
+
+
+ // Create a directory
+ case SYS_MKDIR:
+ CHECK_STR_NONULL( (char*)Regs->Arg1 );
+ ret = VFS_MkDir( (char*)Regs->Arg1 );
+ break;
+ case SYS_UNLINK:
+ Log_Error("Syscalls", "TODO: Impliment SYS_UNLINK");
+ // Fall
// -- Debug
//#if DEBUG_BUILD
case SYS_DEBUG:
Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
LogF("\r\n");
break;
+ case SYS_DEBUGHEX:
+ CHECK_STR_NONULL( (char*)Regs->Arg1 );
+ CHECK_NUM_NONULL( (void*)Regs->Arg2, Regs->Arg3 );
+ Debug_HexDump( (const char*)Regs->Arg1, (void*)Regs->Arg2, Regs->Arg3 );
+ break;
//#endif
// -- Default (Return Error)
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;
Mask |= MM_PFLAG_COW;
}
}
- MM_SetFlags((tVAddr)Addr, Flags, Mask);
+ MM_SetFlags(Addr, Flags, Mask);
return 0;
}