summaryrefslogtreecommitdiff
path: root/DevTools
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-08-07 16:51:08 +0200
committerAndreas Kling <kling@serenityos.org>2020-08-07 16:51:08 +0200
commit5a5b687014f6263299b11f089868c9d80db4174c (patch)
tree6ba92f083a1a4a4625ae5a57360e82a56e32b24e /DevTools
parent93b1e54237fd595a788765c8061c345fba556473 (diff)
downloadserenity-5a5b687014f6263299b11f089868c9d80db4174c.zip
UserspaceEmulator: Add the getpgid() and waitid() syscalls
With this, you can now kinda sorta run the shell in UserspaceEmulator!
Diffstat (limited to 'DevTools')
-rw-r--r--DevTools/UserspaceEmulator/Emulator.cpp33
-rw-r--r--DevTools/UserspaceEmulator/Emulator.h2
2 files changed, 35 insertions, 0 deletions
diff --git a/DevTools/UserspaceEmulator/Emulator.cpp b/DevTools/UserspaceEmulator/Emulator.cpp
index f8c159c5e0..03331a6b07 100644
--- a/DevTools/UserspaceEmulator/Emulator.cpp
+++ b/DevTools/UserspaceEmulator/Emulator.cpp
@@ -253,12 +253,16 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3)
switch (function) {
case SC_access:
return virt$access(arg1, arg2, arg3);
+ case SC_waitid:
+ return virt$waitid(arg1);
case SC_getcwd:
return virt$getcwd(arg1, arg2);
case SC_ttyname:
return virt$ttyname(arg1, arg2, arg3);
case SC_getpgrp:
return virt$getpgrp();
+ case SC_getpgid:
+ return virt$getpgid(arg1);
case SC_setpgid:
return virt$setpgid(arg1, arg2);
case SC_execve:
@@ -1269,6 +1273,11 @@ int Emulator::virt$getpgrp()
return syscall(SC_getpgrp);
}
+int Emulator::virt$getpgid(pid_t pid)
+{
+ return syscall(SC_getpgid, pid);
+}
+
int Emulator::virt$setpgid(pid_t pid, pid_t pgid)
{
return syscall(SC_setpgid, pid, pgid);
@@ -1300,4 +1309,28 @@ int Emulator::virt$access(FlatPtr path, size_t path_length, int type)
return syscall(SC_access, host_path.data(), host_path.size(), type);
}
+int Emulator::virt$waitid(FlatPtr params_addr)
+{
+ Syscall::SC_waitid_params params;
+ mmu().copy_from_vm(&params, params_addr, sizeof(params));
+
+ Syscall::SC_waitid_params host_params = params;
+ siginfo info;
+ host_params.infop = &info;
+
+ int rc = syscall(SC_waitid, &host_params);
+ if (rc < 0)
+ return rc;
+
+ if (info.si_addr) {
+ // FIXME: Translate this somehow.
+ TODO();
+ }
+
+ if (params.infop)
+ mmu().copy_to_vm(params.infop, &info, sizeof(info));
+
+ return rc;
+}
+
}
diff --git a/DevTools/UserspaceEmulator/Emulator.h b/DevTools/UserspaceEmulator/Emulator.h
index 62cabc356a..c4ec7b82cf 100644
--- a/DevTools/UserspaceEmulator/Emulator.h
+++ b/DevTools/UserspaceEmulator/Emulator.h
@@ -138,9 +138,11 @@ private:
ssize_t virt$getrandom(FlatPtr buffer, size_t buffer_size, unsigned int flags);
int virt$sleep(unsigned);
int virt$getpgrp();
+ int virt$getpgid(pid_t);
int virt$setpgid(pid_t pid, pid_t pgid);
int virt$ttyname(int fd, FlatPtr buffer, size_t buffer_size);
int virt$getcwd(FlatPtr buffer, size_t buffer_size);
+ int virt$waitid(FlatPtr);
FlatPtr allocate_vm(size_t size, size_t alignment);