1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-30 00:00:15 +01:00

added some struct address conversions, work in progress.

This commit is contained in:
Annika Wierichs 2018-01-22 17:55:41 +01:00
parent 4fae9adace
commit ff134bfc27
6 changed files with 347 additions and 224 deletions

View file

@ -1044,7 +1044,7 @@ struct ibv_send_wr {
void *hdr;
uint16_t hdr_sz;
uint16_t mss;
} tso;
} tso; // TCP Segmentation Offload
};
};
@ -1606,43 +1606,43 @@ enum verbs_context_mask {
VERBS_CONTEXT_RESERVED = 1 << 5
};
struct verbs_context {
/* "grows up" - new fields go here */
int (*destroy_rwq_ind_table)(struct ibv_rwq_ind_table *rwq_ind_table);
struct ibv_rwq_ind_table *(*create_rwq_ind_table)(struct ibv_context *context,
struct ibv_rwq_ind_table_init_attr *init_attr);
int (*destroy_wq)(struct ibv_wq *wq);
int (*modify_wq)(struct ibv_wq *wq, struct ibv_wq_attr *wq_attr);
struct ibv_wq * (*create_wq)(struct ibv_context *context,
struct ibv_wq_init_attr *wq_init_attr);
int (*query_rt_values)(struct ibv_context *context,
struct ibv_values_ex *values);
struct ibv_cq_ex *(*create_cq_ex)(struct ibv_context *context,
struct ibv_cq_init_attr_ex *init_attr);
struct verbs_ex_private *priv;
int (*query_device_ex)(struct ibv_context *context,
const struct ibv_query_device_ex_input *input,
struct ibv_device_attr_ex *attr,
size_t attr_size);
int (*ibv_destroy_flow) (struct ibv_flow *flow);
void (*ABI_placeholder2) (void); /* DO NOT COPY THIS GARBAGE */
struct ibv_flow * (*ibv_create_flow) (struct ibv_qp *qp,
struct ibv_flow_attr *flow_attr);
void (*ABI_placeholder1) (void); /* DO NOT COPY THIS GARBAGE */
struct ibv_qp *(*open_qp)(struct ibv_context *context,
struct ibv_qp_open_attr *attr);
struct ibv_qp *(*create_qp_ex)(struct ibv_context *context,
struct ibv_qp_init_attr_ex *qp_init_attr_ex);
int (*get_srq_num)(struct ibv_srq *srq, uint32_t *srq_num);
struct ibv_srq * (*create_srq_ex)(struct ibv_context *context,
struct ibv_srq_init_attr_ex *srq_init_attr_ex);
struct ibv_xrcd * (*open_xrcd)(struct ibv_context *context,
struct ibv_xrcd_init_attr *xrcd_init_attr);
int (*close_xrcd)(struct ibv_xrcd *xrcd);
uint64_t has_comp_mask;
size_t sz; /* Must be immediately before struct ibv_context */
struct ibv_context context; /* Must be last field in the struct */
};
// struct verbs_context {
// /* "grows up" - new fields go here */
// int (*destroy_rwq_ind_table)(struct ibv_rwq_ind_table *rwq_ind_table);
// struct ibv_rwq_ind_table *(*create_rwq_ind_table)(struct ibv_context *context,
// struct ibv_rwq_ind_table_init_attr *init_attr);
// int (*destroy_wq)(struct ibv_wq *wq);
// int (*modify_wq)(struct ibv_wq *wq, struct ibv_wq_attr *wq_attr);
// struct ibv_wq * (*create_wq)(struct ibv_context *context,
// struct ibv_wq_init_attr *wq_init_attr);
// int (*query_rt_values)(struct ibv_context *context,
// struct ibv_values_ex *values);
// struct ibv_cq_ex *(*create_cq_ex)(struct ibv_context *context,
// struct ibv_cq_init_attr_ex *init_attr);
// struct verbs_ex_private *priv;
// int (*query_device_ex)(struct ibv_context *context,
// const struct ibv_query_device_ex_input *input,
// struct ibv_device_attr_ex *attr,
// size_t attr_size);
// int (*ibv_destroy_flow) (struct ibv_flow *flow);
// void (*ABI_placeholder2) (void); [> DO NOT COPY THIS GARBAGE <]
// struct ibv_flow * (*ibv_create_flow) (struct ibv_qp *qp,
// struct ibv_flow_attr *flow_attr);
// void (*ABI_placeholder1) (void); [> DO NOT COPY THIS GARBAGE <]
// struct ibv_qp *(*open_qp)(struct ibv_context *context,
// struct ibv_qp_open_attr *attr);
// struct ibv_qp *(*create_qp_ex)(struct ibv_context *context,
// struct ibv_qp_init_attr_ex *qp_init_attr_ex);
// int (*get_srq_num)(struct ibv_srq *srq, uint32_t *srq_num);
// struct ibv_srq * (*create_srq_ex)(struct ibv_context *context,
// struct ibv_srq_init_attr_ex *srq_init_attr_ex);
// struct ibv_xrcd * (*open_xrcd)(struct ibv_context *context,
// struct ibv_xrcd_init_attr *xrcd_init_attr);
// int (*close_xrcd)(struct ibv_xrcd *xrcd);
// uint64_t has_comp_mask;
// size_t sz; [> Must be immediately before struct ibv_context <]
// struct ibv_context context; [> Must be last field in the struct <]
// };
//static inline struct verbs_context *verbs_get_ctx(struct ibv_context *ctx)
//{
@ -1650,15 +1650,15 @@ struct verbs_context {
//NULL : container_of(ctx, struct verbs_context, context);
//}
#define verbs_get_ctx_op(ctx, op) ({ \
struct verbs_context *__vctx = verbs_get_ctx(ctx); \
(!__vctx || (__vctx->sz < sizeof(*__vctx) - offsetof(struct verbs_context, op)) || \
!__vctx->op) ? NULL : __vctx; })
// #define verbs_get_ctx_op(ctx, op) ({ \
// struct verbs_context *__vctx = verbs_get_ctx(ctx); \
// (!__vctx || (__vctx->sz < sizeof(*__vctx) - offsetof(struct verbs_context, op)) || \
// !__vctx->op) ? NULL : __vctx; })
#define verbs_set_ctx_op(_vctx, op, ptr) ({ \
struct verbs_context *vctx = _vctx; \
if (vctx && (vctx->sz >= sizeof(*vctx) - offsetof(struct verbs_context, op))) \
vctx->op = ptr; })
// #define verbs_set_ctx_op(_vctx, op, ptr) ({ \
// struct verbs_context *vctx = _vctx; \
// if (vctx && (vctx->sz >= sizeof(*vctx) - offsetof(struct verbs_context, op))) \
// vctx->op = ptr; })
///**
// * ibv_get_device_list - Get list of IB devices currently available

View file

