diff --git a/src/gpu-compute/cl_driver.cc b/src/gpu-compute/cl_driver.cc index c63856a2e3..d8a461874f 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 5dbb27d845..bc7b749e82 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 fe13d90775..9921d15b83 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 0bc846a7a0..2df5579de6 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());