Revision 8171ee35 dma-helpers.c

b/dma-helpers.c
204 204
{
205 205
    return dma_bdrv_io(bs, sg, sector, bdrv_aio_writev, cb, opaque, true);
206 206
}
207

  
208

  
209
static uint64_t dma_buf_rw(uint8_t *ptr, int32_t len, QEMUSGList *sg, bool to_dev)
210
{
211
    uint64_t resid;
212
    int sg_cur_index;
213

  
214
    resid = sg->size;
215
    sg_cur_index = 0;
216
    len = MIN(len, resid);
217
    while (len > 0) {
218
        ScatterGatherEntry entry = sg->sg[sg_cur_index++];
219
        int32_t xfer = MIN(len, entry.len);
220
        cpu_physical_memory_rw(entry.base, ptr, xfer, !to_dev);
221
        ptr += xfer;
222
        len -= xfer;
223
        resid -= xfer;
224
    }
225

  
226
    return resid;
227
}
228

  
229
uint64_t dma_buf_read(uint8_t *ptr, int32_t len, QEMUSGList *sg)
230
{
231
    return dma_buf_rw(ptr, len, sg, 0);
232
}
233

  
234
uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEMUSGList *sg)
235
{
236
    return dma_buf_rw(ptr, len, sg, 1);
237
}

Also available in: Unified diff