]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Handle some extra aio opcodes in io_submit and io_getevents.
authorTom Hughes <tom@compton.nu>
Wed, 28 Oct 2009 16:03:29 +0000 (16:03 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 28 Oct 2009 16:03:29 +0000 (16:03 +0000)
Based on patch from Gabor Gomas. Fixes #209807.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10918

coregrind/m_syswrap/syswrap-linux.c
include/vki/vki-linux.h

index f115630093f0d3f07a4f21f17d7a1c31f5c0a51f..b4a4563308b7396b1c35fd62b331c88052dc8141 100644 (file)
@@ -1399,10 +1399,35 @@ POST(sys_io_getevents)
             if (vev->result > 0)
                POST_MEM_WRITE( cb->aio_buf, vev->result );
             break;
-            
+
          case VKI_IOCB_CMD_PWRITE:
             break;
-           
+
+         case VKI_IOCB_CMD_FSYNC:
+            break;
+
+         case VKI_IOCB_CMD_FDSYNC:
+            break;
+
+         case VKI_IOCB_CMD_PREADV:
+            if (vev->result > 0) {
+                  struct vki_iovec * vec = (struct vki_iovec *)(Addr)cb->aio_buf;
+                  Int remains = vev->result;
+                  Int j;
+
+                  for (j = 0; j < cb->aio_nbytes; j++) {
+                       Int nReadThisBuf = vec[j].iov_len;
+                       if (nReadThisBuf > remains) nReadThisBuf = remains;
+                       POST_MEM_WRITE( (Addr)vec[j].iov_base, nReadThisBuf );
+                       remains -= nReadThisBuf;
+                       if (remains < 0) VG_(core_panic)("io_getevents(PREADV): remains < 0");
+                  }
+            }
+             break;
+
+         case VKI_IOCB_CMD_PWRITEV:
+             break;
+
          default:
             VG_(message)(Vg_DebugMsg,
                         "Warning: unhandled io_getevents opcode: %u\n",
@@ -1415,7 +1440,7 @@ POST(sys_io_getevents)
 
 PRE(sys_io_submit)
 {
-   Int i;
+   Int i, j;
 
    PRINT("sys_io_submit ( %llu, %ld, %#lx )", (ULong)ARG1,ARG2,ARG3);
    PRE_REG_READ3(long, "io_submit",
@@ -1425,6 +1450,8 @@ PRE(sys_io_submit)
    if (ARG3 != 0) {
       for (i = 0; i < ARG2; i++) {
          struct vki_iocb *cb = ((struct vki_iocb **)ARG3)[i];
+         struct vki_iovec *iov;
+
          PRE_MEM_READ( "io_submit(iocb)", (Addr)cb, sizeof(struct vki_iocb) );
          switch (cb->aio_lio_opcode) {
          case VKI_IOCB_CMD_PREAD:
@@ -1434,7 +1461,27 @@ PRE(sys_io_submit)
          case VKI_IOCB_CMD_PWRITE:
             PRE_MEM_READ( "io_submit(PWRITE)", cb->aio_buf, cb->aio_nbytes );
             break;
-           
+
+         case VKI_IOCB_CMD_FSYNC:
+            break;
+
+         case VKI_IOCB_CMD_FDSYNC:
+            break;
+
+         case VKI_IOCB_CMD_PREADV:
+            iov = (struct vki_iovec *)(Addr)cb->aio_buf;
+            PRE_MEM_READ( "io_submit(PREADV)", cb->aio_buf, cb->aio_nbytes * sizeof(struct vki_iovec) );
+            for (j = 0; j < cb->aio_nbytes; j++)
+                PRE_MEM_WRITE( "io_submit(PREADV(iov[i]))", (Addr)iov[j].iov_base, iov[j].iov_len );
+            break;
+
+         case VKI_IOCB_CMD_PWRITEV:
+            iov = (struct vki_iovec *)(Addr)cb->aio_buf;
+            PRE_MEM_READ( "io_submit(PWRITEV)", cb->aio_buf, cb->aio_nbytes * sizeof(struct vki_iovec) );
+            for (j = 0; j < cb->aio_nbytes; j++)
+                PRE_MEM_READ( "io_submit(PWRITEV(iov[i]))", (Addr)iov[j].iov_base, iov[j].iov_len );
+            break;
+
          default:
             VG_(message)(Vg_DebugMsg,"Warning: unhandled io_submit opcode: %u\n",
                          cb->aio_lio_opcode);
index 93d4ae67218c152e2693057d156450e8fe98ece3..6393a43e688e53600ed4d2cfcd5ca4f9b4bdc3fa 100644 (file)
@@ -1288,6 +1288,10 @@ typedef unsigned long    vki_aio_context_t;
 enum {
        VKI_IOCB_CMD_PREAD = 0,
        VKI_IOCB_CMD_PWRITE = 1,
+       VKI_IOCB_CMD_FSYNC = 2,
+       VKI_IOCB_CMD_FDSYNC = 3,
+       VKI_IOCB_CMD_PREADV = 7,
+       VKI_IOCB_CMD_PWRITEV = 8,
 };
 
 /* read() from /dev/aio returns these structures. */