From 817906fdd1c4509cb4b79160bb0d9ff72db7a604 Mon Sep 17 00:00:00 2001 From: "Suren A. Chilingaryan" Date: Fri, 20 Nov 2015 18:52:51 +0100 Subject: Fix reading non DMA-able kernel pages using pcitool --- pcilib/kmem.c | 28 ++++++++++++++++++++-------- pcilib/kmem.h | 6 ++++-- 2 files changed, 24 insertions(+), 10 deletions(-) (limited to 'pcilib') diff --git a/pcilib/kmem.c b/pcilib/kmem.c index 4e240c3..cb3c58c 100644 --- a/pcilib/kmem.c +++ b/pcilib/kmem.c @@ -276,6 +276,8 @@ pcilib_kmem_handle_t *pcilib_alloc_kernel_memory(pcilib_t *ctx, pcilib_kmem_type memcpy(&kbuf->buf.addr, &kbuf->buf.blocks[0], sizeof(pcilib_kmem_addr_t)); } + kbuf->buf.type = type; + kbuf->buf.use = use; kbuf->buf.reused = reused|(persistent?PCILIB_KMEM_REUSE_PERSISTENT:0)|(hardware?PCILIB_KMEM_REUSE_HARDWARE:0); kbuf->prev = NULL; @@ -331,15 +333,25 @@ int pcilib_kmem_sync_block(pcilib_t *ctx, pcilib_kmem_handle_t *k, pcilib_kmem_s kmem_sync_t ks; pcilib_kmem_list_t *kbuf = (pcilib_kmem_list_t*)k; - ks.dir = dir; - ks.handle.handle_id = kbuf->buf.blocks[block].handle_id; - ks.handle.pa = kbuf->buf.blocks[block].pa; - ret = ioctl(ctx->handle, PCIDRIVER_IOC_KMEM_SYNC, &ks); - if (ret) { - pcilib_error("PCIDRIVER_IOC_KMEM_SYNC ioctl have failed"); - return PCILIB_ERROR_FAILED; + switch (kbuf->buf.type) { + case PCILIB_KMEM_TYPE_DMA_S2C_PAGE: + case PCILIB_KMEM_TYPE_DMA_C2S_PAGE: + case PCILIB_KMEM_TYPE_REGION_S2C: + case PCILIB_KMEM_TYPE_REGION_C2S: + ks.dir = dir; + ks.handle.handle_id = kbuf->buf.blocks[block].handle_id; + ks.handle.pa = kbuf->buf.blocks[block].pa; + + ret = ioctl(ctx->handle, PCIDRIVER_IOC_KMEM_SYNC, &ks); + if (ret) { + pcilib_error("PCIDRIVER_IOC_KMEM_SYNC ioctl have failed"); + return PCILIB_ERROR_FAILED; + } + break; + default: + ; } - + return 0; } diff --git a/pcilib/kmem.h b/pcilib/kmem.h index 3dff625..eb7e4ff 100644 --- a/pcilib/kmem.h +++ b/pcilib/kmem.h @@ -65,12 +65,12 @@ typedef enum { typedef struct { int handle_id; pcilib_kmem_reuse_state_t reused; - + uintptr_t pa; // uintptr_t va; void *ua; size_t size; - + size_t alignment_offset; size_t mmap_offset; } pcilib_kmem_addr_t; @@ -83,6 +83,8 @@ typedef struct { typedef struct { pcilib_kmem_addr_t addr; + pcilib_kmem_type_t type; + pcilib_kmem_use_t use; pcilib_kmem_reuse_state_t reused; size_t n_blocks; -- cgit v1.2.3