sim, syscall_emul: Add mmap to EmulatedDriver
authorMichael LeBeane <michael.lebeane@amd.com>
Wed, 14 Sep 2016 03:12:46 +0000 (23:12 -0400)
committerMichael LeBeane <michael.lebeane@amd.com>
Wed, 14 Sep 2016 03:12:46 +0000 (23:12 -0400)
Add support for calling mmap on an EmulatedDriver file descriptor.

src/sim/emul_driver.hh
src/sim/syscall_emul.hh

index 778fc6461ccf672b81047a2f5c8d7f398fd3cc9c..62ba615074911535ef9eef9a3348df1e039cb1c6 100644 (file)
@@ -46,8 +46,8 @@ class ThreadContext;
  * hardware inside gem5 can be created by deriving from this class and
  * overriding the abstract virtual methods.
  *
- * Currently only open() and ioctl() calls are supported, but other calls
- * (e.g., read(), write(), mmap()) could be added as needed.
+ * Currently only open(), ioctl(), and mmap() calls are supported, but other
+ * calls (e.g., read(), write()) could be added as needed.
  */
 class EmulatedDriver : public SimObject
 {
@@ -85,6 +85,17 @@ class EmulatedDriver : public SimObject
      * (see the SyscallReturn class).
      */
     virtual int ioctl(LiveProcess *p, ThreadContext *tc, unsigned req) = 0;
+
+    /**
+     * Virtual method, invoked when the user program calls mmap() on
+     * the file descriptor returned by a previous open().  The parameters
+     * are the same as those passed in to mmapFunc() (q.v.).
+     * @return The return ptr for the mmap, or the negation of the errno
+     * (see the SyscallReturn class).
+     */
+    virtual Addr mmap(LiveProcess *p, ThreadContext *tc, Addr start,
+                      uint64_t length, int prot, int tgtFlags, int tgtFd,
+                      int offset) { return -EBADF; }
 };
 
 #endif // __SIM_EMUL_DRIVER_HH
index 7cce9e9c05bc0b67066809c90eebb01f8b5a65c6..c11e9865f2c1a538d339d7bbccb08a228d58a5a7 100644 (file)
@@ -1284,7 +1284,17 @@ mmapImpl(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc,
     int sim_fd = -1;
     uint8_t *pmap = nullptr;
     if (!(tgt_flags & OS::TGT_MAP_ANONYMOUS)) {
-        sim_fd = p->getSimFD(tgt_fd);
+        // Check for EmulatedDriver mmap
+        FDEntry *fde = p->getFDEntry(tgt_fd);
+        if (fde == NULL)
+            return -EBADF;
+
+        if (fde->driver != NULL) {
+            return fde->driver->mmap(p, tc, start, length, prot,
+                                     tgt_flags, tgt_fd, offset);
+        }
+        sim_fd = fde->fd;
+
         if (sim_fd < 0)
             return -EBADF;