@ -186,7 +186,7 @@ typedef struct {
int ibv_start_poll(struct ibv_cq_ex * cq, struct ibv_poll_cq_attr * attr) {
uhyve_ibv_start_poll_t uhyve_args;
uhyve_args.cq = cq;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_poll_cq_attr *) guest_to_host((size_t) attr);
uhyve_send(UHYVE_PORT_IBV_START_POLL, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -585,8 +585,7 @@ typedef struct {
struct ibv_device ** ibv_get_device_list(int * num_devices) {
uhyve_ibv_get_device_list_t uhyve_args;
/* uhyve_args.num_devices = num_devices; */
uhyve_args.num_devices = (int *) guest_to_host((size_t) num_devices);
uhyve_args.num_devices = num_devices;
uhyve_send(UHYVE_PORT_IBV_GET_DEVICE_LIST, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -710,7 +709,7 @@ typedef struct {
int ibv_get_async_event(struct ibv_context * context, struct ibv_async_event * event) {
uhyve_ibv_get_async_event_t uhyve_args;
uhyve_args.context = context;
uhyve_args.event = event;
uhyve_args.event = (struct ibv_async_event *) guest_to_host((size_t) event);
uhyve_send(UHYVE_PORT_IBV_GET_ASYNC_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -729,7 +728,7 @@ typedef struct {
void ibv_ack_async_event(struct ibv_async_event * event) {
uhyve_ibv_ack_async_event_t uhyve_args;
uhyve_args.event = event;
uhyve_args.event = (struct ibv_async_event *) guest_to_host((size_t) event);
uhyve_send(UHYVE_PORT_IBV_ACK_ASYNC_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args));
}
@ -750,7 +749,7 @@ typedef struct {
int ibv_query_device(struct ibv_context * context, struct ibv_device_attr * device_attr) {
uhyve_ibv_query_device_t uhyve_args;
uhyve_args.context = context;
uhyve_args.device_attr = device_attr;
uhyve_args.device_attr = (struct ibv_device_attr *) guest_to_host((size_t) device_attr);
uhyve_send(UHYVE_PORT_IBV_QUERY_DEVICE, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -775,7 +774,7 @@ int ibv_query_port(struct ibv_context * context, uint8_t port_num, struct ibv_po
uhyve_ibv_query_port_t uhyve_args;
uhyve_args.context = context;
uhyve_args.port_num = port_num;
uhyve_args.port_attr = port_attr;
uhyve_args.port_attr = (struct ibv_port_attr *) guest_to_host((size_t) port_attr);
uhyve_send(UHYVE_PORT_IBV_QUERY_PORT, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -800,7 +799,7 @@ int ___ibv_query_port(struct ibv_context * context, uint8_t port_num, struct ibv
uhyve____ibv_query_port_t uhyve_args;
uhyve_args.context = context;
uhyve_args.port_num = port_num;
uhyve_args.port_attr = port_attr;
uhyve_args.port_attr = (struct ibv_port_attr *) guest_to_host((size_t) port_attr);
uhyve_send(UHYVE_PORT____IBV_QUERY_PORT, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -919,7 +918,7 @@ typedef struct {
struct ibv_flow * ibv_create_flow(struct ibv_qp * qp, struct ibv_flow_attr * flow) {
uhyve_ibv_create_flow_t uhyve_args;
uhyve_args.qp = qp;
uhyve_args.flow = flow;
uhyve_args.flow = (struct ibv_flow_attr *) guest_to_host((size_t) flow);
uhyve_send(UHYVE_PORT_IBV_CREATE_FLOW, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1153,10 +1152,15 @@ int ibv_bind_mw(struct ibv_qp * qp, struct ibv_mw * mw, struct ibv_mw_bind * mw_
uhyve_ibv_bind_mw_t uhyve_args;
uhyve_args.qp = qp;
uhyve_args.mw = mw;
uhyve_args.mw_bind = mw_bind;
uhyve_args.mw_bind = (struct ibv_mw_bind *) guest_to_host((size_t) mw_bind);
uint64_t mw_bind__bind_info__addr = mw_bind->bind_info.addr; // !
mw_bind->bind_info.addr = (uint64_t) guest_to_host((size_t) mw_bind->bind_info.addr)
uhyve_send(UHYVE_PORT_IBV_BIND_MW, (unsigned) virt_to_phys((size_t) &uhyve_args));
mw_bind->bind_info.addr = mw_bind__bind_info__addr;
return uhyve_args.ret;
}
@ -1247,7 +1251,7 @@ typedef struct {
struct ibv_cq_ex * ibv_create_cq_ex(struct ibv_context * context, struct ibv_cq_init_attr_ex * cq_attr) {
uhyve_ibv_create_cq_ex_t uhyve_args;
uhyve_args.context = context;
uhyve_args.cq_attr = cq_attr;
uhyve_args.cq_attr = (struct ibv_cq_init_attr_ex *) guest_to_host((size_t) cq_attr);
uhyve_send(UHYVE_PORT_IBV_CREATE_CQ_EX, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1360,7 +1364,7 @@ int ibv_poll_cq(struct ibv_cq * cq, int num_entries, struct ibv_wc * wc) {
uhyve_ibv_poll_cq_t uhyve_args;
uhyve_args.cq = cq;
uhyve_args.num_entries = num_entries;
uhyve_args.wc = wc;
uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc);
uhyve_send(UHYVE_PORT_IBV_POLL_CQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1406,7 +1410,7 @@ typedef struct {
struct ibv_srq * ibv_create_srq(struct ibv_pd * pd, struct ibv_srq_init_attr * srq_init_attr) {
uhyve_ibv_create_srq_t uhyve_args;
uhyve_args.pd = pd;
uhyve_args.srq_init_attr = srq_init_attr;
uhyve_args.srq_init_attr = (struct ibv_srq_init_attr *) guest_to_host((size_t) srq_init_attr);
uhyve_send(UHYVE_PORT_IBV_CREATE_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1429,7 +1433,7 @@ typedef struct {
struct ibv_srq * ibv_create_srq_ex(struct ibv_context * context, struct ibv_srq_init_attr_ex * srq_init_attr_ex) {
uhyve_ibv_create_srq_ex_t uhyve_args;
uhyve_args.context = context;
uhyve_args.srq_init_attr_ex = srq_init_attr_ex;
uhyve_args.srq_init_attr_ex = (struct ibv_srq_init_attr_ex *) guest_to_host((size_t) srq_init_attr_ex);
uhyve_send(UHYVE_PORT_IBV_CREATE_SRQ_EX, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1453,7 +1457,7 @@ typedef struct {
int ibv_modify_srq(struct ibv_srq * srq, struct ibv_srq_attr * srq_attr, int srq_attr_mask) {
uhyve_ibv_modify_srq_t uhyve_args;
uhyve_args.srq = srq;
uhyve_args.srq_attr = srq_attr;
uhyve_args.srq_attr = (struct ibv_srq_attr *) guest_to_host((size_t) srq_attr);
uhyve_args.srq_attr_mask = srq_attr_mask;
uhyve_send(UHYVE_PORT_IBV_MODIFY_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1477,7 +1481,7 @@ typedef struct {
int ibv_query_srq(struct ibv_srq * srq, struct ibv_srq_attr * srq_attr) {
uhyve_ibv_query_srq_t uhyve_args;
uhyve_args.srq = srq;
uhyve_args.srq_attr = srq_attr;
uhyve_args.srq_attr = (struct ibv_srq_attr *) guest_to_host((size_t) srq_attr);
uhyve_send(UHYVE_PORT_IBV_QUERY_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1569,7 +1573,7 @@ typedef struct {
struct ibv_qp * ibv_create_qp(struct ibv_pd * pd, struct ibv_qp_init_attr * qp_init_attr) {
uhyve_ibv_create_qp_t uhyve_args;
uhyve_args.pd = pd;
uhyve_args.qp_init_attr = qp_init_attr;
uhyve_args.qp_init_attr = (struct ibv_qp_init_attr *) guest_to_host((size_t) qp_init_attr);
uhyve_send(UHYVE_PORT_IBV_CREATE_QP, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1592,7 +1596,7 @@ typedef struct {
struct ibv_qp * ibv_create_qp_ex(struct ibv_context * context, struct ibv_qp_init_attr_ex * qp_init_attr_ex) {
uhyve_ibv_create_qp_ex_t uhyve_args;
uhyve_args.context = context;
uhyve_args.qp_init_attr_ex = qp_init_attr_ex;
uhyve_args.qp_init_attr_ex = (struct ibv_qp_init_attr_ex *) guest_to_host((size_t) qp_init_attr_ex);
uhyve_send(UHYVE_PORT_IBV_CREATE_QP_EX, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1615,7 +1619,7 @@ typedef struct {
int ibv_query_rt_values_ex(struct ibv_context * context, struct ibv_values_ex * values) {
uhyve_ibv_query_rt_values_ex_t uhyve_args;
uhyve_args.context = context;
uhyve_args.values = values;
uhyve_args.values = (struct ibv_values_ex *) guest_to_host((size_t) values);
uhyve_send(UHYVE_PORT_IBV_QUERY_RT_VALUES_EX, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1640,7 +1644,7 @@ int ibv_query_device_ex(struct ibv_context * context, const struct ibv_query_dev
uhyve_ibv_query_device_ex_t uhyve_args;
uhyve_args.context = context;
uhyve_args.input = input;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_device_attr_ex *) guest_to_host((size_t) attr);
uhyve_send(UHYVE_PORT_IBV_QUERY_DEVICE_EX, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1663,7 +1667,7 @@ typedef struct {
struct ibv_qp * ibv_open_qp(struct ibv_context * context, struct ibv_qp_open_attr * qp_open_attr) {
uhyve_ibv_open_qp_t uhyve_args;
uhyve_args.context = context;
uhyve_args.qp_open_attr = qp_open_attr;
uhyve_args.qp_open_attr = (struct ibv_qp_open_attr *) guest_to_host((size_t) qp_open_attr);
uhyve_send(UHYVE_PORT_IBV_OPEN_QP, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1687,7 +1691,7 @@ typedef struct {
int ibv_modify_qp(struct ibv_qp * qp, struct ibv_qp_attr * attr, int attr_mask) {
uhyve_ibv_modify_qp_t uhyve_args;
uhyve_args.qp = qp;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_qp_attr *) guest_to_host((size_t) attr);
uhyve_args.attr_mask = attr_mask;
uhyve_send(UHYVE_PORT_IBV_MODIFY_QP, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1713,9 +1717,9 @@ typedef struct {
int ibv_query_qp(struct ibv_qp * qp, struct ibv_qp_attr * attr, int attr_mask, struct ibv_qp_init_attr * init_attr) {
uhyve_ibv_query_qp_t uhyve_args;
uhyve_args.qp = qp;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_qp_attr *) guest_to_host((size_t) attr);
uhyve_args.attr_mask = attr_mask;
uhyve_args.init_attr = init_attr;
uhyve_args.init_attr = (struct ibv_qp_init_attr *) guest_to_host((size_t) init_attr);
uhyve_send(UHYVE_PORT_IBV_QUERY_QP, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1759,7 +1763,7 @@ typedef struct {
struct ibv_wq * ibv_create_wq(struct ibv_context * context, struct ibv_wq_init_attr * wq_init_attr) {
uhyve_ibv_create_wq_t uhyve_args;
uhyve_args.context = context;
uhyve_args.wq_init_attr = wq_init_attr;
uhyve_args.wq_init_attr = (struct ibv_wq_init_attr *) guest_to_host((size_t) wq_init_attr);
uhyve_send(UHYVE_PORT_IBV_CREATE_WQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1782,7 +1786,7 @@ typedef struct {
int ibv_modify_wq(struct ibv_wq * wq, struct ibv_wq_attr * wq_attr) {
uhyve_ibv_modify_wq_t uhyve_args;
uhyve_args.wq = wq;
uhyve_args.wq_attr = wq_attr;
uhyve_args.wq_attr = (struct ibv_wq_attr *) guest_to_host((size_t) wq_attr);
uhyve_send(UHYVE_PORT_IBV_MODIFY_WQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1868,14 +1872,58 @@ typedef struct {
int ret;
} __attribute__((packed)) uhyve_ibv_post_send_t;
int ibv_post_send(struct ibv_qp * qp, struct ibv_send_wr * wr, struct ibv_send_wr ** bad_wr) {
int ibv_post_send(struct ibv_qp * qp, struct ibv_send_wr * wr, struct ibv_send_wr ** bad_wr) { // !!!
uhyve_ibv_post_send_t uhyve_args;
uhyve_args.qp = qp;
uhyve_args.wr = wr;
uhyve_args.wr = (struct ibv_send_wr *) guest_to_host((size_t) wr);
// TODO: Take care of ** parameter.
bool is_rdma = wr->opcode == IBV_WR_RDMA_WRITE ||
wr->opcode == IBV_WR_RDMA_WRITE_WITH_IMM ||
wr->opcode == IBV_WR_RDMA_READ;
bool is_atomic = wr->opcode == IBV_WR_ATOMIC_CMP_AND_SWP ||
wr->opcode == IBV_WR_ATOMIC_FETCH_AND_ADD;
bool is_bind_mw = wr->opcode == IBV_WR_BIND_MW;
bool is_tso = wr->opcode == IBV_WR_TSO;
// union wr: rdma and atomic
uint64_t wr__wr__rdma__remote_addr;
uint64_t wr__wr__atomic__remote_addr;
if (is_rdma) {
wr__wr__rdma__remote_addr = wr->wr.rdma.remote_addr;
wr->wr.rdma.remote_addr = (uint64_t) guest_to_host((size_t) wr->wr.rdma.remote_addr);
} else if (is_atomic) {
wr__wr__atomic__remote_addr = wr->wr.atomic.remote_addr;
wr->wr.atomic.remote_addr = (uint64_t) guest_to_host((size_t) wr->wr.atomic.remote_addr);
}
// union: bind_mw and tso
uint64_t wr__bind_mw__bind_info__addr;
void * wr__tso__hdr;
if (is_bind_mw) {
wr__bind_mw__bind_info__addr = wr->bind_mw.bind_info.addr;
wr->bind_mw.bind_info.addr = (uint64_t) guest_to_host((size_t) wr->bind_mw.bind_info.addr);
} else if (is_tso) {
wr__tso__hdr = wr->tso.hdr;
wr->tso.hdr = (void *) guest_to_host((size_t) wr->tso.hdr);
}
uhyve_send(UHYVE_PORT_IBV_POST_SEND, (unsigned) virt_to_phys((size_t) &uhyve_args));
// union: bind_mw and tso
if (is_bind_mw) {
wr->bind_mw.bind_info.addr = wr__bind_mw__bind_info__addr;
} else if (is_tso) {
wr->tso.hdr = wr__tso__hdr;
}
// union wr: rdma and atomic
if (is_rdma) {
wr->wr.rdma.remote_addr = wr__wr__rdma__remote_addr;
} else if (is_atomic) {
wr->wr.atomic.remote_addr = wr__wr__atomic__remote_addr;
}
return uhyve_args.ret;
}
@ -1920,7 +1968,7 @@ typedef struct {
struct ibv_ah * ibv_create_ah(struct ibv_pd * pd, struct ibv_ah_attr * attr) {
uhyve_ibv_create_ah_t uhyve_args;
uhyve_args.pd = pd;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_ah_attr *) guest_to_host((size_t) attr);
uhyve_send(UHYVE_PORT_IBV_CREATE_AH, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1947,9 +1995,9 @@ int ibv_init_ah_from_wc(struct ibv_context * context, uint8_t port_num, struct i
uhyve_ibv_init_ah_from_wc_t uhyve_args;
uhyve_args.context = context;
uhyve_args.port_num = port_num;
uhyve_args.wc = wc;
uhyve_args.grh = grh;
uhyve_args.ah_attr = ah_attr;
uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc);
uhyve_args.grh = (struct ibv_grh *) guest_to_host((size_t) grh);
uhyve_args.ah_attr = (struct ibv_ah_attr *) guest_to_host((size_t) ah_attr);
uhyve_send(UHYVE_PORT_IBV_INIT_AH_FROM_WC, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1974,8 +2022,8 @@ typedef struct {
struct ibv_ah * ibv_create_ah_from_wc(struct ibv_pd * pd, struct ibv_wc * wc, struct ibv_grh * grh, uint8_t port_num) {
uhyve_ibv_create_ah_from_wc_t uhyve_args;
uhyve_args.pd = pd;
uhyve_args.wc = wc;
uhyve_args.grh = grh;
uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc);
uhyve_args.grh = (struct ibv_grh *) guest_to_host((size_t) grh);
uhyve_args.port_num = port_num;
uhyve_send(UHYVE_PORT_IBV_CREATE_AH_FROM_WC, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -2156,7 +2204,7 @@ typedef struct {
int ibv_resolve_eth_l2_from_gid(struct ibv_context * context, struct ibv_ah_attr * attr, uint8_t [6] eth_mac, uint16_t * vid) {
uhyve_ibv_resolve_eth_l2_from_gid_t uhyve_args;
uhyve_args.context = context;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_ah_attr *) guest_to_host((size_t) attr);
uhyve_args.eth_mac = eth_mac;
uhyve_args.vid = vid;
@ -2189,7 +2237,6 @@ int ibv_is_qpt_supported(uint32_t caps, enum ibv_qp_type qpt) {
}
/*
* IBV KERNEL LOG
*/

View file

@ -201,6 +201,42 @@ void* create_stack(size_t sz)
return (void*) (viraddr+PAGE_SIZE);
}
void* create_ib_pool_stack(size_t sz)
{
size_t phyaddr, viraddr, bits;
uint32_t npages = PAGE_CEIL(sz) >> PAGE_BITS;
int err;
LOG_DEBUG("create_stack(0x%zx) (%u pages)\n", DEFAULT_STACK_SIZE, npages);
if (BUILTIN_EXPECT(!sz, 0))
return NULL;
// get free virtual address space
viraddr = vma_alloc((npages+2)*PAGE_SIZE, VMA_READ|VMA_WRITE|VMA_CACHEABLE);
if (BUILTIN_EXPECT(!viraddr, 0))
return NULL;
// get continous physical pages
phyaddr = get_pages(npages);
if (BUILTIN_EXPECT(!phyaddr, 0)) {
vma_free(viraddr, viraddr+(npages+2)*PAGE_SIZE);
return NULL;
}
bits = PG_RW|PG_GLOBAL|PG_NX;
// map physical pages to VMA
err = page_map(viraddr+PAGE_SIZE, phyaddr, npages, bits);
if (BUILTIN_EXPECT(err, 0)) {
vma_free(viraddr, viraddr+(npages+2)*PAGE_SIZE);
put_pages(phyaddr, npages);
return NULL;
}
return (void*) (viraddr+PAGE_SIZE);
}
int destroy_stack(void* viraddr, size_t sz)
{
size_t phyaddr;

View file

@ -139,7 +139,7 @@ typedef struct {
int ibv_start_poll(struct ibv_cq_ex * cq, struct ibv_poll_cq_attr * attr) {
uhyve_ibv_start_poll_t uhyve_args;
uhyve_args.cq = cq;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_poll_cq_attr *) guest_to_host((size_t) attr);
uhyve_send(UHYVE_PORT_IBV_START_POLL, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -662,7 +662,7 @@ typedef struct {
int ibv_get_async_event(struct ibv_context * context, struct ibv_async_event * event) {
uhyve_ibv_get_async_event_t uhyve_args;
uhyve_args.context = context;
uhyve_args.event = event;
uhyve_args.event = (struct ibv_async_event *) guest_to_host((size_t) event);
uhyve_send(UHYVE_PORT_IBV_GET_ASYNC_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -681,7 +681,7 @@ typedef struct {
void ibv_ack_async_event(struct ibv_async_event * event) {
uhyve_ibv_ack_async_event_t uhyve_args;
uhyve_args.event = event;
uhyve_args.event = (struct ibv_async_event *) guest_to_host((size_t) event);
uhyve_send(UHYVE_PORT_IBV_ACK_ASYNC_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args));
}
@ -702,7 +702,7 @@ typedef struct {
int ibv_query_device(struct ibv_context * context, struct ibv_device_attr * device_attr) {
uhyve_ibv_query_device_t uhyve_args;
uhyve_args.context = context;
uhyve_args.device_attr = device_attr;
uhyve_args.device_attr = (struct ibv_device_attr *) guest_to_host((size_t) device_attr);
uhyve_send(UHYVE_PORT_IBV_QUERY_DEVICE, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -727,7 +727,7 @@ int ibv_query_port(struct ibv_context * context, uint8_t port_num, struct ibv_po
uhyve_ibv_query_port_t uhyve_args;
uhyve_args.context = context;
uhyve_args.port_num = port_num;
uhyve_args.port_attr = port_attr;
uhyve_args.port_attr = (struct ibv_port_attr *) guest_to_host((size_t) port_attr);
uhyve_send(UHYVE_PORT_IBV_QUERY_PORT, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -752,7 +752,7 @@ int ___ibv_query_port(struct ibv_context * context, uint8_t port_num, struct ibv
uhyve____ibv_query_port_t uhyve_args;
uhyve_args.context = context;
uhyve_args.port_num = port_num;
uhyve_args.port_attr = port_attr;
uhyve_args.port_attr = (struct ibv_port_attr *) guest_to_host((size_t) port_attr);
uhyve_send(UHYVE_PORT____IBV_QUERY_PORT, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -871,7 +871,7 @@ typedef struct {
struct ibv_flow * ibv_create_flow(struct ibv_qp * qp, struct ibv_flow_attr * flow) {
uhyve_ibv_create_flow_t uhyve_args;
uhyve_args.qp = qp;
uhyve_args.flow = flow;
uhyve_args.flow = (struct ibv_flow_attr *) guest_to_host((size_t) flow);
uhyve_send(UHYVE_PORT_IBV_CREATE_FLOW, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1105,7 +1105,7 @@ int ibv_bind_mw(struct ibv_qp * qp, struct ibv_mw * mw, struct ibv_mw_bind * mw_
uhyve_ibv_bind_mw_t uhyve_args;
uhyve_args.qp = qp;
uhyve_args.mw = mw;
uhyve_args.mw_bind = mw_bind;
uhyve_args.mw_bind = (struct ibv_mw_bind *) guest_to_host((size_t) mw_bind);
uhyve_send(UHYVE_PORT_IBV_BIND_MW, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1199,7 +1199,7 @@ typedef struct {
struct ibv_cq_ex * ibv_create_cq_ex(struct ibv_context * context, struct ibv_cq_init_attr_ex * cq_attr) {
uhyve_ibv_create_cq_ex_t uhyve_args;
uhyve_args.context = context;
uhyve_args.cq_attr = cq_attr;
uhyve_args.cq_attr = (struct ibv_cq_init_attr_ex *) guest_to_host((size_t) cq_attr);
uhyve_send(UHYVE_PORT_IBV_CREATE_CQ_EX, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1312,7 +1312,7 @@ int ibv_poll_cq(struct ibv_cq * cq, int num_entries, struct ibv_wc * wc) {
uhyve_ibv_poll_cq_t uhyve_args;
uhyve_args.cq = cq;
uhyve_args.num_entries = num_entries;
uhyve_args.wc = wc;
uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc);
uhyve_send(UHYVE_PORT_IBV_POLL_CQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1358,7 +1358,7 @@ typedef struct {
struct ibv_srq * ibv_create_srq(struct ibv_pd * pd, struct ibv_srq_init_attr * srq_init_attr) {
uhyve_ibv_create_srq_t uhyve_args;
uhyve_args.pd = pd;
uhyve_args.srq_init_attr = srq_init_attr;
uhyve_args.srq_init_attr = (struct ibv_srq_init_attr *) guest_to_host((size_t) srq_init_attr);
uhyve_send(UHYVE_PORT_IBV_CREATE_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1381,7 +1381,7 @@ typedef struct {
struct ibv_srq * ibv_create_srq_ex(struct ibv_context * context, struct ibv_srq_init_attr_ex * srq_init_attr_ex) {
uhyve_ibv_create_srq_ex_t uhyve_args;
uhyve_args.context = context;
uhyve_args.srq_init_attr_ex = srq_init_attr_ex;
uhyve_args.srq_init_attr_ex = (struct ibv_srq_init_attr_ex *) guest_to_host((size_t) srq_init_attr_ex);
uhyve_send(UHYVE_PORT_IBV_CREATE_SRQ_EX, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1405,7 +1405,7 @@ typedef struct {
int ibv_modify_srq(struct ibv_srq * srq, struct ibv_srq_attr * srq_attr, int srq_attr_mask) {
uhyve_ibv_modify_srq_t uhyve_args;
uhyve_args.srq = srq;
uhyve_args.srq_attr = srq_attr;
uhyve_args.srq_attr = (struct ibv_srq_attr *) guest_to_host((size_t) srq_attr);
uhyve_args.srq_attr_mask = srq_attr_mask;
uhyve_send(UHYVE_PORT_IBV_MODIFY_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1429,7 +1429,7 @@ typedef struct {
int ibv_query_srq(struct ibv_srq * srq, struct ibv_srq_attr * srq_attr) {
uhyve_ibv_query_srq_t uhyve_args;
uhyve_args.srq = srq;
uhyve_args.srq_attr = srq_attr;
uhyve_args.srq_attr = (struct ibv_srq_attr *) guest_to_host((size_t) srq_attr);
uhyve_send(UHYVE_PORT_IBV_QUERY_SRQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1521,7 +1521,7 @@ typedef struct {
struct ibv_qp * ibv_create_qp(struct ibv_pd * pd, struct ibv_qp_init_attr * qp_init_attr) {
uhyve_ibv_create_qp_t uhyve_args;
uhyve_args.pd = pd;
uhyve_args.qp_init_attr = qp_init_attr;
uhyve_args.qp_init_attr = (struct ibv_qp_init_attr *) guest_to_host((size_t) qp_init_attr);
uhyve_send(UHYVE_PORT_IBV_CREATE_QP, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1544,7 +1544,7 @@ typedef struct {
struct ibv_qp * ibv_create_qp_ex(struct ibv_context * context, struct ibv_qp_init_attr_ex * qp_init_attr_ex) {
uhyve_ibv_create_qp_ex_t uhyve_args;
uhyve_args.context = context;
uhyve_args.qp_init_attr_ex = qp_init_attr_ex;
uhyve_args.qp_init_attr_ex = (struct ibv_qp_init_attr_ex *) guest_to_host((size_t) qp_init_attr_ex);
uhyve_send(UHYVE_PORT_IBV_CREATE_QP_EX, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1567,7 +1567,7 @@ typedef struct {
int ibv_query_rt_values_ex(struct ibv_context * context, struct ibv_values_ex * values) {
uhyve_ibv_query_rt_values_ex_t uhyve_args;
uhyve_args.context = context;
uhyve_args.values = values;
uhyve_args.values = (struct ibv_values_ex *) guest_to_host((size_t) values);
uhyve_send(UHYVE_PORT_IBV_QUERY_RT_VALUES_EX, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1592,7 +1592,7 @@ int ibv_query_device_ex(struct ibv_context * context, const struct ibv_query_dev
uhyve_ibv_query_device_ex_t uhyve_args;
uhyve_args.context = context;
uhyve_args.input = input;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_device_attr_ex *) guest_to_host((size_t) attr);
uhyve_send(UHYVE_PORT_IBV_QUERY_DEVICE_EX, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1615,7 +1615,7 @@ typedef struct {
struct ibv_qp * ibv_open_qp(struct ibv_context * context, struct ibv_qp_open_attr * qp_open_attr) {
uhyve_ibv_open_qp_t uhyve_args;
uhyve_args.context = context;
uhyve_args.qp_open_attr = qp_open_attr;
uhyve_args.qp_open_attr = (struct ibv_qp_open_attr *) guest_to_host((size_t) qp_open_attr);
uhyve_send(UHYVE_PORT_IBV_OPEN_QP, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1639,7 +1639,7 @@ typedef struct {
int ibv_modify_qp(struct ibv_qp * qp, struct ibv_qp_attr * attr, int attr_mask) {
uhyve_ibv_modify_qp_t uhyve_args;
uhyve_args.qp = qp;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_qp_attr *) guest_to_host((size_t) attr);
uhyve_args.attr_mask = attr_mask;
uhyve_send(UHYVE_PORT_IBV_MODIFY_QP, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1665,9 +1665,9 @@ typedef struct {
int ibv_query_qp(struct ibv_qp * qp, struct ibv_qp_attr * attr, int attr_mask, struct ibv_qp_init_attr * init_attr) {
uhyve_ibv_query_qp_t uhyve_args;
uhyve_args.qp = qp;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_qp_attr *) guest_to_host((size_t) attr);
uhyve_args.attr_mask = attr_mask;
uhyve_args.init_attr = init_attr;
uhyve_args.init_attr = (struct ibv_qp_init_attr *) guest_to_host((size_t) init_attr);
uhyve_send(UHYVE_PORT_IBV_QUERY_QP, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1711,7 +1711,7 @@ typedef struct {
struct ibv_wq * ibv_create_wq(struct ibv_context * context, struct ibv_wq_init_attr * wq_init_attr) {
uhyve_ibv_create_wq_t uhyve_args;
uhyve_args.context = context;
uhyve_args.wq_init_attr = wq_init_attr;
uhyve_args.wq_init_attr = (struct ibv_wq_init_attr *) guest_to_host((size_t) wq_init_attr);
uhyve_send(UHYVE_PORT_IBV_CREATE_WQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1734,7 +1734,7 @@ typedef struct {
int ibv_modify_wq(struct ibv_wq * wq, struct ibv_wq_attr * wq_attr) {
uhyve_ibv_modify_wq_t uhyve_args;
uhyve_args.wq = wq;
uhyve_args.wq_attr = wq_attr;
uhyve_args.wq_attr = (struct ibv_wq_attr *) guest_to_host((size_t) wq_attr);
uhyve_send(UHYVE_PORT_IBV_MODIFY_WQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1872,7 +1872,7 @@ typedef struct {
struct ibv_ah * ibv_create_ah(struct ibv_pd * pd, struct ibv_ah_attr * attr) {
uhyve_ibv_create_ah_t uhyve_args;
uhyve_args.pd = pd;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_ah_attr *) guest_to_host((size_t) attr);
uhyve_send(UHYVE_PORT_IBV_CREATE_AH, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1899,9 +1899,9 @@ int ibv_init_ah_from_wc(struct ibv_context * context, uint8_t port_num, struct i
uhyve_ibv_init_ah_from_wc_t uhyve_args;
uhyve_args.context = context;
uhyve_args.port_num = port_num;
uhyve_args.wc = wc;
uhyve_args.grh = grh;
uhyve_args.ah_attr = ah_attr;
uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc);
uhyve_args.grh = (struct ibv_grh *) guest_to_host((size_t) grh);
uhyve_args.ah_attr = (struct ibv_ah_attr *) guest_to_host((size_t) ah_attr);
uhyve_send(UHYVE_PORT_IBV_INIT_AH_FROM_WC, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1926,8 +1926,8 @@ typedef struct {
struct ibv_ah * ibv_create_ah_from_wc(struct ibv_pd * pd, struct ibv_wc * wc, struct ibv_grh * grh, uint8_t port_num) {
uhyve_ibv_create_ah_from_wc_t uhyve_args;
uhyve_args.pd = pd;
uhyve_args.wc = wc;
uhyve_args.grh = grh;
uhyve_args.wc = (struct ibv_wc *) guest_to_host((size_t) wc);
uhyve_args.grh = (struct ibv_grh *) guest_to_host((size_t) grh);
uhyve_args.port_num = port_num;
uhyve_send(UHYVE_PORT_IBV_CREATE_AH_FROM_WC, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -2108,7 +2108,7 @@ typedef struct {
int ibv_resolve_eth_l2_from_gid(struct ibv_context * context, struct ibv_ah_attr * attr, uint8_t [6] eth_mac, uint16_t * vid) {
uhyve_ibv_resolve_eth_l2_from_gid_t uhyve_args;
uhyve_args.context = context;
uhyve_args.attr = attr;
uhyve_args.attr = (struct ibv_ah_attr *) guest_to_host((size_t) attr);
uhyve_args.eth_mac = eth_mac;
uhyve_args.vid = vid;

View file

@ -1,100 +1,100 @@
typedef enum {
UHYVE_PORT_SET_IB_POOL_ADDR = 0x60F,
UHYVE_PORT_IBV_WC_STATUS_STR = 0x610,
UHYVE_PORT_IBV_RATE_TO_MULT = 0x611,
UHYVE_PORT_MULT_TO_IBV_RATE = 0x612,
UHYVE_PORT_IBV_RATE_TO_MBPS = 0x613,
UHYVE_PORT_MBPS_TO_IBV_RATE = 0x614,
UHYVE_PORT_IBV_CQ_EX_TO_CQ = 0x615,
UHYVE_PORT_IBV_START_POLL = 0x616,
UHYVE_PORT_IBV_NEXT_POLL = 0x617,
UHYVE_PORT_IBV_END_POLL = 0x618,
UHYVE_PORT_IBV_WC_READ_OPCODE = 0x619,
UHYVE_PORT_IBV_WC_READ_VENDOR_ERR = 0x61A,
UHYVE_PORT_IBV_WC_READ_BYTE_LEN = 0x61B,
UHYVE_PORT_IBV_WC_READ_IMM_DATA = 0x61C,
UHYVE_PORT_SET_IB_POOL_ADDR = 0x60F,
UHYVE_PORT_IBV_WC_STATUS_STR = 0x610,
UHYVE_PORT_IBV_RATE_TO_MULT = 0x611,
UHYVE_PORT_MULT_TO_IBV_RATE = 0x612,
UHYVE_PORT_IBV_RATE_TO_MBPS = 0x613,
UHYVE_PORT_MBPS_TO_IBV_RATE = 0x614,
UHYVE_PORT_IBV_CQ_EX_TO_CQ = 0x615,
UHYVE_PORT_IBV_START_POLL = 0x616,
UHYVE_PORT_IBV_NEXT_POLL = 0x617,
UHYVE_PORT_IBV_END_POLL = 0x618,
UHYVE_PORT_IBV_WC_READ_OPCODE = 0x619,
UHYVE_PORT_IBV_WC_READ_VENDOR_ERR = 0x61A,
UHYVE_PORT_IBV_WC_READ_BYTE_LEN = 0x61B,
UHYVE_PORT_IBV_WC_READ_IMM_DATA = 0x61C,
UHYVE_PORT_IBV_WC_READ_INVALIDATED_RKEY = 0x61D,
UHYVE_PORT_IBV_WC_READ_QP_NUM = 0x61E,
UHYVE_PORT_IBV_WC_READ_SRC_QP = 0x61F,
UHYVE_PORT_IBV_WC_READ_WC_FLAGS = 0x620,
UHYVE_PORT_IBV_WC_READ_SLID = 0x621,
UHYVE_PORT_IBV_WC_READ_SL = 0x622,
UHYVE_PORT_IBV_WC_READ_DLID_PATH_BITS = 0x623,
UHYVE_PORT_IBV_WC_READ_COMPLETION_TS = 0x624,
UHYVE_PORT_IBV_WC_READ_CVLAN = 0x625,
UHYVE_PORT_IBV_WC_READ_FLOW_TAG = 0x626,
UHYVE_PORT_IBV_POST_WQ_RECV = 0x627,
UHYVE_PORT_VERBS_GET_CTX = 0x628,
UHYVE_PORT_IBV_GET_DEVICE_LIST = 0x629,
UHYVE_PORT_IBV_FREE_DEVICE_LIST = 0x62A,
UHYVE_PORT_IBV_GET_DEVICE_NAME = 0x62B,
UHYVE_PORT_IBV_GET_DEVICE_GUID = 0x62C,
UHYVE_PORT_IBV_OPEN_DEVICE = 0x62D,
UHYVE_PORT_IBV_CLOSE_DEVICE = 0x62E,
UHYVE_PORT_IBV_GET_ASYNC_EVENT = 0x62F,
UHYVE_PORT_IBV_ACK_ASYNC_EVENT = 0x630,
UHYVE_PORT_IBV_QUERY_DEVICE = 0x631,
UHYVE_PORT_IBV_QUERY_PORT = 0x632,
UHYVE_PORT____IBV_QUERY_PORT = 0x633,
UHYVE_PORT_IBV_QUERY_GID = 0x634,
UHYVE_PORT_IBV_QUERY_PKEY = 0x635,
UHYVE_PORT_IBV_ALLOC_PD = 0x636,
UHYVE_PORT_IBV_DEALLOC_PD = 0x637,
UHYVE_PORT_IBV_CREATE_FLOW = 0x638,
UHYVE_PORT_IBV_DESTROY_FLOW = 0x639,
UHYVE_PORT_IBV_OPEN_XRCD = 0x63A,
UHYVE_PORT_IBV_CLOSE_XRCD = 0x63B,
UHYVE_PORT_IBV_REG_MR = 0x63C,
UHYVE_PORT_IBV_REREG_MR = 0x63D,
UHYVE_PORT_IBV_DEREG_MR = 0x63E,
UHYVE_PORT_IBV_ALLOC_MW = 0x63F,
UHYVE_PORT_IBV_DEALLOC_MW = 0x640,
UHYVE_PORT_IBV_INC_RKEY = 0x641,
UHYVE_PORT_IBV_BIND_MW = 0x642,
UHYVE_PORT_IBV_CREATE_COMP_CHANNEL = 0x643,
UHYVE_PORT_IBV_DESTROY_COMP_CHANNEL = 0x644,
UHYVE_PORT_IBV_CREATE_CQ = 0x645,
UHYVE_PORT_IBV_CREATE_CQ_EX = 0x646,
UHYVE_PORT_IBV_RESIZE_CQ = 0x647,
UHYVE_PORT_IBV_DESTROY_CQ = 0x648,
UHYVE_PORT_IBV_GET_CQ_EVENT = 0x649,
UHYVE_PORT_IBV_ACK_CQ_EVENTS = 0x64A,
UHYVE_PORT_IBV_POLL_CQ = 0x64B,
UHYVE_PORT_IBV_REQ_NOTIFY_CQ = 0x64C,
UHYVE_PORT_IBV_CREATE_SRQ = 0x64D,
UHYVE_PORT_IBV_CREATE_SRQ_EX = 0x64E,
UHYVE_PORT_IBV_MODIFY_SRQ = 0x64F,
UHYVE_PORT_IBV_QUERY_SRQ = 0x650,
UHYVE_PORT_IBV_GET_SRQ_NUM = 0x651,
UHYVE_PORT_IBV_DESTROY_SRQ = 0x652,
UHYVE_PORT_IBV_POST_SRQ_RECV = 0x653,
UHYVE_PORT_IBV_CREATE_QP = 0x654,
UHYVE_PORT_IBV_CREATE_QP_EX = 0x655,
UHYVE_PORT_IBV_QUERY_RT_VALUES_EX = 0x656,
UHYVE_PORT_IBV_QUERY_DEVICE_EX = 0x657,
UHYVE_PORT_IBV_OPEN_QP = 0x658,
UHYVE_PORT_IBV_MODIFY_QP = 0x659,
UHYVE_PORT_IBV_QUERY_QP = 0x65A,
UHYVE_PORT_IBV_DESTROY_QP = 0x65B,
UHYVE_PORT_IBV_CREATE_WQ = 0x65C,
UHYVE_PORT_IBV_MODIFY_WQ = 0x65D,
UHYVE_PORT_IBV_DESTROY_WQ = 0x65E,
UHYVE_PORT_IBV_CREATE_RWQ_IND_TABLE = 0x65F,
UHYVE_PORT_IBV_DESTROY_RWQ_IND_TABLE = 0x660,
UHYVE_PORT_IBV_POST_SEND = 0x661,
UHYVE_PORT_IBV_POST_RECV = 0x662,
UHYVE_PORT_IBV_CREATE_AH = 0x663,
UHYVE_PORT_IBV_INIT_AH_FROM_WC = 0x664,
UHYVE_PORT_IBV_CREATE_AH_FROM_WC = 0x665,
UHYVE_PORT_IBV_DESTROY_AH = 0x666,
UHYVE_PORT_IBV_ATTACH_MCAST = 0x667,
UHYVE_PORT_IBV_DETACH_MCAST = 0x668,
UHYVE_PORT_IBV_FORK_INIT = 0x669,
UHYVE_PORT_IBV_NODE_TYPE_STR = 0x66A,
UHYVE_PORT_IBV_PORT_STATE_STR = 0x66B,
UHYVE_PORT_IBV_EVENT_TYPE_STR = 0x66C,
UHYVE_PORT_IBV_RESOLVE_ETH_L2_FROM_GID = 0x66D,
UHYVE_PORT_IBV_IS_QPT_SUPPORTED = 0x66E,
UHYVE_PORT_IBV_WC_READ_QP_NUM = 0x61E,
UHYVE_PORT_IBV_WC_READ_SRC_QP = 0x61F,
UHYVE_PORT_IBV_WC_READ_WC_FLAGS = 0x620,
UHYVE_PORT_IBV_WC_READ_SLID = 0x621,
UHYVE_PORT_IBV_WC_READ_SL = 0x622,
UHYVE_PORT_IBV_WC_READ_DLID_PATH_BITS = 0x623,
UHYVE_PORT_IBV_WC_READ_COMPLETION_TS = 0x624,
UHYVE_PORT_IBV_WC_READ_CVLAN = 0x625,
UHYVE_PORT_IBV_WC_READ_FLOW_TAG = 0x626,
UHYVE_PORT_IBV_POST_WQ_RECV = 0x627,
UHYVE_PORT_VERBS_GET_CTX = 0x628,
UHYVE_PORT_IBV_GET_DEVICE_LIST = 0x629,
UHYVE_PORT_IBV_FREE_DEVICE_LIST = 0x62A,
UHYVE_PORT_IBV_GET_DEVICE_NAME = 0x62B,
UHYVE_PORT_IBV_GET_DEVICE_GUID = 0x62C,
UHYVE_PORT_IBV_OPEN_DEVICE = 0x62D,
UHYVE_PORT_IBV_CLOSE_DEVICE = 0x62E,
UHYVE_PORT_IBV_GET_ASYNC_EVENT = 0x62F,
UHYVE_PORT_IBV_ACK_ASYNC_EVENT = 0x630,
UHYVE_PORT_IBV_QUERY_DEVICE = 0x631,
UHYVE_PORT_IBV_QUERY_PORT = 0x632,
UHYVE_PORT____IBV_QUERY_PORT = 0x633,
UHYVE_PORT_IBV_QUERY_GID = 0x634,
UHYVE_PORT_IBV_QUERY_PKEY = 0x635,
UHYVE_PORT_IBV_ALLOC_PD = 0x636,
UHYVE_PORT_IBV_DEALLOC_PD = 0x637,
UHYVE_PORT_IBV_CREATE_FLOW = 0x638,
UHYVE_PORT_IBV_DESTROY_FLOW = 0x639,
UHYVE_PORT_IBV_OPEN_XRCD = 0x63A,
UHYVE_PORT_IBV_CLOSE_XRCD = 0x63B,
UHYVE_PORT_IBV_REG_MR = 0x63C,
UHYVE_PORT_IBV_REREG_MR = 0x63D,
UHYVE_PORT_IBV_DEREG_MR = 0x63E,
UHYVE_PORT_IBV_ALLOC_MW = 0x63F,
UHYVE_PORT_IBV_DEALLOC_MW = 0x640,
UHYVE_PORT_IBV_INC_RKEY = 0x641,
UHYVE_PORT_IBV_BIND_MW = 0x642,
UHYVE_PORT_IBV_CREATE_COMP_CHANNEL = 0x643,
UHYVE_PORT_IBV_DESTROY_COMP_CHANNEL = 0x644,
UHYVE_PORT_IBV_CREATE_CQ = 0x645,
UHYVE_PORT_IBV_CREATE_CQ_EX = 0x646,
UHYVE_PORT_IBV_RESIZE_CQ = 0x647,
UHYVE_PORT_IBV_DESTROY_CQ = 0x648,
UHYVE_PORT_IBV_GET_CQ_EVENT = 0x649,
UHYVE_PORT_IBV_ACK_CQ_EVENTS = 0x64A,
UHYVE_PORT_IBV_POLL_CQ = 0x64B,
UHYVE_PORT_IBV_REQ_NOTIFY_CQ = 0x64C,
UHYVE_PORT_IBV_CREATE_SRQ = 0x64D,
UHYVE_PORT_IBV_CREATE_SRQ_EX = 0x64E,
UHYVE_PORT_IBV_MODIFY_SRQ = 0x64F,
UHYVE_PORT_IBV_QUERY_SRQ = 0x650,
UHYVE_PORT_IBV_GET_SRQ_NUM = 0x651,
UHYVE_PORT_IBV_DESTROY_SRQ = 0x652,
UHYVE_PORT_IBV_POST_SRQ_RECV = 0x653,
UHYVE_PORT_IBV_CREATE_QP = 0x654,
UHYVE_PORT_IBV_CREATE_QP_EX = 0x655,
UHYVE_PORT_IBV_QUERY_RT_VALUES_EX = 0x656,
UHYVE_PORT_IBV_QUERY_DEVICE_EX = 0x657,
UHYVE_PORT_IBV_OPEN_QP = 0x658,
UHYVE_PORT_IBV_MODIFY_QP = 0x659,
UHYVE_PORT_IBV_QUERY_QP = 0x65A,
UHYVE_PORT_IBV_DESTROY_QP = 0x65B,
UHYVE_PORT_IBV_CREATE_WQ = 0x65C,
UHYVE_PORT_IBV_MODIFY_WQ = 0x65D,
UHYVE_PORT_IBV_DESTROY_WQ = 0x65E,
UHYVE_PORT_IBV_CREATE_RWQ_IND_TABLE = 0x65F,
UHYVE_PORT_IBV_DESTROY_RWQ_IND_TABLE = 0x660,
UHYVE_PORT_IBV_POST_SEND = 0x661,
UHYVE_PORT_IBV_POST_RECV = 0x662,
UHYVE_PORT_IBV_CREATE_AH = 0x663,
UHYVE_PORT_IBV_INIT_AH_FROM_WC = 0x664,
UHYVE_PORT_IBV_CREATE_AH_FROM_WC = 0x665,
UHYVE_PORT_IBV_DESTROY_AH = 0x666,
UHYVE_PORT_IBV_ATTACH_MCAST = 0x667,
UHYVE_PORT_IBV_DETACH_MCAST = 0x668,
UHYVE_PORT_IBV_FORK_INIT = 0x669,
UHYVE_PORT_IBV_NODE_TYPE_STR = 0x66A,
UHYVE_PORT_IBV_PORT_STATE_STR = 0x66B,
UHYVE_PORT_IBV_EVENT_TYPE_STR = 0x66C,
UHYVE_PORT_IBV_RESOLVE_ETH_L2_FROM_GID = 0x66D,
UHYVE_PORT_IBV_IS_QPT_SUPPORTED = 0x66E,
} uhyve_ibv_t;
typedef struct {

View file

@ -109,6 +109,52 @@ PORT_NUMBER_START = 0x610
TABS = ["", "\t", "\t\t", "\t\t\t", "\t\t\t\t"]
NEWLINES = ["", "\n", "\n\n"]
params_in_guest_mem = ['struct ibv_device_attr',
'struct ibv_device_attr_ex',
'struct ibv_port_attr',
'struct ibv_ah_attr',
'struct ibv_srq_attr',
'struct ibv_wq_attr',
'struct ibv_qp_attr',
'struct ibv_poll_cq_attr',
'struct ibv_flow_attr',
'struct ibv_global_route',
'struct ibv_packet_pacing_caps',
'struct ibv_qp_cap',
'struct ibv_odp_caps',
'struct ibv_tso_caps',
'struct ibv_rss_caps',
'struct ibv_flow_eth_filter',
'struct ibv_flow_spec_eth',
'struct ibv_flow_ipv4_filter',
'struct ibv_flow_spec_ipv4',
'struct ibv_flow_ipv4_ext_filter',
'struct ibv_flow_spec_ipv4_ext',
'struct ibv_flow_ipv6_filter',
'struct ibv_flow_spec_ipv6',
'struct ibv_flow_tcp_udp_filter',
'struct ibv_flow_spec_tcp_udp',
'struct ibv_flow_tunnel_filter',
'struct ibv_flow_spec_tunnel',
'struct ibv_flow_spec_action_tag',
'struct ibv_flow_spec_action_drop',
'struct ibv_query_device_ex_input',
'struct ibv_wc',
'struct ibv_grh',
'struct ibv_mw_bind',
'struct ibv_flow_spec',
'struct ibv_values_ex',
# containing ib pool pointers:
'struct ibv_wq_init_attr',
'struct ibv_qp_init_attr',
'struct ibv_qp_init_attr_ex',
'struct ibv_srq_init_attr_ex',
'struct ibv_srq_init_attr',
'struct ibv_qp_open_attr',
'struct ibv_cq_init_attr_ex',
'struct ibv_async_event']
class Type:
def __init__(self, string):
ts = string
@ -124,7 +170,7 @@ class Type:
def get_struct_name(self):
name = ""
if is_struct():
if self.is_struct():
name = self.type_components[1]
return name
@ -149,8 +195,6 @@ class FunctionParameter:
components = string.split(" ")
type_string = " ".join(components[:-1])
# print("string in FunctionParameter: ", string)
self.type = Type(type_string)
self.name = components[-1]
@ -202,7 +246,7 @@ class FunctionPrototype:
return code
def generate_function_declaration(self):
return "{} {}({});\n".format(self.ret.type_string, self.function_name,
return "{} {}({});\n".format(self.ret.type_string, self.function_name,
self.get_string_of_parameters())
def get_string_of_parameters(self):
@ -258,11 +302,18 @@ def generate_kernel_function(function_prototype):
code = "{0} {1}({2}) {{\n".format(ret_type.type_string, fnc_name, comma_separated_params)
code += "\t{0} uhyve_args;\n".format(function_prototype.get_args_struct_name())
# uhyve_args.attr = (struct ibv_poll_cq_attr *) guest_to_host((size_t) attr);
for p in params or []:
if p.is_pointer_pointer():
code += "\t// TODO: Take care of ** parameter.\n"
else:
code += "\tuhyve_args.{0} = {0};\n".format(p.name)
# print (p.get_struct_name())
if 'struct ' + p.get_struct_name() in params_in_guest_mem and p.is_pointer():
code += "\tuhyve_args.{0} = ({1}) guest_to_host((size_t) {0});\n".format(
p.name, p.type.type_string)
else:
code += "\tuhyve_args.{0} = {0};\n".format(p.name)
code += "\n"
code += "\tuhyve_send({0}, (unsigned) virt_to_phys((size_t) &uhyve_args));\n".format(port_name)
@ -272,17 +323,6 @@ def generate_kernel_function(function_prototype):
return code
# case UHYVE_PORT_SET_IB_POOL_ADDR:
# printf("LOG: UHYVE CASE\n");
# unsigned data = *((unsigned*)((size_t)run+run->io.data_offset));
# uint64_t * temp = (uint64_t*)(guest_mem + data);
# /* printf("LOG: Value of uint64 pool start: %" PRIu64 "\n", *temp); */
# printf("LOG: Value of uint64 pool start: %p\n", *temp);
# ib_pool_addr = (uint8_t*) *temp;
# /* printf("LOG: Value of uint8 pool start: %" PRIu8 "\n", ib_pool_addr); */
# printf("LOG: Value of uint8 pool start: %p\n", ib_pool_addr);
# ib_pool_top = ib_pool_addr;
# break;
def generate_uhyve_cases(function_prototypes):
""" Generates all switch-cases for uhyve's KVM exit IO.