diff --git a/kernel/ibv.c b/kernel/ibv.c index d319fc316..25216baed 100644 --- a/kernel/ibv.c +++ b/kernel/ibv.c @@ -40,28 +40,49 @@ typedef struct { // In: int *num_devices; // Out: - /*struct ibv_device devices[MAX_NUM_OF_IBV_DEVICES];*/ - struct ibv_device **device_list; + struct ibv_device *dev_phys_ptr_list[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 **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)); + struct ibv_device *devs = kmalloc(MAX_NUM_OF_IBV_DEVICES * sizeof(struct ibv_device)); + struct ibv_device **list_virt; + list_virt = kmalloc(MAX_NUM_OF_IBV_DEVICES * sizeof(struct ibv_device *)); // NUM + 1 ??? + 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));*/ + struct ibv_device* device_address = devs + i; + list_virt[i] = device_address; + uhyve_args.dev_phys_ptr_list[i] = (struct ibv_device*) virt_to_phys((size_t) device_address); } - 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; + return list_virt; } +/*struct ibv_device** h_ibv_get_device_list(int *num_devices)*/ +/*{*/ + /*struct ibv_device *devs = calloc(MAX_NUM_OF_IBV_DEVICES, sizeof(struct ibv_device));*/ + + /*struct ibv_device **list_phys; */ + /*struct ibv_device **list_virt;*/ + /*list_phys = calloc(MAX_NUM_OF_IBV_DEVICES, sizeof(struct ibv_device *)); // NUM + 1 ???*/ + /*list_virt = calloc(MAX_NUM_OF_IBV_DEVICES, sizeof(struct ibv_device *)); // NUM + 1 ???*/ + /*for (int i = 0; i < MAX_NUM_OF_IBV_DEVICES; i++) {*/ + /*struct ibv_device* device_address = devs + i;*/ + /*list_virt[i] = device_address;*/ + /*list_phys[i] = (struct ibv_device*) virt_to_phys((size_t) device_address);*/ + /*[>list_phys[i] = calloc(1, sizeof(struct ibv_device));<]*/ + /*}*/ + /*uhyve_ibv_get_device_list_t uhyve_args =*/ + /*{(int*) virt_to_phys((size_t) num_devices), (struct ibv_device**) virt_to_phys((size_t) list_phys)};*/ + + /*uhyve_send(UHYVE_PORT_IBV_GET_DEVICE_LIST, (unsigned)virt_to_phys((size_t)&uhyve_args));*/ + /*return list_virt;*/ +/*}*/ + /*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)};*/ diff --git a/tools/uhyve-ibv.h b/tools/uhyve-ibv.h index 15a6f656f..e6ff46616 100644 --- a/tools/uhyve-ibv.h +++ b/tools/uhyve-ibv.h @@ -33,7 +33,8 @@ typedef struct { int *num_devices; // Out: //struct ibv_device devices[MAX_NUM_OF_IBV_DEVICES]; - struct ibv_device **device_list; + struct ibv_device *dev_phys_ptr_list[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 76f8d1675..dbe9bd6b2 100644 --- a/tools/uhyve.c +++ b/tools/uhyve.c @@ -974,25 +974,19 @@ static int vcpu_loop(void) int num_devices; struct ibv_device **temp_dev_list = ibv_get_device_list(&num_devices); - /*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++) { // TODO switch to num devices - printf("uhyve.c: for loop: before dev ptr definition.\n"); + for (int d = 0; d < num_devices; d++) { // TODO switch to num devices /*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)); + /*struct ibv_device* dest_device_guest = guest_mem + (size_t)args->first_device;*/ + /*memcpy(dest_device_guest, temp_dev_list[d], sizeof(struct ibv_device));*/ + printf("uhyve.c: before memcpy list[d].\n"); + memcpy(guest_mem + (size_t)args->dev_phys_ptr_list[d], 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);*/ - /*args->ret = ibv_get_device_list((int*)(guest_mem+(size_t)args->num_devices));*/ - printf("uhyve.c: before break.\n"); break; } diff --git a/usr/tests/ib_test.c b/usr/tests/ib_test.c index e46c5e725..dd0a0a139 100644 --- a/usr/tests/ib_test.c +++ b/usr/tests/ib_test.c @@ -51,14 +51,15 @@ int main(int argc, char** argv) struct ibv_device **dev_list; int num_devices; - printf("before get dev list.\n"); + printf("ib_test.c: before get dev list.\n"); + dev_list = h_ibv_get_device_list(&num_devices); + printf("ib_test.c: after get dev list.\n"); - /*dev_list = h_ibv_get_device_list(&num_devices);*/ - h_ibv_get_device_list(&num_devices); - printf("after get dev list.\n"); + printf("ib_test.c: num devices: %d\n", num_devices); - printf("num devices: %d\n", num_devices); - /*printf("first device name: %s\n", (*dev_list)->name);*/ + for (int i=0; i < num_devices; i++) { + printf("ib_test.c: Device name No. %d: %s\n", i, dev_list[i]->name); + } /*if (!dev_list) {*/ /*perror("Failed to get IB devices list");*/ @@ -77,36 +78,6 @@ int main(int argc, char** argv) /*printf("Device: %s", dev_name);*/ /*printf("\nafter get dev name.\n");*/ - // --------------------------------------------------------------------------- - - // register test handler - signal(SIGUSR1, test_handler); - - printf("Hello World!!!\n"); - //for(i=0; environ[i]; i++) - // printf("environ[%d] = %s\n", i, environ[i]); - for(i=0; i