X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Fsyscalls.c;h=02a59b90587be63906b9d2e4a8cfbd7cc2331cc0;hb=7681237dd0061c95dd4b22ca1b5c8c3c8b8fae2e;hp=50352f8740b6148a9b0d53989179a0e1c61dc7c5;hpb=d599a063b3b453b705925c58180c93e1f9cb3d79;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/syscalls.c b/AcessNative/ld-acess_src/syscalls.c index 50352f87..02a59b90 100644 --- a/AcessNative/ld-acess_src/syscalls.c +++ b/AcessNative/ld-acess_src/syscalls.c @@ -15,7 +15,7 @@ // === IMPORTS === // === CODE === -const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const char *ArgTypes, va_list Args) +const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const char *ArgTypes, va_list *Args) { uint64_t val64; uint32_t val32; @@ -52,7 +52,8 @@ const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const return NULL; } - val32 = va_arg(Args, uint32_t); + val32 = va_arg(*Args, uint32_t); + printf("val32 = 0x%x\n", val32); Dest->Type = ARG_TYPE_INT32; Dest->Length = sizeof(uint32_t); @@ -69,7 +70,8 @@ const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const return NULL; } - val64 = va_arg(Args, uint64_t); + val64 = va_arg(*Args, uint64_t); + printf("val64 = 0x%llx\n", val64); Dest->Type = ARG_TYPE_INT64; Dest->Length = sizeof(uint64_t); @@ -85,7 +87,8 @@ const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const return NULL; } - str = va_arg(Args, char*); + str = va_arg(*Args, char*); + printf("str = %p '%s'\n", str, str); Dest->Type = ARG_TYPE_STRING; Dest->Length = strlen(str) + 1; @@ -98,15 +101,17 @@ const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const break; // Data (special handling) case 'd': - len = va_arg(Args, int); - str = va_arg(Args, char*); + 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; // Create parameter block - Dest->Type = ARG_TYPE_INT64; - Dest->Length = sizeof(uint64_t); + Dest->Type = ARG_TYPE_DATA; + Dest->Length = len; Dest->Flags = 0; if( direction & 2 ) Dest->Flags |= ARG_FLAG_RETURN; @@ -163,7 +168,7 @@ uint64_t _Syscall(int SyscallID, const char *ArgTypes, ...) { tRequestValue tmpVal; - str = ReadEntry(&tmpVal, NULL, NULL, str, args); + str = ReadEntry(&tmpVal, NULL, NULL, str, &args); if( !str ) { fprintf(stderr, "syscalls.c: ReadEntry failed (SyscallID = %i)\n", SyscallID); exit(127); @@ -201,7 +206,7 @@ uint64_t _Syscall(int SyscallID, const char *ArgTypes, ...) retCount = 0; while(*str) { - str = ReadEntry(&req->Params[paramCount], dataPtr, &retPtrs[retCount], str, args); + str = ReadEntry(&req->Params[paramCount], dataPtr, &retPtrs[retCount], str, &args); if( !str ) break; if( !(req->Params[paramCount].Flags & ARG_FLAG_ZEROED) ) @@ -214,7 +219,7 @@ uint64_t _Syscall(int SyscallID, const char *ArgTypes, ...) va_end(args); // Send syscall request - if( SendRequest(req, dataLength) ) { + if( SendRequest(req, dataLength) < 0 ) { fprintf(stderr, "syscalls.c: SendRequest failed (SyscallID = %i)\n", SyscallID); exit(127); } @@ -260,6 +265,10 @@ void close(int FD) { _Syscall(SYS_CLOSE, ">i", FD); } +int reopen(int FD, const char *Path, int Flags) { + return _Syscall(SYS_REOPEN, ">i >s >i", FD, Path, Flags); +} + size_t read(int FD, size_t Bytes, void *Dest) { return _Syscall(SYS_READ, "i >i i >i ?d", &ret, fd, id, 1024, data); - return ret; + return _Syscall(SYS_IOCTL, ">i >i ?d", fd, id, 1024, data); } int finfo(int fd, t_sysFInfo *info, int maxacls) { - int ret = 0; - _Syscall(SYS_FINFO, "i i", - &ret, fd, + return _Syscall(SYS_FINFO, ">i i", + fd, sizeof(t_sysFInfo)+maxacls*sizeof(t_sysACL), info, maxacls); - return ret; } int readdir(int fd, char *dest) { - int ret = 0; - _Syscall(SYS_READDIR, "i i i >s >i", &ret, fd, name, flags); - return ret; + return _Syscall(SYS_OPENCHILD, ">i >s >i", fd, name, flags); } int _SysGetACL(int fd, t_sysACL *dest) { - int ret = 0; - _Syscall(SYS_GETACL, "i i s >s >s >s", &ret, Device, Directory, Type, Options); - return ret; + return _Syscall(SYS_MOUNT, ">s >s >s >s", Device, Directory, Type, Options); } @@ -321,6 +318,14 @@ int _SysSetFaultHandler(int (*Handler)(int)) { return 0; } +// --- Memory Management --- +uint64_t _SysAllocate(uint vaddr) +{ + if( AllocateMemory(vaddr, 0x1000) == -1 ) // Allocate a page + return 0; + return vaddr; // Just ignore the need for paddrs :) +} + // === Symbol List === #define DEFSYM(name) {#name, name} @@ -329,6 +334,7 @@ const tSym caBuiltinSymbols[] = { DEFSYM(open), DEFSYM(close), + DEFSYM(reopen), DEFSYM(read), DEFSYM(write), DEFSYM(seek), @@ -340,6 +346,8 @@ const tSym caBuiltinSymbols[] = { DEFSYM(_SysGetACL), DEFSYM(_SysMount), + DEFSYM(_SysAllocate), + {"_SysSetFaultHandler", _SysSetFaultHandler} };