Переглянути джерело

UserspaceEmulator: Add the getcwd syscall

Andreas Kling 5 роки тому
батько
коміт
c497603177

+ 12 - 0
DevTools/UserspaceEmulator/Emulator.cpp

@@ -250,6 +250,8 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3)
     dbgprintf("Syscall: %s (%x)\n", Syscall::to_string((Syscall::Function)function), function);
 #endif
     switch (function) {
+    case SC_getcwd:
+        return virt$getcwd(arg1, arg2);
     case SC_ttyname:
         return virt$ttyname(arg1, arg2, arg3);
     case SC_getpgrp:
@@ -1256,4 +1258,14 @@ int Emulator::virt$ttyname(int fd, FlatPtr buffer, size_t buffer_size)
     return rc;
 }
 
+int Emulator::virt$getcwd(FlatPtr buffer, size_t buffer_size)
+{
+    auto host_buffer = ByteBuffer::create_zeroed(buffer_size);
+    int rc = syscall(SC_getcwd, host_buffer.data(), host_buffer.size());
+    if (rc < 1)
+        return rc;
+    mmu().copy_to_vm(buffer, host_buffer.data(), host_buffer.size());
+    return rc;
+}
+
 }

+ 1 - 0
DevTools/UserspaceEmulator/Emulator.h

@@ -138,6 +138,7 @@ private:
     int virt$sleep(unsigned);
     int virt$getpgrp();
     int virt$ttyname(int fd, FlatPtr buffer, size_t buffer_size);
+    int virt$getcwd(FlatPtr buffer, size_t buffer_size);
 
     FlatPtr allocate_vm(size_t size, size_t alignment);