Browse Source

UserspaceEmulator: Add support for SC_uname and SC_sysconf syscalls

Brendan Coles 3 năm trước cách đây
mục cha
commit
1e48cd35a1

+ 2 - 0
Userland/DevTools/UserspaceEmulator/Emulator.h

@@ -148,6 +148,7 @@ private:
     int virt$purge(int mode);
     int virt$purge(int mode);
     u32 virt$mmap(u32);
     u32 virt$mmap(u32);
     FlatPtr virt$mremap(FlatPtr);
     FlatPtr virt$mremap(FlatPtr);
+    u32 virt$sysconf(u32 name);
     u32 virt$mount(u32);
     u32 virt$mount(u32);
     u32 virt$munmap(FlatPtr address, size_t size);
     u32 virt$munmap(FlatPtr address, size_t size);
     u32 virt$gettid();
     u32 virt$gettid();
@@ -231,6 +232,7 @@ private:
     int virt$beep();
     int virt$beep();
     int virt$ftruncate(int fd, FlatPtr length_addr);
     int virt$ftruncate(int fd, FlatPtr length_addr);
     mode_t virt$umask(mode_t);
     mode_t virt$umask(mode_t);
+    int virt$uname(FlatPtr params_addr);
     int virt$anon_create(size_t, int);
     int virt$anon_create(size_t, int);
     int virt$recvfd(int, int);
     int virt$recvfd(int, int);
     int virt$sendfd(int, int);
     int virt$sendfd(int, int);

+ 18 - 0
Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp

@@ -22,6 +22,7 @@
 #include <sys/stat.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/time.h>
 #include <sys/uio.h>
 #include <sys/uio.h>
+#include <sys/utsname.h>
 #include <syscall.h>
 #include <syscall.h>
 #include <termios.h>
 #include <termios.h>
 
 
@@ -94,6 +95,8 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3)
         return virt$mremap(arg1);
         return virt$mremap(arg1);
     case SC_gettid:
     case SC_gettid:
         return virt$gettid();
         return virt$gettid();
+    case SC_sysconf:
+        return virt$sysconf(arg1);
     case SC_getpid:
     case SC_getpid:
         return virt$getpid();
         return virt$getpid();
     case SC_getsid:
     case SC_getsid:
@@ -246,6 +249,8 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3)
         return virt$ftruncate(arg1, arg2);
         return virt$ftruncate(arg1, arg2);
     case SC_umask:
     case SC_umask:
         return virt$umask(arg1);
         return virt$umask(arg1);
+    case SC_uname:
+        return virt$uname(arg1);
     case SC_chown:
     case SC_chown:
         return virt$chown(arg1);
         return virt$chown(arg1);
     case SC_msyscall:
     case SC_msyscall:
@@ -487,6 +492,14 @@ int Emulator::virt$ftruncate(int fd, FlatPtr length_addr)
     return syscall(SC_ftruncate, fd, &length);
     return syscall(SC_ftruncate, fd, &length);
 }
 }
 
 
+int Emulator::virt$uname(FlatPtr params_addr)
+{
+    struct utsname local_uname;
+    auto rc = syscall(SC_uname, &local_uname);
+    mmu().copy_to_vm(params_addr, &local_uname, sizeof(local_uname));
+    return rc;
+}
+
 mode_t Emulator::virt$umask(mode_t mask)
 mode_t Emulator::virt$umask(mode_t mask)
 {
 {
     return syscall(SC_umask, mask);
     return syscall(SC_umask, mask);
@@ -1596,6 +1609,11 @@ int Emulator::virt$beep()
     return syscall(SC_beep);
     return syscall(SC_beep);
 }
 }
 
 
+u32 Emulator::virt$sysconf(u32 name)
+{
+    return syscall(SC_sysconf, name);
+}
+
 int Emulator::virt$msyscall(FlatPtr)
 int Emulator::virt$msyscall(FlatPtr)
 {
 {
     // FIXME: Implement this.
     // FIXME: Implement this.