|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 6/9] tools/libs/light: Add "read" command to xl pcid and libxl PCI
From: Anastasiia Lukianenko <anastasiia_lukianenko@xxxxxxxx>
Libxl PCI can use xl pcid server to read integer value from the given path.
Signed-off-by: Anastasiia Lukianenko <anastasiia_lukianenko@xxxxxxxx>
---
tools/include/pcid.h | 1 +
tools/libs/light/libxl_pci.c | 125 ++++++++++++++++++----------------
tools/libs/light/libxl_pcid.c | 50 ++++++++++++++
3 files changed, 119 insertions(+), 57 deletions(-)
diff --git a/tools/include/pcid.h b/tools/include/pcid.h
index 935d99b186..f39011ecb8 100644
--- a/tools/include/pcid.h
+++ b/tools/include/pcid.h
@@ -32,6 +32,7 @@
#define PCID_CMD_DIR_ID "dir_id"
#define PCID_CMD_WRITE "write"
+#define PCID_CMD_READ_HEX "read_hex"
#define PCID_CMD_PCI_PATH "pci_path"
#define PCID_CMD_PCI_INFO "pci_info"
diff --git a/tools/libs/light/libxl_pci.c b/tools/libs/light/libxl_pci.c
index 03ce42dec3..d5ddca4964 100644
--- a/tools/libs/light/libxl_pci.c
+++ b/tools/libs/light/libxl_pci.c
@@ -634,83 +634,94 @@ static int sysfs_dev_unbind(libxl__gc *gc,
libxl_device_pci *pci,
static uint16_t sysfs_dev_get_vendor(libxl__gc *gc, libxl_device_pci *pci)
{
char *pci_device_vendor_path =
- GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/vendor",
- pci->domain, pci->bus, pci->dev, pci->func);
- uint16_t read_items;
+ GCSPRINTF("/"PCI_BDF"/vendor", pci->domain, pci->bus,
+ pci->dev, pci->func);
uint16_t pci_device_vendor;
+ struct vchan_info *vchan;
+ libxl__json_object *args = NULL, *result = NULL;
- FILE *f = fopen(pci_device_vendor_path, "r");
- if (!f) {
- LOGE(ERROR,
- "pci device "PCI_BDF" does not have vendor attribute",
- pci->domain, pci->bus, pci->dev, pci->func);
- return 0xffff;
- }
- read_items = fscanf(f, "0x%hx\n", &pci_device_vendor);
- fclose(f);
- if (read_items != 1) {
- LOGE(ERROR,
- "cannot read vendor of pci device "PCI_BDF,
- pci->domain, pci->bus, pci->dev, pci->func);
- return 0xffff;
- }
+ vchan = pci_prepare_vchan(gc);
+ if (!vchan)
+ goto fail;
+ libxl__vchan_param_add_string(gc, &args, PCID_CMD_PCI_INFO,
+ pci_device_vendor_path);
+ libxl__vchan_param_add_string(gc, &args, PCID_CMD_DIR_ID,
+ PCID_PCI_DEV);
+ result = vchan_send_command(gc, vchan, PCID_CMD_READ_HEX, args);
+ if (!result)
+ goto fail;
+
+ pci_device_vendor = libxl__json_object_get_integer(result);
return pci_device_vendor;
+
+fail:
+ LOGE(ERROR,
+ "cannot read vendor of pci device "PCI_BDF,
+ pci->domain, pci->bus, pci->dev, pci->func);
+ return 0xffff;
}
static uint16_t sysfs_dev_get_device(libxl__gc *gc, libxl_device_pci *pci)
{
char *pci_device_device_path =
- GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/device",
- pci->domain, pci->bus, pci->dev, pci->func);
- uint16_t read_items;
+ GCSPRINTF("/"PCI_BDF"/device", pci->domain, pci->bus,
+ pci->dev, pci->func);
uint16_t pci_device_device;
+ struct vchan_info *vchan;
+ libxl__json_object *args = NULL, *result = NULL;
- FILE *f = fopen(pci_device_device_path, "r");
- if (!f) {
- LOGE(ERROR,
- "pci device "PCI_BDF" does not have device attribute",
- pci->domain, pci->bus, pci->dev, pci->func);
- return 0xffff;
- }
- read_items = fscanf(f, "0x%hx\n", &pci_device_device);
- fclose(f);
- if (read_items != 1) {
- LOGE(ERROR,
- "cannot read device of pci device "PCI_BDF,
- pci->domain, pci->bus, pci->dev, pci->func);
- return 0xffff;
- }
+ vchan = pci_prepare_vchan(gc);
+ if (!vchan)
+ goto fail;
+ libxl__vchan_param_add_string(gc, &args, PCID_CMD_PCI_INFO,
+ pci_device_device_path);
+ libxl__vchan_param_add_string(gc, &args, PCID_CMD_DIR_ID,
+ PCID_PCI_DEV);
+ result = vchan_send_command(gc, vchan, PCID_CMD_READ_HEX, args);
+ if (!result)
+ goto fail;
+
+ pci_device_device = libxl__json_object_get_integer(result);
return pci_device_device;
+
+fail:
+ LOGE(ERROR,
+ "cannot read device of pci device "PCI_BDF,
+ pci->domain, pci->bus, pci->dev, pci->func);
+ return 0xffff;
}
static int sysfs_dev_get_class(libxl__gc *gc, libxl_device_pci *pci,
unsigned long *class)
{
- char *pci_device_class_path = GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/class",
- pci->domain, pci->bus, pci->dev, pci->func);
- int read_items, ret = 0;
+ char *pci_device_class_path = GCSPRINTF("/"PCI_BDF"/class",
+ pci->domain, pci->bus,
+ pci->dev, pci->func);
+ struct vchan_info *vchan;
+ libxl__json_object *args = NULL, *result = NULL;
- FILE *f = fopen(pci_device_class_path, "r");
- if (!f) {
- LOGE(ERROR,
- "pci device "PCI_BDF" does not have class attribute",
- pci->domain, pci->bus, pci->dev, pci->func);
- ret = ERROR_FAIL;
- goto out;
- }
- read_items = fscanf(f, "0x%lx\n", class);
- fclose(f);
- if (read_items != 1) {
- LOGE(ERROR,
- "cannot read class of pci device "PCI_BDF,
- pci->domain, pci->bus, pci->dev, pci->func);
- ret = ERROR_FAIL;
- }
+ vchan = pci_prepare_vchan(gc);
+ if (!vchan)
+ goto fail;
+ libxl__vchan_param_add_string(gc, &args, PCID_CMD_PCI_INFO,
+ pci_device_class_path);
+ libxl__vchan_param_add_string(gc, &args, PCID_CMD_DIR_ID,
+ PCID_PCI_DEV);
+ result = vchan_send_command(gc, vchan, PCID_CMD_READ_HEX, args);
+ if (!result)
+ goto fail;
-out:
- return ret;
+ *class = libxl__json_object_get_integer(result);
+
+ return 0;
+
+fail:
+ LOGE(ERROR,
+ "cannot read class of pci device "PCI_BDF,
+ pci->domain, pci->bus, pci->dev, pci->func);
+ return ERROR_FAIL;
}
/*
diff --git a/tools/libs/light/libxl_pcid.c b/tools/libs/light/libxl_pcid.c
index ee4c832779..0f736c68af 100644
--- a/tools/libs/light/libxl_pcid.c
+++ b/tools/libs/light/libxl_pcid.c
@@ -154,6 +154,54 @@ out:
return result;
}
+static libxl__json_object *process_read_hex_cmd(libxl__gc *gc,
+ const struct
libxl__json_object *resp)
+{
+ libxl__json_object *result = NULL;
+ const struct libxl__json_object *args, *dir_id, *pci_info;
+ char *full_path;
+ uint16_t read_items;
+ long long read_number;
+
+ args = libxl__json_map_get(PCID_MSG_FIELD_ARGS, resp, JSON_MAP);
+ if (!args)
+ goto out;
+ dir_id = libxl__json_map_get(PCID_CMD_DIR_ID, args, JSON_ANY);
+ if (!dir_id)
+ goto out;
+ pci_info = libxl__json_map_get(PCID_CMD_PCI_INFO, args, JSON_ANY);
+ if (!pci_info)
+ goto out;
+
+ if (strcmp(PCID_PCI_DEV, dir_id->u.string) == 0)
+ full_path = libxl__sprintf(gc, SYSFS_PCI_DEV"%s", pci_info->u.string);
+ else
+ full_path = pci_info->u.string;
+
+ FILE *f = fopen(full_path, "r");
+ if (!f) {
+ LOGE(ERROR, "PCI device %s does not have needed attribute\n",
+ full_path);
+ goto out;
+ }
+ read_items = fscanf(f, "0x%llx\n", &read_number);
+ fclose(f);
+ if (read_items != 1) {
+ LOGE(ERROR, "Cannot read attribute of pci device %s\n", full_path);
+ goto out;
+ }
+
+ result = libxl__json_object_alloc(gc, JSON_INTEGER);
+ if (!result) {
+ LOGE(ERROR, "Memory allocation failed\n");
+ goto out;
+ }
+ result->u.i = read_number;
+
+out:
+ return result;
+}
+
static int pcid_handle_message(libxl__gc *gc, const libxl__json_object
*request,
libxl__json_object **result)
{
@@ -171,6 +219,8 @@ static int pcid_handle_message(libxl__gc *gc, const
libxl__json_object *request,
*result = process_ls_cmd(gc, request);
else if (strcmp(PCID_CMD_WRITE, command_name) == 0)
*result = process_write_cmd(gc, request);
+ else if (strcmp(command_name, PCID_CMD_READ_HEX) == 0)
+ *result = process_read_hex_cmd(gc, request);
else
return ERROR_NOTFOUND;
--
2.17.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |