|
From: <sv...@va...> - 2009-10-28 16:03:44
|
Author: tom
Date: 2009-10-28 16:03:29 +0000 (Wed, 28 Oct 2009)
New Revision: 10918
Log:
Handle some extra aio opcodes in io_submit and io_getevents.
Based on patch from Gabor Gomas. Fixes #209807.
Modified:
trunk/coregrind/m_syswrap/syswrap-linux.c
trunk/include/vki/vki-linux.h
Modified: trunk/coregrind/m_syswrap/syswrap-linux.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-linux.c 2009-10-28 10:15:06 UTC (rev 10917)
+++ trunk/coregrind/m_syswrap/syswrap-linux.c 2009-10-28 16:03:29 UTC (rev 10918)
@@ -1399,10 +1399,35 @@
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 @@
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 @@
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 @@
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);
Modified: trunk/include/vki/vki-linux.h
===================================================================
--- trunk/include/vki/vki-linux.h 2009-10-28 10:15:06 UTC (rev 10917)
+++ trunk/include/vki/vki-linux.h 2009-10-28 16:03:29 UTC (rev 10918)
@@ -1288,6 +1288,10 @@
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. */
|