From 1e560df12fb9f6f8333e621fa733b0932b292977 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Tue, 11 May 2010 11:23:54 +0100 Subject: [PATCH] xl: Add "xl trigger" command, a clone of "xm trigger". Signed-off-by: Yang Hongyang --- tools/libxl/libxl.c | 34 +++++++++++++++++++++++++++++ tools/libxl/libxl.h | 2 ++ tools/libxl/xl_cmdimpl.c | 45 +++++++++++++++++++++++++++++++++++++++ tools/libxl/xl_cmdimpl.h | 1 + tools/libxl/xl_cmdtable.c | 1 + 5 files changed, 83 insertions(+) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 4ddcfe868f..1b09294016 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2595,3 +2595,37 @@ int libxl_sched_credit_domain_set(struct libxl_ctx *ctx, uint32_t domid, struct return 0; } +static int trigger_type_from_string(char *trigger_name) +{ + if (!strcmp(trigger_name, "nmi")) + return XEN_DOMCTL_SENDTRIGGER_NMI; + else if (!strcmp(trigger_name, "reset")) + return XEN_DOMCTL_SENDTRIGGER_RESET; + else if (!strcmp(trigger_name, "init")) + return XEN_DOMCTL_SENDTRIGGER_INIT; + else if (!strcmp(trigger_name, "power")) + return XEN_DOMCTL_SENDTRIGGER_POWER; + else if (!strcmp(trigger_name, "sleep")) + return XEN_DOMCTL_SENDTRIGGER_SLEEP; + else + return -1; +} + +int libxl_send_trigger(struct libxl_ctx *ctx, uint32_t domid, char *trigger_name, uint32_t vcpuid) +{ + int rc = -1; + int trigger_type = trigger_type_from_string(trigger_name); + + if (trigger_type == -1) { + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, -1, + "Invalid trigger, valid triggers are "); + return -1; + } + + rc = xc_domain_send_trigger(ctx->xch, domid, trigger_type, vcpuid); + if (rc != 0) + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, + "Send trigger '%s' failed", trigger_name); + + return rc; +} diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index c5186369ae..198d98daf2 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -479,5 +479,7 @@ int libxl_sched_credit_domain_get(struct libxl_ctx *ctx, uint32_t domid, struct libxl_sched_credit *scinfo); int libxl_sched_credit_domain_set(struct libxl_ctx *ctx, uint32_t domid, struct libxl_sched_credit *scinfo); +int libxl_send_trigger(struct libxl_ctx *ctx, uint32_t domid, + char *trigger_name, uint32_t vcpuid); #endif /* LIBXL_H */ diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index ae7dcf5d79..f9e2cd647a 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1275,6 +1275,9 @@ void help(char *command) } else if (!strcmp(command, "rename")) { printf("Usage: xl rename \n\n"); printf("Rename a domain.\n"); + } else if (!strcmp(command, "trigger")) { + printf("Usage: xm trigger []\n\n"); + printf("Send a trigger to a domain.\n"); } } @@ -3107,3 +3110,45 @@ int main_rename(int argc, char **argv) exit(0); } + +int main_trigger(int argc, char **argv) +{ + int opt; + char *trigger_name = NULL; + char *endptr = NULL; + char *dom = NULL; + int vcpuid = 0; + + while ((opt = getopt(argc, argv, "h")) != -1) { + switch (opt) { + case 'h': + help("trigger"); + exit(0); + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + dom = argv[optind++]; + if (!dom || !argv[optind]) { + fprintf(stderr, "'xl trigger' requires between 2 and 3 arguments.\n\n"); + help("trigger"); + exit(1); + } + + find_domain(dom); + + trigger_name = argv[optind++]; + + if (argv[optind]) { + vcpuid = strtol(argv[optind], &endptr, 10); + if (vcpuid == 0 && !strcmp(endptr, argv[optind])) { + fprintf(stderr, "Invalid vcpuid, using default vcpuid=0.\n\n"); + } + } + + libxl_send_trigger(&ctx, domid, trigger_name, vcpuid); + + exit(0); +} diff --git a/tools/libxl/xl_cmdimpl.h b/tools/libxl/xl_cmdimpl.h index bf1b72fa8c..c53ba4e4b8 100644 --- a/tools/libxl/xl_cmdimpl.h +++ b/tools/libxl/xl_cmdimpl.h @@ -38,5 +38,6 @@ int main_sched_credit(int argc, char **argv); int main_domid(int argc, char **argv); int main_domname(int argc, char **argv); int main_rename(int argc, char **argv); +int main_trigger(int argc, char **argv); void help(char *command); diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index 96062e6f62..ef44a2336c 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -41,6 +41,7 @@ struct cmd_spec cmd_table[] = { { "domid", &main_domid, "convert a domain name to domain id"}, { "domname", &main_domname, "convert a domain id to domain name"}, { "rename", &main_rename, "rename a domain"}, + { "trigger", &main_trigger, "send a trigger to a domain"}, }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); -- 2.39.5