WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 2 of 2] Add support to libxl to trigger power or slee

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 2 of 2] Add support to libxl to trigger power or sleep button pushes
From: Paul Durrant <paul.durrant@xxxxxxxxxx>
Date: Wed, 13 Jan 2010 10:16:12 +0000
Cc: paul.durrant@xxxxxxxxxx
Delivery-date: Wed, 13 Jan 2010 02:21:55 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1263377770@xxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Paul Durrant <paul.durrant@xxxxxxxxxx>
# Date 1263377694 0
# Node ID 679f0a189c7280053cc172d1ed80b6312702f4d8
# Parent  cdf348c11aba31171bdc838ffe3a457acab0f7de
Add support to libxl to trigger power or sleep button pushes
in HVM guests.

signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>

diff -r cdf348c11aba -r 679f0a189c72 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Wed Jan 13 10:14:54 2010 +0000
+++ b/tools/libxl/libxl.c       Wed Jan 13 10:14:54 2010 +0000
@@ -2153,3 +2153,21 @@
     rc = xc_domain_memory_set_pod_target(ctx->xch, domid, (target_memkb - 
videoram) / 4, NULL, NULL, NULL);
     return rc;
 }
+
+int libxl_button_press(struct libxl_ctx *ctx, uint32_t domid, libxl_button 
button)
+{
+    int rc = -1;
+
+    switch (button) {
+    case POWER_BUTTON:
+        rc = xc_domain_send_trigger(ctx->xch, domid, 
XEN_DOMCTL_SENDTRIGGER_POWER, 0);
+        break;
+    case SLEEP_BUTTON:
+        rc = xc_domain_send_trigger(ctx->xch, domid, 
XEN_DOMCTL_SENDTRIGGER_SLEEP, 0);
+        break;
+    default:
+        break;
+    }
+
+    return rc;
+}
diff -r cdf348c11aba -r 679f0a189c72 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Wed Jan 13 10:14:54 2010 +0000
+++ b/tools/libxl/libxl.h       Wed Jan 13 10:14:54 2010 +0000
@@ -343,4 +343,12 @@
                           unsigned int bus, unsigned int dev,
                           unsigned int func, unsigned int vdevfn);
 
-#endif
+typedef enum {
+    POWER_BUTTON,
+    SLEEP_BUTTON
+} libxl_button;
+
+int libxl_button_press(struct libxl_ctx *ctx, uint32_t domid, libxl_button 
button);
+
+#endif /* LIBXL_H */
+
diff -r cdf348c11aba -r 679f0a189c72 tools/libxl/xl.c
--- a/tools/libxl/xl.c  Wed Jan 13 10:14:54 2010 +0000
+++ b/tools/libxl/xl.c  Wed Jan 13 10:14:54 2010 +0000
@@ -933,6 +933,7 @@
         printf(" cd-insert                     insert a cdrom into a guest's 
cd drive\n\n");
         printf(" cd-eject                      eject a cdrom from a guest's cd 
drive\n\n");
         printf(" mem-set                       set the current memory usage 
for a domain\n\n");
+        printf(" button-press                  indicate an ACPI button press 
to the domain\n\n");
     } else if(!strcmp(command, "create")) {
         printf("Usage: xl create <ConfigFile> [options] [vars]\n\n");
         printf("Create a domain based on <ConfigFile>.\n\n");
@@ -986,6 +987,10 @@
     } else if (!strcmp(command, "mem-set")) {
         printf("Usage: xl mem-set <Domain> <MemKB>\n\n");
         printf("Set the current memory usage for a domain.\n\n");
+    } else if (!strcmp(command, "button-press")) {
+        printf("Usage: xl button-press <Domain> <Button>\n\n");
+        printf("Indicate <Button> press to a domain.\n");
+        printf("<Button> may be 'power' or 'sleep'.\n\n");
     }
 }
 
@@ -1668,6 +1673,60 @@
     exit(0);
 }
 
+void button_press(char *p, char *b)
+{
+    struct libxl_ctx ctx;
+    uint32_t domid;
+    libxl_button button;
+
+    libxl_ctx_init(&ctx, LIBXL_VERSION);
+    libxl_ctx_set_log(&ctx, log_callback, NULL);
+
+    if (domain_qualifier_to_domid(&ctx, p, &domid) < 0) {
+        fprintf(stderr, "%s is an invalid domain identifier\n", p);
+        exit(2);
+    }
+
+    if (!strcmp(b, "power")) {
+        button = POWER_BUTTON;
+    } else if (!strcmp(b, "sleep")) {
+        button = SLEEP_BUTTON;
+    } else {
+        fprintf(stderr, "%s is an invalid button identifier\n", b);
+        exit(2);
+    }
+
+    libxl_button_press(&ctx, domid, button);
+}
+
+int main_button_press(int argc, char **argv)
+{
+    int opt;
+    char *p;
+    char *b;
+
+    while ((opt = getopt(argc, argv, "h")) != -1) {
+        switch (opt) {
+        case 'h':
+            help("button-press");
+            exit(0);
+        default:
+            fprintf(stderr, "option not supported\n");
+            break;
+        }
+    }
+    if (optind >= argc - 1) {
+        help("button-press");
+        exit(2);
+    }
+
+    p = argv[optind];
+    b = argv[optind + 1];
+
+    button_press(p, b);
+    exit(0);
+}
+
 int main(int argc, char **argv)
 {
     if (argc < 2) {
@@ -1705,6 +1764,8 @@
         main_cd_eject(argc - 1, argv + 1);
     } else if (!strcmp(argv[1], "mem-set")) {
         main_memset(argc - 1, argv + 1);
+    } else if (!strcmp(argv[1], "button-press")) {
+        main_button_press(argc - 1, argv + 1);
     } else if (!strcmp(argv[1], "help")) {
         if (argc > 2)
             help(argv[2]);

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel