Bladeren bron

UserspaceEmulator: Add the getcwd syscall

Andreas Kling 5 jaren geleden
bovenliggende
commit
c497603177
2 gewijzigde bestanden met toevoegingen van 13 en 0 verwijderingen
  1. 12 0
      DevTools/UserspaceEmulator/Emulator.cpp
  2. 1 0
      DevTools/UserspaceEmulator/Emulator.h

+ 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);
     dbgprintf("Syscall: %s (%x)\n", Syscall::to_string((Syscall::Function)function), function);
 #endif
 #endif
     switch (function) {
     switch (function) {
+    case SC_getcwd:
+        return virt$getcwd(arg1, arg2);
     case SC_ttyname:
     case SC_ttyname:
         return virt$ttyname(arg1, arg2, arg3);
         return virt$ttyname(arg1, arg2, arg3);
     case SC_getpgrp:
     case SC_getpgrp:
@@ -1256,4 +1258,14 @@ int Emulator::virt$ttyname(int fd, FlatPtr buffer, size_t buffer_size)
     return rc;
     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$sleep(unsigned);
     int virt$getpgrp();
     int virt$getpgrp();
     int virt$ttyname(int fd, FlatPtr buffer, size_t buffer_size);
     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);
     FlatPtr allocate_vm(size_t size, size_t alignment);