From bb40b964354f0fd9ba8bc8e22dfe4f8ed1f92850 Mon Sep 17 00:00:00 2001 From: Annika Wierichs Date: Fri, 24 Nov 2017 12:47:24 +0100 Subject: [PATCH] Fixed phys to virt function. Working now. --- arch/x86/mm/page.c | 23 ++++- include/hermit/ibv_guest_host.h | 1 + kernel/ibv.c | 3 + kernel/ibv_guest_host.c | 170 +++++++++++++------------------- tools/uhyve-ibv.c | 2 +- usr/tests/ib-test.c | 10 +- 6 files changed, 101 insertions(+), 108 deletions(-) diff --git a/arch/x86/mm/page.c b/arch/x86/mm/page.c index 8bc0f5a9c..e95939366 100644 --- a/arch/x86/mm/page.c +++ b/arch/x86/mm/page.c @@ -117,38 +117,56 @@ size_t virt_to_phys(size_t addr) size_t phys_to_virt(size_t phy) { + LOG_INFO("phys_to_virt called.\n"); size_t pfn = phy & PFN_MASK; size_t off = phy & ~PAGE_MASK; + LOG_INFO("off: Hex: %zx, Dec: %zd\n", off, off); + LOG_INFO("pfn: Hex: %zx, Dec: %zd\n", pfn, pfn); size_t * pml4 = self[PAGE_LEVELS-1]; for(size_t i=0; i<(1 << PAGE_MAP_BITS); i++) { + /* LOG_INFO("First for.\n"); */ if (!(pml4[i] & PG_PRESENT)) { continue; } size_t * pdpt = (size_t *) (pml4[i] & PAGE_MASK); for(size_t j=0; j<(1 << PAGE_MAP_BITS); j++) { + /* LOG_INFO("Second for.\n"); */ if (!(pdpt[j] & PG_PRESENT)) { continue; } size_t * pgd = (size_t *) (pdpt[j] & PAGE_MASK); for(size_t k=0; k<(1 << PAGE_MAP_BITS); k++) { + /* LOG_INFO("Third for.\n"); */ if (!(pgd[k] & PG_PRESENT)) { continue; } size_t * pgt = (size_t *) (pgd[k] & PAGE_MASK); for(size_t l=0; l<(1 << PAGE_MAP_BITS); l++) { + /* LOG_INFO("Fourth for.\n"); */ if (pgt[l] & PG_PRESENT) { // Valid page table entry + /* LOG_INFO("Present.\n"); */ if ((pgt[l] & PFN_MASK) == pfn) { // Page frame found - size_t vpn = ((((((i << PAGE_MAP_BITS) & j) << PAGE_MAP_BITS) & k) << PAGE_MAP_BITS) & l) << PAGE_BITS; + LOG_INFO("SAME PAGE.\n"); + LOG_INFO("i: Hex: %zx, Dec: %zd\n", i, i); + LOG_INFO("j: Hex: %zx, Dec: %zd\n", j, j); + LOG_INFO("k: Hex: %zx, Dec: %zd\n", k, k); + LOG_INFO("l: Hex: %zx, Dec: %zd\n", l, l); + size_t vpn = ((((((i << PAGE_MAP_BITS) | j) << PAGE_MAP_BITS) | k) << PAGE_MAP_BITS) | l) << PAGE_BITS; + LOG_INFO("vpn: Hex: %zx, Dec: %zd\n", vpn, vpn); size_t sext = i & (1UL << (PAGE_MAP_BITS - 1)); + LOG_INFO("sext: Hex: %zx, Dec: %zd\n", sext, sext); if (sext) { + LOG_INFO("sext true"); vpn |= ~0UL << VIRT_BITS; + LOG_INFO("vpn: Hex: %zx, Dec: %zd\n", vpn, vpn); } - return vpn & off; + LOG_INFO("return: Hex: %zx, Dec: %zd\n", vpn | off, vpn | off); + return vpn | off; } } } @@ -156,6 +174,7 @@ size_t phys_to_virt(size_t phy) } } + sys_exit(-EFAULT); // TODO: remove this. return 0; } diff --git a/include/hermit/ibv_guest_host.h b/include/hermit/ibv_guest_host.h index 40b79503e..21691a818 100644 --- a/include/hermit/ibv_guest_host.h +++ b/include/hermit/ibv_guest_host.h @@ -57,6 +57,7 @@ struct ibv_device * host_to_guest_ibv_device(struct ibv_device * device, struct ibv_context * host_to_guest_ibv_context(struct ibv_context * context, addr_type type); struct ibv_context_ops * host_to_guest_ibv_context_ops(struct ibv_context_ops * context_ops, addr_type type); struct ibv_port_attr * host_to_guest_ibv_port_attr(struct ibv_port_attr * port_attr, addr_type type); +struct ibv_comp_channel * host_to_guest_ibv_comp_channel(struct ibv_comp_channel * channel, addr_type type); struct ibv_abi_compat_v2 * host_to_guest_ibv_abi_compat_v2(struct ibv_abi_compat_v2 * abi_compat, addr_type type); pthread_mutex_t * host_to_guest_pthread_mutex_t(pthread_mutex_t * mutex, addr_type type); diff --git a/kernel/ibv.c b/kernel/ibv.c index e63f7653e..98fca300e 100644 --- a/kernel/ibv.c +++ b/kernel/ibv.c @@ -105,7 +105,10 @@ const char * ibv_get_device_name(struct ibv_device * device) { host_to_guest_ibv_device(device, GUEST); ret_guest = host_to_guest((size_t) uhyve_args.ret); + LOG_INFO("LOG TEST\n"); return (char *) ret_guest; + + /* return device->name; // TODO: hack for testing */ } diff --git a/kernel/ibv_guest_host.c b/kernel/ibv_guest_host.c index e6f98ac17..e36896489 100644 --- a/kernel/ibv_guest_host.c +++ b/kernel/ibv_guest_host.c @@ -132,6 +132,8 @@ struct ibv_abi_compat_v2 * host_to_guest_ibv_abi_compat_v2(struct ibv_abi_compa host_to_guest_ibv_comp_channel(&abi_compat->channel, GUEST); host_to_guest_pthread_mutex_t(&abi_compat->in_use, GUEST); + + return vaddr; } @@ -142,7 +144,7 @@ struct ibv_abi_compat_v2 * host_to_guest_ibv_abi_compat_v2(struct ibv_abi_compa pthread_mutex_t * guest_to_host_pthread_mutex_t(pthread_mutex_t * mutex) { /* mutex->__m_owner = guest_to_host__pthread_descr(mutex->__m_owner); */ - return (struct pthread_mutex_t *) guest_to_host((size_t) mutex); + return (pthread_mutex_t *) guest_to_host((size_t) mutex); } pthread_mutex_t * host_to_guest_pthread_mutex_t(pthread_mutex_t * mutex, addr_type type) { @@ -159,40 +161,39 @@ pthread_mutex_t * host_to_guest_pthread_mutex_t(pthread_mutex_t * mutex, addr_ty */ struct ibv_context_ops * guest_to_host_ibv_context_ops(struct ibv_context_ops * context_ops) { - - // TODO: Does this work? Fcn returns size_t. Have to convert? - context_ops->query_device = guest_to_host((size_t) context_ops->query_device); - context_ops->query_port = guest_to_host((size_t) context_ops->query_port); - context_ops->alloc_pd = guest_to_host((size_t) context_ops->alloc_pd); - context_ops->dealloc_pd = guest_to_host((size_t) context_ops->dealloc_pd); - context_ops->reg_mr = guest_to_host((size_t) context_ops->reg_mr); - context_ops->rereg_mr = guest_to_host((size_t) context_ops->rereg_mr); - context_ops->dereg_mr = guest_to_host((size_t) context_ops->dereg_mr); - context_ops->alloc_mw = guest_to_host((size_t) context_ops->alloc_mw); - context_ops->bind_mw = guest_to_host((size_t) context_ops->bind_mw); - context_ops->dealloc_mw = guest_to_host((size_t) context_ops->dealloc_mw); - context_ops->create_cq = guest_to_host((size_t) context_ops->create_cq); - context_ops->poll_cq = guest_to_host((size_t) context_ops->poll_cq); - context_ops->req_notify_cq = guest_to_host((size_t) context_ops->req_notify_cq); - context_ops->cq_event = guest_to_host((size_t) context_ops->cq_event); - context_ops->resize_cq = guest_to_host((size_t) context_ops->resize_cq); - context_ops->destroy_cq = guest_to_host((size_t) context_ops->destroy_cq); - context_ops->create_srq = guest_to_host((size_t) context_ops->create_srq); - context_ops->modify_srq = guest_to_host((size_t) context_ops->modify_srq); - context_ops->query_srq = guest_to_host((size_t) context_ops->query_srq); - context_ops->destroy_srq = guest_to_host((size_t) context_ops->destroy_srq); - context_ops->post_srq_recv = guest_to_host((size_t) context_ops->post_srq_recv); - context_ops->create_qp = guest_to_host((size_t) context_ops->create_qp); - context_ops->query_qp = guest_to_host((size_t) context_ops->query_qp); - context_ops->modify_qp = guest_to_host((size_t) context_ops->modify_qp); - context_ops->destroy_qp = guest_to_host((size_t) context_ops->destroy_qp); - context_ops->post_send = guest_to_host((size_t) context_ops->post_send); - context_ops->post_recv = guest_to_host((size_t) context_ops->post_recv); - context_ops->create_ah = guest_to_host((size_t) context_ops->create_ah); - context_ops->destroy_ah = guest_to_host((size_t) context_ops->destroy_ah); - context_ops->attach_mcast = guest_to_host((size_t) context_ops->attach_mcast); - context_ops->detach_mcast = guest_to_host((size_t) context_ops->detach_mcast); - context_ops->async_event = guest_to_host((size_t) context_ops->async_event); + // TODO: Does this work? + context_ops->query_device = (int (*)(struct ibv_context *, struct ibv_device_attr *)) guest_to_host((size_t) context_ops->query_device); + context_ops->query_port = (int (*)(struct ibv_context *, uint8_t, struct ibv_port_attr *)) guest_to_host((size_t) context_ops->query_port); + context_ops->alloc_pd = (struct ibv_pd * (*)(struct ibv_context *)) guest_to_host((size_t) context_ops->alloc_pd); + context_ops->dealloc_pd = (int (*)(struct ibv_pd *)) guest_to_host((size_t) context_ops->dealloc_pd); + context_ops->reg_mr = (struct ibv_mr * (*)(struct ibv_pd *, void *, size_t, int)) guest_to_host((size_t) context_ops->reg_mr); + context_ops->rereg_mr = (int (*)(struct ibv_mr *, int, struct ibv_pd *, void *, size_t, int)) guest_to_host((size_t) context_ops->rereg_mr); + context_ops->dereg_mr = (int (*)(struct ibv_mr *)) guest_to_host((size_t) context_ops->dereg_mr); + context_ops->alloc_mw = (struct ibv_mw * (*)(struct ibv_pd *, enum ibv_mw_type)) guest_to_host((size_t) context_ops->alloc_mw); + context_ops->bind_mw = (int (*)(struct ibv_qp *, struct ibv_mw *, struct ibv_mw_bind *)) guest_to_host((size_t) context_ops->bind_mw); + context_ops->dealloc_mw = (int (*)(struct ibv_mw *)) guest_to_host((size_t) context_ops->dealloc_mw); + context_ops->create_cq = (struct ibv_cq * (*)(struct ibv_context *, int, struct ibv_comp_channel *, int)) guest_to_host((size_t) context_ops->create_cq); + context_ops->poll_cq = (int (*)(struct ibv_cq *, int, struct ibv_wc *)) guest_to_host((size_t) context_ops->poll_cq); + context_ops->req_notify_cq = (int (*)(struct ibv_cq *, int)) guest_to_host((size_t) context_ops->req_notify_cq); + context_ops->cq_event = (void (*)(struct ibv_cq *)) guest_to_host((size_t) context_ops->cq_event); + context_ops->resize_cq = (int (*)(struct ibv_cq *, int)) guest_to_host((size_t) context_ops->resize_cq); + context_ops->destroy_cq = (int (*)(struct ibv_cq *)) guest_to_host((size_t) context_ops->destroy_cq); + context_ops->create_srq = (struct ibv_srq * (*)(struct ibv_pd *, struct ibv_srq_init_attr *)) guest_to_host((size_t) context_ops->create_srq); + context_ops->modify_srq = (int (*)(struct ibv_srq *, struct ibv_srq_attr *, int)) guest_to_host((size_t) context_ops->modify_srq); + context_ops->query_srq = (int (*)(struct ibv_srq *, struct ibv_srq_attr *)) guest_to_host((size_t) context_ops->query_srq); + context_ops->destroy_srq = (int (*)(struct ibv_srq *)) guest_to_host((size_t) context_ops->destroy_srq); + context_ops->post_srq_recv = (int (*)(struct ibv_srq *, struct ibv_recv_wr *, struct ibv_recv_wr **)) guest_to_host((size_t) context_ops->post_srq_recv); + context_ops->create_qp = (struct ibv_qp * (*)(struct ibv_pd *, struct ibv_qp_init_attr *)) guest_to_host((size_t) context_ops->create_qp); + context_ops->query_qp = (int (*)(struct ibv_qp *, struct ibv_qp_attr *, int, struct ibv_qp_init_attr *)) guest_to_host((size_t) context_ops->query_qp); + context_ops->modify_qp = (int (*)(struct ibv_qp *, struct ibv_qp_attr *, int)) guest_to_host((size_t) context_ops->modify_qp); + context_ops->destroy_qp = (int (*)(struct ibv_qp *)) guest_to_host((size_t) context_ops->destroy_qp); + context_ops->post_send = (int (*)(struct ibv_qp *, struct ibv_send_wr *, struct ibv_send_wr **)) guest_to_host((size_t) context_ops->post_send); + context_ops->post_recv = (int (*)(struct ibv_qp *, struct ibv_recv_wr *, struct ibv_recv_wr **)) guest_to_host((size_t) context_ops->post_recv); + context_ops->create_ah = (struct ibv_ah * (*)(struct ibv_pd *, struct ibv_ah_attr *)) guest_to_host((size_t) context_ops->create_ah); + context_ops->destroy_ah = (int (*)(struct ibv_ah *)) guest_to_host((size_t) context_ops->destroy_ah); + context_ops->attach_mcast = (int (*)(struct ibv_qp *, const union ibv_gid *, uint16_t)) guest_to_host((size_t) context_ops->attach_mcast); + context_ops->detach_mcast = (int (*)(struct ibv_qp *, const union ibv_gid *, uint16_t)) guest_to_host((size_t) context_ops->detach_mcast); + context_ops->async_event = (void (*)(struct ibv_async_event *)) guest_to_host((size_t) context_ops->async_event); return (struct ibv_context_ops *) guest_to_host((size_t) context_ops); } @@ -202,73 +203,38 @@ struct ibv_context_ops * host_to_guest_ibv_context_ops( struct ibv_context_ops * vaddr = (type == GUEST) ? context_ops : (struct ibv_context_ops *) host_to_guest((size_t) context_ops); - context_ops->query_device = (int (*)(struct ibv_context *, struct ibv_device_attr *)) host_to_guest((size_t) vaddr->); - context_ops->query_port = (int (*)(struct ibv_context *, uint8_t, struct ibv_port_attr *)) host_to_guest((size_t) vaddr->); - context_ops->alloc_pd = (struct ibv_pd * (*)(struct ibv_context *)) host_to_guest((size_t) vaddr->); - context_ops->dealloc_pd = (int (*)(struct ibv_pd *)) host_to_guest((size_t) vaddr->); - context_ops->reg_mr = (struct ibv_mr * (*)(struct ibv_pd *, void *, size_t, int)) host_to_guest((size_t) vaddr->); - context_ops->rereg_mr = (int (*)(struct ibv_mr *, int, struct ibv_pd *, void *, size_t, int)) host_to_guest((size_t) vaddr->); - context_ops->dereg_mr = (int (*)(struct ibv_mr *)) host_to_guest((size_t) vaddr->); - context_ops->alloc_mw = (struct ibv_mw * (*)(struct ibv_pd *, enum ibv_mw_type)) host_to_guest((size_t) vaddr->); - context_ops->bind_mw = (int (*)(struct ibv_qp *, struct ibv_mw *, struct ibv_mw_bind *)) host_to_guest((size_t) vaddr->); - context_ops->dealloc_mw = (int (*)(struct ibv_mw *)) host_to_guest((size_t) vaddr->); - context_ops->create_cq = (struct ibv_cq * (*)(struct ibv_context *, int, struct ibv_comp_channel *, int)) host_to_guest((size_t) vaddr->); - context_ops->poll_cq = (int (*)(struct ibv_cq *, int, struct ibv_wc *)) host_to_guest((size_t) vaddr->); - context_ops->req_notify_cq = (int (*)(struct ibv_cq *, int)) host_to_guest((size_t) vaddr->); - context_ops->cq_event = (void (*)(struct ibv_cq *)) host_to_guest((size_t) vaddr->); - context_ops->resize_cq = (int (*)(struct ibv_cq *, int)) host_to_guest((size_t) vaddr->); - context_ops->destroy_cq = (int (*)(struct ibv_cq *)) host_to_guest((size_t) vaddr->); - context_ops->create_srq = (struct ibv_srq * (*)(struct ibv_pd *, struct ibv_srq_init_attr *)) host_to_guest((size_t) vaddr->); - context_ops->modify_srq = (int (*)(struct ibv_srq *, struct ibv_srq_attr *, int)) host_to_guest((size_t) vaddr->); - context_ops->query_srq = (int (*)(struct ibv_srq *, struct ibv_srq_attr *)) host_to_guest((size_t) vaddr->); - context_ops->destroy_srq = (int (*)(struct ibv_srq *)) host_to_guest((size_t) vaddr->); - context_ops->post_srq_recv = (int (*)(struct ibv_srq *, struct ibv_recv_wr *, struct ibv_recv_wr **)) host_to_guest((size_t) vaddr->); - context_ops->create_qp = (struct ibv_qp * (*)(struct ibv_pd *, struct ibv_qp_init_attr *)) host_to_guest((size_t) vaddr->); - context_ops->query_qp = (int (*)(struct ibv_qp *, struct ibv_qp_attr *, int, struct ibv_qp_init_attr *)) host_to_guest((size_t) vaddr->); - context_ops->modify_qp = (int (*)(struct ibv_qp *, struct ibv_qp_attr *, int)) host_to_guest((size_t) vaddr->); - context_ops->destroy_qp = (int (*)(struct ibv_qp *)) host_to_guest((size_t) vaddr->); - context_ops->post_send = (int (*)(struct ibv_qp *, struct ibv_send_wr *, struct ibv_send_wr **)) host_to_guest((size_t) vaddr->); - context_ops->post_recv = (int (*)(struct ibv_qp *, struct ibv_recv_wr *, struct ibv_recv_wr **)) host_to_guest((size_t) vaddr->); - context_ops->create_ah = (struct ibv_ah * (*)(struct ibv_pd *, struct ibv_ah_attr *)) host_to_guest((size_t) vaddr->); - context_ops->destroy_ah = (int (*)(struct ibv_ah *)) host_to_guest((size_t) vaddr->); - context_ops->attach_mcast = (int (*)(struct ibv_qp *, const union ibv_gid *, uint16_t)) host_to_guest((size_t) vaddr->); - context_ops->detach_mcast = (int (*)(struct ibv_qp *, const union ibv_gid *, uint16_t)) host_to_guest((size_t) vaddr->); - context_ops->async_event = (void (*)(struct ibv_async_event *)) host_to_guest((size_t) vaddr->); - // todo - - - context_ops->query_device = host_to_guest((size_t) vaddr->query_device); - context_ops->query_port = host_to_guest((size_t) vaddr->query_port); - context_ops->alloc_pd = host_to_guest((size_t) vaddr->alloc_pd); - context_ops->dealloc_pd = host_to_guest((size_t) vaddr->dealloc_pd); - context_ops->reg_mr = host_to_guest((size_t) vaddr->reg_mr); - context_ops->rereg_mr = host_to_guest((size_t) vaddr->rereg_mr); - context_ops->dereg_mr = host_to_guest((size_t) vaddr->dereg_mr); - context_ops->alloc_mw = host_to_guest((size_t) vaddr->alloc_mw); - context_ops->bind_mw = host_to_guest((size_t) vaddr->bind_mw); - context_ops->dealloc_mw = host_to_guest((size_t) vaddr->dealloc_mw); - context_ops->create_cq = host_to_guest((size_t) vaddr->create_cq); - context_ops->poll_cq = host_to_guest((size_t) vaddr->poll_cq); - context_ops->req_notify_cq = host_to_guest((size_t) vaddr->req_notify_cq); - context_ops->cq_event = host_to_guest((size_t) vaddr->cq_event); - context_ops->resize_cq = host_to_guest((size_t) vaddr->resize_cq); - context_ops->destroy_cq = host_to_guest((size_t) vaddr->destroy_cq); - context_ops->create_srq = host_to_guest((size_t) vaddr->create_srq); - context_ops->modify_srq = host_to_guest((size_t) vaddr->modify_srq); - context_ops->query_srq = host_to_guest((size_t) vaddr->query_srq); - context_ops->destroy_srq = host_to_guest((size_t) vaddr->destroy_srq); - context_ops->post_srq_recv = host_to_guest((size_t) vaddr->post_srq_recv); - context_ops->create_qp = host_to_guest((size_t) vaddr->create_qp); - context_ops->query_qp = host_to_guest((size_t) vaddr->query_qp); - context_ops->modify_qp = host_to_guest((size_t) vaddr->modify_qp); - context_ops->destroy_qp = host_to_guest((size_t) vaddr->destroy_qp); - context_ops->post_send = host_to_guest((size_t) vaddr->post_send); - context_ops->post_recv = host_to_guest((size_t) vaddr->post_recv); - context_ops->create_ah = host_to_guest((size_t) vaddr->create_ah); - context_ops->destroy_ah = host_to_guest((size_t) vaddr->destroy_ah); - context_ops->attach_mcast = host_to_guest((size_t) vaddr->attach_mcast); - context_ops->detach_mcast = host_to_guest((size_t) vaddr->detach_mcast); - context_ops->async_event = host_to_guest((size_t) vaddr->async_event); + vaddr->query_device = (int (*)(struct ibv_context *, struct ibv_device_attr *)) host_to_guest((size_t) vaddr->query_device); + vaddr->query_port = (int (*)(struct ibv_context *, uint8_t, struct ibv_port_attr *)) host_to_guest((size_t) vaddr->query_port); + vaddr->alloc_pd = (struct ibv_pd * (*)(struct ibv_context *)) host_to_guest((size_t) vaddr->alloc_pd); + vaddr->dealloc_pd = (int (*)(struct ibv_pd *)) host_to_guest((size_t) vaddr->dealloc_pd); + vaddr->reg_mr = (struct ibv_mr * (*)(struct ibv_pd *, void *, size_t, int)) host_to_guest((size_t) vaddr->reg_mr); + vaddr->rereg_mr = (int (*)(struct ibv_mr *, int, struct ibv_pd *, void *, size_t, int)) host_to_guest((size_t) vaddr->rereg_mr); + vaddr->dereg_mr = (int (*)(struct ibv_mr *)) host_to_guest((size_t) vaddr->dereg_mr); + vaddr->alloc_mw = (struct ibv_mw * (*)(struct ibv_pd *, enum ibv_mw_type)) host_to_guest((size_t) vaddr->alloc_mw); + vaddr->bind_mw = (int (*)(struct ibv_qp *, struct ibv_mw *, struct ibv_mw_bind *)) host_to_guest((size_t) vaddr->bind_mw); + vaddr->dealloc_mw = (int (*)(struct ibv_mw *)) host_to_guest((size_t) vaddr->dealloc_mw); + vaddr->create_cq = (struct ibv_cq * (*)(struct ibv_context *, int, struct ibv_comp_channel *, int)) host_to_guest((size_t) vaddr->create_cq); + vaddr->poll_cq = (int (*)(struct ibv_cq *, int, struct ibv_wc *)) host_to_guest((size_t) vaddr->poll_cq); + vaddr->req_notify_cq = (int (*)(struct ibv_cq *, int)) host_to_guest((size_t) vaddr->req_notify_cq); + vaddr->cq_event = (void (*)(struct ibv_cq *)) host_to_guest((size_t) vaddr->cq_event); + vaddr->resize_cq = (int (*)(struct ibv_cq *, int)) host_to_guest((size_t) vaddr->resize_cq); + vaddr->destroy_cq = (int (*)(struct ibv_cq *)) host_to_guest((size_t) vaddr->destroy_cq); + vaddr->create_srq = (struct ibv_srq * (*)(struct ibv_pd *, struct ibv_srq_init_attr *)) host_to_guest((size_t) vaddr->create_srq); + vaddr->modify_srq = (int (*)(struct ibv_srq *, struct ibv_srq_attr *, int)) host_to_guest((size_t) vaddr->modify_srq); + vaddr->query_srq = (int (*)(struct ibv_srq *, struct ibv_srq_attr *)) host_to_guest((size_t) vaddr->query_srq); + vaddr->destroy_srq = (int (*)(struct ibv_srq *)) host_to_guest((size_t) vaddr->destroy_srq); + vaddr->post_srq_recv = (int (*)(struct ibv_srq *, struct ibv_recv_wr *, struct ibv_recv_wr **)) host_to_guest((size_t) vaddr->post_srq_recv); + vaddr->create_qp = (struct ibv_qp * (*)(struct ibv_pd *, struct ibv_qp_init_attr *)) host_to_guest((size_t) vaddr->create_qp); + vaddr->query_qp = (int (*)(struct ibv_qp *, struct ibv_qp_attr *, int, struct ibv_qp_init_attr *)) host_to_guest((size_t) vaddr->query_qp); + vaddr->modify_qp = (int (*)(struct ibv_qp *, struct ibv_qp_attr *, int)) host_to_guest((size_t) vaddr->modify_qp); + vaddr->destroy_qp = (int (*)(struct ibv_qp *)) host_to_guest((size_t) vaddr->destroy_qp); + vaddr->post_send = (int (*)(struct ibv_qp *, struct ibv_send_wr *, struct ibv_send_wr **)) host_to_guest((size_t) vaddr->post_send); + vaddr->post_recv = (int (*)(struct ibv_qp *, struct ibv_recv_wr *, struct ibv_recv_wr **)) host_to_guest((size_t) vaddr->post_recv); + vaddr->create_ah = (struct ibv_ah * (*)(struct ibv_pd *, struct ibv_ah_attr *)) host_to_guest((size_t) vaddr->create_ah); + vaddr->destroy_ah = (int (*)(struct ibv_ah *)) host_to_guest((size_t) vaddr->destroy_ah); + vaddr->attach_mcast = (int (*)(struct ibv_qp *, const union ibv_gid *, uint16_t)) host_to_guest((size_t) vaddr->attach_mcast); + vaddr->detach_mcast = (int (*)(struct ibv_qp *, const union ibv_gid *, uint16_t)) host_to_guest((size_t) vaddr->detach_mcast); + vaddr->async_event = (void (*)(struct ibv_async_event *)) host_to_guest((size_t) vaddr->async_event); return vaddr; } diff --git a/tools/uhyve-ibv.c b/tools/uhyve-ibv.c index 1c4499071..3f77c1d50 100644 --- a/tools/uhyve-ibv.c +++ b/tools/uhyve-ibv.c @@ -61,7 +61,7 @@ void call_ibv_get_device_list(struct kvm_run * run, uint8_t * guest_mem) { */ void call_ibv_get_device_name(struct kvm_run * run, uint8_t * guest_mem) { - printf("LOG: UHYVE - call_ibv_get_device_name"); + printf("LOG: UHYVE - call_ibv_get_device_name\n"); unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); uhyve_ibv_get_device_name_t * args = (uhyve_ibv_get_device_name_t *) (guest_mem + data); diff --git a/usr/tests/ib-test.c b/usr/tests/ib-test.c index 21a5438af..a51bda8bb 100644 --- a/usr/tests/ib-test.c +++ b/usr/tests/ib-test.c @@ -54,14 +54,18 @@ int main(int argc, char** argv) printf("ib-test.c: before get dev list.\n"); dev_list = ibv_get_device_list(&num_devices); printf("after get device list -- ib-test.c: num devices: %d\n", num_devices); + printf("after get device list -- ib-test.c: ptr 1: %p\n", dev_list[0]); + printf("after get device list -- ib-test.c: ptr 2: %p\n", dev_list[1]); + printf("after get device list -- ib-test.c: name 1: %s\n", dev_list[0]->name); + printf("after get device list -- ib-test.c: name 2: %s\n", dev_list[1]->name); printf("before get device name.\n"); const char* dev_name = ibv_get_device_name(dev_list[0]); - printf("after get device name -- Device: %s", dev_name); + printf("after get device name -- Device: %s\n", dev_name); printf("before open_device\n"); - ibv_context * context = ibv_open_device(dev_list[0]); - printf("after open device name -- Device: %s", dev_name); + struct ibv_context * context = ibv_open_device(dev_list[0]); + printf("after open device name -- Device: %s\n", dev_name);