aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/libxl/xl.h2
-rw-r--r--tools/libxl/xl_cmdimpl.c80
-rw-r--r--tools/libxl/xl_cmdtable.c14
3 files changed, 96 insertions, 0 deletions
diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h
index f267d9b673..9b4cb259e8 100644
--- a/tools/libxl/xl.h
+++ b/tools/libxl/xl.h
@@ -37,6 +37,8 @@ int main_vncviewer(int argc, char **argv);
int main_pcilist(int argc, char **argv);
int main_pcidetach(int argc, char **argv);
int main_pciattach(int argc, char **argv);
+int main_pciassignable_add(int argc, char **argv);
+int main_pciassignable_remove(int argc, char **argv);
int main_pciassignable_list(int argc, char **argv);
int main_restore(int argc, char **argv);
int main_migrate_receive(int argc, char **argv);
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 4f3aec50ac..167b75d7a9 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -2440,6 +2440,86 @@ int main_pciassignable_list(int argc, char **argv)
return 0;
}
+static void pciassignable_add(const char *bdf, int rebind)
+{
+ libxl_device_pci pcidev;
+ XLU_Config *config;
+
+ libxl_device_pci_init(&pcidev);
+
+ config = xlu_cfg_init(stderr, "command line");
+ if (!config) { perror("xlu_cfg_init"); exit(-1); }
+
+ if (xlu_pci_parse_bdf(config, &pcidev, bdf)) {
+ fprintf(stderr, "pci-assignable-add: malformed BDF specification \"%s\"\n", bdf);
+ exit(2);
+ }
+ libxl_device_pci_assignable_add(ctx, &pcidev, rebind);
+
+ libxl_device_pci_dispose(&pcidev);
+ xlu_cfg_destroy(config);
+}
+
+int main_pciassignable_add(int argc, char **argv)
+{
+ int opt;
+ const char *bdf = NULL;
+
+ while ((opt = def_getopt(argc, argv, "", "pci-assignable-add", 1)) != -1) {
+ switch (opt) {
+ case 0: case 2:
+ return opt;
+ }
+ }
+
+ bdf = argv[optind];
+
+ pciassignable_add(bdf, 1);
+ return 0;
+}
+
+static void pciassignable_remove(const char *bdf, int rebind)
+{
+ libxl_device_pci pcidev;
+ XLU_Config *config;
+
+ libxl_device_pci_init(&pcidev);
+
+ config = xlu_cfg_init(stderr, "command line");
+ if (!config) { perror("xlu_cfg_init"); exit(-1); }
+
+ if (xlu_pci_parse_bdf(config, &pcidev, bdf)) {
+ fprintf(stderr, "pci-assignable-remove: malformed BDF specification \"%s\"\n", bdf);
+ exit(2);
+ }
+ libxl_device_pci_assignable_remove(ctx, &pcidev, rebind);
+
+ libxl_device_pci_dispose(&pcidev);
+ xlu_cfg_destroy(config);
+}
+
+int main_pciassignable_remove(int argc, char **argv)
+{
+ int opt;
+ const char *bdf = NULL;
+ int rebind = 0;
+
+ while ((opt = def_getopt(argc, argv, "r", "pci-assignable-remove", 1)) != -1) {
+ switch (opt) {
+ case 0: case 2:
+ return opt;
+ case 'r':
+ rebind=1;
+ break;
+ }
+ }
+
+ bdf = argv[optind];
+
+ pciassignable_remove(bdf, rebind);
+ return 0;
+}
+
static void pause_domain(const char *p)
{
find_domain(p);
diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
index 193d6a3a46..896b3990a6 100644
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -89,6 +89,20 @@ struct cmd_spec cmd_table[] = {
"List pass-through pci devices for a domain",
"<Domain>",
},
+ { "pci-assignable-add",
+ &main_pciassignable_add, 0, 1,
+ "Make a device assignable for pci-passthru",
+ "<BDF>",
+ "-h Print this help.\n"
+ },
+ { "pci-assignable-remove",
+ &main_pciassignable_remove, 0, 1,
+ "Remove a device from being assignable",
+ "[options] <BDF>",
+ "-h Print this help.\n"
+ "-r Attempt to re-assign the device to the\n"
+ " original driver"
+ },
{ "pci-assignable-list",
&main_pciassignable_list, 0, 0,
"List all the assignable pci devices",