sim,gpu: Make ioctl unconditionally take an address parameter.
authorGabe Black <gabeblack@google.com>
Sat, 7 Dec 2019 11:43:46 +0000 (03:43 -0800)
committerGabe Black <gabeblack@google.com>
Thu, 12 Mar 2020 07:21:13 +0000 (07:21 +0000)
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 <noreply+kokoro@google.com>
Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu>
Maintainer: Gabe Black <gabeblack@google.com>

src/gpu-compute/cl_driver.cc
src/gpu-compute/cl_driver.hh
src/sim/emul_driver.hh
src/sim/syscall_emul.hh

index c63856a2e3b49eac2611fd5d9d58b5be870a9c2a..d8a461874f781d529d7726a27cbf6ad0769e1ea2 100644 (file)
@@ -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:
index 5dbb27d8453d4472e2bc4335f3ddf5bb78d461be..bc7b749e82606233244dbcbc6c1b0c05f471ade2 100644 (file)
@@ -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:
index fe13d90775093d464f553132b1472e5742ef1deb..9921d15b833b26e5f9afa2c1238078bbe2ef014b 100644 (file)
@@ -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
index 0bc846a7a08f16f1b05d2a633032a06cce186c27..2df5579de6b7027e45f5fdfa4c1c5bc98023cd39 100644 (file)
@@ -702,7 +702,7 @@ copyOutStatfsBuf(PortProxy &mem, Addr addr,
 template <class OS>
 SyscallReturn
 ioctlFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
-        int tgt_fd, unsigned req, GuestABI::VarArgs<Addr> 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<SocketFDEntry>((*p->fds)[tgt_fd]);
@@ -724,8 +724,7 @@ ioctlFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
 
         switch (req) {
           case SIOCGIFCONF: {
-            Addr conf_addr = varargs.get<Addr>();
-            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<Addr>();
-            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());