diff --git a/kernel/ibv.c b/kernel/ibv.c index 4b4a0ad38..d319fc316 100644 --- a/kernel/ibv.c +++ b/kernel/ibv.c @@ -40,21 +40,37 @@ typedef struct { // In: int *num_devices; // Out: - /*struct ibv_device **ret;*/ - struct ibv_device devices[MAX_NUM_OF_IBV_DEVICES]; + /*struct ibv_device devices[MAX_NUM_OF_IBV_DEVICES];*/ + struct ibv_device **device_list; } __attribute__((packed)) uhyve_ibv_get_device_list_t; struct ibv_device** h_ibv_get_device_list(int *num_devices) { uhyve_ibv_get_device_list_t uhyve_args = {(int*) virt_to_phys((size_t) num_devices)}; - /*(struct ibv_device*) virt_to_phys((size_t) devices)};*/ - &uhyve_args.devices = (struct ibv_device*) virt_to_phys((size_t) uhyve_args.devices); - uhyve_send(UHYVE_PORT_IBV_GET_DEVICE_LIST, (unsigned)virt_to_phys((size_t)&uhyve_args)); - return &uhyve_args.devices; - // TODO: proxy implementation + struct ibv_device **list; + struct ibv_device *devs; + list = calloc(MAX_NUM_OF_IBV_DEVICES, sizeof(struct ibv_device *)); // NUM + 1 ??? + devs = calloc(MAX_NUM_OF_IBV_DEVICES, sizeof(struct ibv_device)); + for (int i = 0; i < MAX_NUM_OF_IBV_DEVICES; i++) { + list[i] = devs + i * sizeof(struct ibv_device) + /*list[i] = calloc(1, sizeof(struct ibv_device));*/ + } + uhyve_args.first_device = (struct ibv_device*) virt_to_phys((size_t) dev_arr); + + uhyve_send(UHYVE_PORT_IBV_GET_DEVICE_LIST, (unsigned)virt_to_phys((size_t)&uhyve_args)); + return &dev_arr; } +/*void h_ibv_get_device_list(int *num_devices)*/ +/*{*/ + /*uhyve_ibv_get_device_list_t uhyve_args = {(int*) virt_to_phys((size_t) num_devices)};*/ + /*uhyve_args.first_device = (struct ibv_device*) virt_to_phys((size_t) uhyve_args.devices);*/ + /*[>&uhyve_args.devices = (struct ibv_device*) virt_to_phys((size_t) uhyve_args.devices);<]*/ + + /*uhyve_send(UHYVE_PORT_IBV_GET_DEVICE_LIST, (unsigned)virt_to_phys((size_t)&uhyve_args));*/ +/*}*/ + typedef struct { struct ibv_device *device; diff --git a/tools/uhyve-ibv.h b/tools/uhyve-ibv.h index 00d6d6dc4..15a6f656f 100644 --- a/tools/uhyve-ibv.h +++ b/tools/uhyve-ibv.h @@ -32,7 +32,8 @@ typedef struct { // In: int *num_devices; // Out: - struct ibv_device devices[MAX_NUM_OF_IBV_DEVICES]; + //struct ibv_device devices[MAX_NUM_OF_IBV_DEVICES]; + struct ibv_device **device_list; } __attribute__((packed)) uhyve_ibv_get_device_list_t; typedef struct { diff --git a/tools/uhyve.c b/tools/uhyve.c index 51a5005be..76f8d1675 100644 --- a/tools/uhyve.c +++ b/tools/uhyve.c @@ -974,20 +974,20 @@ static int vcpu_loop(void) int num_devices; struct ibv_device **temp_dev_list = ibv_get_device_list(&num_devices); - - printf("uhyve.c: before memcpy num_devices.\nGuest mem value: %p\n", guest_mem); - /*uhyve_read->ret = read(uhyve_read->fd, guest_mem+(size_t)uhyve_read->buf, uhyve_read->len);*/ + /*struct ibv_device **temp_dev_list = ibv_get_device_list(guest_mem+(size_t)args->num_devices);*/ + printf("uhyve.c: before memcpy num_devices.\n"); memcpy(guest_mem+(size_t)args->num_devices, &num_devices, sizeof(num_devices)); /*memcpy(args->num_devices, &num_devices, sizeof(num_devices));*/ - /*printf("uhyve.c: before for loop.\n");*/ - /*for (int d = 0; d < 1; d++) {*/ - /*printf("uhyve.c: for loop: before dev ptr definition.\n");*/ - /*[>struct ibv_device* dest_device_guest = guest_mem + (size_t)args->devices + d*sizeof(struct ibv_device);<]*/ - /*printf("uhyve.c: device name: %s\n", temp_dev_list[d]->name);*/ - /*printf("uhyve.c: for loop: before memcpy device struct.\n args->devices val: %s\n", args->devices);*/ - /*memcpy(args->devices, temp_dev_list[d], sizeof(struct ibv_device));*/ - /*}*/ + printf("uhyve.c: before for loop.\n"); + for (int d = 0; d < 1; d++) { // TODO switch to num devices + printf("uhyve.c: for loop: before dev ptr definition.\n"); + /*struct ibv_device* dest_device_guest = guest_mem + (size_t)args->first_device + d*sizeof(struct ibv_device);*/ + struct ibv_device* dest_device_guest = guest_mem + (size_t)args->first_device; + printf("uhyve.c: device name: %s\n", temp_dev_list[d]->name); + printf("uhyve.c: for loop: before memcpy device struct.\n args->devices val: %s\n", args->devices); + memcpy(dest_device_guest, temp_dev_list[d], sizeof(struct ibv_device)); + } /*memcpy(uhyve_netinfo->mac_str, uhyve_get_mac(), 18);*/ /*memcpy(args->ret, ibv_get_device_list((int*)(guest_mem+(size_t)args->num_devices)), 18);*/ diff --git a/usr/tests/ib_test.c b/usr/tests/ib_test.c index d421e115e..e46c5e725 100644 --- a/usr/tests/ib_test.c +++ b/usr/tests/ib_test.c @@ -57,14 +57,14 @@ int main(int argc, char** argv) h_ibv_get_device_list(&num_devices); printf("after get dev list.\n"); - printf("num devices: %s\n", num_devices); + printf("num devices: %d\n", num_devices); /*printf("first device name: %s\n", (*dev_list)->name);*/ /*if (!dev_list) {*/ /*perror("Failed to get IB devices list");*/ /*return 1;*/ /*}*/ - printf("after dev list check.\n"); + /*printf("after dev list check.\n");*/ /*const char* dev_name = h_ibv_get_device_name(dev_list[0]);*/ /*printf("after get device name.\n");*/