diff --git a/DevTools/UserspaceEmulator/Emulator.cpp b/DevTools/UserspaceEmulator/Emulator.cpp index 61e0dd2f37..8e10c940d2 100644 --- a/DevTools/UserspaceEmulator/Emulator.cpp +++ b/DevTools/UserspaceEmulator/Emulator.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include //#define DEBUG_SPAM @@ -240,6 +241,8 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3) return virt$getgid(); case SC_close: return virt$close(arg1); + case SC_fstat: + return virt$fstat(arg1, arg2); case SC_write: return virt$write(arg1, arg2, arg3); case SC_read: @@ -256,6 +259,8 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3) return virt$getgroups(arg1, arg2); case SC_lseek: return virt$lseek(arg1, arg2, arg3); + case SC_get_process_name: + return virt$get_process_name(arg1, arg2); case SC_exit: virt$exit((int)arg1); return 0; @@ -266,11 +271,29 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3) } } +int Emulator::virt$fstat(int fd, FlatPtr statbuf) +{ + struct stat local_statbuf; + int rc = syscall(SC_fstat, fd, &local_statbuf); + if (rc < 0) + return rc; + mmu().copy_to_vm(statbuf, &local_statbuf, sizeof(local_statbuf)); + return rc; +} + int Emulator::virt$close(int fd) { return syscall(SC_close, fd); } +int Emulator::virt$get_process_name(FlatPtr buffer, int size) +{ + if (size < 9) + return -ENAMETOOLONG; + mmu().copy_to_vm(buffer, "EMULATED", 9); + return 0; +} + int Emulator::virt$lseek(int fd, off_t offset, int whence) { return syscall(SC_lseek, fd, offset, whence); diff --git a/DevTools/UserspaceEmulator/Emulator.h b/DevTools/UserspaceEmulator/Emulator.h index 9802851211..695cd0ee11 100644 --- a/DevTools/UserspaceEmulator/Emulator.h +++ b/DevTools/UserspaceEmulator/Emulator.h @@ -68,6 +68,8 @@ private: u32 virt$madvise(FlatPtr, size_t, int); u32 virt$open(u32); int virt$close(int); + int virt$get_process_name(FlatPtr buffer, int size); + int virt$fstat(int, FlatPtr); u32 virt$fcntl(int fd, int, u32); int virt$getgroups(ssize_t count, FlatPtr); int virt$lseek(int fd, off_t offset, int whence);