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);
// === CODE ===
void SyscallHandler(tSyscallRegs *Regs)
{
- Uint ret=0, err=0;
+ Uint64 ret = 0;
+ Uint err = 0;
#if DEBUG
ENTER("iThread iNum", gCurrentThread->TID, Regs->Num);
if(Regs->Num < NUM_SYSCALLS)
ret = -1;
break;
+ case SYS_GETPHYS:
+ ret = MM_GetPhysAddr(Regs->Arg1);
+ break;
// -- Map an address
case SYS_MAP: MM_Map(Regs->Arg1, Regs->Arg2); break;
// -- Allocate an address
#endif
break;
+ case SYS_READ:
+ #if BITS < 64
+ VFS_Read( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 );
+ #else
+ VFS_Read( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 );
+ #endif
+ break;
+
+ case SYS_FINFO:
+ ret = VFS_FInfo( Regs->Arg1, (void*)Regs->Arg2, Regs->Arg3 );
+ break;
// -- Debug
case SYS_DEBUG:
default:
Warning("SyscallHandler: Unknown System Call %i", Regs->Num);
if(Regs->Num < NUM_SYSCALLS)
- Warning(" Syscall %s", cSYSCALL_NAMES[Regs->Num]);
+ Warning(" Syscall '%s'", cSYSCALL_NAMES[Regs->Num]);
err = -ENOSYS;
ret = -1;
break;
}
+ #if BITS < 64
+ Regs->Return = ret&0xFFFFFFFF;
+ Regs->RetHi = ret >> 32;
+ #else
Regs->Return = ret;
+ #endif
Regs->Error = err;
#if DEBUG
LOG("SyscallHandler: err = %i", err);