From 7082c820e598ef78efb72aca8ed89a89601bd19b Mon Sep 17 00:00:00 2001 From: Annika Wierichs Date: Fri, 27 Oct 2017 15:16:54 +0200 Subject: [PATCH] Finished code generator including clean up and documentation. --- .../GEN_include_hermit_stddef.h | 96 ++ .../{ibv_gen.c => GEN_kernel_ibv.c} | 121 +++ .../ibv_code_generator/GEN_tools_uhyve-ibv.h | 97 ++ tools/ibv_code_generator/GEN_tools_uhyve.c | 855 ++++++++++++++++++ tools/ibv_code_generator/generate_code.py | 330 +++++++ tools/ibv_code_generator/kernel_api.py | 121 --- tools/ibv_code_generator/uhyve_handler.py | 0 7 files changed, 1499 insertions(+), 121 deletions(-) create mode 100644 tools/ibv_code_generator/GEN_include_hermit_stddef.h rename tools/ibv_code_generator/{ibv_gen.c => GEN_kernel_ibv.c} (99%) create mode 100644 tools/ibv_code_generator/GEN_tools_uhyve-ibv.h create mode 100644 tools/ibv_code_generator/GEN_tools_uhyve.c create mode 100755 tools/ibv_code_generator/generate_code.py delete mode 100755 tools/ibv_code_generator/kernel_api.py delete mode 100644 tools/ibv_code_generator/uhyve_handler.py diff --git a/tools/ibv_code_generator/GEN_include_hermit_stddef.h b/tools/ibv_code_generator/GEN_include_hermit_stddef.h new file mode 100644 index 000000000..763714f59 --- /dev/null +++ b/tools/ibv_code_generator/GEN_include_hermit_stddef.h @@ -0,0 +1,96 @@ + +#define UHYVE_PORT_IBV_WC_STATUS_STR 0x510, +#define UHYVE_PORT_IBV_RATE_TO_MULT 0x511, +#define UHYVE_PORT_MULT_TO_IBV_RATE 0x512, +#define UHYVE_PORT_IBV_RATE_TO_MBPS 0x513, +#define UHYVE_PORT_MBPS_TO_IBV_RATE 0x514, +#define UHYVE_PORT_IBV_CQ_EX_TO_CQ 0x515, +#define UHYVE_PORT_IBV_START_POLL 0x516, +#define UHYVE_PORT_IBV_NEXT_POLL 0x517, +#define UHYVE_PORT_IBV_END_POLL 0x518, +#define UHYVE_PORT_IBV_WC_READ_OPCODE 0x519, +#define UHYVE_PORT_IBV_WC_READ_VENDOR_ERR 0x51A, +#define UHYVE_PORT_IBV_WC_READ_BYTE_LEN 0x51B, +#define UHYVE_PORT_IBV_WC_READ_IMM_DATA 0x51C, +#define UHYVE_PORT_IBV_WC_READ_INVALIDATED_RKEY 0x51D, +#define UHYVE_PORT_IBV_WC_READ_QP_NUM 0x51E, +#define UHYVE_PORT_IBV_WC_READ_SRC_QP 0x51F, +#define UHYVE_PORT_IBV_WC_READ_WC_FLAGS 0x520, +#define UHYVE_PORT_IBV_WC_READ_SLID 0x521, +#define UHYVE_PORT_IBV_WC_READ_SL 0x522, +#define UHYVE_PORT_IBV_WC_READ_DLID_PATH_BITS 0x523, +#define UHYVE_PORT_IBV_WC_READ_COMPLETION_TS 0x524, +#define UHYVE_PORT_IBV_WC_READ_CVLAN 0x525, +#define UHYVE_PORT_IBV_WC_READ_FLOW_TAG 0x526, +#define UHYVE_PORT_IBV_POST_WQ_RECV 0x527, +#define UHYVE_PORT_VERBS_GET_CTX 0x528, +#define UHYVE_PORT_IBV_GET_DEVICE_LIST 0x529, +#define UHYVE_PORT_IBV_FREE_DEVICE_LIST 0x52A, +#define UHYVE_PORT_IBV_GET_DEVICE_NAME 0x52B, +#define UHYVE_PORT_IBV_GET_DEVICE_GUID 0x52C, +#define UHYVE_PORT_IBV_OPEN_DEVICE 0x52D, +#define UHYVE_PORT_IBV_CLOSE_DEVICE 0x52E, +#define UHYVE_PORT_IBV_GET_ASYNC_EVENT 0x52F, +#define UHYVE_PORT_IBV_ACK_ASYNC_EVENT 0x530, +#define UHYVE_PORT_IBV_QUERY_DEVICE 0x531, +#define UHYVE_PORT_IBV_QUERY_PORT 0x532, +#define UHYVE_PORT____IBV_QUERY_PORT 0x533, +#define UHYVE_PORT_IBV_QUERY_GID 0x534, +#define UHYVE_PORT_IBV_QUERY_PKEY 0x535, +#define UHYVE_PORT_IBV_ALLOC_PD 0x536, +#define UHYVE_PORT_IBV_DEALLOC_PD 0x537, +#define UHYVE_PORT_IBV_CREATE_FLOW 0x538, +#define UHYVE_PORT_IBV_DESTROY_FLOW 0x539, +#define UHYVE_PORT_IBV_OPEN_XRCD 0x53A, +#define UHYVE_PORT_IBV_CLOSE_XRCD 0x53B, +#define UHYVE_PORT_IBV_REG_MR 0x53C, +#define UHYVE_PORT_IBV_REREG_MR 0x53D, +#define UHYVE_PORT_IBV_DEREG_MR 0x53E, +#define UHYVE_PORT_IBV_ALLOC_MW 0x53F, +#define UHYVE_PORT_IBV_DEALLOC_MW 0x540, +#define UHYVE_PORT_IBV_INC_RKEY 0x541, +#define UHYVE_PORT_IBV_BIND_MW 0x542, +#define UHYVE_PORT_IBV_CREATE_COMP_CHANNEL 0x543, +#define UHYVE_PORT_IBV_DESTROY_COMP_CHANNEL 0x544, +#define UHYVE_PORT_IBV_CREATE_CQ 0x545, +#define UHYVE_PORT_IBV_CREATE_CQ_EX 0x546, +#define UHYVE_PORT_IBV_RESIZE_CQ 0x547, +#define UHYVE_PORT_IBV_DESTROY_CQ 0x548, +#define UHYVE_PORT_IBV_GET_CQ_EVENT 0x549, +#define UHYVE_PORT_IBV_ACK_CQ_EVENTS 0x54A, +#define UHYVE_PORT_IBV_POLL_CQ 0x54B, +#define UHYVE_PORT_IBV_REQ_NOTIFY_CQ 0x54C, +#define UHYVE_PORT_IBV_CREATE_SRQ 0x54D, +#define UHYVE_PORT_IBV_CREATE_SRQ_EX 0x54E, +#define UHYVE_PORT_IBV_MODIFY_SRQ 0x54F, +#define UHYVE_PORT_IBV_QUERY_SRQ 0x550, +#define UHYVE_PORT_IBV_GET_SRQ_NUM 0x551, +#define UHYVE_PORT_IBV_DESTROY_SRQ 0x552, +#define UHYVE_PORT_IBV_POST_SRQ_RECV 0x553, +#define UHYVE_PORT_IBV_CREATE_QP 0x554, +#define UHYVE_PORT_IBV_CREATE_QP_EX 0x555, +#define UHYVE_PORT_IBV_QUERY_RT_VALUES_EX 0x556, +#define UHYVE_PORT_IBV_QUERY_DEVICE_EX 0x557, +#define UHYVE_PORT_IBV_OPEN_QP 0x558, +#define UHYVE_PORT_IBV_MODIFY_QP 0x559, +#define UHYVE_PORT_IBV_QUERY_QP 0x55A, +#define UHYVE_PORT_IBV_DESTROY_QP 0x55B, +#define UHYVE_PORT_IBV_CREATE_WQ 0x55C, +#define UHYVE_PORT_IBV_MODIFY_WQ 0x55D, +#define UHYVE_PORT_IBV_DESTROY_WQ 0x55E, +#define UHYVE_PORT_IBV_CREATE_RWQ_IND_TABLE 0x55F, +#define UHYVE_PORT_IBV_DESTROY_RWQ_IND_TABLE 0x560, +#define UHYVE_PORT_IBV_POST_SEND 0x561, +#define UHYVE_PORT_IBV_POST_RECV 0x562, +#define UHYVE_PORT_IBV_CREATE_AH 0x563, +#define UHYVE_PORT_IBV_INIT_AH_FROM_WC 0x564, +#define UHYVE_PORT_IBV_CREATE_AH_FROM_WC 0x565, +#define UHYVE_PORT_IBV_DESTROY_AH 0x566, +#define UHYVE_PORT_IBV_ATTACH_MCAST 0x567, +#define UHYVE_PORT_IBV_DETACH_MCAST 0x568, +#define UHYVE_PORT_IBV_FORK_INIT 0x569, +#define UHYVE_PORT_IBV_NODE_TYPE_STR 0x56A, +#define UHYVE_PORT_IBV_PORT_STATE_STR 0x56B, +#define UHYVE_PORT_IBV_EVENT_TYPE_STR 0x56C, +#define UHYVE_PORT_IBV_RESOLVE_ETH_L2_FROM_GID 0x56D, +#define UHYVE_PORT_IBV_IS_QPT_SUPPORTED 0x56E, \ No newline at end of file diff --git a/tools/ibv_code_generator/ibv_gen.c b/tools/ibv_code_generator/GEN_kernel_ibv.c similarity index 99% rename from tools/ibv_code_generator/ibv_gen.c rename to tools/ibv_code_generator/GEN_kernel_ibv.c index 3f54b3fa6..b80a43ba9 100644 --- a/tools/ibv_code_generator/ibv_gen.c +++ b/tools/ibv_code_generator/GEN_kernel_ibv.c @@ -8,7 +8,9 @@ typedef struct { const char * ibv_wc_status_str(enum ibv_wc_status status) { uhyve_ibv_wc_status_str_t uhyve_args; uhyve_args->status = status; + uhyve_args->ret = kmalloc(sizeof(const char)); + uhyve_send(UHYVE_PORT_IBV_WC_STATUS_STR, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -26,6 +28,7 @@ typedef struct { int ibv_rate_to_mult(enum ibv_rate rate) { uhyve_ibv_rate_to_mult_t uhyve_args; uhyve_args->rate = rate; + uhyve_send(UHYVE_PORT_IBV_RATE_TO_MULT, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -43,6 +46,7 @@ typedef struct { enum ibv_rate mult_to_ibv_rate(int mult) { uhyve_mult_to_ibv_rate_t uhyve_args; uhyve_args->mult = mult; + uhyve_send(UHYVE_PORT_MULT_TO_IBV_RATE, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -60,6 +64,7 @@ typedef struct { int ibv_rate_to_mbps(enum ibv_rate rate) { uhyve_ibv_rate_to_mbps_t uhyve_args; uhyve_args->rate = rate; + uhyve_send(UHYVE_PORT_IBV_RATE_TO_MBPS, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -77,6 +82,7 @@ typedef struct { enum ibv_rate mbps_to_ibv_rate(int mbps) { uhyve_mbps_to_ibv_rate_t uhyve_args; uhyve_args->mbps = mbps; + uhyve_send(UHYVE_PORT_MBPS_TO_IBV_RATE, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -94,7 +100,9 @@ typedef struct { struct ibv_cq * ibv_cq_ex_to_cq(struct ibv_cq_ex * cq) { uhyve_ibv_cq_ex_to_cq_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_args->ret = kmalloc(sizeof(struct ibv_cq)); + uhyve_send(UHYVE_PORT_IBV_CQ_EX_TO_CQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -114,6 +122,7 @@ 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 = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); uhyve_args->attr = (struct ibv_poll_cq_attr *) virt_to_phys((size_t) attr); + uhyve_send(UHYVE_PORT_IBV_START_POLL, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -131,6 +140,7 @@ typedef struct { int ibv_next_poll(struct ibv_cq_ex * cq) { uhyve_ibv_next_poll_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_NEXT_POLL, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -148,6 +158,7 @@ typedef struct { void ibv_end_poll(struct ibv_cq_ex * cq) { uhyve_ibv_end_poll_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_END_POLL, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -165,6 +176,7 @@ typedef struct { enum ibv_wc_opcode ibv_wc_read_opcode(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_opcode_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_OPCODE, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -182,6 +194,7 @@ typedef struct { uint32_t ibv_wc_read_vendor_err(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_vendor_err_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_VENDOR_ERR, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -199,6 +212,7 @@ typedef struct { uint32_t ibv_wc_read_byte_len(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_byte_len_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_BYTE_LEN, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -216,6 +230,7 @@ typedef struct { __be32 ibv_wc_read_imm_data(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_imm_data_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_IMM_DATA, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -233,6 +248,7 @@ typedef struct { uint32_t ibv_wc_read_invalidated_rkey(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_invalidated_rkey_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_INVALIDATED_RKEY, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -250,6 +266,7 @@ typedef struct { uint32_t ibv_wc_read_qp_num(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_qp_num_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_QP_NUM, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -267,6 +284,7 @@ typedef struct { uint32_t ibv_wc_read_src_qp(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_src_qp_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_SRC_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -284,6 +302,7 @@ typedef struct { int ibv_wc_read_wc_flags(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_wc_flags_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_WC_FLAGS, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -301,6 +320,7 @@ typedef struct { uint32_t ibv_wc_read_slid(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_slid_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_SLID, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -318,6 +338,7 @@ typedef struct { uint8_t ibv_wc_read_sl(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_sl_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_SL, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -335,6 +356,7 @@ typedef struct { uint8_t ibv_wc_read_dlid_path_bits(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_dlid_path_bits_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_DLID_PATH_BITS, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -352,6 +374,7 @@ typedef struct { uint64_t ibv_wc_read_completion_ts(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_completion_ts_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_COMPLETION_TS, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -369,6 +392,7 @@ typedef struct { uint16_t ibv_wc_read_cvlan(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_cvlan_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_CVLAN, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -386,6 +410,7 @@ typedef struct { uint32_t ibv_wc_read_flow_tag(struct ibv_cq_ex * cq) { uhyve_ibv_wc_read_flow_tag_t uhyve_args; uhyve_args->cq = (struct ibv_cq_ex *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_WC_READ_FLOW_TAG, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -407,6 +432,7 @@ int ibv_post_wq_recv(struct ibv_wq * wq, struct ibv_recv_wr * recv_wr, struct ib uhyve_args->wq = (struct ibv_wq *) virt_to_phys((size_t) wq); uhyve_args->recv_wr = (struct ibv_recv_wr *) virt_to_phys((size_t) recv_wr); // TODO: Take care of ** parameter. + uhyve_send(UHYVE_PORT_IBV_POST_WQ_RECV, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -424,7 +450,9 @@ typedef struct { struct verbs_context * verbs_get_ctx(struct ibv_context * ctx) { uhyve_verbs_get_ctx_t uhyve_args; uhyve_args->ctx = (struct ibv_context *) virt_to_phys((size_t) ctx); + uhyve_args->ret = kmalloc(sizeof(struct verbs_context)); + uhyve_send(UHYVE_PORT_VERBS_GET_CTX, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -442,7 +470,9 @@ typedef struct { struct ibv_device ** ibv_get_device_list(int * num_devices) { uhyve_ibv_get_device_list_t uhyve_args; uhyve_args->num_devices = (int *) virt_to_phys((size_t) num_devices); + // TODO: Take care of return value. + uhyve_send(UHYVE_PORT_IBV_GET_DEVICE_LIST, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -460,6 +490,7 @@ typedef struct { void ibv_free_device_list(struct ibv_device ** list) { uhyve_ibv_free_device_list_t uhyve_args; // TODO: Take care of ** parameter. + uhyve_send(UHYVE_PORT_IBV_FREE_DEVICE_LIST, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -477,7 +508,9 @@ typedef struct { const char * ibv_get_device_name(struct ibv_device * device) { uhyve_ibv_get_device_name_t uhyve_args; uhyve_args->device = (struct ibv_device *) virt_to_phys((size_t) device); + uhyve_args->ret = kmalloc(sizeof(const char)); + uhyve_send(UHYVE_PORT_IBV_GET_DEVICE_NAME, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -495,6 +528,7 @@ typedef struct { __be64 ibv_get_device_guid(struct ibv_device * device) { uhyve_ibv_get_device_guid_t uhyve_args; uhyve_args->device = (struct ibv_device *) virt_to_phys((size_t) device); + uhyve_send(UHYVE_PORT_IBV_GET_DEVICE_GUID, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -512,7 +546,9 @@ typedef struct { struct ibv_context * ibv_open_device(struct ibv_device * device) { uhyve_ibv_open_device_t uhyve_args; uhyve_args->device = (struct ibv_device *) virt_to_phys((size_t) device); + uhyve_args->ret = kmalloc(sizeof(struct ibv_context)); + uhyve_send(UHYVE_PORT_IBV_OPEN_DEVICE, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -530,6 +566,7 @@ typedef struct { int ibv_close_device(struct ibv_context * context) { uhyve_ibv_close_device_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); + uhyve_send(UHYVE_PORT_IBV_CLOSE_DEVICE, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -549,6 +586,7 @@ int ibv_get_async_event(struct ibv_context * context, struct ibv_async_event * e uhyve_ibv_get_async_event_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->event = (struct ibv_async_event *) virt_to_phys((size_t) event); + uhyve_send(UHYVE_PORT_IBV_GET_ASYNC_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -566,6 +604,7 @@ typedef struct { void ibv_ack_async_event(struct ibv_async_event * event) { uhyve_ibv_ack_async_event_t uhyve_args; uhyve_args->event = (struct ibv_async_event *) virt_to_phys((size_t) event); + uhyve_send(UHYVE_PORT_IBV_ACK_ASYNC_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -585,6 +624,7 @@ int ibv_query_device(struct ibv_context * context, struct ibv_device_attr * devi uhyve_ibv_query_device_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->device_attr = (struct ibv_device_attr *) virt_to_phys((size_t) device_attr); + uhyve_send(UHYVE_PORT_IBV_QUERY_DEVICE, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -606,6 +646,7 @@ int ibv_query_port(struct ibv_context * context, uint8_t port_num, struct ibv_po uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->port_num = port_num; uhyve_args->port_attr = (struct ibv_port_attr *) virt_to_phys((size_t) port_attr); + uhyve_send(UHYVE_PORT_IBV_QUERY_PORT, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -627,6 +668,7 @@ int ___ibv_query_port(struct ibv_context * context, uint8_t port_num, struct ibv uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->port_num = port_num; uhyve_args->port_attr = (struct ibv_port_attr *) virt_to_phys((size_t) port_attr); + uhyve_send(UHYVE_PORT____IBV_QUERY_PORT, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -650,6 +692,7 @@ int ibv_query_gid(struct ibv_context * context, uint8_t port_num, int index, uni uhyve_args->port_num = port_num; uhyve_args->index = index; uhyve_args->gid = (union ibv_gid *) virt_to_phys((size_t) gid); + uhyve_send(UHYVE_PORT_IBV_QUERY_GID, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -673,6 +716,7 @@ int ibv_query_pkey(struct ibv_context * context, uint8_t port_num, int index, __ uhyve_args->port_num = port_num; uhyve_args->index = index; uhyve_args->pkey = (__be16 *) virt_to_phys((size_t) pkey); + uhyve_send(UHYVE_PORT_IBV_QUERY_PKEY, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -690,7 +734,9 @@ typedef struct { struct ibv_pd * ibv_alloc_pd(struct ibv_context * context) { uhyve_ibv_alloc_pd_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); + uhyve_args->ret = kmalloc(sizeof(struct ibv_pd)); + uhyve_send(UHYVE_PORT_IBV_ALLOC_PD, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -708,6 +754,7 @@ typedef struct { int ibv_dealloc_pd(struct ibv_pd * pd) { uhyve_ibv_dealloc_pd_t uhyve_args; uhyve_args->pd = (struct ibv_pd *) virt_to_phys((size_t) pd); + uhyve_send(UHYVE_PORT_IBV_DEALLOC_PD, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -727,7 +774,9 @@ struct ibv_flow * ibv_create_flow(struct ibv_qp * qp, struct ibv_flow_attr * flo uhyve_ibv_create_flow_t uhyve_args; uhyve_args->qp = (struct ibv_qp *) virt_to_phys((size_t) qp); uhyve_args->flow = (struct ibv_flow_attr *) virt_to_phys((size_t) flow); + uhyve_args->ret = kmalloc(sizeof(struct ibv_flow)); + uhyve_send(UHYVE_PORT_IBV_CREATE_FLOW, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -745,6 +794,7 @@ typedef struct { int ibv_destroy_flow(struct ibv_flow * flow_id) { uhyve_ibv_destroy_flow_t uhyve_args; uhyve_args->flow_id = (struct ibv_flow *) virt_to_phys((size_t) flow_id); + uhyve_send(UHYVE_PORT_IBV_DESTROY_FLOW, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -764,7 +814,9 @@ struct ibv_xrcd * ibv_open_xrcd(struct ibv_context * context, struct ibv_xrcd_in uhyve_ibv_open_xrcd_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->xrcd_init_attr = (struct ibv_xrcd_init_attr *) virt_to_phys((size_t) xrcd_init_attr); + uhyve_args->ret = kmalloc(sizeof(struct ibv_xrcd)); + uhyve_send(UHYVE_PORT_IBV_OPEN_XRCD, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -782,6 +834,7 @@ typedef struct { int ibv_close_xrcd(struct ibv_xrcd * xrcd) { uhyve_ibv_close_xrcd_t uhyve_args; uhyve_args->xrcd = (struct ibv_xrcd *) virt_to_phys((size_t) xrcd); + uhyve_send(UHYVE_PORT_IBV_CLOSE_XRCD, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -805,7 +858,9 @@ struct ibv_mr * ibv_reg_mr(struct ibv_pd * pd, void * addr, int length, int acce uhyve_args->addr = (void *) virt_to_phys((size_t) addr); uhyve_args->length = length; uhyve_args->access = access; + uhyve_args->ret = kmalloc(sizeof(struct ibv_mr)); + uhyve_send(UHYVE_PORT_IBV_REG_MR, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -833,6 +888,7 @@ int ibv_rereg_mr(struct ibv_mr * mr, int flags, struct ibv_pd * pd, void * addr, uhyve_args->addr = (void *) virt_to_phys((size_t) addr); uhyve_args->length = length; uhyve_args->access = access; + uhyve_send(UHYVE_PORT_IBV_REREG_MR, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -850,6 +906,7 @@ typedef struct { int ibv_dereg_mr(struct ibv_mr * mr) { uhyve_ibv_dereg_mr_t uhyve_args; uhyve_args->mr = (struct ibv_mr *) virt_to_phys((size_t) mr); + uhyve_send(UHYVE_PORT_IBV_DEREG_MR, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -869,7 +926,9 @@ struct ibv_mw * ibv_alloc_mw(struct ibv_pd * pd, enum ibv_mw_type type) { uhyve_ibv_alloc_mw_t uhyve_args; uhyve_args->pd = (struct ibv_pd *) virt_to_phys((size_t) pd); uhyve_args->type = type; + uhyve_args->ret = kmalloc(sizeof(struct ibv_mw)); + uhyve_send(UHYVE_PORT_IBV_ALLOC_MW, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -887,6 +946,7 @@ typedef struct { int ibv_dealloc_mw(struct ibv_mw * mw) { uhyve_ibv_dealloc_mw_t uhyve_args; uhyve_args->mw = (struct ibv_mw *) virt_to_phys((size_t) mw); + uhyve_send(UHYVE_PORT_IBV_DEALLOC_MW, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -904,6 +964,7 @@ typedef struct { uint32_t ibv_inc_rkey(uint32_t rkey) { uhyve_ibv_inc_rkey_t uhyve_args; uhyve_args->rkey = rkey; + uhyve_send(UHYVE_PORT_IBV_INC_RKEY, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -925,6 +986,7 @@ int ibv_bind_mw(struct ibv_qp * qp, struct ibv_mw * mw, struct ibv_mw_bind * mw_ uhyve_args->qp = (struct ibv_qp *) virt_to_phys((size_t) qp); uhyve_args->mw = (struct ibv_mw *) virt_to_phys((size_t) mw); uhyve_args->mw_bind = (struct ibv_mw_bind *) virt_to_phys((size_t) mw_bind); + uhyve_send(UHYVE_PORT_IBV_BIND_MW, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -942,7 +1004,9 @@ typedef struct { struct ibv_comp_channel * ibv_create_comp_channel(struct ibv_context * context) { uhyve_ibv_create_comp_channel_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); + uhyve_args->ret = kmalloc(sizeof(struct ibv_comp_channel)); + uhyve_send(UHYVE_PORT_IBV_CREATE_COMP_CHANNEL, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -960,6 +1024,7 @@ typedef struct { int ibv_destroy_comp_channel(struct ibv_comp_channel * channel) { uhyve_ibv_destroy_comp_channel_t uhyve_args; uhyve_args->channel = (struct ibv_comp_channel *) virt_to_phys((size_t) channel); + uhyve_send(UHYVE_PORT_IBV_DESTROY_COMP_CHANNEL, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -985,7 +1050,9 @@ struct ibv_cq * ibv_create_cq(struct ibv_context * context, int cqe, void * cq_c uhyve_args->cq_context = (void *) virt_to_phys((size_t) cq_context); uhyve_args->channel = (struct ibv_comp_channel *) virt_to_phys((size_t) channel); uhyve_args->comp_vector = comp_vector; + uhyve_args->ret = kmalloc(sizeof(struct ibv_cq)); + uhyve_send(UHYVE_PORT_IBV_CREATE_CQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1005,7 +1072,9 @@ struct ibv_cq_ex * ibv_create_cq_ex(struct ibv_context * context, struct ibv_cq_ uhyve_ibv_create_cq_ex_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->cq_attr = (struct ibv_cq_init_attr_ex *) virt_to_phys((size_t) cq_attr); + uhyve_args->ret = kmalloc(sizeof(struct ibv_cq_ex)); + uhyve_send(UHYVE_PORT_IBV_CREATE_CQ_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1025,6 +1094,7 @@ int ibv_resize_cq(struct ibv_cq * cq, int cqe) { uhyve_ibv_resize_cq_t uhyve_args; uhyve_args->cq = (struct ibv_cq *) virt_to_phys((size_t) cq); uhyve_args->cqe = cqe; + uhyve_send(UHYVE_PORT_IBV_RESIZE_CQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1042,6 +1112,7 @@ typedef struct { int ibv_destroy_cq(struct ibv_cq * cq) { uhyve_ibv_destroy_cq_t uhyve_args; uhyve_args->cq = (struct ibv_cq *) virt_to_phys((size_t) cq); + uhyve_send(UHYVE_PORT_IBV_DESTROY_CQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1063,6 +1134,7 @@ int ibv_get_cq_event(struct ibv_comp_channel * channel, struct ibv_cq ** cq, voi uhyve_args->channel = (struct ibv_comp_channel *) virt_to_phys((size_t) channel); // TODO: Take care of ** parameter. // TODO: Take care of ** parameter. + uhyve_send(UHYVE_PORT_IBV_GET_CQ_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1082,6 +1154,7 @@ void ibv_ack_cq_events(struct ibv_cq * cq, unsigned int nevents) { uhyve_ibv_ack_cq_events_t uhyve_args; uhyve_args->cq = (struct ibv_cq *) virt_to_phys((size_t) cq); uhyve_args->nevents = nevents; + uhyve_send(UHYVE_PORT_IBV_ACK_CQ_EVENTS, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1103,6 +1176,7 @@ int ibv_poll_cq(struct ibv_cq * cq, int num_entries, struct ibv_wc * wc) { uhyve_args->cq = (struct ibv_cq *) virt_to_phys((size_t) cq); uhyve_args->num_entries = num_entries; uhyve_args->wc = (struct ibv_wc *) virt_to_phys((size_t) wc); + uhyve_send(UHYVE_PORT_IBV_POLL_CQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1122,6 +1196,7 @@ int ibv_req_notify_cq(struct ibv_cq * cq, int solicited_only) { uhyve_ibv_req_notify_cq_t uhyve_args; uhyve_args->cq = (struct ibv_cq *) virt_to_phys((size_t) cq); uhyve_args->solicited_only = solicited_only; + uhyve_send(UHYVE_PORT_IBV_REQ_NOTIFY_CQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1141,7 +1216,9 @@ struct ibv_srq * ibv_create_srq(struct ibv_pd * pd, struct ibv_srq_init_attr * s uhyve_ibv_create_srq_t uhyve_args; uhyve_args->pd = (struct ibv_pd *) virt_to_phys((size_t) pd); uhyve_args->srq_init_attr = (struct ibv_srq_init_attr *) virt_to_phys((size_t) srq_init_attr); + uhyve_args->ret = kmalloc(sizeof(struct ibv_srq)); + uhyve_send(UHYVE_PORT_IBV_CREATE_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1161,7 +1238,9 @@ struct ibv_srq * ibv_create_srq_ex(struct ibv_context * context, struct ibv_srq_ uhyve_ibv_create_srq_ex_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->srq_init_attr_ex = (struct ibv_srq_init_attr_ex *) virt_to_phys((size_t) srq_init_attr_ex); + uhyve_args->ret = kmalloc(sizeof(struct ibv_srq)); + uhyve_send(UHYVE_PORT_IBV_CREATE_SRQ_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1183,6 +1262,7 @@ int ibv_modify_srq(struct ibv_srq * srq, struct ibv_srq_attr * srq_attr, int srq uhyve_args->srq = (struct ibv_srq *) virt_to_phys((size_t) srq); uhyve_args->srq_attr = (struct ibv_srq_attr *) virt_to_phys((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)); // TODO: Fix pointers in returned data structures. @@ -1202,6 +1282,7 @@ int ibv_query_srq(struct ibv_srq * srq, struct ibv_srq_attr * srq_attr) { uhyve_ibv_query_srq_t uhyve_args; uhyve_args->srq = (struct ibv_srq *) virt_to_phys((size_t) srq); uhyve_args->srq_attr = (struct ibv_srq_attr *) virt_to_phys((size_t) srq_attr); + uhyve_send(UHYVE_PORT_IBV_QUERY_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1221,6 +1302,7 @@ int ibv_get_srq_num(struct ibv_srq * srq, uint32_t * srq_num) { uhyve_ibv_get_srq_num_t uhyve_args; uhyve_args->srq = (struct ibv_srq *) virt_to_phys((size_t) srq); uhyve_args->srq_num = (uint32_t *) virt_to_phys((size_t) srq_num); + uhyve_send(UHYVE_PORT_IBV_GET_SRQ_NUM, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1238,6 +1320,7 @@ typedef struct { int ibv_destroy_srq(struct ibv_srq * srq) { uhyve_ibv_destroy_srq_t uhyve_args; uhyve_args->srq = (struct ibv_srq *) virt_to_phys((size_t) srq); + uhyve_send(UHYVE_PORT_IBV_DESTROY_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1259,6 +1342,7 @@ int ibv_post_srq_recv(struct ibv_srq * srq, struct ibv_recv_wr * recv_wr, struct uhyve_args->srq = (struct ibv_srq *) virt_to_phys((size_t) srq); uhyve_args->recv_wr = (struct ibv_recv_wr *) virt_to_phys((size_t) recv_wr); // TODO: Take care of ** parameter. + uhyve_send(UHYVE_PORT_IBV_POST_SRQ_RECV, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1278,7 +1362,9 @@ struct ibv_qp * ibv_create_qp(struct ibv_pd * pd, struct ibv_qp_init_attr * qp_i uhyve_ibv_create_qp_t uhyve_args; uhyve_args->pd = (struct ibv_pd *) virt_to_phys((size_t) pd); uhyve_args->qp_init_attr = (struct ibv_qp_init_attr *) virt_to_phys((size_t) qp_init_attr); + uhyve_args->ret = kmalloc(sizeof(struct ibv_qp)); + uhyve_send(UHYVE_PORT_IBV_CREATE_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1298,7 +1384,9 @@ struct ibv_qp * ibv_create_qp_ex(struct ibv_context * context, struct ibv_qp_ini uhyve_ibv_create_qp_ex_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->qp_init_attr_ex = (struct ibv_qp_init_attr_ex *) virt_to_phys((size_t) qp_init_attr_ex); + uhyve_args->ret = kmalloc(sizeof(struct ibv_qp)); + uhyve_send(UHYVE_PORT_IBV_CREATE_QP_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1318,6 +1406,7 @@ int ibv_query_rt_values_ex(struct ibv_context * context, struct ibv_values_ex * uhyve_ibv_query_rt_values_ex_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->values = (struct ibv_values_ex *) virt_to_phys((size_t) values); + uhyve_send(UHYVE_PORT_IBV_QUERY_RT_VALUES_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1339,6 +1428,7 @@ int ibv_query_device_ex(struct ibv_context * context, const struct ibv_query_dev uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->input = (const struct ibv_query_device_ex_input *) virt_to_phys((size_t) input); uhyve_args->attr = (struct ibv_device_attr_ex *) virt_to_phys((size_t) attr); + uhyve_send(UHYVE_PORT_IBV_QUERY_DEVICE_EX, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1358,7 +1448,9 @@ struct ibv_qp * ibv_open_qp(struct ibv_context * context, struct ibv_qp_open_att uhyve_ibv_open_qp_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->qp_open_attr = (struct ibv_qp_open_attr *) virt_to_phys((size_t) qp_open_attr); + uhyve_args->ret = kmalloc(sizeof(struct ibv_qp)); + uhyve_send(UHYVE_PORT_IBV_OPEN_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1380,6 +1472,7 @@ int ibv_modify_qp(struct ibv_qp * qp, struct ibv_qp_attr * attr, int attr_mask) uhyve_args->qp = (struct ibv_qp *) virt_to_phys((size_t) qp); uhyve_args->attr = (struct ibv_qp_attr *) virt_to_phys((size_t) attr); uhyve_args->attr_mask = attr_mask; + uhyve_send(UHYVE_PORT_IBV_MODIFY_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1403,6 +1496,7 @@ int ibv_query_qp(struct ibv_qp * qp, struct ibv_qp_attr * attr, int attr_mask, s uhyve_args->attr = (struct ibv_qp_attr *) virt_to_phys((size_t) attr); uhyve_args->attr_mask = attr_mask; uhyve_args->init_attr = (struct ibv_qp_init_attr *) virt_to_phys((size_t) init_attr); + uhyve_send(UHYVE_PORT_IBV_QUERY_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1420,6 +1514,7 @@ typedef struct { int ibv_destroy_qp(struct ibv_qp * qp) { uhyve_ibv_destroy_qp_t uhyve_args; uhyve_args->qp = (struct ibv_qp *) virt_to_phys((size_t) qp); + uhyve_send(UHYVE_PORT_IBV_DESTROY_QP, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1439,7 +1534,9 @@ struct ibv_wq * ibv_create_wq(struct ibv_context * context, struct ibv_wq_init_a uhyve_ibv_create_wq_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->wq_init_attr = (struct ibv_wq_init_attr *) virt_to_phys((size_t) wq_init_attr); + uhyve_args->ret = kmalloc(sizeof(struct ibv_wq)); + uhyve_send(UHYVE_PORT_IBV_CREATE_WQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1459,6 +1556,7 @@ int ibv_modify_wq(struct ibv_wq * wq, struct ibv_wq_attr * wq_attr) { uhyve_ibv_modify_wq_t uhyve_args; uhyve_args->wq = (struct ibv_wq *) virt_to_phys((size_t) wq); uhyve_args->wq_attr = (struct ibv_wq_attr *) virt_to_phys((size_t) wq_attr); + uhyve_send(UHYVE_PORT_IBV_MODIFY_WQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1476,6 +1574,7 @@ typedef struct { int ibv_destroy_wq(struct ibv_wq * wq) { uhyve_ibv_destroy_wq_t uhyve_args; uhyve_args->wq = (struct ibv_wq *) virt_to_phys((size_t) wq); + uhyve_send(UHYVE_PORT_IBV_DESTROY_WQ, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1495,7 +1594,9 @@ struct ibv_rwq_ind_table * ibv_create_rwq_ind_table(struct ibv_context * context uhyve_ibv_create_rwq_ind_table_t uhyve_args; uhyve_args->context = (struct ibv_context *) virt_to_phys((size_t) context); uhyve_args->init_attr = (struct ibv_rwq_ind_table_init_attr *) virt_to_phys((size_t) init_attr); + uhyve_args->ret = kmalloc(sizeof(struct ibv_rwq_ind_table)); + uhyve_send(UHYVE_PORT_IBV_CREATE_RWQ_IND_TABLE, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1513,6 +1614,7 @@ typedef struct { int ibv_destroy_rwq_ind_table(struct ibv_rwq_ind_table * rwq_ind_table) { uhyve_ibv_destroy_rwq_ind_table_t uhyve_args; uhyve_args->rwq_ind_table = (struct ibv_rwq_ind_table *) virt_to_phys((size_t) rwq_ind_table); + uhyve_send(UHYVE_PORT_IBV_DESTROY_RWQ_IND_TABLE, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1534,6 +1636,7 @@ int ibv_post_send(struct ibv_qp * qp, struct ibv_send_wr * wr, struct ibv_send_w uhyve_args->qp = (struct ibv_qp *) virt_to_phys((size_t) qp); uhyve_args->wr = (struct ibv_send_wr *) virt_to_phys((size_t) wr); // TODO: Take care of ** parameter. + uhyve_send(UHYVE_PORT_IBV_POST_SEND, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1555,6 +1658,7 @@ int ibv_post_recv(struct ibv_qp * qp, struct ibv_recv_wr * wr, struct ibv_recv_w uhyve_args->qp = (struct ibv_qp *) virt_to_phys((size_t) qp); uhyve_args->wr = (struct ibv_recv_wr *) virt_to_phys((size_t) wr); // TODO: Take care of ** parameter. + uhyve_send(UHYVE_PORT_IBV_POST_RECV, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1574,7 +1678,9 @@ 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 = (struct ibv_pd *) virt_to_phys((size_t) pd); uhyve_args->attr = (struct ibv_ah_attr *) virt_to_phys((size_t) attr); + uhyve_args->ret = kmalloc(sizeof(struct ibv_ah)); + uhyve_send(UHYVE_PORT_IBV_CREATE_AH, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1600,6 +1706,7 @@ int ibv_init_ah_from_wc(struct ibv_context * context, uint8_t port_num, struct i uhyve_args->wc = (struct ibv_wc *) virt_to_phys((size_t) wc); uhyve_args->grh = (struct ibv_grh *) virt_to_phys((size_t) grh); uhyve_args->ah_attr = (struct ibv_ah_attr *) virt_to_phys((size_t) ah_attr); + uhyve_send(UHYVE_PORT_IBV_INIT_AH_FROM_WC, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1623,7 +1730,9 @@ struct ibv_ah * ibv_create_ah_from_wc(struct ibv_pd * pd, struct ibv_wc * wc, st uhyve_args->wc = (struct ibv_wc *) virt_to_phys((size_t) wc); uhyve_args->grh = (struct ibv_grh *) virt_to_phys((size_t) grh); uhyve_args->port_num = port_num; + uhyve_args->ret = kmalloc(sizeof(struct ibv_ah)); + uhyve_send(UHYVE_PORT_IBV_CREATE_AH_FROM_WC, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1641,6 +1750,7 @@ typedef struct { int ibv_destroy_ah(struct ibv_ah * ah) { uhyve_ibv_destroy_ah_t uhyve_args; uhyve_args->ah = (struct ibv_ah *) virt_to_phys((size_t) ah); + uhyve_send(UHYVE_PORT_IBV_DESTROY_AH, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1662,6 +1772,7 @@ int ibv_attach_mcast(struct ibv_qp * qp, const union ibv_gid * gid, uint16_t lid uhyve_args->qp = (struct ibv_qp *) virt_to_phys((size_t) qp); uhyve_args->gid = (const union ibv_gid *) virt_to_phys((size_t) gid); uhyve_args->lid = lid; + uhyve_send(UHYVE_PORT_IBV_ATTACH_MCAST, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1683,6 +1794,7 @@ int ibv_detach_mcast(struct ibv_qp * qp, const union ibv_gid * gid, uint16_t lid uhyve_args->qp = (struct ibv_qp *) virt_to_phys((size_t) qp); uhyve_args->gid = (const union ibv_gid *) virt_to_phys((size_t) gid); uhyve_args->lid = lid; + uhyve_send(UHYVE_PORT_IBV_DETACH_MCAST, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1700,6 +1812,7 @@ typedef struct { int ibv_fork_init() { uhyve_ibv_fork_init_t uhyve_args; uhyve_args-> = ; + uhyve_send(UHYVE_PORT_IBV_FORK_INIT, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1717,7 +1830,9 @@ typedef struct { const char * ibv_node_type_str(enum ibv_node_type node_type) { uhyve_ibv_node_type_str_t uhyve_args; uhyve_args->node_type = node_type; + uhyve_args->ret = kmalloc(sizeof(const char)); + uhyve_send(UHYVE_PORT_IBV_NODE_TYPE_STR, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1735,7 +1850,9 @@ typedef struct { const char * ibv_port_state_str(enum ibv_port_state port_state) { uhyve_ibv_port_state_str_t uhyve_args; uhyve_args->port_state = port_state; + uhyve_args->ret = kmalloc(sizeof(const char)); + uhyve_send(UHYVE_PORT_IBV_PORT_STATE_STR, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1753,7 +1870,9 @@ typedef struct { const char * ibv_event_type_str(enum ibv_event_type event) { uhyve_ibv_event_type_str_t uhyve_args; uhyve_args->event = event; + uhyve_args->ret = kmalloc(sizeof(const char)); + uhyve_send(UHYVE_PORT_IBV_EVENT_TYPE_STR, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1777,6 +1896,7 @@ int ibv_resolve_eth_l2_from_gid(struct ibv_context * context, struct ibv_ah_attr uhyve_args->attr = (struct ibv_ah_attr *) virt_to_phys((size_t) attr); uhyve_args->eth_mac = eth_mac; uhyve_args->vid = (uint16_t *) virt_to_phys((size_t) vid); + uhyve_send(UHYVE_PORT_IBV_RESOLVE_ETH_L2_FROM_GID, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. @@ -1796,6 +1916,7 @@ int ibv_is_qpt_supported(uint32_t caps, enum ibv_qp_type qpt) { uhyve_ibv_is_qpt_supported_t uhyve_args; uhyve_args->caps = caps; uhyve_args->qpt = qpt; + uhyve_send(UHYVE_PORT_IBV_IS_QPT_SUPPORTED, (unsigned) virt_to_phys((size_t) &uhyve_args)); // TODO: Fix pointers in returned data structures. diff --git a/tools/ibv_code_generator/GEN_tools_uhyve-ibv.h b/tools/ibv_code_generator/GEN_tools_uhyve-ibv.h new file mode 100644 index 000000000..7e2a908f8 --- /dev/null +++ b/tools/ibv_code_generator/GEN_tools_uhyve-ibv.h @@ -0,0 +1,97 @@ +typedef enum { + UHYVE_PORT_IBV_WC_STATUS_STR = 0x510, + UHYVE_PORT_IBV_RATE_TO_MULT = 0x511, + UHYVE_PORT_MULT_TO_IBV_RATE = 0x512, + UHYVE_PORT_IBV_RATE_TO_MBPS = 0x513, + UHYVE_PORT_MBPS_TO_IBV_RATE = 0x514, + UHYVE_PORT_IBV_CQ_EX_TO_CQ = 0x515, + UHYVE_PORT_IBV_START_POLL = 0x516, + UHYVE_PORT_IBV_NEXT_POLL = 0x517, + UHYVE_PORT_IBV_END_POLL = 0x518, + UHYVE_PORT_IBV_WC_READ_OPCODE = 0x519, + UHYVE_PORT_IBV_WC_READ_VENDOR_ERR = 0x51A, + UHYVE_PORT_IBV_WC_READ_BYTE_LEN = 0x51B, + UHYVE_PORT_IBV_WC_READ_IMM_DATA = 0x51C, + UHYVE_PORT_IBV_WC_READ_INVALIDATED_RKEY = 0x51D, + UHYVE_PORT_IBV_WC_READ_QP_NUM = 0x51E, + UHYVE_PORT_IBV_WC_READ_SRC_QP = 0x51F, + UHYVE_PORT_IBV_WC_READ_WC_FLAGS = 0x520, + UHYVE_PORT_IBV_WC_READ_SLID = 0x521, + UHYVE_PORT_IBV_WC_READ_SL = 0x522, + UHYVE_PORT_IBV_WC_READ_DLID_PATH_BITS = 0x523, + UHYVE_PORT_IBV_WC_READ_COMPLETION_TS = 0x524, + UHYVE_PORT_IBV_WC_READ_CVLAN = 0x525, + UHYVE_PORT_IBV_WC_READ_FLOW_TAG = 0x526, + UHYVE_PORT_IBV_POST_WQ_RECV = 0x527, + UHYVE_PORT_VERBS_GET_CTX = 0x528, + UHYVE_PORT_IBV_GET_DEVICE_LIST = 0x529, + UHYVE_PORT_IBV_FREE_DEVICE_LIST = 0x52A, + UHYVE_PORT_IBV_GET_DEVICE_NAME = 0x52B, + UHYVE_PORT_IBV_GET_DEVICE_GUID = 0x52C, + UHYVE_PORT_IBV_OPEN_DEVICE = 0x52D, + UHYVE_PORT_IBV_CLOSE_DEVICE = 0x52E, + UHYVE_PORT_IBV_GET_ASYNC_EVENT = 0x52F, + UHYVE_PORT_IBV_ACK_ASYNC_EVENT = 0x530, + UHYVE_PORT_IBV_QUERY_DEVICE = 0x531, + UHYVE_PORT_IBV_QUERY_PORT = 0x532, + UHYVE_PORT____IBV_QUERY_PORT = 0x533, + UHYVE_PORT_IBV_QUERY_GID = 0x534, + UHYVE_PORT_IBV_QUERY_PKEY = 0x535, + UHYVE_PORT_IBV_ALLOC_PD = 0x536, + UHYVE_PORT_IBV_DEALLOC_PD = 0x537, + UHYVE_PORT_IBV_CREATE_FLOW = 0x538, + UHYVE_PORT_IBV_DESTROY_FLOW = 0x539, + UHYVE_PORT_IBV_OPEN_XRCD = 0x53A, + UHYVE_PORT_IBV_CLOSE_XRCD = 0x53B, + UHYVE_PORT_IBV_REG_MR = 0x53C, + UHYVE_PORT_IBV_REREG_MR = 0x53D, + UHYVE_PORT_IBV_DEREG_MR = 0x53E, + UHYVE_PORT_IBV_ALLOC_MW = 0x53F, + UHYVE_PORT_IBV_DEALLOC_MW = 0x540, + UHYVE_PORT_IBV_INC_RKEY = 0x541, + UHYVE_PORT_IBV_BIND_MW = 0x542, + UHYVE_PORT_IBV_CREATE_COMP_CHANNEL = 0x543, + UHYVE_PORT_IBV_DESTROY_COMP_CHANNEL = 0x544, + UHYVE_PORT_IBV_CREATE_CQ = 0x545, + UHYVE_PORT_IBV_CREATE_CQ_EX = 0x546, + UHYVE_PORT_IBV_RESIZE_CQ = 0x547, + UHYVE_PORT_IBV_DESTROY_CQ = 0x548, + UHYVE_PORT_IBV_GET_CQ_EVENT = 0x549, + UHYVE_PORT_IBV_ACK_CQ_EVENTS = 0x54A, + UHYVE_PORT_IBV_POLL_CQ = 0x54B, + UHYVE_PORT_IBV_REQ_NOTIFY_CQ = 0x54C, + UHYVE_PORT_IBV_CREATE_SRQ = 0x54D, + UHYVE_PORT_IBV_CREATE_SRQ_EX = 0x54E, + UHYVE_PORT_IBV_MODIFY_SRQ = 0x54F, + UHYVE_PORT_IBV_QUERY_SRQ = 0x550, + UHYVE_PORT_IBV_GET_SRQ_NUM = 0x551, + UHYVE_PORT_IBV_DESTROY_SRQ = 0x552, + UHYVE_PORT_IBV_POST_SRQ_RECV = 0x553, + UHYVE_PORT_IBV_CREATE_QP = 0x554, + UHYVE_PORT_IBV_CREATE_QP_EX = 0x555, + UHYVE_PORT_IBV_QUERY_RT_VALUES_EX = 0x556, + UHYVE_PORT_IBV_QUERY_DEVICE_EX = 0x557, + UHYVE_PORT_IBV_OPEN_QP = 0x558, + UHYVE_PORT_IBV_MODIFY_QP = 0x559, + UHYVE_PORT_IBV_QUERY_QP = 0x55A, + UHYVE_PORT_IBV_DESTROY_QP = 0x55B, + UHYVE_PORT_IBV_CREATE_WQ = 0x55C, + UHYVE_PORT_IBV_MODIFY_WQ = 0x55D, + UHYVE_PORT_IBV_DESTROY_WQ = 0x55E, + UHYVE_PORT_IBV_CREATE_RWQ_IND_TABLE = 0x55F, + UHYVE_PORT_IBV_DESTROY_RWQ_IND_TABLE = 0x560, + UHYVE_PORT_IBV_POST_SEND = 0x561, + UHYVE_PORT_IBV_POST_RECV = 0x562, + UHYVE_PORT_IBV_CREATE_AH = 0x563, + UHYVE_PORT_IBV_INIT_AH_FROM_WC = 0x564, + UHYVE_PORT_IBV_CREATE_AH_FROM_WC = 0x565, + UHYVE_PORT_IBV_DESTROY_AH = 0x566, + UHYVE_PORT_IBV_ATTACH_MCAST = 0x567, + UHYVE_PORT_IBV_DETACH_MCAST = 0x568, + UHYVE_PORT_IBV_FORK_INIT = 0x569, + UHYVE_PORT_IBV_NODE_TYPE_STR = 0x56A, + UHYVE_PORT_IBV_PORT_STATE_STR = 0x56B, + UHYVE_PORT_IBV_EVENT_TYPE_STR = 0x56C, + UHYVE_PORT_IBV_RESOLVE_ETH_L2_FROM_GID = 0x56D, + UHYVE_PORT_IBV_IS_QPT_SUPPORTED = 0x56E, +} uhyve_ibv_t; \ No newline at end of file diff --git a/tools/ibv_code_generator/GEN_tools_uhyve.c b/tools/ibv_code_generator/GEN_tools_uhyve.c new file mode 100644 index 000000000..d528f58b0 --- /dev/null +++ b/tools/ibv_code_generator/GEN_tools_uhyve.c @@ -0,0 +1,855 @@ + + case UHYVE_PORT_IBV_WC_STATUS_STR: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_status_str_t * args = (uhyve_ibv_wc_status_str_t *) (guest_mem + data); + + const char * host_ret = ibv_wc_status_str(status); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_RATE_TO_MULT: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_rate_to_mult_t * args = (uhyve_ibv_rate_to_mult_t *) (guest_mem + data); + + int host_ret = ibv_rate_to_mult(rate); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_MULT_TO_IBV_RATE: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_mult_to_ibv_rate_t * args = (uhyve_mult_to_ibv_rate_t *) (guest_mem + data); + + enum ibv_rate host_ret = mult_to_ibv_rate(mult); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_RATE_TO_MBPS: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_rate_to_mbps_t * args = (uhyve_ibv_rate_to_mbps_t *) (guest_mem + data); + + int host_ret = ibv_rate_to_mbps(rate); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_MBPS_TO_IBV_RATE: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_mbps_to_ibv_rate_t * args = (uhyve_mbps_to_ibv_rate_t *) (guest_mem + data); + + enum ibv_rate host_ret = mbps_to_ibv_rate(mbps); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_CQ_EX_TO_CQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_cq_ex_to_cq_t * args = (uhyve_ibv_cq_ex_to_cq_t *) (guest_mem + data); + + struct ibv_cq * host_ret = ibv_cq_ex_to_cq(guest_mem+(size_t)args->cq); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_START_POLL: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_start_poll_t * args = (uhyve_ibv_start_poll_t *) (guest_mem + data); + + int host_ret = ibv_start_poll(guest_mem+(size_t)args->cq, guest_mem+(size_t)args->attr); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_NEXT_POLL: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_next_poll_t * args = (uhyve_ibv_next_poll_t *) (guest_mem + data); + + int host_ret = ibv_next_poll(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_END_POLL: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_end_poll_t * args = (uhyve_ibv_end_poll_t *) (guest_mem + data); + + void host_ret = ibv_end_poll(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_OPCODE: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_opcode_t * args = (uhyve_ibv_wc_read_opcode_t *) (guest_mem + data); + + enum ibv_wc_opcode host_ret = ibv_wc_read_opcode(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_VENDOR_ERR: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_vendor_err_t * args = (uhyve_ibv_wc_read_vendor_err_t *) (guest_mem + data); + + uint32_t host_ret = ibv_wc_read_vendor_err(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_BYTE_LEN: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_byte_len_t * args = (uhyve_ibv_wc_read_byte_len_t *) (guest_mem + data); + + uint32_t host_ret = ibv_wc_read_byte_len(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_IMM_DATA: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_imm_data_t * args = (uhyve_ibv_wc_read_imm_data_t *) (guest_mem + data); + + __be32 host_ret = ibv_wc_read_imm_data(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_INVALIDATED_RKEY: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_invalidated_rkey_t * args = (uhyve_ibv_wc_read_invalidated_rkey_t *) (guest_mem + data); + + uint32_t host_ret = ibv_wc_read_invalidated_rkey(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_QP_NUM: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_qp_num_t * args = (uhyve_ibv_wc_read_qp_num_t *) (guest_mem + data); + + uint32_t host_ret = ibv_wc_read_qp_num(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_SRC_QP: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_src_qp_t * args = (uhyve_ibv_wc_read_src_qp_t *) (guest_mem + data); + + uint32_t host_ret = ibv_wc_read_src_qp(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_WC_FLAGS: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_wc_flags_t * args = (uhyve_ibv_wc_read_wc_flags_t *) (guest_mem + data); + + int host_ret = ibv_wc_read_wc_flags(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_SLID: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_slid_t * args = (uhyve_ibv_wc_read_slid_t *) (guest_mem + data); + + uint32_t host_ret = ibv_wc_read_slid(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_SL: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_sl_t * args = (uhyve_ibv_wc_read_sl_t *) (guest_mem + data); + + uint8_t host_ret = ibv_wc_read_sl(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_DLID_PATH_BITS: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_dlid_path_bits_t * args = (uhyve_ibv_wc_read_dlid_path_bits_t *) (guest_mem + data); + + uint8_t host_ret = ibv_wc_read_dlid_path_bits(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_COMPLETION_TS: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_completion_ts_t * args = (uhyve_ibv_wc_read_completion_ts_t *) (guest_mem + data); + + uint64_t host_ret = ibv_wc_read_completion_ts(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_CVLAN: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_cvlan_t * args = (uhyve_ibv_wc_read_cvlan_t *) (guest_mem + data); + + uint16_t host_ret = ibv_wc_read_cvlan(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_WC_READ_FLOW_TAG: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_wc_read_flow_tag_t * args = (uhyve_ibv_wc_read_flow_tag_t *) (guest_mem + data); + + uint32_t host_ret = ibv_wc_read_flow_tag(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_POST_WQ_RECV: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_post_wq_recv_t * args = (uhyve_ibv_post_wq_recv_t *) (guest_mem + data); + + int host_ret = ibv_post_wq_recv(guest_mem+(size_t)args->wq, guest_mem+(size_t)args->recv_wr, /* TODO: param bad_recv_wr*/); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_VERBS_GET_CTX: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_verbs_get_ctx_t * args = (uhyve_verbs_get_ctx_t *) (guest_mem + data); + + struct verbs_context * host_ret = verbs_get_ctx(guest_mem+(size_t)args->ctx); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_GET_DEVICE_LIST: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_get_device_list_t * args = (uhyve_ibv_get_device_list_t *) (guest_mem + data); + + struct ibv_device ** host_ret = ibv_get_device_list(guest_mem+(size_t)args->num_devices); + // TODO: Take care of struct ibv_device ** return value. + break; + } + + case UHYVE_PORT_IBV_FREE_DEVICE_LIST: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_free_device_list_t * args = (uhyve_ibv_free_device_list_t *) (guest_mem + data); + + void host_ret = ibv_free_device_list(/* TODO: param list*/); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_GET_DEVICE_NAME: { + 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); + + const char * host_ret = ibv_get_device_name(guest_mem+(size_t)args->device); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_GET_DEVICE_GUID: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_get_device_guid_t * args = (uhyve_ibv_get_device_guid_t *) (guest_mem + data); + + __be64 host_ret = ibv_get_device_guid(guest_mem+(size_t)args->device); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_OPEN_DEVICE: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_open_device_t * args = (uhyve_ibv_open_device_t *) (guest_mem + data); + + struct ibv_context * host_ret = ibv_open_device(guest_mem+(size_t)args->device); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_CLOSE_DEVICE: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_close_device_t * args = (uhyve_ibv_close_device_t *) (guest_mem + data); + + int host_ret = ibv_close_device(guest_mem+(size_t)args->context); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_GET_ASYNC_EVENT: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_get_async_event_t * args = (uhyve_ibv_get_async_event_t *) (guest_mem + data); + + int host_ret = ibv_get_async_event(guest_mem+(size_t)args->context, guest_mem+(size_t)args->event); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_ACK_ASYNC_EVENT: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_ack_async_event_t * args = (uhyve_ibv_ack_async_event_t *) (guest_mem + data); + + void host_ret = ibv_ack_async_event(guest_mem+(size_t)args->event); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_QUERY_DEVICE: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_query_device_t * args = (uhyve_ibv_query_device_t *) (guest_mem + data); + + int host_ret = ibv_query_device(guest_mem+(size_t)args->context, guest_mem+(size_t)args->device_attr); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_QUERY_PORT: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_query_port_t * args = (uhyve_ibv_query_port_t *) (guest_mem + data); + + int host_ret = ibv_query_port(guest_mem+(size_t)args->context, port_num, guest_mem+(size_t)args->port_attr); + args->ret = host_ret; + break; + } + + case UHYVE_PORT____IBV_QUERY_PORT: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve____ibv_query_port_t * args = (uhyve____ibv_query_port_t *) (guest_mem + data); + + int host_ret = ___ibv_query_port(guest_mem+(size_t)args->context, port_num, guest_mem+(size_t)args->port_attr); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_QUERY_GID: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_query_gid_t * args = (uhyve_ibv_query_gid_t *) (guest_mem + data); + + int host_ret = ibv_query_gid(guest_mem+(size_t)args->context, port_num, index, guest_mem+(size_t)args->gid); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_QUERY_PKEY: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_query_pkey_t * args = (uhyve_ibv_query_pkey_t *) (guest_mem + data); + + int host_ret = ibv_query_pkey(guest_mem+(size_t)args->context, port_num, index, guest_mem+(size_t)args->pkey); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_ALLOC_PD: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_alloc_pd_t * args = (uhyve_ibv_alloc_pd_t *) (guest_mem + data); + + struct ibv_pd * host_ret = ibv_alloc_pd(guest_mem+(size_t)args->context); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_DEALLOC_PD: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_dealloc_pd_t * args = (uhyve_ibv_dealloc_pd_t *) (guest_mem + data); + + int host_ret = ibv_dealloc_pd(guest_mem+(size_t)args->pd); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_CREATE_FLOW: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_flow_t * args = (uhyve_ibv_create_flow_t *) (guest_mem + data); + + struct ibv_flow * host_ret = ibv_create_flow(guest_mem+(size_t)args->qp, guest_mem+(size_t)args->flow); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_DESTROY_FLOW: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_destroy_flow_t * args = (uhyve_ibv_destroy_flow_t *) (guest_mem + data); + + int host_ret = ibv_destroy_flow(guest_mem+(size_t)args->flow_id); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_OPEN_XRCD: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_open_xrcd_t * args = (uhyve_ibv_open_xrcd_t *) (guest_mem + data); + + struct ibv_xrcd * host_ret = ibv_open_xrcd(guest_mem+(size_t)args->context, guest_mem+(size_t)args->xrcd_init_attr); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_CLOSE_XRCD: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_close_xrcd_t * args = (uhyve_ibv_close_xrcd_t *) (guest_mem + data); + + int host_ret = ibv_close_xrcd(guest_mem+(size_t)args->xrcd); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_REG_MR: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_reg_mr_t * args = (uhyve_ibv_reg_mr_t *) (guest_mem + data); + + struct ibv_mr * host_ret = ibv_reg_mr(guest_mem+(size_t)args->pd, guest_mem+(size_t)args->addr, length, access); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_REREG_MR: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_rereg_mr_t * args = (uhyve_ibv_rereg_mr_t *) (guest_mem + data); + + int host_ret = ibv_rereg_mr(guest_mem+(size_t)args->mr, flags, guest_mem+(size_t)args->pd, guest_mem+(size_t)args->addr, length, access); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_DEREG_MR: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_dereg_mr_t * args = (uhyve_ibv_dereg_mr_t *) (guest_mem + data); + + int host_ret = ibv_dereg_mr(guest_mem+(size_t)args->mr); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_ALLOC_MW: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_alloc_mw_t * args = (uhyve_ibv_alloc_mw_t *) (guest_mem + data); + + struct ibv_mw * host_ret = ibv_alloc_mw(guest_mem+(size_t)args->pd, type); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_DEALLOC_MW: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_dealloc_mw_t * args = (uhyve_ibv_dealloc_mw_t *) (guest_mem + data); + + int host_ret = ibv_dealloc_mw(guest_mem+(size_t)args->mw); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_INC_RKEY: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_inc_rkey_t * args = (uhyve_ibv_inc_rkey_t *) (guest_mem + data); + + uint32_t host_ret = ibv_inc_rkey(rkey); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_BIND_MW: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_bind_mw_t * args = (uhyve_ibv_bind_mw_t *) (guest_mem + data); + + int host_ret = ibv_bind_mw(guest_mem+(size_t)args->qp, guest_mem+(size_t)args->mw, guest_mem+(size_t)args->mw_bind); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_CREATE_COMP_CHANNEL: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_comp_channel_t * args = (uhyve_ibv_create_comp_channel_t *) (guest_mem + data); + + struct ibv_comp_channel * host_ret = ibv_create_comp_channel(guest_mem+(size_t)args->context); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_DESTROY_COMP_CHANNEL: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_destroy_comp_channel_t * args = (uhyve_ibv_destroy_comp_channel_t *) (guest_mem + data); + + int host_ret = ibv_destroy_comp_channel(guest_mem+(size_t)args->channel); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_CREATE_CQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_cq_t * args = (uhyve_ibv_create_cq_t *) (guest_mem + data); + + struct ibv_cq * host_ret = ibv_create_cq(guest_mem+(size_t)args->context, cqe, guest_mem+(size_t)args->cq_context, guest_mem+(size_t)args->channel, comp_vector); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_CREATE_CQ_EX: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_cq_ex_t * args = (uhyve_ibv_create_cq_ex_t *) (guest_mem + data); + + struct ibv_cq_ex * host_ret = ibv_create_cq_ex(guest_mem+(size_t)args->context, guest_mem+(size_t)args->cq_attr); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_RESIZE_CQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_resize_cq_t * args = (uhyve_ibv_resize_cq_t *) (guest_mem + data); + + int host_ret = ibv_resize_cq(guest_mem+(size_t)args->cq, cqe); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_DESTROY_CQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_destroy_cq_t * args = (uhyve_ibv_destroy_cq_t *) (guest_mem + data); + + int host_ret = ibv_destroy_cq(guest_mem+(size_t)args->cq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_GET_CQ_EVENT: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_get_cq_event_t * args = (uhyve_ibv_get_cq_event_t *) (guest_mem + data); + + int host_ret = ibv_get_cq_event(guest_mem+(size_t)args->channel, /* TODO: param cq*/, /* TODO: param cq_context*/); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_ACK_CQ_EVENTS: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_ack_cq_events_t * args = (uhyve_ibv_ack_cq_events_t *) (guest_mem + data); + + void host_ret = ibv_ack_cq_events(guest_mem+(size_t)args->cq, nevents); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_POLL_CQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_poll_cq_t * args = (uhyve_ibv_poll_cq_t *) (guest_mem + data); + + int host_ret = ibv_poll_cq(guest_mem+(size_t)args->cq, num_entries, guest_mem+(size_t)args->wc); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_REQ_NOTIFY_CQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_req_notify_cq_t * args = (uhyve_ibv_req_notify_cq_t *) (guest_mem + data); + + int host_ret = ibv_req_notify_cq(guest_mem+(size_t)args->cq, solicited_only); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_CREATE_SRQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_srq_t * args = (uhyve_ibv_create_srq_t *) (guest_mem + data); + + struct ibv_srq * host_ret = ibv_create_srq(guest_mem+(size_t)args->pd, guest_mem+(size_t)args->srq_init_attr); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_CREATE_SRQ_EX: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_srq_ex_t * args = (uhyve_ibv_create_srq_ex_t *) (guest_mem + data); + + struct ibv_srq * host_ret = ibv_create_srq_ex(guest_mem+(size_t)args->context, guest_mem+(size_t)args->srq_init_attr_ex); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_MODIFY_SRQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_modify_srq_t * args = (uhyve_ibv_modify_srq_t *) (guest_mem + data); + + int host_ret = ibv_modify_srq(guest_mem+(size_t)args->srq, guest_mem+(size_t)args->srq_attr, srq_attr_mask); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_QUERY_SRQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_query_srq_t * args = (uhyve_ibv_query_srq_t *) (guest_mem + data); + + int host_ret = ibv_query_srq(guest_mem+(size_t)args->srq, guest_mem+(size_t)args->srq_attr); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_GET_SRQ_NUM: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_get_srq_num_t * args = (uhyve_ibv_get_srq_num_t *) (guest_mem + data); + + int host_ret = ibv_get_srq_num(guest_mem+(size_t)args->srq, guest_mem+(size_t)args->srq_num); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_DESTROY_SRQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_destroy_srq_t * args = (uhyve_ibv_destroy_srq_t *) (guest_mem + data); + + int host_ret = ibv_destroy_srq(guest_mem+(size_t)args->srq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_POST_SRQ_RECV: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_post_srq_recv_t * args = (uhyve_ibv_post_srq_recv_t *) (guest_mem + data); + + int host_ret = ibv_post_srq_recv(guest_mem+(size_t)args->srq, guest_mem+(size_t)args->recv_wr, /* TODO: param bad_recv_wr*/); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_CREATE_QP: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_qp_t * args = (uhyve_ibv_create_qp_t *) (guest_mem + data); + + struct ibv_qp * host_ret = ibv_create_qp(guest_mem+(size_t)args->pd, guest_mem+(size_t)args->qp_init_attr); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_CREATE_QP_EX: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_qp_ex_t * args = (uhyve_ibv_create_qp_ex_t *) (guest_mem + data); + + struct ibv_qp * host_ret = ibv_create_qp_ex(guest_mem+(size_t)args->context, guest_mem+(size_t)args->qp_init_attr_ex); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_QUERY_RT_VALUES_EX: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_query_rt_values_ex_t * args = (uhyve_ibv_query_rt_values_ex_t *) (guest_mem + data); + + int host_ret = ibv_query_rt_values_ex(guest_mem+(size_t)args->context, guest_mem+(size_t)args->values); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_QUERY_DEVICE_EX: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_query_device_ex_t * args = (uhyve_ibv_query_device_ex_t *) (guest_mem + data); + + int host_ret = ibv_query_device_ex(guest_mem+(size_t)args->context, guest_mem+(size_t)args->input, guest_mem+(size_t)args->attr); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_OPEN_QP: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_open_qp_t * args = (uhyve_ibv_open_qp_t *) (guest_mem + data); + + struct ibv_qp * host_ret = ibv_open_qp(guest_mem+(size_t)args->context, guest_mem+(size_t)args->qp_open_attr); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_MODIFY_QP: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_modify_qp_t * args = (uhyve_ibv_modify_qp_t *) (guest_mem + data); + + int host_ret = ibv_modify_qp(guest_mem+(size_t)args->qp, guest_mem+(size_t)args->attr, attr_mask); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_QUERY_QP: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_query_qp_t * args = (uhyve_ibv_query_qp_t *) (guest_mem + data); + + int host_ret = ibv_query_qp(guest_mem+(size_t)args->qp, guest_mem+(size_t)args->attr, attr_mask, guest_mem+(size_t)args->init_attr); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_DESTROY_QP: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_destroy_qp_t * args = (uhyve_ibv_destroy_qp_t *) (guest_mem + data); + + int host_ret = ibv_destroy_qp(guest_mem+(size_t)args->qp); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_CREATE_WQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_wq_t * args = (uhyve_ibv_create_wq_t *) (guest_mem + data); + + struct ibv_wq * host_ret = ibv_create_wq(guest_mem+(size_t)args->context, guest_mem+(size_t)args->wq_init_attr); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_MODIFY_WQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_modify_wq_t * args = (uhyve_ibv_modify_wq_t *) (guest_mem + data); + + int host_ret = ibv_modify_wq(guest_mem+(size_t)args->wq, guest_mem+(size_t)args->wq_attr); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_DESTROY_WQ: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_destroy_wq_t * args = (uhyve_ibv_destroy_wq_t *) (guest_mem + data); + + int host_ret = ibv_destroy_wq(guest_mem+(size_t)args->wq); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_CREATE_RWQ_IND_TABLE: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_rwq_ind_table_t * args = (uhyve_ibv_create_rwq_ind_table_t *) (guest_mem + data); + + struct ibv_rwq_ind_table * host_ret = ibv_create_rwq_ind_table(guest_mem+(size_t)args->context, guest_mem+(size_t)args->init_attr); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_DESTROY_RWQ_IND_TABLE: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_destroy_rwq_ind_table_t * args = (uhyve_ibv_destroy_rwq_ind_table_t *) (guest_mem + data); + + int host_ret = ibv_destroy_rwq_ind_table(guest_mem+(size_t)args->rwq_ind_table); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_POST_SEND: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_post_send_t * args = (uhyve_ibv_post_send_t *) (guest_mem + data); + + int host_ret = ibv_post_send(guest_mem+(size_t)args->qp, guest_mem+(size_t)args->wr, /* TODO: param bad_wr*/); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_POST_RECV: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_post_recv_t * args = (uhyve_ibv_post_recv_t *) (guest_mem + data); + + int host_ret = ibv_post_recv(guest_mem+(size_t)args->qp, guest_mem+(size_t)args->wr, /* TODO: param bad_wr*/); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_CREATE_AH: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_ah_t * args = (uhyve_ibv_create_ah_t *) (guest_mem + data); + + struct ibv_ah * host_ret = ibv_create_ah(guest_mem+(size_t)args->pd, guest_mem+(size_t)args->attr); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_INIT_AH_FROM_WC: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_init_ah_from_wc_t * args = (uhyve_ibv_init_ah_from_wc_t *) (guest_mem + data); + + int host_ret = ibv_init_ah_from_wc(guest_mem+(size_t)args->context, port_num, guest_mem+(size_t)args->wc, guest_mem+(size_t)args->grh, guest_mem+(size_t)args->ah_attr); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_CREATE_AH_FROM_WC: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_create_ah_from_wc_t * args = (uhyve_ibv_create_ah_from_wc_t *) (guest_mem + data); + + struct ibv_ah * host_ret = ibv_create_ah_from_wc(guest_mem+(size_t)args->pd, guest_mem+(size_t)args->wc, guest_mem+(size_t)args->grh, port_num); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_DESTROY_AH: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_destroy_ah_t * args = (uhyve_ibv_destroy_ah_t *) (guest_mem + data); + + int host_ret = ibv_destroy_ah(guest_mem+(size_t)args->ah); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_ATTACH_MCAST: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_attach_mcast_t * args = (uhyve_ibv_attach_mcast_t *) (guest_mem + data); + + int host_ret = ibv_attach_mcast(guest_mem+(size_t)args->qp, guest_mem+(size_t)args->gid, lid); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_DETACH_MCAST: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_detach_mcast_t * args = (uhyve_ibv_detach_mcast_t *) (guest_mem + data); + + int host_ret = ibv_detach_mcast(guest_mem+(size_t)args->qp, guest_mem+(size_t)args->gid, lid); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_FORK_INIT: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_fork_init_t * args = (uhyve_ibv_fork_init_t *) (guest_mem + data); + + int host_ret = ibv_fork_init(); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_NODE_TYPE_STR: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_node_type_str_t * args = (uhyve_ibv_node_type_str_t *) (guest_mem + data); + + const char * host_ret = ibv_node_type_str(node_type); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_PORT_STATE_STR: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_port_state_str_t * args = (uhyve_ibv_port_state_str_t *) (guest_mem + data); + + const char * host_ret = ibv_port_state_str(port_state); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_EVENT_TYPE_STR: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_event_type_str_t * args = (uhyve_ibv_event_type_str_t *) (guest_mem + data); + + const char * host_ret = ibv_event_type_str(event); + memcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret)); + break; + } + + case UHYVE_PORT_IBV_RESOLVE_ETH_L2_FROM_GID: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_resolve_eth_l2_from_gid_t * args = (uhyve_ibv_resolve_eth_l2_from_gid_t *) (guest_mem + data); + + int host_ret = ibv_resolve_eth_l2_from_gid(guest_mem+(size_t)args->context, guest_mem+(size_t)args->attr, eth_mac, guest_mem+(size_t)args->vid); + args->ret = host_ret; + break; + } + + case UHYVE_PORT_IBV_IS_QPT_SUPPORTED: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_is_qpt_supported_t * args = (uhyve_ibv_is_qpt_supported_t *) (guest_mem + data); + + int host_ret = ibv_is_qpt_supported(caps, qpt); + args->ret = host_ret; + break; + } diff --git a/tools/ibv_code_generator/generate_code.py b/tools/ibv_code_generator/generate_code.py new file mode 100755 index 000000000..27ffef7bd --- /dev/null +++ b/tools/ibv_code_generator/generate_code.py @@ -0,0 +1,330 @@ +#!/usr/bin/env python + +"""Copyright (c) 2017, Annika Wierichs, RWTH Aachen University + +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +This script expects a text file containing function prototypes as input +(SRC_PATH). It generates the following C code snippets for each individual given +function in the input file. Todo notes are inserted whereever more work is +required. + +1. The definition of a struct that contains all parameters and the return value +of a given function. +Required in: ./kernel/ibv.c + + Example: + typedef struct { + // Parameters: + struct ibv_mr * mr; + int flags; + struct ibv_pd * pd; + // Return value: + int ret; + } __attribute__((packed)) uhyve_ibv_rereg_mr_t; + +2. The definition of the kernel space function that sends a KVM exit IO to +uhyve. +Required in: ./kernel/ibv.c + + Example: + int ibv_rereg_mr(struct ibv_mr * mr, int flags, struct ibv_pd * pd) { + uhyve_ibv_rereg_mr_t uhyve_args; + uhyve_args->mr = (struct ibv_mr *) virt_to_phys((size_t) mr); + uhyve_args->flags = flags; + uhyve_args->pd = (struct ibv_pd *) virt_to_phys((size_t) pd); + + uhyve_send(UHYVE_PORT_IBV_REREG_MR, (unsigned) virt_to_phys((size_t) &uhyve_args)); + + return uhyve_args.ret; + } + +3. The switch-case that catches the KVM exit IO sent to uhyve by the kernel. +Required in: ./tool/uhyve.c + + Example: + case UHYVE_PORT_IBV_REREG_MR: { + unsigned data = *((unsigned*)((size_t)run+run->io.data_offset)); + uhyve_ibv_rereg_mr_t * args = (uhyve_ibv_rereg_mr_t *) (guest_mem + data); + + int host_ret = ibv_rereg_mr(guest_mem+(size_t)args->mr, flags, guest_mem+(size_t)args->pd); + args->ret = host_ret; + break; + } + +The script also generates an enum mapping all functions to KVM exit IO port +names and numbers. +Required in: ./tool/uhyve-ibv.h + + Example: + typedef enum { + UHYVE_PORT_IBV_WC_STATUS_STR = 0x510, + UHYVE_PORT_IBV_RATE_TO_MULT = 0x511, + UHYVE_PORT_MULT_TO_IBV_RATE = 0x512, + // ... + } uhyve_ibv_t; +""" + + +# Path of the input file containing function prototypes. +SRC_PATH = "function_prototypes.txt" + +# Paths of the files that are generated by the script. +IBV_GEN_PATH = "GEN_kernel_ibv.c" +UHYVE_CASES_GEN_PATH = "GEN_tools_uhyve.c" +UHYVE_IBV_HEADER_GEN_PATH = "GEN_tools_uhyve-ibv.h" +INCLUDE_STDDEF_GEN_PATH = "GEN_include_hermit_stddef.h" + +# Starting number of the sequence used for IBV ports. +PORT_NUMBER_START = 0x510 + + +def get_struct_name(function_name): + """Returns the matching struct name for a given function name. + """ + return "uhyve_{0}_t".format(function_name) + + +def parse_line(line): + """Parses a line containing a function prototype. + + Args: + line: Line of the following format: + ( , [...]) + + Returns: + Return type, function name, parameters as Tuple[string, string, list[string]] + """ + parens_split = line.split("(") + + ret_and_name = parens_split[0].split(" ") + all_params = parens_split[-1][:-1] + + ret = " ".join(ret_and_name[:-1]) + function_name = ret_and_name[-1] + + params = all_params.split(",") + params[-1] = params[-1][:-1] + + return ret, function_name, params + + +def generate_struct(ret, function_name, params): + """Generates the struct to hold a function's parameters and return value. + + Args: + ret: Return type as string. + function_name: Function name as string. + params: Parameters as list of strings. + + Returns: + Generated struct as string. + """ + struct = "typedef struct {\n" + if params: + struct += "\t// Parameters:\n" + for param in params: + struct += "\t{0};\n".format(param) + + if ret is not "void": + struct += "\t// Return value:\n" + struct += "\t{0} ret;\n".format(ret) + + struct_name = get_struct_name(function_name) + struct += "}} __attribute__((packed)) {0};\n\n".format(struct_name) + + return struct + + +def generate_kernel_function(ret, function_name, params): + """Generates the kernel function that sends the KVM exit IO to uhyve. + + Args: + ret: Return type as string. + function_name: Function name as string. + params: Parameters as list of strings. + + Returns: + Generated function as string. + """ + function = "{0} {1}({2}) {{\n".format(ret, function_name, ", ".join(params)) + + # Create uhyve_args and define parameters + struct_name = get_struct_name(function_name) + function += "\t{0} uhyve_args;\n".format(struct_name) + for param in params: + param_split = param.split(" ") + param_type = " ".join(param_split[:-1]) + param_name = param_split[-1] + + # Define struct members according to their type. + if "**" in param_type: + function += "\t// TODO: Take care of ** parameter.\n" + elif "*" in param_type: + function += "\tuhyve_args->{0} = " "({1}) virt_to_phys((size_t) {2});\n".format( + param_name, param_type, param_name) + else: + function += "\tuhyve_args->{0} = {0};\n".format(param_name) + + # Allocate memory for return value if it is a pointer. + if "**" in ret: + function += "\n\t// TODO: Take care of return value.\n" + elif "*" in ret: + function += "\n\tuhyve_args->ret = kmalloc(sizeof({0}));\n".format(ret[:-2]) + + # call uhyve_send() using the respective port ID. + port_name = "UHYVE_PORT_" + function_name.upper() + function += "\n\tuhyve_send({0}, (unsigned) virt_to_phys((size_t) " \ + "&uhyve_args));\n\n".format(port_name) + + function += "\t// TODO: Fix pointers in returned data structures.\n" + + function += "\treturn uhyve_args.ret;\n" + function += "}\n\n\n" + + return function + + +def generate_uhyve_case(ret, function_name, params): + """Generates a switch-case that catches a KVM exit IO for the given function in uhyve. + + Args: + ret: Return type as string. + function_name: Function name as string. + params: Parameters as list of strings. + + Returns: + Generated switch-case code as string. + """ + + def generate_host_call_parameter(param): + """Generates the parameter for the host's function called from within uhyve. + + This distinguishes between pointers and non-pointers since pointers have to + be converted to host memory addresses. + Example for pointer: guest_mem+(size_t)args->param + Example for non-pointer: args->param + + Args: + param: The parameter type and name as a single string. + + Returns: + Generated parameter, + """ + param_name = param.split(" ")[-1] + if "**" in param: + host_param = "/* TODO: param {0}*/".format(param_name) + elif "*" in param: + host_param = "guest_mem+(size_t)args->{0}".format(param_name) + else: + host_param = "{0}".format(param_name) + + return host_param + + port_name = "UHYVE_PORT_" + function_name.upper() + struct_name = get_struct_name(function_name) + + case = "\n\t\t\tcase {0}: {{".format(port_name) + case += "\n\t\t\t\tunsigned data = *((unsigned*)((size_t)run+run->io.data_offset));" + case += "\n\t\t\t\t{0} * args = ({0} *) (guest_mem + data);".format(struct_name) + case += "\n\n\t\t\t\t{0} host_ret = {1}(".format(ret, function_name) + + for param in params[:-1]: + case += generate_host_call_parameter(param) + ", " + else: + case += generate_host_call_parameter(params[-1]) + ");" + + if "**" in ret: + case += "\n\t\t\t\t// TODO: Take care of {0} return value.".format(ret) + elif "*" in ret: + case += "\n\t\t\t\tmemcpy(guest_mem+(size_t)args->ret, host_ret, sizeof(host_ret));" + else: + case += "\n\t\t\t\targs->ret = host_ret;" + + case += "\n\t\t\t\tbreak;" + case += "\n\t\t\t}\n" + + return case + + +def generate_port_enum(function_names): + """Generates the enum mapping KVM exit IO port names to port numbers. + + Args: + function_names: All function names to be mapped to ports as list of strings. + + Returns: + Generated complete enum. + """ + port_enum = "typedef enum {" + for num, function_name in enumerate(function_names, PORT_NUMBER_START): + port_enum += "\n\tUHYVE_PORT_{0} = 0x{1},".format(function_name.upper(), + format(num, "X")) + port_enum += "\n} uhyve_ibv_t;" + + return port_enum + + +def generate_port_macros(function_names): + """Generates the compiler macros mapping KVM exit IO port names to port numbers. + + Args: + function_names: All function names to be mapped to ports as list of strings. + + Returns: + Generated list of compiler macros. + """ + macros = "" + for num, function_name in enumerate(function_names, PORT_NUMBER_START): + macros += "\n#define UHYVE_PORT_{0} 0x{1},".format(function_name.upper(), + format(num, "X")) + return macros + + +if __name__ == "__main__": + with open(SRC_PATH, "r") as f_src, \ + open(IBV_GEN_PATH, "w") as f_ibv, \ + open(UHYVE_CASES_GEN_PATH, "w") as f_uhyve: + function_names = [] + for line in f_src: + ret, function_name, params = parse_line(line) + function_names.append(function_name) + + struct = generate_struct(ret, function_name, params) + f_ibv.write(struct) + + kernel_function = generate_kernel_function(ret, function_name, params) + f_ibv.write(kernel_function) + + uhyve_case = generate_uhyve_case(ret, function_name, params) + f_uhyve.write(uhyve_case) + + with open(UHYVE_IBV_HEADER_GEN_PATH, "w") as f_uhyve_ibv: + port_enum = generate_port_enum(function_names) + f_uhyve_ibv.write(port_enum) + + with open(INCLUDE_STDDEF_GEN_PATH, "w") as f_stddef: + port_macros = generate_port_macros(function_names) + f_stddef.write(port_macros) diff --git a/tools/ibv_code_generator/kernel_api.py b/tools/ibv_code_generator/kernel_api.py deleted file mode 100755 index b0f90a4b0..000000000 --- a/tools/ibv_code_generator/kernel_api.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python - -"""Copyright (c) 2017, Annika Wierichs, RWTH Aachen University - -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the University nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -TODO: Documentation""" - -src_file_path = 'function_prototypes.txt' - -ibv_gen_path = 'ibv_gen.c' -uhyve_cases_gen_path = 'uhyve_gen.c' - -with open(src_file_path, 'r') as f_src: - with open(ibv_gen_path, 'w') as f_ibv, open(uhyve_cases_gen_path, 'w') as f_uhyve: - # TODO: next: generate hyve stuff. - for line in f_src: - parens_split = line.split('(') - - ret_and_name = parens_split[0].split(' ') - function_name = ret_and_name[-1] - ret = ' '.join(ret_and_name[:-1]) - - all_params = parens_split[-1][:-1] - params = all_params.split(',') - params[-1] = params[-1][:-1] - - # Struct - struct_name = 'uhyve_{0}_t'.format(function_name) - f_ibv.write('typedef struct {\n') - if params: - f_ibv.write('\t// Parameters:\n') - for param in params: - f_ibv.write('\t{0};\n'.format(param)) - - if ret is not "void": - f_ibv.write('\t// Return value:\n') - f_ibv.write('\t{0} ret;\n'.format(ret)) - - f_ibv.write('}} __attribute__((packed)) {0};\n\n'.format(struct_name)) - - # Function - params_single_string = ', '.join(params) - f_ibv.write('{0} {1}({2}) {{\n'.format(ret, function_name, - params_single_string)) - - # Create uhyve_args and define parameters - f_ibv.write('\t{0} uhyve_args;\n'.format(struct_name)) - for param in params: - param_split = param.split(' ') - param_type = ' '.join(param_split[:-1]) - param_name = param_split[-1] - # Define struct members according to their type. - if '**' in param_type: - f_ibv.write('\t// TODO: Take care of ** parameter.\n') - elif '*' in param_type: - f_ibv.write('\tuhyve_args->{0} = ({1}) virt_to_phys((size_t) {2});\n' - .format(param_name, param_type, param_name)) - else: - f_ibv.write('\tuhyve_args->{0} = {0};\n'.format(param_name)) - - # Allocate memory for return value if it is a pointer. - if '**' in ret: - f_ibv.write('\n\t// TODO: Take care of return value.\n') - elif '*' in ret: - f_ibv.write('\n\tuhyve_args->ret = kmalloc(sizeof({0}));\n'.format(ret[:-2])) - - # call uhyve_send() using the respective port ID. - port_name = 'UHYVE_PORT_' + function_name.upper() - f_ibv.write('\n\tuhyve_send({0}, (unsigned) virt_to_phys((size_t) ' - '&uhyve_args));\n\n'.format(port_name)) - - f_ibv.write('\t// TODO: Fix pointers in returned data structures.\n') - - f_ibv.write('\treturn uhyve_args.ret;\n') - f_ibv.write('}\n\n\n') - - with open(uhyve_cases_gen_path, 'w') as f_ibv: - - - -# typedef struct { - # // Parameters: - # struct ibv_device *device; - # // Return value: - # struct ibv_context *ret; -# } __attribute__((packed)) uhyve_ibv_open_device_t; - -# int ibv_open_device(struct ibv_device *device) { - # uhyve_ibv_open_device_t uhyve_args; - # uhyve_args.device = (struct ibv_device *) virt_to_phys((size_t) device); - # uhyve_args->ret = kmalloc(sizeof(struct ibv_context)); - - # uhyve_send(UHYVE_PORT_IBV_OPEN_DEVICE, (unsigned)virt_to_phys((size_t) &uhyve_args)); - - # // Set all pointers contained in returned data structure to valid kernel space addresses. - # uhyve_args->ret->device = device; - - # return uhyve_args.ret; -# } diff --git a/tools/ibv_code_generator/uhyve_handler.py b/tools/ibv_code_generator/uhyve_handler.py deleted file mode 100644 index e69de29bb..000000000