X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Fsyscalls.c;h=546095612b70875b86a9ff91eb6fc267ebbd7f43;hb=4cbfb47ebf71128b57cf25a131550b3f66a295a3;hp=ff299973e320a871d0c2e8bd1fe0218e51257d78;hpb=9ed2477f5f7e5b01501368719e93259aa336932f;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/syscalls.c b/AcessNative/ld-acess_src/syscalls.c index ff299973..54609561 100644 --- a/AcessNative/ld-acess_src/syscalls.c +++ b/AcessNative/ld-acess_src/syscalls.c @@ -1,5 +1,6 @@ /* */ +#define DONT_INCLUDE_SYSCALL_NAMES 1 #include "../../Usermode/include/acess/sys.h" #include "common.h" #include @@ -7,12 +8,22 @@ #include #include #include +#include #include "request.h" #include "../syscalls.h" +#define DEBUG(str, x...) Debug(str, x) + +#define NATIVE_FILE_MASK 0x40000000 +#define MAX_FPS 16 + // === Types === // === IMPORTS === +extern int giSyscall_ClientID; // Needed for execve + +// === GLOBALS === +FILE *gaSyscall_LocalFPs[MAX_FPS]; // === CODE === const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const char *ArgTypes, va_list *Args) @@ -48,12 +59,11 @@ const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const case 'i': if( direction != 1 ) { - fprintf(stderr, "ReadEntry: Recieving an integer is not defined\n"); + Warning("ReadEntry: Recieving an integer is not defined"); return NULL; } val32 = va_arg(*Args, uint32_t); - printf("val32 = 0x%x\n", val32); Dest->Type = ARG_TYPE_INT32; Dest->Length = sizeof(uint32_t); @@ -71,7 +81,6 @@ const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const } val64 = va_arg(*Args, uint64_t); - printf("val64 = 0x%llx\n", val64); Dest->Type = ARG_TYPE_INT64; Dest->Length = sizeof(uint64_t); @@ -88,7 +97,6 @@ const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const } str = va_arg(*Args, char*); - printf("str = %p '%s'\n", str, str); Dest->Type = ARG_TYPE_STRING; Dest->Length = strlen(str) + 1; @@ -104,8 +112,6 @@ const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const len = va_arg(*Args, int); str = va_arg(*Args, char*); - printf("len = %i, str = %p\n", len, str); - // Save the pointer for later if( PtrDest ) *PtrDest = str; @@ -159,6 +165,11 @@ uint64_t _Syscall(int SyscallID, const char *ArgTypes, ...) uint64_t retValue; int i; + // DEBUG! +// printf("&tRequestHeader->Params = %i\n", offsetof(tRequestHeader, Params)); +// printf("&tRequestValue->Flags = %i\n", offsetof(tRequestValue, Flags)); +// printf("&tRequestValue->Length = %i\n", offsetof(tRequestValue, Length)); + // Get data size va_start(args, ArgTypes); str = ArgTypes; @@ -219,7 +230,7 @@ uint64_t _Syscall(int SyscallID, const char *ArgTypes, ...) va_end(args); // Send syscall request - if( SendRequest(req, dataLength) < 0 ) { + if( SendRequest(req, dataLength, retLength) < 0 ) { fprintf(stderr, "syscalls.c: SendRequest failed (SyscallID = %i)\n", SyscallID); exit(127); } @@ -227,7 +238,7 @@ uint64_t _Syscall(int SyscallID, const char *ArgTypes, ...) // Parse return value dataPtr = &req->Params[req->NParams]; retValue = 0; - if( req->NParams > 1 ) + if( req->NParams >= 1 ) { switch(req->Params[0].Type) { @@ -243,85 +254,279 @@ uint64_t _Syscall(int SyscallID, const char *ArgTypes, ...) } // Write changes to buffers - va_start(args, ArgTypes); + retCount = 0; for( i = 1; i < req->NParams; i ++ ) { - memcpy( retPtrs[i-1], dataPtr, req->Params[i].Length ); + #if 0 + int j; + printf("Return Data %i: (%i)", i, req->Params[i].Length); + for( j = 0; j < req->Params[i].Length; j ++ ) + printf(" %02x", ((uint8_t*)dataPtr)[j]); + printf("\n"); + #endif + memcpy( retPtrs[retCount++], dataPtr, req->Params[i].Length ); dataPtr += req->Params[i].Length; } - va_end(args); free( req ); + free( retPtrs ); - return 0; + DEBUG(": %llx", retValue); + + return retValue; } // --- VFS Calls -int open(const char *Path, int Flags) { +int acess_chdir(const char *Path) +{ + return _Syscall(SYS_CHDIR, ">s", Path); +} + +int acess_open(const char *Path, int Flags) +{ + if( strncmp(Path, "$$$$", 4) == 0 ) + { + int ret; + for(ret = 0; ret < MAX_FPS && gaSyscall_LocalFPs[ret]; ret ++ ) ; + if(ret == MAX_FPS) return -1; + // TODO: Handle directories + gaSyscall_LocalFPs[ret] = fopen(&Path[4], "r+"); + if(!gaSyscall_LocalFPs[ret]) return -1; + return ret|NATIVE_FILE_MASK; + } + DEBUG("open(\"%s\", 0x%x)", Path, Flags); return _Syscall(SYS_OPEN, ">s >i", Path, Flags); } -void close(int FD) { +void acess_close(int FD) { + if(FD & NATIVE_FILE_MASK) { + fclose( gaSyscall_LocalFPs[FD & (NATIVE_FILE_MASK-1)] ); + gaSyscall_LocalFPs[FD & (NATIVE_FILE_MASK-1)] = NULL; + return ; + } + DEBUG("close(%i)", FD); _Syscall(SYS_CLOSE, ">i", FD); } -size_t read(int FD, size_t Bytes, void *Dest) { - return _Syscall(SYS_READ, "i >i i >s >i", FD, Path, Flags); } -size_t write(int FD, size_t Bytes, void *Src) { +size_t acess_read(int FD, size_t Bytes, void *Dest) { + if(FD & NATIVE_FILE_MASK) + return fread( Dest, Bytes, 1, gaSyscall_LocalFPs[FD & (NATIVE_FILE_MASK-1)] ); + DEBUG("read(0x%x, 0x%x, *%p)", FD, Bytes, Dest); + return _Syscall(SYS_READ, ">i >i i >i >d", FD, Bytes, Bytes, Src); } -int seek(int FD, int64_t Ofs, int Dir) { +int acess_seek(int FD, int64_t Ofs, int Dir) { + if(FD & NATIVE_FILE_MASK) { + switch(Dir) { + case ACESS_SEEK_SET: Dir = SEEK_SET; break; + default: + case ACESS_SEEK_CUR: Dir = SEEK_CUR; break; + case ACESS_SEEK_END: Dir = SEEK_END; break; + } + return fseek( gaSyscall_LocalFPs[FD & (NATIVE_FILE_MASK-1)], Ofs, Dir ); + } + DEBUG("seek(0x%x, 0x%llx, %i)", FD, Ofs, Dir); return _Syscall(SYS_SEEK, ">i >I >i", FD, Ofs, Dir); } -uint64_t tell(int FD) { +uint64_t acess_tell(int FD) { + if(FD & NATIVE_FILE_MASK) + return ftell( gaSyscall_LocalFPs[FD & (NATIVE_FILE_MASK-1)] ); return _Syscall(SYS_TELL, ">i", FD); } -int ioctl(int fd, int id, void *data) { +int acess_ioctl(int fd, int id, void *data) { // NOTE: 1024 byte size is a hack + DEBUG("ioctl(%i, %i, %p)", fd, id, data); return _Syscall(SYS_IOCTL, ">i >i ?d", fd, id, 1024, data); } -int finfo(int fd, t_sysFInfo *info, int maxacls) { +int acess_finfo(int fd, t_sysFInfo *info, int maxacls) { return _Syscall(SYS_FINFO, ">i i", fd, sizeof(t_sysFInfo)+maxacls*sizeof(t_sysACL), info, maxacls); } -int readdir(int fd, char *dest) { +int acess_readdir(int fd, char *dest) { + DEBUG("readdir(%i, %p)", fd, dest); return _Syscall(SYS_READDIR, ">i i ?d ?d ?d >d", nfds, + read ? (nfds+7)/8 : 0, read, + write ? (nfds+7)/8 : 0, write, + error ? (nfds+7)/8 : 0, error, + sizeof(*timeout), timeout + ); +} + +int acess__SysOpenChild(int fd, char *name, int flags) { return _Syscall(SYS_OPENCHILD, ">i >s >i", fd, name, flags); } -int _SysGetACL(int fd, t_sysACL *dest) { +int acess__SysGetACL(int fd, t_sysACL *dest) { return _Syscall(SYS_GETACL, "i s >s >s >s", Device, Directory, Type, Options); } // --- Error Handler -int _SysSetFaultHandler(int (*Handler)(int)) { +int acess__SysSetFaultHandler(int (*Handler)(int)) { + printf("TODO: Set fault handler (asked to set to %p)\n", Handler); return 0; } +// --- Memory Management --- +uint64_t acess__SysAllocate(uint vaddr) +{ + if( AllocateMemory(vaddr, 0x1000) == -1 ) // Allocate a page + return 0; + + return vaddr; // Just ignore the need for paddrs :) +} + +// --- Process Management --- +int acess_clone(int flags, void *stack) +{ + extern int fork(void); + if(flags & CLONE_VM) { + int ret, newID, kernel_tid=0; + printf("fork()"); + + newID = _Syscall(SYS_FORK, "i i", ID); +} + +int acess_setgid(int ID) +{ + return _Syscall(SYS_SETGID, ">i", ID); +} + +int acess_SysSendMessage(int DestTID, int Length, void *Data) +{ + return _Syscall(SYS_SENDMSG, ">i >d", DestTID, Length, Data); +} + +int acess_SysGetMessage(int *SourceTID, void *Data) +{ + return _Syscall(SYS_GETMSG, "i", Status); + exit(Status); +} + // === Symbol List === -#define DEFSYM(name) {#name, name} +#define DEFSYM(name) {#name, acess_##name} const tSym caBuiltinSymbols[] = { - {"_exit", exit}, + DEFSYM(_exit), + DEFSYM(chdir), DEFSYM(open), DEFSYM(close), + DEFSYM(reopen), DEFSYM(read), DEFSYM(write), DEFSYM(seek), @@ -329,11 +534,25 @@ const tSym caBuiltinSymbols[] = { DEFSYM(ioctl), DEFSYM(finfo), DEFSYM(readdir), + DEFSYM(select), DEFSYM(_SysOpenChild), DEFSYM(_SysGetACL), DEFSYM(_SysMount), - {"_SysSetFaultHandler", _SysSetFaultHandler} + DEFSYM(clone), + DEFSYM(execve), + DEFSYM(sleep), + + DEFSYM(waittid), + DEFSYM(setuid), + DEFSYM(setgid), + + DEFSYM(SysSendMessage), + DEFSYM(SysGetMessage), + + DEFSYM(_SysAllocate), + DEFSYM(_SysDebug), + DEFSYM(_SysSetFaultHandler) }; const int ciNumBuiltinSymbols = sizeof(caBuiltinSymbols)/sizeof(caBuiltinSymbols[0]);