From ff134bfc27c9eb0e925ad0e99aac2cc28dd5c47f Mon Sep 17 00:00:00 2001 From: Annika Wierichs Date: Mon, 22 Jan 2018 17:55:41 +0100 Subject: [PATCH] added some struct address conversions, work in progress. --- include/hermit/verbs.h | 92 ++++----- kernel/ibv.c | 119 +++++++---- mm/malloc.c | 36 ++++ tools/ibv_code_generator/GEN-kernel.c | 62 +++--- .../GEN-tools-uhyve-ibv-ports.h | 190 +++++++++--------- tools/ibv_code_generator/generate-code.py | 72 +++++-- 6 files changed, 347 insertions(+), 224 deletions(-) diff --git a/include/hermit/verbs.h b/include/hermit/verbs.h index 465f21821..368cae88f 100644 --- a/include/hermit/verbs.h +++ b/include/hermit/verbs.h @@ -1044,7 +1044,7 @@ struct ibv_send_wr { void *hdr; uint16_t hdr_sz; uint16_t mss; - } tso; + } tso; // TCP Segmentation Offload }; }; @@ -1606,43 +1606,43 @@ enum verbs_context_mask { VERBS_CONTEXT_RESERVED = 1 << 5 }; -struct verbs_context { - /* "grows up" - new fields go here */ - int (*destroy_rwq_ind_table)(struct ibv_rwq_ind_table *rwq_ind_table); - struct ibv_rwq_ind_table *(*create_rwq_ind_table)(struct ibv_context *context, - struct ibv_rwq_ind_table_init_attr *init_attr); - int (*destroy_wq)(struct ibv_wq *wq); - int (*modify_wq)(struct ibv_wq *wq, struct ibv_wq_attr *wq_attr); - struct ibv_wq * (*create_wq)(struct ibv_context *context, - struct ibv_wq_init_attr *wq_init_attr); - int (*query_rt_values)(struct ibv_context *context, - struct ibv_values_ex *values); - struct ibv_cq_ex *(*create_cq_ex)(struct ibv_context *context, - struct ibv_cq_init_attr_ex *init_attr); - struct verbs_ex_private *priv; - int (*query_device_ex)(struct ibv_context *context, - const struct ibv_query_device_ex_input *input, - struct ibv_device_attr_ex *attr, - size_t attr_size); - int (*ibv_destroy_flow) (struct ibv_flow *flow); - void (*ABI_placeholder2) (void); /* DO NOT COPY THIS GARBAGE */ - struct ibv_flow * (*ibv_create_flow) (struct ibv_qp *qp, - struct ibv_flow_attr *flow_attr); - void (*ABI_placeholder1) (void); /* DO NOT COPY THIS GARBAGE */ - struct ibv_qp *(*open_qp)(struct ibv_context *context, - struct ibv_qp_open_attr *attr); - struct ibv_qp *(*create_qp_ex)(struct ibv_context *context, - struct ibv_qp_init_attr_ex *qp_init_attr_ex); - int (*get_srq_num)(struct ibv_srq *srq, uint32_t *srq_num); - struct ibv_srq * (*create_srq_ex)(struct ibv_context *context, - struct ibv_srq_init_attr_ex *srq_init_attr_ex); - struct ibv_xrcd * (*open_xrcd)(struct ibv_context *context, - struct ibv_xrcd_init_attr *xrcd_init_attr); - int (*close_xrcd)(struct ibv_xrcd *xrcd); - uint64_t has_comp_mask; - size_t sz; /* Must be immediately before struct ibv_context */ - struct ibv_context context; /* Must be last field in the struct */ -}; +// struct verbs_context { + // /* "grows up" - new fields go here */ + // int (*destroy_rwq_ind_table)(struct ibv_rwq_ind_table *rwq_ind_table); + // struct ibv_rwq_ind_table *(*create_rwq_ind_table)(struct ibv_context *context, + // struct ibv_rwq_ind_table_init_attr *init_attr); + // int (*destroy_wq)(struct ibv_wq *wq); + // int (*modify_wq)(struct ibv_wq *wq, struct ibv_wq_attr *wq_attr); + // struct ibv_wq * (*create_wq)(struct ibv_context *context, + // struct ibv_wq_init_attr *wq_init_attr); + // int (*query_rt_values)(struct ibv_context *context, + // struct ibv_values_ex *values); + // struct ibv_cq_ex *(*create_cq_ex)(struct ibv_context *context, + // struct ibv_cq_init_attr_ex *init_attr); + // struct verbs_ex_private *priv; + // int (*query_device_ex)(struct ibv_context *context, + // const struct ibv_query_device_ex_input *input, + // struct ibv_device_attr_ex *attr, + // size_t attr_size); + // int (*ibv_destroy_flow) (struct ibv_flow *flow); + // void (*ABI_placeholder2) (void); [> DO NOT COPY THIS GARBAGE <] + // struct ibv_flow * (*ibv_create_flow) (struct ibv_qp *qp, + // struct ibv_flow_attr *flow_attr); + // void (*ABI_placeholder1) (void); [> DO NOT COPY THIS GARBAGE <] + // struct ibv_qp *(*open_qp)(struct ibv_context *context, + // struct ibv_qp_open_attr *attr); + // struct ibv_qp *(*create_qp_ex)(struct ibv_context *context, + // struct ibv_qp_init_attr_ex *qp_init_attr_ex); + // int (*get_srq_num)(struct ibv_srq *srq, uint32_t *srq_num); + // struct ibv_srq * (*create_srq_ex)(struct ibv_context *context, + // struct ibv_srq_init_attr_ex *srq_init_attr_ex); + // struct ibv_xrcd * (*open_xrcd)(struct ibv_context *context, + // struct ibv_xrcd_init_attr *xrcd_init_attr); + // int (*close_xrcd)(struct ibv_xrcd *xrcd); + // uint64_t has_comp_mask; + // size_t sz; [> Must be immediately before struct ibv_context <] + // struct ibv_context context; [> Must be last field in the struct <] +// }; //static inline struct verbs_context *verbs_get_ctx(struct ibv_context *ctx) //{ @@ -1650,15 +1650,15 @@ struct verbs_context { //NULL : container_of(ctx, struct verbs_context, context); //} -#define verbs_get_ctx_op(ctx, op) ({ \ - struct verbs_context *__vctx = verbs_get_ctx(ctx); \ - (!__vctx || (__vctx->sz < sizeof(*__vctx) - offsetof(struct verbs_context, op)) || \ - !__vctx->op) ? NULL : __vctx; }) +// #define verbs_get_ctx_op(ctx, op) ({ \ + // struct verbs_context *__vctx = verbs_get_ctx(ctx); \ + // (!__vctx || (__vctx->sz < sizeof(*__vctx) - offsetof(struct verbs_context, op)) || \ + // !__vctx->op) ? NULL : __vctx; }) -#define verbs_set_ctx_op(_vctx, op, ptr) ({ \ - struct verbs_context *vctx = _vctx; \ - if (vctx && (vctx->sz >= sizeof(*vctx) - offsetof(struct verbs_context, op))) \ - vctx->op = ptr; }) +// #define verbs_set_ctx_op(_vctx, op, ptr) ({ \ + // struct verbs_context *vctx = _vctx; \ + // if (vctx && (vctx->sz >= sizeof(*vctx) - offsetof(struct verbs_context, op))) \ + // vctx->op = ptr; }) ///** // * ibv_get_device_list - Get list of IB devices currently available diff --git a/kernel/ibv.c b/kernel/ibv.c index 4b19b5b9f..3925c7043 100644 --- a/kernel/ibv.c +++ b/kernel/ibv.c @@ -186,7 +186,7 @@ typedef struct { int ibv_start_poll(struct ibv_cq_ex * cq, struct ibv_poll_cq_attr * attr) { uhyve_ibv_start_poll_t uhyve_args; uhyve_args.cq = cq; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_poll_cq_attr *) guest_to_host((size_t) attr); uhyve_send(UHYVE_PORT_IBV_START_POLL, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -585,8 +585,7 @@ typedef struct { struct ibv_device ** ibv_get_device_list(int * num_devices) { uhyve_ibv_get_device_list_t uhyve_args; - /* uhyve_args.num_devices = num_devices; */ - uhyve_args.num_devices = (int *) guest_to_host((size_t) num_devices); + uhyve_args.num_devices = num_devices; uhyve_send(UHYVE_PORT_IBV_GET_DEVICE_LIST, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -710,7 +709,7 @@ typedef struct { int ibv_get_async_event(struct ibv_context * context, struct ibv_async_event * event) { uhyve_ibv_get_async_event_t uhyve_args; uhyve_args.context = context; - uhyve_args.event = event; + uhyve_args.event = (struct ibv_async_event *) guest_to_host((size_t) event); uhyve_send(UHYVE_PORT_IBV_GET_ASYNC_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -729,7 +728,7 @@ typedef struct { void ibv_ack_async_event(struct ibv_async_event * event) { uhyve_ibv_ack_async_event_t uhyve_args; - uhyve_args.event = event; + uhyve_args.event = (struct ibv_async_event *) guest_to_host((size_t) event); uhyve_send(UHYVE_PORT_IBV_ACK_ASYNC_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args)); } @@ -750,7 +749,7 @@ typedef struct { int ibv_query_device(struct ibv_context * context, struct ibv_device_attr * device_attr) { uhyve_ibv_query_device_t uhyve_args; uhyve_args.context = context; - uhyve_args.device_attr = device_attr; + uhyve_args.device_attr = (struct ibv_device_attr *) guest_to_host((size_t) device_attr); uhyve_send(UHYVE_PORT_IBV_QUERY_DEVICE, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -775,7 +774,7 @@ int ibv_query_port(struct ibv_context * context, uint8_t port_num, struct ibv_po uhyve_ibv_query_port_t uhyve_args; uhyve_args.context = context; uhyve_args.port_num = port_num; - uhyve_args.port_attr = port_attr; + uhyve_args.port_attr = (struct ibv_port_attr *) guest_to_host((size_t) port_attr); uhyve_send(UHYVE_PORT_IBV_QUERY_PORT, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -800,7 +799,7 @@ int ___ibv_query_port(struct ibv_context * context, uint8_t port_num, struct ibv uhyve____ibv_query_port_t uhyve_args; uhyve_args.context = context; uhyve_args.port_num = port_num; - uhyve_args.port_attr = port_attr; + uhyve_args.port_attr = (struct ibv_port_attr *) guest_to_host((size_t) port_attr); uhyve_send(UHYVE_PORT____IBV_QUERY_PORT, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -919,7 +918,7 @@ typedef struct { struct ibv_flow * ibv_create_flow(struct ibv_qp * qp, struct ibv_flow_attr * flow) { uhyve_ibv_create_flow_t uhyve_args; uhyve_args.qp = qp; - uhyve_args.flow = flow; + uhyve_args.flow = (struct ibv_flow_attr *) guest_to_host((size_t) flow); uhyve_send(UHYVE_PORT_IBV_CREATE_FLOW, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1153,10 +1152,15 @@ int ibv_bind_mw(struct ibv_qp * qp, struct ibv_mw * mw, struct ibv_mw_bind * mw_ uhyve_ibv_bind_mw_t uhyve_args; uhyve_args.qp = qp; uhyve_args.mw = mw; - uhyve_args.mw_bind = mw_bind; + uhyve_args.mw_bind = (struct ibv_mw_bind *) guest_to_host((size_t) mw_bind); + + uint64_t mw_bind__bind_info__addr = mw_bind->bind_info.addr; // ! + mw_bind->bind_info.addr = (uint64_t) guest_to_host((size_t) mw_bind->bind_info.addr) uhyve_send(UHYVE_PORT_IBV_BIND_MW, (unsigned) virt_to_phys((size_t) &uhyve_args)); + mw_bind->bind_info.addr = mw_bind__bind_info__addr; + return uhyve_args.ret; } @@ -1247,7 +1251,7 @@ typedef struct { struct ibv_cq_ex * ibv_create_cq_ex(struct ibv_context * context, struct ibv_cq_init_attr_ex * cq_attr) { uhyve_ibv_create_cq_ex_t uhyve_args; uhyve_args.context = context; - uhyve_args.cq_attr = cq_attr; + uhyve_args.cq_attr = (struct ibv_cq_init_attr_ex *) guest_to_host((size_t) cq_attr); uhyve_send(UHYVE_PORT_IBV_CREATE_CQ_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1360,7 +1364,7 @@ int ibv_poll_cq(struct ibv_cq * cq, int num_entries, struct ibv_wc * wc) { uhyve_ibv_poll_cq_t uhyve_args; uhyve_args.cq = cq; uhyve_args.num_entries = num_entries; - uhyve_args.wc = wc; + uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc); uhyve_send(UHYVE_PORT_IBV_POLL_CQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1406,7 +1410,7 @@ typedef struct { struct ibv_srq * ibv_create_srq(struct ibv_pd * pd, struct ibv_srq_init_attr * srq_init_attr) { uhyve_ibv_create_srq_t uhyve_args; uhyve_args.pd = pd; - uhyve_args.srq_init_attr = srq_init_attr; + uhyve_args.srq_init_attr = (struct ibv_srq_init_attr *) guest_to_host((size_t) srq_init_attr); uhyve_send(UHYVE_PORT_IBV_CREATE_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1429,7 +1433,7 @@ typedef struct { struct ibv_srq * ibv_create_srq_ex(struct ibv_context * context, struct ibv_srq_init_attr_ex * srq_init_attr_ex) { uhyve_ibv_create_srq_ex_t uhyve_args; uhyve_args.context = context; - uhyve_args.srq_init_attr_ex = srq_init_attr_ex; + uhyve_args.srq_init_attr_ex = (struct ibv_srq_init_attr_ex *) guest_to_host((size_t) srq_init_attr_ex); uhyve_send(UHYVE_PORT_IBV_CREATE_SRQ_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1453,7 +1457,7 @@ typedef struct { int ibv_modify_srq(struct ibv_srq * srq, struct ibv_srq_attr * srq_attr, int srq_attr_mask) { uhyve_ibv_modify_srq_t uhyve_args; uhyve_args.srq = srq; - uhyve_args.srq_attr = srq_attr; + uhyve_args.srq_attr = (struct ibv_srq_attr *) guest_to_host((size_t) srq_attr); uhyve_args.srq_attr_mask = srq_attr_mask; uhyve_send(UHYVE_PORT_IBV_MODIFY_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1477,7 +1481,7 @@ typedef struct { int ibv_query_srq(struct ibv_srq * srq, struct ibv_srq_attr * srq_attr) { uhyve_ibv_query_srq_t uhyve_args; uhyve_args.srq = srq; - uhyve_args.srq_attr = srq_attr; + uhyve_args.srq_attr = (struct ibv_srq_attr *) guest_to_host((size_t) srq_attr); uhyve_send(UHYVE_PORT_IBV_QUERY_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1569,7 +1573,7 @@ typedef struct { struct ibv_qp * ibv_create_qp(struct ibv_pd * pd, struct ibv_qp_init_attr * qp_init_attr) { uhyve_ibv_create_qp_t uhyve_args; uhyve_args.pd = pd; - uhyve_args.qp_init_attr = qp_init_attr; + uhyve_args.qp_init_attr = (struct ibv_qp_init_attr *) guest_to_host((size_t) qp_init_attr); uhyve_send(UHYVE_PORT_IBV_CREATE_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1592,7 +1596,7 @@ typedef struct { struct ibv_qp * ibv_create_qp_ex(struct ibv_context * context, struct ibv_qp_init_attr_ex * qp_init_attr_ex) { uhyve_ibv_create_qp_ex_t uhyve_args; uhyve_args.context = context; - uhyve_args.qp_init_attr_ex = qp_init_attr_ex; + uhyve_args.qp_init_attr_ex = (struct ibv_qp_init_attr_ex *) guest_to_host((size_t) qp_init_attr_ex); uhyve_send(UHYVE_PORT_IBV_CREATE_QP_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1615,7 +1619,7 @@ typedef struct { int ibv_query_rt_values_ex(struct ibv_context * context, struct ibv_values_ex * values) { uhyve_ibv_query_rt_values_ex_t uhyve_args; uhyve_args.context = context; - uhyve_args.values = values; + uhyve_args.values = (struct ibv_values_ex *) guest_to_host((size_t) values); uhyve_send(UHYVE_PORT_IBV_QUERY_RT_VALUES_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1640,7 +1644,7 @@ int ibv_query_device_ex(struct ibv_context * context, const struct ibv_query_dev uhyve_ibv_query_device_ex_t uhyve_args; uhyve_args.context = context; uhyve_args.input = input; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_device_attr_ex *) guest_to_host((size_t) attr); uhyve_send(UHYVE_PORT_IBV_QUERY_DEVICE_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1663,7 +1667,7 @@ typedef struct { struct ibv_qp * ibv_open_qp(struct ibv_context * context, struct ibv_qp_open_attr * qp_open_attr) { uhyve_ibv_open_qp_t uhyve_args; uhyve_args.context = context; - uhyve_args.qp_open_attr = qp_open_attr; + uhyve_args.qp_open_attr = (struct ibv_qp_open_attr *) guest_to_host((size_t) qp_open_attr); uhyve_send(UHYVE_PORT_IBV_OPEN_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1687,7 +1691,7 @@ typedef struct { int ibv_modify_qp(struct ibv_qp * qp, struct ibv_qp_attr * attr, int attr_mask) { uhyve_ibv_modify_qp_t uhyve_args; uhyve_args.qp = qp; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_qp_attr *) guest_to_host((size_t) attr); uhyve_args.attr_mask = attr_mask; uhyve_send(UHYVE_PORT_IBV_MODIFY_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1713,9 +1717,9 @@ typedef struct { int ibv_query_qp(struct ibv_qp * qp, struct ibv_qp_attr * attr, int attr_mask, struct ibv_qp_init_attr * init_attr) { uhyve_ibv_query_qp_t uhyve_args; uhyve_args.qp = qp; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_qp_attr *) guest_to_host((size_t) attr); uhyve_args.attr_mask = attr_mask; - uhyve_args.init_attr = init_attr; + uhyve_args.init_attr = (struct ibv_qp_init_attr *) guest_to_host((size_t) init_attr); uhyve_send(UHYVE_PORT_IBV_QUERY_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1759,7 +1763,7 @@ typedef struct { struct ibv_wq * ibv_create_wq(struct ibv_context * context, struct ibv_wq_init_attr * wq_init_attr) { uhyve_ibv_create_wq_t uhyve_args; uhyve_args.context = context; - uhyve_args.wq_init_attr = wq_init_attr; + uhyve_args.wq_init_attr = (struct ibv_wq_init_attr *) guest_to_host((size_t) wq_init_attr); uhyve_send(UHYVE_PORT_IBV_CREATE_WQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1782,7 +1786,7 @@ typedef struct { int ibv_modify_wq(struct ibv_wq * wq, struct ibv_wq_attr * wq_attr) { uhyve_ibv_modify_wq_t uhyve_args; uhyve_args.wq = wq; - uhyve_args.wq_attr = wq_attr; + uhyve_args.wq_attr = (struct ibv_wq_attr *) guest_to_host((size_t) wq_attr); uhyve_send(UHYVE_PORT_IBV_MODIFY_WQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1868,14 +1872,58 @@ typedef struct { int ret; } __attribute__((packed)) uhyve_ibv_post_send_t; -int ibv_post_send(struct ibv_qp * qp, struct ibv_send_wr * wr, struct ibv_send_wr ** bad_wr) { +int ibv_post_send(struct ibv_qp * qp, struct ibv_send_wr * wr, struct ibv_send_wr ** bad_wr) { // !!! uhyve_ibv_post_send_t uhyve_args; uhyve_args.qp = qp; - uhyve_args.wr = wr; + uhyve_args.wr = (struct ibv_send_wr *) guest_to_host((size_t) wr); // TODO: Take care of ** parameter. + bool is_rdma = wr->opcode == IBV_WR_RDMA_WRITE || + wr->opcode == IBV_WR_RDMA_WRITE_WITH_IMM || + wr->opcode == IBV_WR_RDMA_READ; + bool is_atomic = wr->opcode == IBV_WR_ATOMIC_CMP_AND_SWP || + wr->opcode == IBV_WR_ATOMIC_FETCH_AND_ADD; + bool is_bind_mw = wr->opcode == IBV_WR_BIND_MW; + bool is_tso = wr->opcode == IBV_WR_TSO; + + // union wr: rdma and atomic + uint64_t wr__wr__rdma__remote_addr; + uint64_t wr__wr__atomic__remote_addr; + if (is_rdma) { + wr__wr__rdma__remote_addr = wr->wr.rdma.remote_addr; + wr->wr.rdma.remote_addr = (uint64_t) guest_to_host((size_t) wr->wr.rdma.remote_addr); + } else if (is_atomic) { + wr__wr__atomic__remote_addr = wr->wr.atomic.remote_addr; + wr->wr.atomic.remote_addr = (uint64_t) guest_to_host((size_t) wr->wr.atomic.remote_addr); + } + + // union: bind_mw and tso + uint64_t wr__bind_mw__bind_info__addr; + void * wr__tso__hdr; + if (is_bind_mw) { + wr__bind_mw__bind_info__addr = wr->bind_mw.bind_info.addr; + wr->bind_mw.bind_info.addr = (uint64_t) guest_to_host((size_t) wr->bind_mw.bind_info.addr); + } else if (is_tso) { + wr__tso__hdr = wr->tso.hdr; + wr->tso.hdr = (void *) guest_to_host((size_t) wr->tso.hdr); + } + uhyve_send(UHYVE_PORT_IBV_POST_SEND, (unsigned) virt_to_phys((size_t) &uhyve_args)); + // union: bind_mw and tso + if (is_bind_mw) { + wr->bind_mw.bind_info.addr = wr__bind_mw__bind_info__addr; + } else if (is_tso) { + wr->tso.hdr = wr__tso__hdr; + } + + // union wr: rdma and atomic + if (is_rdma) { + wr->wr.rdma.remote_addr = wr__wr__rdma__remote_addr; + } else if (is_atomic) { + wr->wr.atomic.remote_addr = wr__wr__atomic__remote_addr; + } + return uhyve_args.ret; } @@ -1920,7 +1968,7 @@ typedef struct { struct ibv_ah * ibv_create_ah(struct ibv_pd * pd, struct ibv_ah_attr * attr) { uhyve_ibv_create_ah_t uhyve_args; uhyve_args.pd = pd; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_ah_attr *) guest_to_host((size_t) attr); uhyve_send(UHYVE_PORT_IBV_CREATE_AH, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1947,9 +1995,9 @@ int ibv_init_ah_from_wc(struct ibv_context * context, uint8_t port_num, struct i uhyve_ibv_init_ah_from_wc_t uhyve_args; uhyve_args.context = context; uhyve_args.port_num = port_num; - uhyve_args.wc = wc; - uhyve_args.grh = grh; - uhyve_args.ah_attr = ah_attr; + uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc); + uhyve_args.grh = (struct ibv_grh *) guest_to_host((size_t) grh); + uhyve_args.ah_attr = (struct ibv_ah_attr *) guest_to_host((size_t) ah_attr); uhyve_send(UHYVE_PORT_IBV_INIT_AH_FROM_WC, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1974,8 +2022,8 @@ typedef struct { struct ibv_ah * ibv_create_ah_from_wc(struct ibv_pd * pd, struct ibv_wc * wc, struct ibv_grh * grh, uint8_t port_num) { uhyve_ibv_create_ah_from_wc_t uhyve_args; uhyve_args.pd = pd; - uhyve_args.wc = wc; - uhyve_args.grh = grh; + uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc); + uhyve_args.grh = (struct ibv_grh *) guest_to_host((size_t) grh); uhyve_args.port_num = port_num; uhyve_send(UHYVE_PORT_IBV_CREATE_AH_FROM_WC, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -2156,7 +2204,7 @@ typedef struct { int ibv_resolve_eth_l2_from_gid(struct ibv_context * context, struct ibv_ah_attr * attr, uint8_t [6] eth_mac, uint16_t * vid) { uhyve_ibv_resolve_eth_l2_from_gid_t uhyve_args; uhyve_args.context = context; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_ah_attr *) guest_to_host((size_t) attr); uhyve_args.eth_mac = eth_mac; uhyve_args.vid = vid; @@ -2189,7 +2237,6 @@ int ibv_is_qpt_supported(uint32_t caps, enum ibv_qp_type qpt) { } - /* * IBV KERNEL LOG */ diff --git a/mm/malloc.c b/mm/malloc.c index 0718eb62a..9f722549f 100644 --- a/mm/malloc.c +++ b/mm/malloc.c @@ -201,6 +201,42 @@ void* create_stack(size_t sz) return (void*) (viraddr+PAGE_SIZE); } +void* create_ib_pool_stack(size_t sz) +{ + size_t phyaddr, viraddr, bits; + uint32_t npages = PAGE_CEIL(sz) >> PAGE_BITS; + int err; + + LOG_DEBUG("create_stack(0x%zx) (%u pages)\n", DEFAULT_STACK_SIZE, npages); + + if (BUILTIN_EXPECT(!sz, 0)) + return NULL; + + // get free virtual address space + viraddr = vma_alloc((npages+2)*PAGE_SIZE, VMA_READ|VMA_WRITE|VMA_CACHEABLE); + if (BUILTIN_EXPECT(!viraddr, 0)) + return NULL; + + // get continous physical pages + phyaddr = get_pages(npages); + if (BUILTIN_EXPECT(!phyaddr, 0)) { + vma_free(viraddr, viraddr+(npages+2)*PAGE_SIZE); + return NULL; + } + + bits = PG_RW|PG_GLOBAL|PG_NX; + + // map physical pages to VMA + err = page_map(viraddr+PAGE_SIZE, phyaddr, npages, bits); + if (BUILTIN_EXPECT(err, 0)) { + vma_free(viraddr, viraddr+(npages+2)*PAGE_SIZE); + put_pages(phyaddr, npages); + return NULL; + } + + return (void*) (viraddr+PAGE_SIZE); +} + int destroy_stack(void* viraddr, size_t sz) { size_t phyaddr; diff --git a/tools/ibv_code_generator/GEN-kernel.c b/tools/ibv_code_generator/GEN-kernel.c index e27cd95bd..4a9a69d84 100644 --- a/tools/ibv_code_generator/GEN-kernel.c +++ b/tools/ibv_code_generator/GEN-kernel.c @@ -139,7 +139,7 @@ typedef struct { int ibv_start_poll(struct ibv_cq_ex * cq, struct ibv_poll_cq_attr * attr) { uhyve_ibv_start_poll_t uhyve_args; uhyve_args.cq = cq; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_poll_cq_attr *) guest_to_host((size_t) attr); uhyve_send(UHYVE_PORT_IBV_START_POLL, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -662,7 +662,7 @@ typedef struct { int ibv_get_async_event(struct ibv_context * context, struct ibv_async_event * event) { uhyve_ibv_get_async_event_t uhyve_args; uhyve_args.context = context; - uhyve_args.event = event; + uhyve_args.event = (struct ibv_async_event *) guest_to_host((size_t) event); uhyve_send(UHYVE_PORT_IBV_GET_ASYNC_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -681,7 +681,7 @@ typedef struct { void ibv_ack_async_event(struct ibv_async_event * event) { uhyve_ibv_ack_async_event_t uhyve_args; - uhyve_args.event = event; + uhyve_args.event = (struct ibv_async_event *) guest_to_host((size_t) event); uhyve_send(UHYVE_PORT_IBV_ACK_ASYNC_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args)); } @@ -702,7 +702,7 @@ typedef struct { int ibv_query_device(struct ibv_context * context, struct ibv_device_attr * device_attr) { uhyve_ibv_query_device_t uhyve_args; uhyve_args.context = context; - uhyve_args.device_attr = device_attr; + uhyve_args.device_attr = (struct ibv_device_attr *) guest_to_host((size_t) device_attr); uhyve_send(UHYVE_PORT_IBV_QUERY_DEVICE, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -727,7 +727,7 @@ int ibv_query_port(struct ibv_context * context, uint8_t port_num, struct ibv_po uhyve_ibv_query_port_t uhyve_args; uhyve_args.context = context; uhyve_args.port_num = port_num; - uhyve_args.port_attr = port_attr; + uhyve_args.port_attr = (struct ibv_port_attr *) guest_to_host((size_t) port_attr); uhyve_send(UHYVE_PORT_IBV_QUERY_PORT, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -752,7 +752,7 @@ int ___ibv_query_port(struct ibv_context * context, uint8_t port_num, struct ibv uhyve____ibv_query_port_t uhyve_args; uhyve_args.context = context; uhyve_args.port_num = port_num; - uhyve_args.port_attr = port_attr; + uhyve_args.port_attr = (struct ibv_port_attr *) guest_to_host((size_t) port_attr); uhyve_send(UHYVE_PORT____IBV_QUERY_PORT, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -871,7 +871,7 @@ typedef struct { struct ibv_flow * ibv_create_flow(struct ibv_qp * qp, struct ibv_flow_attr * flow) { uhyve_ibv_create_flow_t uhyve_args; uhyve_args.qp = qp; - uhyve_args.flow = flow; + uhyve_args.flow = (struct ibv_flow_attr *) guest_to_host((size_t) flow); uhyve_send(UHYVE_PORT_IBV_CREATE_FLOW, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1105,7 +1105,7 @@ int ibv_bind_mw(struct ibv_qp * qp, struct ibv_mw * mw, struct ibv_mw_bind * mw_ uhyve_ibv_bind_mw_t uhyve_args; uhyve_args.qp = qp; uhyve_args.mw = mw; - uhyve_args.mw_bind = mw_bind; + uhyve_args.mw_bind = (struct ibv_mw_bind *) guest_to_host((size_t) mw_bind); uhyve_send(UHYVE_PORT_IBV_BIND_MW, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1199,7 +1199,7 @@ typedef struct { struct ibv_cq_ex * ibv_create_cq_ex(struct ibv_context * context, struct ibv_cq_init_attr_ex * cq_attr) { uhyve_ibv_create_cq_ex_t uhyve_args; uhyve_args.context = context; - uhyve_args.cq_attr = cq_attr; + uhyve_args.cq_attr = (struct ibv_cq_init_attr_ex *) guest_to_host((size_t) cq_attr); uhyve_send(UHYVE_PORT_IBV_CREATE_CQ_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1312,7 +1312,7 @@ int ibv_poll_cq(struct ibv_cq * cq, int num_entries, struct ibv_wc * wc) { uhyve_ibv_poll_cq_t uhyve_args; uhyve_args.cq = cq; uhyve_args.num_entries = num_entries; - uhyve_args.wc = wc; + uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc); uhyve_send(UHYVE_PORT_IBV_POLL_CQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1358,7 +1358,7 @@ typedef struct { struct ibv_srq * ibv_create_srq(struct ibv_pd * pd, struct ibv_srq_init_attr * srq_init_attr) { uhyve_ibv_create_srq_t uhyve_args; uhyve_args.pd = pd; - uhyve_args.srq_init_attr = srq_init_attr; + uhyve_args.srq_init_attr = (struct ibv_srq_init_attr *) guest_to_host((size_t) srq_init_attr); uhyve_send(UHYVE_PORT_IBV_CREATE_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1381,7 +1381,7 @@ typedef struct { struct ibv_srq * ibv_create_srq_ex(struct ibv_context * context, struct ibv_srq_init_attr_ex * srq_init_attr_ex) { uhyve_ibv_create_srq_ex_t uhyve_args; uhyve_args.context = context; - uhyve_args.srq_init_attr_ex = srq_init_attr_ex; + uhyve_args.srq_init_attr_ex = (struct ibv_srq_init_attr_ex *) guest_to_host((size_t) srq_init_attr_ex); uhyve_send(UHYVE_PORT_IBV_CREATE_SRQ_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1405,7 +1405,7 @@ typedef struct { int ibv_modify_srq(struct ibv_srq * srq, struct ibv_srq_attr * srq_attr, int srq_attr_mask) { uhyve_ibv_modify_srq_t uhyve_args; uhyve_args.srq = srq; - uhyve_args.srq_attr = srq_attr; + uhyve_args.srq_attr = (struct ibv_srq_attr *) guest_to_host((size_t) srq_attr); uhyve_args.srq_attr_mask = srq_attr_mask; uhyve_send(UHYVE_PORT_IBV_MODIFY_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1429,7 +1429,7 @@ typedef struct { int ibv_query_srq(struct ibv_srq * srq, struct ibv_srq_attr * srq_attr) { uhyve_ibv_query_srq_t uhyve_args; uhyve_args.srq = srq; - uhyve_args.srq_attr = srq_attr; + uhyve_args.srq_attr = (struct ibv_srq_attr *) guest_to_host((size_t) srq_attr); uhyve_send(UHYVE_PORT_IBV_QUERY_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1521,7 +1521,7 @@ typedef struct { struct ibv_qp * ibv_create_qp(struct ibv_pd * pd, struct ibv_qp_init_attr * qp_init_attr) { uhyve_ibv_create_qp_t uhyve_args; uhyve_args.pd = pd; - uhyve_args.qp_init_attr = qp_init_attr; + uhyve_args.qp_init_attr = (struct ibv_qp_init_attr *) guest_to_host((size_t) qp_init_attr); uhyve_send(UHYVE_PORT_IBV_CREATE_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1544,7 +1544,7 @@ typedef struct { struct ibv_qp * ibv_create_qp_ex(struct ibv_context * context, struct ibv_qp_init_attr_ex * qp_init_attr_ex) { uhyve_ibv_create_qp_ex_t uhyve_args; uhyve_args.context = context; - uhyve_args.qp_init_attr_ex = qp_init_attr_ex; + uhyve_args.qp_init_attr_ex = (struct ibv_qp_init_attr_ex *) guest_to_host((size_t) qp_init_attr_ex); uhyve_send(UHYVE_PORT_IBV_CREATE_QP_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1567,7 +1567,7 @@ typedef struct { int ibv_query_rt_values_ex(struct ibv_context * context, struct ibv_values_ex * values) { uhyve_ibv_query_rt_values_ex_t uhyve_args; uhyve_args.context = context; - uhyve_args.values = values; + uhyve_args.values = (struct ibv_values_ex *) guest_to_host((size_t) values); uhyve_send(UHYVE_PORT_IBV_QUERY_RT_VALUES_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1592,7 +1592,7 @@ int ibv_query_device_ex(struct ibv_context * context, const struct ibv_query_dev uhyve_ibv_query_device_ex_t uhyve_args; uhyve_args.context = context; uhyve_args.input = input; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_device_attr_ex *) guest_to_host((size_t) attr); uhyve_send(UHYVE_PORT_IBV_QUERY_DEVICE_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1615,7 +1615,7 @@ typedef struct { struct ibv_qp * ibv_open_qp(struct ibv_context * context, struct ibv_qp_open_attr * qp_open_attr) { uhyve_ibv_open_qp_t uhyve_args; uhyve_args.context = context; - uhyve_args.qp_open_attr = qp_open_attr; + uhyve_args.qp_open_attr = (struct ibv_qp_open_attr *) guest_to_host((size_t) qp_open_attr); uhyve_send(UHYVE_PORT_IBV_OPEN_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1639,7 +1639,7 @@ typedef struct { int ibv_modify_qp(struct ibv_qp * qp, struct ibv_qp_attr * attr, int attr_mask) { uhyve_ibv_modify_qp_t uhyve_args; uhyve_args.qp = qp; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_qp_attr *) guest_to_host((size_t) attr); uhyve_args.attr_mask = attr_mask; uhyve_send(UHYVE_PORT_IBV_MODIFY_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1665,9 +1665,9 @@ typedef struct { int ibv_query_qp(struct ibv_qp * qp, struct ibv_qp_attr * attr, int attr_mask, struct ibv_qp_init_attr * init_attr) { uhyve_ibv_query_qp_t uhyve_args; uhyve_args.qp = qp; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_qp_attr *) guest_to_host((size_t) attr); uhyve_args.attr_mask = attr_mask; - uhyve_args.init_attr = init_attr; + uhyve_args.init_attr = (struct ibv_qp_init_attr *) guest_to_host((size_t) init_attr); uhyve_send(UHYVE_PORT_IBV_QUERY_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1711,7 +1711,7 @@ typedef struct { struct ibv_wq * ibv_create_wq(struct ibv_context * context, struct ibv_wq_init_attr * wq_init_attr) { uhyve_ibv_create_wq_t uhyve_args; uhyve_args.context = context; - uhyve_args.wq_init_attr = wq_init_attr; + uhyve_args.wq_init_attr = (struct ibv_wq_init_attr *) guest_to_host((size_t) wq_init_attr); uhyve_send(UHYVE_PORT_IBV_CREATE_WQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1734,7 +1734,7 @@ typedef struct { int ibv_modify_wq(struct ibv_wq * wq, struct ibv_wq_attr * wq_attr) { uhyve_ibv_modify_wq_t uhyve_args; uhyve_args.wq = wq; - uhyve_args.wq_attr = wq_attr; + uhyve_args.wq_attr = (struct ibv_wq_attr *) guest_to_host((size_t) wq_attr); uhyve_send(UHYVE_PORT_IBV_MODIFY_WQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1872,7 +1872,7 @@ typedef struct { struct ibv_ah * ibv_create_ah(struct ibv_pd * pd, struct ibv_ah_attr * attr) { uhyve_ibv_create_ah_t uhyve_args; uhyve_args.pd = pd; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_ah_attr *) guest_to_host((size_t) attr); uhyve_send(UHYVE_PORT_IBV_CREATE_AH, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1899,9 +1899,9 @@ int ibv_init_ah_from_wc(struct ibv_context * context, uint8_t port_num, struct i uhyve_ibv_init_ah_from_wc_t uhyve_args; uhyve_args.context = context; uhyve_args.port_num = port_num; - uhyve_args.wc = wc; - uhyve_args.grh = grh; - uhyve_args.ah_attr = ah_attr; + uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc); + uhyve_args.grh = (struct ibv_grh *) guest_to_host((size_t) grh); + uhyve_args.ah_attr = (struct ibv_ah_attr *) guest_to_host((size_t) ah_attr); uhyve_send(UHYVE_PORT_IBV_INIT_AH_FROM_WC, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -1926,8 +1926,8 @@ typedef struct { struct ibv_ah * ibv_create_ah_from_wc(struct ibv_pd * pd, struct ibv_wc * wc, struct ibv_grh * grh, uint8_t port_num) { uhyve_ibv_create_ah_from_wc_t uhyve_args; uhyve_args.pd = pd; - uhyve_args.wc = wc; - uhyve_args.grh = grh; + uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc); + uhyve_args.grh = (struct ibv_grh *) guest_to_host((size_t) grh); uhyve_args.port_num = port_num; uhyve_send(UHYVE_PORT_IBV_CREATE_AH_FROM_WC, (unsigned) virt_to_phys((size_t) &uhyve_args)); @@ -2108,7 +2108,7 @@ typedef struct { int ibv_resolve_eth_l2_from_gid(struct ibv_context * context, struct ibv_ah_attr * attr, uint8_t [6] eth_mac, uint16_t * vid) { uhyve_ibv_resolve_eth_l2_from_gid_t uhyve_args; uhyve_args.context = context; - uhyve_args.attr = attr; + uhyve_args.attr = (struct ibv_ah_attr *) guest_to_host((size_t) attr); uhyve_args.eth_mac = eth_mac; uhyve_args.vid = vid; diff --git a/tools/ibv_code_generator/GEN-tools-uhyve-ibv-ports.h b/tools/ibv_code_generator/GEN-tools-uhyve-ibv-ports.h index 422ff7974..69f6bbfdc 100644 --- a/tools/ibv_code_generator/GEN-tools-uhyve-ibv-ports.h +++ b/tools/ibv_code_generator/GEN-tools-uhyve-ibv-ports.h @@ -1,100 +1,100 @@ typedef enum { - UHYVE_PORT_SET_IB_POOL_ADDR = 0x60F, - UHYVE_PORT_IBV_WC_STATUS_STR = 0x610, - UHYVE_PORT_IBV_RATE_TO_MULT = 0x611, - UHYVE_PORT_MULT_TO_IBV_RATE = 0x612, - UHYVE_PORT_IBV_RATE_TO_MBPS = 0x613, - UHYVE_PORT_MBPS_TO_IBV_RATE = 0x614, - UHYVE_PORT_IBV_CQ_EX_TO_CQ = 0x615, - UHYVE_PORT_IBV_START_POLL = 0x616, - UHYVE_PORT_IBV_NEXT_POLL = 0x617, - UHYVE_PORT_IBV_END_POLL = 0x618, - UHYVE_PORT_IBV_WC_READ_OPCODE = 0x619, - UHYVE_PORT_IBV_WC_READ_VENDOR_ERR = 0x61A, - UHYVE_PORT_IBV_WC_READ_BYTE_LEN = 0x61B, - UHYVE_PORT_IBV_WC_READ_IMM_DATA = 0x61C, + UHYVE_PORT_SET_IB_POOL_ADDR = 0x60F, + UHYVE_PORT_IBV_WC_STATUS_STR = 0x610, + UHYVE_PORT_IBV_RATE_TO_MULT = 0x611, + UHYVE_PORT_MULT_TO_IBV_RATE = 0x612, + UHYVE_PORT_IBV_RATE_TO_MBPS = 0x613, + UHYVE_PORT_MBPS_TO_IBV_RATE = 0x614, + UHYVE_PORT_IBV_CQ_EX_TO_CQ = 0x615, + UHYVE_PORT_IBV_START_POLL = 0x616, + UHYVE_PORT_IBV_NEXT_POLL = 0x617, + UHYVE_PORT_IBV_END_POLL = 0x618, + UHYVE_PORT_IBV_WC_READ_OPCODE = 0x619, + UHYVE_PORT_IBV_WC_READ_VENDOR_ERR = 0x61A, + UHYVE_PORT_IBV_WC_READ_BYTE_LEN = 0x61B, + UHYVE_PORT_IBV_WC_READ_IMM_DATA = 0x61C, UHYVE_PORT_IBV_WC_READ_INVALIDATED_RKEY = 0x61D, - UHYVE_PORT_IBV_WC_READ_QP_NUM = 0x61E, - UHYVE_PORT_IBV_WC_READ_SRC_QP = 0x61F, - UHYVE_PORT_IBV_WC_READ_WC_FLAGS = 0x620, - UHYVE_PORT_IBV_WC_READ_SLID = 0x621, - UHYVE_PORT_IBV_WC_READ_SL = 0x622, - UHYVE_PORT_IBV_WC_READ_DLID_PATH_BITS = 0x623, - UHYVE_PORT_IBV_WC_READ_COMPLETION_TS = 0x624, - UHYVE_PORT_IBV_WC_READ_CVLAN = 0x625, - UHYVE_PORT_IBV_WC_READ_FLOW_TAG = 0x626, - UHYVE_PORT_IBV_POST_WQ_RECV = 0x627, - UHYVE_PORT_VERBS_GET_CTX = 0x628, - UHYVE_PORT_IBV_GET_DEVICE_LIST = 0x629, - UHYVE_PORT_IBV_FREE_DEVICE_LIST = 0x62A, - UHYVE_PORT_IBV_GET_DEVICE_NAME = 0x62B, - UHYVE_PORT_IBV_GET_DEVICE_GUID = 0x62C, - UHYVE_PORT_IBV_OPEN_DEVICE = 0x62D, - UHYVE_PORT_IBV_CLOSE_DEVICE = 0x62E, - UHYVE_PORT_IBV_GET_ASYNC_EVENT = 0x62F, - UHYVE_PORT_IBV_ACK_ASYNC_EVENT = 0x630, - UHYVE_PORT_IBV_QUERY_DEVICE = 0x631, - UHYVE_PORT_IBV_QUERY_PORT = 0x632, - UHYVE_PORT____IBV_QUERY_PORT = 0x633, - UHYVE_PORT_IBV_QUERY_GID = 0x634, - UHYVE_PORT_IBV_QUERY_PKEY = 0x635, - UHYVE_PORT_IBV_ALLOC_PD = 0x636, - UHYVE_PORT_IBV_DEALLOC_PD = 0x637, - UHYVE_PORT_IBV_CREATE_FLOW = 0x638, - UHYVE_PORT_IBV_DESTROY_FLOW = 0x639, - UHYVE_PORT_IBV_OPEN_XRCD = 0x63A, - UHYVE_PORT_IBV_CLOSE_XRCD = 0x63B, - UHYVE_PORT_IBV_REG_MR = 0x63C, - UHYVE_PORT_IBV_REREG_MR = 0x63D, - UHYVE_PORT_IBV_DEREG_MR = 0x63E, - UHYVE_PORT_IBV_ALLOC_MW = 0x63F, - UHYVE_PORT_IBV_DEALLOC_MW = 0x640, - UHYVE_PORT_IBV_INC_RKEY = 0x641, - UHYVE_PORT_IBV_BIND_MW = 0x642, - UHYVE_PORT_IBV_CREATE_COMP_CHANNEL = 0x643, - UHYVE_PORT_IBV_DESTROY_COMP_CHANNEL = 0x644, - UHYVE_PORT_IBV_CREATE_CQ = 0x645, - UHYVE_PORT_IBV_CREATE_CQ_EX = 0x646, - UHYVE_PORT_IBV_RESIZE_CQ = 0x647, - UHYVE_PORT_IBV_DESTROY_CQ = 0x648, - UHYVE_PORT_IBV_GET_CQ_EVENT = 0x649, - UHYVE_PORT_IBV_ACK_CQ_EVENTS = 0x64A, - UHYVE_PORT_IBV_POLL_CQ = 0x64B, - UHYVE_PORT_IBV_REQ_NOTIFY_CQ = 0x64C, - UHYVE_PORT_IBV_CREATE_SRQ = 0x64D, - UHYVE_PORT_IBV_CREATE_SRQ_EX = 0x64E, - UHYVE_PORT_IBV_MODIFY_SRQ = 0x64F, - UHYVE_PORT_IBV_QUERY_SRQ = 0x650, - UHYVE_PORT_IBV_GET_SRQ_NUM = 0x651, - UHYVE_PORT_IBV_DESTROY_SRQ = 0x652, - UHYVE_PORT_IBV_POST_SRQ_RECV = 0x653, - UHYVE_PORT_IBV_CREATE_QP = 0x654, - UHYVE_PORT_IBV_CREATE_QP_EX = 0x655, - UHYVE_PORT_IBV_QUERY_RT_VALUES_EX = 0x656, - UHYVE_PORT_IBV_QUERY_DEVICE_EX = 0x657, - UHYVE_PORT_IBV_OPEN_QP = 0x658, - UHYVE_PORT_IBV_MODIFY_QP = 0x659, - UHYVE_PORT_IBV_QUERY_QP = 0x65A, - UHYVE_PORT_IBV_DESTROY_QP = 0x65B, - UHYVE_PORT_IBV_CREATE_WQ = 0x65C, - UHYVE_PORT_IBV_MODIFY_WQ = 0x65D, - UHYVE_PORT_IBV_DESTROY_WQ = 0x65E, - UHYVE_PORT_IBV_CREATE_RWQ_IND_TABLE = 0x65F, - UHYVE_PORT_IBV_DESTROY_RWQ_IND_TABLE = 0x660, - UHYVE_PORT_IBV_POST_SEND = 0x661, - UHYVE_PORT_IBV_POST_RECV = 0x662, - UHYVE_PORT_IBV_CREATE_AH = 0x663, - UHYVE_PORT_IBV_INIT_AH_FROM_WC = 0x664, - UHYVE_PORT_IBV_CREATE_AH_FROM_WC = 0x665, - UHYVE_PORT_IBV_DESTROY_AH = 0x666, - UHYVE_PORT_IBV_ATTACH_MCAST = 0x667, - UHYVE_PORT_IBV_DETACH_MCAST = 0x668, - UHYVE_PORT_IBV_FORK_INIT = 0x669, - UHYVE_PORT_IBV_NODE_TYPE_STR = 0x66A, - UHYVE_PORT_IBV_PORT_STATE_STR = 0x66B, - UHYVE_PORT_IBV_EVENT_TYPE_STR = 0x66C, - UHYVE_PORT_IBV_RESOLVE_ETH_L2_FROM_GID = 0x66D, - UHYVE_PORT_IBV_IS_QPT_SUPPORTED = 0x66E, + UHYVE_PORT_IBV_WC_READ_QP_NUM = 0x61E, + UHYVE_PORT_IBV_WC_READ_SRC_QP = 0x61F, + UHYVE_PORT_IBV_WC_READ_WC_FLAGS = 0x620, + UHYVE_PORT_IBV_WC_READ_SLID = 0x621, + UHYVE_PORT_IBV_WC_READ_SL = 0x622, + UHYVE_PORT_IBV_WC_READ_DLID_PATH_BITS = 0x623, + UHYVE_PORT_IBV_WC_READ_COMPLETION_TS = 0x624, + UHYVE_PORT_IBV_WC_READ_CVLAN = 0x625, + UHYVE_PORT_IBV_WC_READ_FLOW_TAG = 0x626, + UHYVE_PORT_IBV_POST_WQ_RECV = 0x627, + UHYVE_PORT_VERBS_GET_CTX = 0x628, + UHYVE_PORT_IBV_GET_DEVICE_LIST = 0x629, + UHYVE_PORT_IBV_FREE_DEVICE_LIST = 0x62A, + UHYVE_PORT_IBV_GET_DEVICE_NAME = 0x62B, + UHYVE_PORT_IBV_GET_DEVICE_GUID = 0x62C, + UHYVE_PORT_IBV_OPEN_DEVICE = 0x62D, + UHYVE_PORT_IBV_CLOSE_DEVICE = 0x62E, + UHYVE_PORT_IBV_GET_ASYNC_EVENT = 0x62F, + UHYVE_PORT_IBV_ACK_ASYNC_EVENT = 0x630, + UHYVE_PORT_IBV_QUERY_DEVICE = 0x631, + UHYVE_PORT_IBV_QUERY_PORT = 0x632, + UHYVE_PORT____IBV_QUERY_PORT = 0x633, + UHYVE_PORT_IBV_QUERY_GID = 0x634, + UHYVE_PORT_IBV_QUERY_PKEY = 0x635, + UHYVE_PORT_IBV_ALLOC_PD = 0x636, + UHYVE_PORT_IBV_DEALLOC_PD = 0x637, + UHYVE_PORT_IBV_CREATE_FLOW = 0x638, + UHYVE_PORT_IBV_DESTROY_FLOW = 0x639, + UHYVE_PORT_IBV_OPEN_XRCD = 0x63A, + UHYVE_PORT_IBV_CLOSE_XRCD = 0x63B, + UHYVE_PORT_IBV_REG_MR = 0x63C, + UHYVE_PORT_IBV_REREG_MR = 0x63D, + UHYVE_PORT_IBV_DEREG_MR = 0x63E, + UHYVE_PORT_IBV_ALLOC_MW = 0x63F, + UHYVE_PORT_IBV_DEALLOC_MW = 0x640, + UHYVE_PORT_IBV_INC_RKEY = 0x641, + UHYVE_PORT_IBV_BIND_MW = 0x642, + UHYVE_PORT_IBV_CREATE_COMP_CHANNEL = 0x643, + UHYVE_PORT_IBV_DESTROY_COMP_CHANNEL = 0x644, + UHYVE_PORT_IBV_CREATE_CQ = 0x645, + UHYVE_PORT_IBV_CREATE_CQ_EX = 0x646, + UHYVE_PORT_IBV_RESIZE_CQ = 0x647, + UHYVE_PORT_IBV_DESTROY_CQ = 0x648, + UHYVE_PORT_IBV_GET_CQ_EVENT = 0x649, + UHYVE_PORT_IBV_ACK_CQ_EVENTS = 0x64A, + UHYVE_PORT_IBV_POLL_CQ = 0x64B, + UHYVE_PORT_IBV_REQ_NOTIFY_CQ = 0x64C, + UHYVE_PORT_IBV_CREATE_SRQ = 0x64D, + UHYVE_PORT_IBV_CREATE_SRQ_EX = 0x64E, + UHYVE_PORT_IBV_MODIFY_SRQ = 0x64F, + UHYVE_PORT_IBV_QUERY_SRQ = 0x650, + UHYVE_PORT_IBV_GET_SRQ_NUM = 0x651, + UHYVE_PORT_IBV_DESTROY_SRQ = 0x652, + UHYVE_PORT_IBV_POST_SRQ_RECV = 0x653, + UHYVE_PORT_IBV_CREATE_QP = 0x654, + UHYVE_PORT_IBV_CREATE_QP_EX = 0x655, + UHYVE_PORT_IBV_QUERY_RT_VALUES_EX = 0x656, + UHYVE_PORT_IBV_QUERY_DEVICE_EX = 0x657, + UHYVE_PORT_IBV_OPEN_QP = 0x658, + UHYVE_PORT_IBV_MODIFY_QP = 0x659, + UHYVE_PORT_IBV_QUERY_QP = 0x65A, + UHYVE_PORT_IBV_DESTROY_QP = 0x65B, + UHYVE_PORT_IBV_CREATE_WQ = 0x65C, + UHYVE_PORT_IBV_MODIFY_WQ = 0x65D, + UHYVE_PORT_IBV_DESTROY_WQ = 0x65E, + UHYVE_PORT_IBV_CREATE_RWQ_IND_TABLE = 0x65F, + UHYVE_PORT_IBV_DESTROY_RWQ_IND_TABLE = 0x660, + UHYVE_PORT_IBV_POST_SEND = 0x661, + UHYVE_PORT_IBV_POST_RECV = 0x662, + UHYVE_PORT_IBV_CREATE_AH = 0x663, + UHYVE_PORT_IBV_INIT_AH_FROM_WC = 0x664, + UHYVE_PORT_IBV_CREATE_AH_FROM_WC = 0x665, + UHYVE_PORT_IBV_DESTROY_AH = 0x666, + UHYVE_PORT_IBV_ATTACH_MCAST = 0x667, + UHYVE_PORT_IBV_DETACH_MCAST = 0x668, + UHYVE_PORT_IBV_FORK_INIT = 0x669, + UHYVE_PORT_IBV_NODE_TYPE_STR = 0x66A, + UHYVE_PORT_IBV_PORT_STATE_STR = 0x66B, + UHYVE_PORT_IBV_EVENT_TYPE_STR = 0x66C, + UHYVE_PORT_IBV_RESOLVE_ETH_L2_FROM_GID = 0x66D, + UHYVE_PORT_IBV_IS_QPT_SUPPORTED = 0x66E, } uhyve_ibv_t; typedef struct { diff --git a/tools/ibv_code_generator/generate-code.py b/tools/ibv_code_generator/generate-code.py index a4e9a3a70..da35640e6 100755 --- a/tools/ibv_code_generator/generate-code.py +++ b/tools/ibv_code_generator/generate-code.py @@ -109,6 +109,52 @@ PORT_NUMBER_START = 0x610 TABS = ["", "\t", "\t\t", "\t\t\t", "\t\t\t\t"] NEWLINES = ["", "\n", "\n\n"] +params_in_guest_mem = ['struct ibv_device_attr', + 'struct ibv_device_attr_ex', + 'struct ibv_port_attr', + 'struct ibv_ah_attr', + 'struct ibv_srq_attr', + 'struct ibv_wq_attr', + 'struct ibv_qp_attr', + 'struct ibv_poll_cq_attr', + 'struct ibv_flow_attr', + 'struct ibv_global_route', + 'struct ibv_packet_pacing_caps', + 'struct ibv_qp_cap', + 'struct ibv_odp_caps', + 'struct ibv_tso_caps', + 'struct ibv_rss_caps', + 'struct ibv_flow_eth_filter', + 'struct ibv_flow_spec_eth', + 'struct ibv_flow_ipv4_filter', + 'struct ibv_flow_spec_ipv4', + 'struct ibv_flow_ipv4_ext_filter', + 'struct ibv_flow_spec_ipv4_ext', + 'struct ibv_flow_ipv6_filter', + 'struct ibv_flow_spec_ipv6', + 'struct ibv_flow_tcp_udp_filter', + 'struct ibv_flow_spec_tcp_udp', + 'struct ibv_flow_tunnel_filter', + 'struct ibv_flow_spec_tunnel', + 'struct ibv_flow_spec_action_tag', + 'struct ibv_flow_spec_action_drop', + 'struct ibv_query_device_ex_input', + 'struct ibv_wc', + 'struct ibv_grh', + 'struct ibv_mw_bind', + 'struct ibv_flow_spec', + 'struct ibv_values_ex', + # containing ib pool pointers: + 'struct ibv_wq_init_attr', + 'struct ibv_qp_init_attr', + 'struct ibv_qp_init_attr_ex', + 'struct ibv_srq_init_attr_ex', + 'struct ibv_srq_init_attr', + 'struct ibv_qp_open_attr', + 'struct ibv_cq_init_attr_ex', + 'struct ibv_async_event'] + + class Type: def __init__(self, string): ts = string @@ -124,7 +170,7 @@ class Type: def get_struct_name(self): name = "" - if is_struct(): + if self.is_struct(): name = self.type_components[1] return name @@ -149,8 +195,6 @@ class FunctionParameter: components = string.split(" ") type_string = " ".join(components[:-1]) - # print("string in FunctionParameter: ", string) - self.type = Type(type_string) self.name = components[-1] @@ -202,7 +246,7 @@ class FunctionPrototype: return code def generate_function_declaration(self): - return "{} {}({});\n".format(self.ret.type_string, self.function_name, + return "{} {}({});\n".format(self.ret.type_string, self.function_name, self.get_string_of_parameters()) def get_string_of_parameters(self): @@ -258,11 +302,18 @@ def generate_kernel_function(function_prototype): code = "{0} {1}({2}) {{\n".format(ret_type.type_string, fnc_name, comma_separated_params) code += "\t{0} uhyve_args;\n".format(function_prototype.get_args_struct_name()) + # uhyve_args.attr = (struct ibv_poll_cq_attr *) guest_to_host((size_t) attr); + for p in params or []: if p.is_pointer_pointer(): code += "\t// TODO: Take care of ** parameter.\n" else: - code += "\tuhyve_args.{0} = {0};\n".format(p.name) + # print (p.get_struct_name()) + if 'struct ' + p.get_struct_name() in params_in_guest_mem and p.is_pointer(): + code += "\tuhyve_args.{0} = ({1}) guest_to_host((size_t) {0});\n".format( + p.name, p.type.type_string) + else: + code += "\tuhyve_args.{0} = {0};\n".format(p.name) code += "\n" code += "\tuhyve_send({0}, (unsigned) virt_to_phys((size_t) &uhyve_args));\n".format(port_name) @@ -272,17 +323,6 @@ def generate_kernel_function(function_prototype): return code - # case UHYVE_PORT_SET_IB_POOL_ADDR: - # printf("LOG: UHYVE CASE\n"); - # unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); - # uint64_t * temp = (uint64_t*)(guest_mem + data); - # /* printf("LOG: Value of uint64 pool start: %" PRIu64 "\n", *temp); */ - # printf("LOG: Value of uint64 pool start: %p\n", *temp); - # ib_pool_addr = (uint8_t*) *temp; - # /* printf("LOG: Value of uint8 pool start: %" PRIu8 "\n", ib_pool_addr); */ - # printf("LOG: Value of uint8 pool start: %p\n", ib_pool_addr); - # ib_pool_top = ib_pool_addr; - # break; def generate_uhyve_cases(function_prototypes): """ Generates all switch-cases for uhyve's KVM exit IO.