From 3b98e65eaf2f1216085f4ec5013a1fd881618cb1 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sat, 7 Dec 2019 03:43:46 -0800 Subject: [PATCH] sim,gpu: Make ioctl unconditionally take an address parameter. The definition of ioctl is not actually variadic, it just doesn't specify what the type of the pointer is that it takes as its third argument. The man page says that that's because it predates void * being valid C. By passing this address around (even if it's unused), we avoid having to extract system call arguments further down the call stack. Change-Id: I62541237baafaec30bbe3df06b3284dd286a4051 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23456 Tested-by: kokoro Reviewed-by: Bobby R. Bruce Maintainer: Gabe Black --- src/gpu-compute/cl_driver.cc | 3 +-- src/gpu-compute/cl_driver.hh | 2 +- src/sim/emul_driver.hh | 2 +- src/sim/syscall_emul.hh | 10 ++++------ 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/gpu-compute/cl_driver.cc b/src/gpu-compute/cl_driver.cc index c63856a2e..d8a461874 100644 --- a/src/gpu-compute/cl_driver.cc +++ b/src/gpu-compute/cl_driver.cc @@ -103,11 +103,10 @@ ClDriver::open(ThreadContext *tc, int mode, int flags) } int -ClDriver::ioctl(ThreadContext *tc, unsigned req) +ClDriver::ioctl(ThreadContext *tc, unsigned req, Addr buf_addr) { int index = 2; auto process = tc->getProcessPtr(); - Addr buf_addr = process->getSyscallArg(tc, index); switch (req) { case HSA_GET_SIZES: diff --git a/src/gpu-compute/cl_driver.hh b/src/gpu-compute/cl_driver.hh index 5dbb27d84..bc7b749e8 100644 --- a/src/gpu-compute/cl_driver.hh +++ b/src/gpu-compute/cl_driver.hh @@ -54,7 +54,7 @@ class ClDriver final : public EmulatedDriver ClDriver(ClDriverParams *p); void handshake(GpuDispatcher *_dispatcher); int open(ThreadContext *tc, int mode, int flags); - int ioctl(ThreadContext *tc, unsigned req); + int ioctl(ThreadContext *tc, unsigned req, Addr buf); const char* codeOffToKernelName(uint64_t code_ptr); private: diff --git a/src/sim/emul_driver.hh b/src/sim/emul_driver.hh index fe13d9077..9921d15b8 100644 --- a/src/sim/emul_driver.hh +++ b/src/sim/emul_driver.hh @@ -83,7 +83,7 @@ class EmulatedDriver : public SimObject * @return The return code for the ioctl, or the negation of the errno * (see the SyscallReturn class). */ - virtual int ioctl(ThreadContext *tc, unsigned req) = 0; + virtual int ioctl(ThreadContext *tc, unsigned req, Addr buf) = 0; /** * Virtual method, invoked when the user program calls mmap() on diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index 0bc846a7a..2df5579de 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -702,7 +702,7 @@ copyOutStatfsBuf(PortProxy &mem, Addr addr, template SyscallReturn ioctlFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, - int tgt_fd, unsigned req, GuestABI::VarArgs varargs) + int tgt_fd, unsigned req, Addr addr) { auto p = tc->getProcessPtr(); @@ -715,7 +715,7 @@ ioctlFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, if (dfdp) { EmulatedDriver *emul_driver = dfdp->getDriver(); if (emul_driver) - return emul_driver->ioctl(tc, req); + return emul_driver->ioctl(tc, req, addr); } auto sfdp = std::dynamic_pointer_cast((*p->fds)[tgt_fd]); @@ -724,8 +724,7 @@ ioctlFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, switch (req) { case SIOCGIFCONF: { - Addr conf_addr = varargs.get(); - BufferArg conf_arg(conf_addr, sizeof(ifconf)); + BufferArg conf_arg(addr, sizeof(ifconf)); conf_arg.copyIn(tc->getVirtProxy()); ifconf *conf = (ifconf*)conf_arg.bufferPtr(); @@ -754,8 +753,7 @@ ioctlFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, case SIOCGIFHWADDR: #endif case SIOCGIFMTU: { - Addr req_addr = varargs.get(); - BufferArg req_arg(req_addr, sizeof(ifreq)); + BufferArg req_arg(addr, sizeof(ifreq)); req_arg.copyIn(tc->getVirtProxy()); status = ioctl(sfdp->getSimFD(), req, req_arg.bufferPtr()); -- 2.30.2