X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Fexports.c;h=d7e49227d652ca08b11a2fed950aa63a1f95a9fb;hb=c18c6fea968e72403f9a7b75d6f7f8e3f9e8757f;hp=9ee04f17df97b28e66c6994ce12a19bcf62a619f;hpb=9698333503f59d07ceb7d0b1bb89bacef05f37e8;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/exports.c b/AcessNative/ld-acess_src/exports.c index 9ee04f17..d7e49227 100644 --- a/AcessNative/ld-acess_src/exports.c +++ b/AcessNative/ld-acess_src/exports.c @@ -12,11 +12,11 @@ #include #define DEBUG(v...) Debug(v) +//#define DEBUG(v...) do{}while(0)//Debug(v) #define PAGE_SIZE 4096 typedef struct sFILE FILE; -extern FILE *stderr; extern void exit(int) __attribute__ ((noreturn)); extern int printf(const char *, ...); extern int fprintf(FILE *,const char *, ...); @@ -29,6 +29,7 @@ extern int giSyscall_ClientID; // Needed for execve extern void _InitSyscalls(void); extern void _CloseSyscalls(void); +extern void Warning(const char *Format, ...); extern void Debug(const char *Format, ...); extern int AllocateMemory(uintptr_t VirtAddr, size_t ByteCount); @@ -37,6 +38,7 @@ extern int AllocateMemory(uintptr_t VirtAddr, size_t ByteCount); // === GLOBALS === int acess__errno; +char *gsExecutablePath = "./ld-acess"; // === CODE === // --- VFS Calls @@ -95,6 +97,7 @@ int acess_seek(int FD, int64_t Ofs, int Dir) { uint64_t acess_tell(int FD) { if(FD & NATIVE_FILE_MASK) return native_tell( FD & (NATIVE_FILE_MASK-1) ); + DEBUG("tell(0x%x)", FD); return _Syscall(SYS_TELL, ">i", FD); } @@ -123,7 +126,7 @@ int acess_SysReadDir(int fd, char *dest) { return _Syscall(SYS_READDIR, ">i i ?d ?d ?d >d >i", nfds, @@ -135,21 +138,24 @@ int acess__SysSelect(int nfds, fd_set *read, fd_set *write, fd_set *error, time_ ); } -int acess_select(int nfds, fd_set *read, fd_set *write, fd_set *error, time_t *timeout) +int acess_select(int nfds, fd_set *read, fd_set *write, fd_set *error, int64_t *timeout) { return acess__SysSelect(nfds, read, write, error, timeout, 0); } int acess__SysOpenChild(int fd, char *name, int flags) { + DEBUG("_SysOpenChild(0x%x, '%s', 0x%x)", fd, name, flags); return _Syscall(SYS_OPENCHILD, ">i >s >i", fd, name, flags); } int acess__SysGetACL(int fd, t_sysACL *dest) { + DEBUG("%s(0x%x, %p)", __func__, fd, dest); return _Syscall(SYS_GETACL, ">i s >s >s >s", Device, Directory, Type, Options); } @@ -161,7 +167,7 @@ int acess__SysSetFaultHandler(int (*Handler)(int)) { } // --- Memory Management --- -uint64_t acess__SysAllocate(uint vaddr) +uint64_t acess__SysAllocate(uintptr_t vaddr) { if( AllocateMemory(vaddr, 0x1000) == -1 ) // Allocate a page return 0; @@ -172,10 +178,14 @@ uint64_t acess__SysAllocate(uint vaddr) // --- Process Management --- int acess_clone(int flags, void *stack) { + #ifdef __WIN32__ + Warning("Win32 does not support anything like fork(2), cannot emulate"); + exit(-1); + #else extern int fork(void); if(flags & CLONE_VM) { int ret, newID, kernel_tid=0; - printf("USERSIDE fork()\n"); + Debug("USERSIDE fork()"); newID = _Syscall(SYS_AN_FORK, "d >d", sizeof(int), &kernel_tid, + nfd*sizeof(int), fds, + info ? sizeof(*info) : 0, info); + + const char *new_argv[5+argc+1]; + int new_argc = 0, i; + char client_id_str[11]; + sprintf(client_id_str, "%i", newID); + new_argv[new_argc++] = gsExecutablePath; // TODO: Get path to ld-acess executable + new_argv[new_argc++] = "--key"; + new_argv[new_argc++] = client_id_str; + new_argv[new_argc++] = "--binary"; + new_argv[new_argc++] = binary; + for( i = 0; argv[i]; i ++) + new_argv[new_argc++] = argv[i]; + new_argv[new_argc++] = NULL; + + // TODO: Debug output? + + native_spawn(gsExecutablePath, new_argv, envp); + + return kernel_tid; +} + void acess_sleep(void) { + DEBUG("%s()", __func__); _Syscall(SYS_SLEEP, ""); } int acess_waittid(int TID, int *ExitStatus) { + DEBUG("%s(%i, %p)", __func__, TID, ExitStatus); return _Syscall(SYS_WAITTID, ">i i >d", DestTID, Length, Data); } -int acess_SysGetMessage(int *SourceTID, void *Data) +int acess_SysGetMessage(int *SourceTID, int BufLen, void *Data) { -// static __thread int lastlen = 1024; - int lastlen; - - lastlen = _Syscall(SYS_GETMSG, "i", Mask); } @@ -304,6 +350,12 @@ void acess__exit(int Status) exit(Status); } +uint32_t acess__SysSetMemFlags(uintptr_t vaddr, uint32_t flags, uint32_t mask) +{ + // TODO: Impliment acess__SysSetMemFlags? + return 0; +} + // === Symbol List === #define DEFSYM(name) {#name, &acess_##name} @@ -329,17 +381,21 @@ const tSym caBuiltinSymbols[] = { DEFSYM(clone), DEFSYM(execve), + DEFSYM(_SysSpawn), DEFSYM(sleep), DEFSYM(waittid), + DEFSYM(gettid), DEFSYM(setuid), DEFSYM(setgid), - DEFSYM(gettid), + DEFSYM(getuid), + DEFSYM(getgid), DEFSYM(SysSendMessage), DEFSYM(SysGetMessage), DEFSYM(_SysAllocate), + DEFSYM(_SysSetMemFlags), DEFSYM(_SysDebug), DEFSYM(_SysSetFaultHandler), DEFSYM(_SysWaitEvent),