From 33e3e8d63d99b607e713dc3fd5890130cfd48fbc Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 15 Jul 2020 23:44:51 +0200 Subject: [PATCH] UserspaceEmulator: Add the getrandom() syscall --- DevTools/UserspaceEmulator/Emulator.cpp | 16 +++++++++++++--- DevTools/UserspaceEmulator/Emulator.h | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/DevTools/UserspaceEmulator/Emulator.cpp b/DevTools/UserspaceEmulator/Emulator.cpp index f48780fc09..d8ac88057e 100644 --- a/DevTools/UserspaceEmulator/Emulator.cpp +++ b/DevTools/UserspaceEmulator/Emulator.cpp @@ -198,9 +198,6 @@ void Emulator::dump_backtrace() u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3) { - (void)arg2; - (void)arg3; - #ifdef DEBUG_SPAM dbgprintf("Syscall: %s (%x)\n", Syscall::to_string((Syscall::Function)function), function); #endif @@ -296,6 +293,9 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3) return virt$gettimeofday(arg1); case SC_clock_gettime: return virt$clock_gettime(arg1, arg2); + case SC_getrandom: + return virt$getrandom(arg1, arg2, arg3) ; + default: warn() << "Unimplemented syscall: " << Syscall::to_string((Syscall::Function)function); dump_backtrace(); @@ -738,4 +738,14 @@ void Emulator::virt$exit(int status) m_shutdown = true; } +ssize_t Emulator::virt$getrandom(FlatPtr buffer, size_t buffer_size, unsigned int flags) +{ + auto host_buffer = ByteBuffer::create_uninitialized(buffer_size); + int rc = syscall(SC_getrandom, host_buffer.data(), host_buffer.size(), flags); + if (rc < 0) + return rc; + mmu().copy_to_vm(buffer, host_buffer.data(), host_buffer.size()); + return rc; +} + } diff --git a/DevTools/UserspaceEmulator/Emulator.h b/DevTools/UserspaceEmulator/Emulator.h index d9cfc5e755..fbfcfee319 100644 --- a/DevTools/UserspaceEmulator/Emulator.h +++ b/DevTools/UserspaceEmulator/Emulator.h @@ -111,6 +111,7 @@ private: int virt$recvfrom(FlatPtr); int virt$connect(int sockfd, FlatPtr address, socklen_t address_size); void virt$exit(int); + ssize_t virt$getrandom(FlatPtr buffer, size_t buffer_size, unsigned int flags); FlatPtr allocate_vm(size_t size, size_t alignment);