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

ibv_get_device_list() working. Need to check phys memory conversions.

This commit is contained in:
Annika Wierichs 2017-10-21 15:49:35 +02:00
parent 26691d555d
commit aae4dcb937
4 changed files with 45 additions and 58 deletions

View file

@ -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)};*/

View file

@ -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 {

View file

@ -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;
}

View file

@ -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<argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);
raise(SIGUSR1);
file = fopen("/etc/hostname", "r");
if (file)
{
char fname[N] = "";
fscanf(file, "%s", fname);
printf("Hostname: %s\n", fname);
fclose(file);
} else fprintf(stderr, "Unable to open file /etc/hostname\n");
file = fopen("/tmp/test.txt", "w");
if (file)
{
fprintf(file, "Hello World!!!\n");
fclose(file);
} else fprintf(stderr, "Unable to open file /tmp/test.txt\n");
return 0;
}