mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-06 03:23:58 +00:00
Handle some extra aio opcodes in io_submit and io_getevents.
Based on patch from Gabor Gomas. Fixes #209807. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10918
This commit is contained in:
parent
9fc54e2deb
commit
cc253fdd8f
@ -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);
|
||||
|
||||
@ -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. */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user