Stefano Stabellini
2010-Aug-09  14:01 UTC
[Xen-devel] [PATCH 3 of 4] libxl: support multiple consoles
This patch modifies libxenlight to support multiple consoles and
separates the xenstore paths for pv and serial consoles:
- rename libxl_console_constype to libxl_console_consback: constype is
used to to specify whether qemu or xenconsoled provides the backend, so I
renamed it to libxl_console_consback to make it more obvious that we are
talking about backends;
- add a new libxl_console_constype to specify if the console is an
emulated serial or a pv console;
- support the new xenconsole "type" command line parameter;
- use the "output" node under console in xenstore to tell qemu where
do we
want the output of this pv console to go;
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
diff -r 6b28b2dac7dd tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Aug 05 11:36:24 2010 +0100
+++ b/tools/libxl/libxl.c	Mon Aug 09 14:26:22 2010 +0100
@@ -884,21 +884,31 @@ int libxl_domain_destroy(libxl_ctx *ctx,
     return 0;
 }
 
-int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num)
+int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num,
libxl_console_constype type)
 {
     char *p = libxl_sprintf(ctx, "%s/xenconsole",
libxl_private_bindir_path());
     char *domid_s = libxl_sprintf(ctx, "%d", domid);
     char *cons_num_s = libxl_sprintf(ctx, "%d", cons_num);
-    return execl(p, p, domid_s, "--num", cons_num_s, (void *)NULL) ==
0 ? 0 : ERROR_FAIL;
+    char *cons_type_s;
+    
+    if (type == LIBXL_CONSTYPE_PV)
+        cons_type_s = "pv";
+    else
+        cons_type_s = "serial";
+    return execl(p, p, domid_s, "--num", cons_num_s,
"--type", cons_type_s, (void *)NULL) == 0 ? 0 : ERROR_FAIL;
 }
 
 int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm)
 {
     uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm);
     if (stubdomid)
-        return libxl_console_exec(ctx, stubdomid, 1);
-    else
-        return libxl_console_exec(ctx, domid_vm, 0);
+        return libxl_console_exec(ctx, stubdomid, 1, LIBXL_CONSTYPE_PV);
+    else {
+        if (is_hvm(ctx, domid_vm))
+            return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_SERIAL);
+        else
+            return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_PV);
+    }
 }
 
 int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
@@ -1292,14 +1302,21 @@ retry_transaction:
 
     for (i = 0; i < num_console; i++) {
         console[i].devid = i;
-        console[i].constype = CONSTYPE_IOEMU;
+        console[i].consback = LIBXL_CONSBACK_IOEMU;
         console[i].domid = domid;
-        if (!i)
+        if (!i) {
+            char *filename;
+            char *name = libxl_sprintf(ctx, "qemu-dm-%s",
libxl_domid_to_name(ctx, info->domid));
+            libxl_create_logfile(ctx, name, &filename);
+            console[i].output = libxl_sprintf(ctx, "file:%s",
filename);
             console[i].build_state = &state;
+            free(filename);
+        } else
+            console[i].output = "pty";
         ret = libxl_device_console_add(ctx, domid, &console[i]);
         if (ret) return ret;
     }
-    if (libxl_create_xenpv_qemu(ctx, vfb, num_console, console,
&dm_starting) < 0) {
+    if (libxl_create_xenpv_qemu(ctx, domid, vfb, &dm_starting) < 0) {
         free(args);
         return ERROR_FAIL;
     }
@@ -1978,7 +1995,7 @@ int libxl_device_console_add(libxl_ctx *
 
     if (console->build_state) {
         xs_transaction_t t;
-        char **ents = (char **) libxl_calloc(ctx, 9, sizeof(char *));
+        char **ents = (char **) libxl_calloc(ctx, 11, sizeof(char *));
         ents[0] = "console/port";
         ents[1] = libxl_sprintf(ctx, "%"PRIu32,
console->build_state->console_port);
         ents[2] = "console/ring-ref";
@@ -1986,10 +2003,12 @@ int libxl_device_console_add(libxl_ctx *
         ents[4] = "console/limit";
         ents[5] = libxl_sprintf(ctx, "%d", LIBXL_XENCONSOLE_LIMIT);
         ents[6] = "console/type";
-        if (console->constype == CONSTYPE_XENCONSOLED)
+        if (console->consback == LIBXL_CONSBACK_XENCONSOLED)
             ents[7] = "xenconsoled";
         else
             ents[7] = "ioemu";
+        ents[8] = "console/output";
+        ents[9] = console->output;
 retry_transaction:
         t = xs_transaction_start(ctx->xsh);
         libxl_xs_writev(ctx, t, libxl_xs_get_dompath(ctx, console->domid),
ents);
@@ -2032,10 +2051,12 @@ retry_transaction:
     flexarray_set(front, foffset++, "protocol");
     flexarray_set(front, foffset++, LIBXL_XENCONSOLE_PROTOCOL);
     flexarray_set(front, foffset++, "type");
-    if (console->constype == CONSTYPE_XENCONSOLED)
+    if (console->consback == LIBXL_CONSBACK_XENCONSOLED)
         flexarray_set(front, foffset++, "xenconsoled");
     else
         flexarray_set(front, foffset++, "ioemu");
+    flexarray_set(front, foffset++, "output");
+    flexarray_set(front, foffset++, console->output);
 
     libxl_device_generic_add(ctx, &device,
                              libxl_xs_kvs_of_flexarray(ctx, back, boffset),
@@ -2226,64 +2247,39 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u
 
 /******************************************************************************/
 static int libxl_build_xenpv_qemu_args(libxl_ctx *ctx,
+                                       uint32_t domid,
                                        libxl_device_vfb *vfb,
-                                       int num_console,
-                                       libxl_device_console *console,
                                        libxl_device_model_info *info)
 {
-    int i = 0, j = 0, num = 0;
     memset(info, 0x00, sizeof(libxl_device_model_info));
 
-    info->vnc = vfb->vnc;
-    if (vfb->vnclisten)
-        info->vnclisten = libxl_strdup(ctx, vfb->vnclisten);
-    info->vncdisplay = vfb->vncdisplay;
-    info->vncunused = vfb->vncunused;
-    if (vfb->vncpasswd)
-        info->vncpasswd = vfb->vncpasswd;
-    if (vfb->keymap)
-        info->keymap = libxl_strdup(ctx, vfb->keymap);
-    info->sdl = vfb->sdl;
-    info->opengl = vfb->opengl;
-    for (i = 0; i < num_console; i++) {
-        if (console->constype == CONSTYPE_IOEMU)
-            num++;
-    }
-    if (num > 0) {
-        uint32_t guest_domid;
-        if (libxl_is_stubdom(ctx, vfb->domid, &guest_domid)) {
-            char *filename;
-            char *name = libxl_sprintf(ctx, "qemu-dm-%s",
libxl_domid_to_name(ctx, guest_domid));
-            libxl_create_logfile(ctx, name, &filename);
-            info->serial = libxl_sprintf(ctx, "file:%s",
filename);
-            free(filename);
-        } else {
-            info->serial = "pty";
-        }
-        num--;
-    }
-    if (num > 0) {
-        info->extra = (char **) libxl_calloc(ctx, num * 2 + 1, sizeof(char
*));
-        for (j = 0; j < num * 2; j = j + 2) {
-            info->extra[j] = "-serial";
-            info->extra[j + 1] = "pty";
-        }
-        info->extra[j] = NULL;
-    }
-    info->domid = vfb->domid;
-    info->dom_name = libxl_domid_to_name(ctx, vfb->domid);
+    if (vfb != NULL) {
+        info->vnc = vfb->vnc;
+        if (vfb->vnclisten)
+            info->vnclisten = libxl_strdup(ctx, vfb->vnclisten);
+        info->vncdisplay = vfb->vncdisplay;
+        info->vncunused = vfb->vncunused;
+        if (vfb->vncpasswd)
+            info->vncpasswd = vfb->vncpasswd;
+        if (vfb->keymap)
+            info->keymap = libxl_strdup(ctx, vfb->keymap);
+        info->sdl = vfb->sdl;
+        info->opengl = vfb->opengl;
+    } else
+        info->nographic = 1;
+    info->domid = domid;
+    info->dom_name = libxl_domid_to_name(ctx, domid);
     info->device_model = libxl_abs_path(ctx, "qemu-dm",
libxl_libexec_path());
     info->type = XENPV;
     return 0;
 }
 
-int libxl_create_xenpv_qemu(libxl_ctx *ctx, libxl_device_vfb *vfb,
-                            int num_console, libxl_device_console *console,
+int libxl_create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb
*vfb,
                             libxl_device_model_starting **starting_r)
 {
     libxl_device_model_info info;
 
-    libxl_build_xenpv_qemu_args(ctx, vfb, num_console, console, &info);
+    libxl_build_xenpv_qemu_args(ctx, domid, vfb, &info);
     libxl_create_device_model(ctx, &info, NULL, 0, NULL, 0, starting_r);
     return 0;
 }
diff -r 6b28b2dac7dd tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Aug 05 11:36:24 2010 +0100
+++ b/tools/libxl/libxl.h	Mon Aug 09 14:26:22 2010 +0100
@@ -229,16 +229,22 @@ typedef struct {
 } libxl_device_vkb;
 
 typedef enum {
-    CONSTYPE_XENCONSOLED,
-    CONSTYPE_IOEMU,
+    LIBXL_CONSTYPE_SERIAL,
+    LIBXL_CONSTYPE_PV,
 } libxl_console_constype;
 
+typedef enum {
+    LIBXL_CONSBACK_XENCONSOLED,
+    LIBXL_CONSBACK_IOEMU,
+} libxl_console_consback;
+
 typedef struct {
     uint32_t backend_domid;
     uint32_t domid;
     int devid;
-    libxl_console_constype constype;
+    libxl_console_consback consback;
     libxl_domain_build_state *build_state;
+    char *output;
 } libxl_device_console;
 
 typedef enum {
@@ -434,7 +440,7 @@ int libxl_domain_setmaxmem(libxl_ctx *ct
 int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t
target_memkb, int enforce);
 
 int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass);
-int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num);
+int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num,
libxl_console_constype type);
 /* libxl_primary_console_exec finds the domid and console number
  * corresponding to the primary console of the given vm, then calls
  * libxl_console_exec with the right arguments (domid might be different
@@ -456,8 +462,7 @@ int libxl_create_device_model(libxl_ctx 
                               libxl_device_disk *disk, int num_disks,
                               libxl_device_nic *vifs, int num_vifs,
                               libxl_device_model_starting **starting_r);
-int libxl_create_xenpv_qemu(libxl_ctx *ctx, libxl_device_vfb *vfb,
-                            int num_console, libxl_device_console *console,
+int libxl_create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb
*vfb,
                             libxl_device_model_starting **starting_r);
   /* Caller must either: pass starting_r==0, or on successful
    * return pass *starting_r (which will be non-0) to
diff -r 6b28b2dac7dd tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Aug 05 11:36:24 2010 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Mon Aug 09 14:26:22 2010 +0100
@@ -370,7 +370,8 @@ static void init_console_info(libxl_devi
 {
     memset(console, 0x00, sizeof(libxl_device_console));
     console->devid = dev_num;
-    console->constype = CONSTYPE_XENCONSOLED;
+    console->consback = LIBXL_CONSBACK_XENCONSOLED;
+    console->output = "pty";
     if (state)
         console->build_state = state;
 }
@@ -1435,6 +1436,7 @@ start:
     if (d_config.c_info.hvm) {
         init_console_info(&console, 0, &state);
         console.domid = domid;
+        console.consback = LIBXL_CONSBACK_IOEMU;
         libxl_device_console_add(&ctx, domid, &console);
         dm_info.domid = domid;
         MUST( libxl_create_device_model(&ctx, &dm_info,
@@ -1451,10 +1453,10 @@ start:
         init_console_info(&console, 0, &state);
         console.domid = domid;
         if (d_config.num_vfbs)
-            console.constype = CONSTYPE_IOEMU;
+             console.consback = LIBXL_CONSBACK_IOEMU;
         libxl_device_console_add(&ctx, domid, &console);
         if (d_config.num_vfbs)
-            libxl_create_xenpv_qemu(&ctx, d_config.vfbs, 1, &console,
&dm_starting);
+            libxl_create_xenpv_qemu(&ctx, domid, d_config.vfbs,
&dm_starting);
     }
 
     if (dm_starting)
@@ -1849,13 +1851,27 @@ int main_cd_insert(int argc, char **argv
 
 int main_console(int argc, char **argv)
 {
-    int opt = 0;
-
-    while ((opt = getopt(argc, argv, "hn:")) != -1) {
+    int opt = 0, num = 0;
+    libxl_console_constype type = -1;
+
+    while ((opt = getopt(argc, argv, "hn:t:")) != -1) {
         switch (opt) {
         case ''h'':
             help("console");
             return 0;
+        case ''t'':
+            if (!strcmp(optarg, "pv"))
+                type = LIBXL_CONSTYPE_PV;
+            else if (!strcmp(optarg, "serial"))
+                type = LIBXL_CONSTYPE_SERIAL;
+            else {
+                fprintf(stderr, "console type supported are: pv,
serial\n");
+                return 2;
+            }
+            break;
+        case ''n'':
+            num = atoi(optarg);
+            break;
         default:
             fprintf(stderr, "option not supported\n");
             break;
@@ -1867,7 +1883,10 @@ int main_console(int argc, char **argv)
     }
 
     find_domain(argv[optind]);
-    libxl_primary_console_exec(&ctx, domid);
+    if (type <= 0 && num == 0)
+        libxl_primary_console_exec(&ctx, domid);
+    else
+        libxl_console_exec(&ctx, domid, num, type);
     fprintf(stderr, "Unable to attach console\n");
     return 1;
 }
diff -r 6b28b2dac7dd tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c	Thu Aug 05 11:36:24 2010 +0100
+++ b/tools/libxl/xl_cmdtable.c	Mon Aug 09 14:26:22 2010 +0100
@@ -86,7 +86,9 @@ struct cmd_spec cmd_table[] = {
     { "console",
       &main_console,
       "Attach to domain''s console",
-      "<Domain>",
+      "[options] <Domain>\n"
+      "-t <type>       console type, pv or serial\n"
+      "-n <number>     console number"
     },
     { "vncviewer",
       &main_vncviewer,
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Stefano Stabellini
2010-Aug-09  17:08 UTC
Re: [Xen-devel] [PATCH 3 of 4] libxl: support multiple consoles
On Mon, 9 Aug 2010, Stefano Stabellini wrote:> This patch modifies libxenlight to support multiple consoles and > separates the xenstore paths for pv and serial consoles: > > - rename libxl_console_constype to libxl_console_consback: constype is > used to to specify whether qemu or xenconsoled provides the backend, so I > renamed it to libxl_console_consback to make it more obvious that we are > talking about backends; > > - add a new libxl_console_constype to specify if the console is an > emulated serial or a pv console; > > - support the new xenconsole "type" command line parameter; > > - use the "output" node under console in xenstore to tell qemu where do we > want the output of this pv console to go; > >actually I missed one change in the patch: pv console number 0 only needs to be added to dompath/console, dompath/device/console/0 should be avoided because the backends don''t respond to changes in the xenbus state there. This is the updated patch. --- This patch modifies libxenlight to support multiple consoles and separates the xenstore paths for pv and serial consoles: - rename libxl_console_constype to libxl_console_consback: constype is used to to specify whether qemu or xenconsoled provides the backend, so I renamed it to libxl_console_consback to make it more obvious that we are talking about backends; - add a new libxl_console_constype to specify if the console is an emulated serial or a pv console; - support the new xenconsole "type" command line parameter; - use the "output" node under console in xenstore to tell qemu where do we want the output of this pv console to go; - do not setup pv console 0 on device/console/0 too. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> diff -r 1644b4efef8a tools/libxl/libxl.c --- a/tools/libxl/libxl.c Mon Aug 09 17:46:39 2010 +0100 +++ b/tools/libxl/libxl.c Mon Aug 09 17:51:18 2010 +0100 @@ -884,21 +884,31 @@ int libxl_domain_destroy(libxl_ctx *ctx, return 0; } -int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num) +int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_console_constype type) { char *p = libxl_sprintf(ctx, "%s/xenconsole", libxl_private_bindir_path()); char *domid_s = libxl_sprintf(ctx, "%d", domid); char *cons_num_s = libxl_sprintf(ctx, "%d", cons_num); - return execl(p, p, domid_s, "--num", cons_num_s, (void *)NULL) == 0 ? 0 : ERROR_FAIL; + char *cons_type_s; + + if (type == LIBXL_CONSTYPE_PV) + cons_type_s = "pv"; + else + cons_type_s = "serial"; + return execl(p, p, domid_s, "--num", cons_num_s, "--type", cons_type_s, (void *)NULL) == 0 ? 0 : ERROR_FAIL; } int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm) { uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm); if (stubdomid) - return libxl_console_exec(ctx, stubdomid, 1); - else - return libxl_console_exec(ctx, domid_vm, 0); + return libxl_console_exec(ctx, stubdomid, 1, LIBXL_CONSTYPE_PV); + else { + if (is_hvm(ctx, domid_vm)) + return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_SERIAL); + else + return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_PV); + } } int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass) @@ -1450,14 +1460,21 @@ retry_transaction: for (i = 0; i < num_console; i++) { console[i].devid = i; - console[i].constype = CONSTYPE_IOEMU; + console[i].consback = LIBXL_CONSBACK_IOEMU; console[i].domid = domid; - if (!i) + if (!i) { + char *filename; + char *name = libxl_sprintf(ctx, "qemu-dm-%s", libxl_domid_to_name(ctx, info->domid)); + libxl_create_logfile(ctx, name, &filename); + console[i].output = libxl_sprintf(ctx, "file:%s", filename); console[i].build_state = &state; + free(filename); + } else + console[i].output = "pty"; ret = libxl_device_console_add(ctx, domid, &console[i]); if (ret) return ret; } - if (libxl_create_xenpv_qemu(ctx, vfb, num_console, console, &dm_starting) < 0) { + if (libxl_create_xenpv_qemu(ctx, domid, vfb, &dm_starting) < 0) { free(args); return ERROR_FAIL; } @@ -2136,7 +2153,7 @@ int libxl_device_console_add(libxl_ctx * if (console->build_state) { xs_transaction_t t; - char **ents = (char **) libxl_calloc(ctx, 9, sizeof(char *)); + char **ents = (char **) libxl_calloc(ctx, 11, sizeof(char *)); ents[0] = "console/port"; ents[1] = libxl_sprintf(ctx, "%"PRIu32, console->build_state->console_port); ents[2] = "console/ring-ref"; @@ -2144,16 +2161,19 @@ int libxl_device_console_add(libxl_ctx * ents[4] = "console/limit"; ents[5] = libxl_sprintf(ctx, "%d", LIBXL_XENCONSOLE_LIMIT); ents[6] = "console/type"; - if (console->constype == CONSTYPE_XENCONSOLED) + if (console->consback == LIBXL_CONSBACK_XENCONSOLED) ents[7] = "xenconsoled"; else ents[7] = "ioemu"; + ents[8] = "console/output"; + ents[9] = console->output; retry_transaction: t = xs_transaction_start(ctx->xsh); libxl_xs_writev(ctx, t, libxl_xs_get_dompath(ctx, console->domid), ents); if (!xs_transaction_end(ctx->xsh, t, 0)) if (errno == EAGAIN) goto retry_transaction; + return 0; } front = flexarray_make(16, 1); @@ -2190,10 +2210,12 @@ retry_transaction: flexarray_set(front, foffset++, "protocol"); flexarray_set(front, foffset++, LIBXL_XENCONSOLE_PROTOCOL); flexarray_set(front, foffset++, "type"); - if (console->constype == CONSTYPE_XENCONSOLED) + if (console->consback == LIBXL_CONSBACK_XENCONSOLED) flexarray_set(front, foffset++, "xenconsoled"); else flexarray_set(front, foffset++, "ioemu"); + flexarray_set(front, foffset++, "output"); + flexarray_set(front, foffset++, console->output); libxl_device_generic_add(ctx, &device, libxl_xs_kvs_of_flexarray(ctx, back, boffset), @@ -2384,64 +2406,39 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u /******************************************************************************/ static int libxl_build_xenpv_qemu_args(libxl_ctx *ctx, + uint32_t domid, libxl_device_vfb *vfb, - int num_console, - libxl_device_console *console, libxl_device_model_info *info) { - int i = 0, j = 0, num = 0; memset(info, 0x00, sizeof(libxl_device_model_info)); - info->vnc = vfb->vnc; - if (vfb->vnclisten) - info->vnclisten = libxl_strdup(ctx, vfb->vnclisten); - info->vncdisplay = vfb->vncdisplay; - info->vncunused = vfb->vncunused; - if (vfb->vncpasswd) - info->vncpasswd = vfb->vncpasswd; - if (vfb->keymap) - info->keymap = libxl_strdup(ctx, vfb->keymap); - info->sdl = vfb->sdl; - info->opengl = vfb->opengl; - for (i = 0; i < num_console; i++) { - if (console->constype == CONSTYPE_IOEMU) - num++; - } - if (num > 0) { - uint32_t guest_domid; - if (libxl_is_stubdom(ctx, vfb->domid, &guest_domid)) { - char *filename; - char *name = libxl_sprintf(ctx, "qemu-dm-%s", libxl_domid_to_name(ctx, guest_domid)); - libxl_create_logfile(ctx, name, &filename); - info->serial = libxl_sprintf(ctx, "file:%s", filename); - free(filename); - } else { - info->serial = "pty"; - } - num--; - } - if (num > 0) { - info->extra = (char **) libxl_calloc(ctx, num * 2 + 1, sizeof(char *)); - for (j = 0; j < num * 2; j = j + 2) { - info->extra[j] = "-serial"; - info->extra[j + 1] = "pty"; - } - info->extra[j] = NULL; - } - info->domid = vfb->domid; - info->dom_name = libxl_domid_to_name(ctx, vfb->domid); + if (vfb != NULL) { + info->vnc = vfb->vnc; + if (vfb->vnclisten) + info->vnclisten = libxl_strdup(ctx, vfb->vnclisten); + info->vncdisplay = vfb->vncdisplay; + info->vncunused = vfb->vncunused; + if (vfb->vncpasswd) + info->vncpasswd = vfb->vncpasswd; + if (vfb->keymap) + info->keymap = libxl_strdup(ctx, vfb->keymap); + info->sdl = vfb->sdl; + info->opengl = vfb->opengl; + } else + info->nographic = 1; + info->domid = domid; + info->dom_name = libxl_domid_to_name(ctx, domid); info->device_model = libxl_abs_path(ctx, "qemu-dm", libxl_libexec_path()); info->type = XENPV; return 0; } -int libxl_create_xenpv_qemu(libxl_ctx *ctx, libxl_device_vfb *vfb, - int num_console, libxl_device_console *console, +int libxl_create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb, libxl_device_model_starting **starting_r) { libxl_device_model_info info; - libxl_build_xenpv_qemu_args(ctx, vfb, num_console, console, &info); + libxl_build_xenpv_qemu_args(ctx, domid, vfb, &info); libxl_create_device_model(ctx, &info, NULL, 0, NULL, 0, starting_r); return 0; } diff -r 1644b4efef8a tools/libxl/libxl.h --- a/tools/libxl/libxl.h Mon Aug 09 17:46:39 2010 +0100 +++ b/tools/libxl/libxl.h Mon Aug 09 17:51:18 2010 +0100 @@ -229,16 +229,22 @@ typedef struct { } libxl_device_vkb; typedef enum { - CONSTYPE_XENCONSOLED, - CONSTYPE_IOEMU, + LIBXL_CONSTYPE_SERIAL, + LIBXL_CONSTYPE_PV, } libxl_console_constype; +typedef enum { + LIBXL_CONSBACK_XENCONSOLED, + LIBXL_CONSBACK_IOEMU, +} libxl_console_consback; + typedef struct { uint32_t backend_domid; uint32_t domid; int devid; - libxl_console_constype constype; + libxl_console_consback consback; libxl_domain_build_state *build_state; + char *output; } libxl_device_console; typedef enum { @@ -436,7 +442,7 @@ int libxl_domain_setmaxmem(libxl_ctx *ct int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb, int enforce); int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass); -int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num); +int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_console_constype type); /* libxl_primary_console_exec finds the domid and console number * corresponding to the primary console of the given vm, then calls * libxl_console_exec with the right arguments (domid might be different @@ -458,8 +464,7 @@ int libxl_create_device_model(libxl_ctx libxl_device_disk *disk, int num_disks, libxl_device_nic *vifs, int num_vifs, libxl_device_model_starting **starting_r); -int libxl_create_xenpv_qemu(libxl_ctx *ctx, libxl_device_vfb *vfb, - int num_console, libxl_device_console *console, +int libxl_create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb, libxl_device_model_starting **starting_r); /* Caller must either: pass starting_r==0, or on successful * return pass *starting_r (which will be non-0) to diff -r 1644b4efef8a tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Mon Aug 09 17:46:39 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.c Mon Aug 09 17:51:18 2010 +0100 @@ -370,7 +370,8 @@ static void init_console_info(libxl_devi { memset(console, 0x00, sizeof(libxl_device_console)); console->devid = dev_num; - console->constype = CONSTYPE_XENCONSOLED; + console->consback = LIBXL_CONSBACK_XENCONSOLED; + console->output = "pty"; if (state) console->build_state = state; } @@ -1440,6 +1441,7 @@ start: if (d_config.c_info.hvm) { init_console_info(&console, 0, &state); console.domid = domid; + console.consback = LIBXL_CONSBACK_IOEMU; libxl_device_console_add(&ctx, domid, &console); dm_info.domid = domid; MUST( libxl_create_device_model(&ctx, &dm_info, @@ -1456,10 +1458,10 @@ start: init_console_info(&console, 0, &state); console.domid = domid; if (d_config.num_vfbs) - console.constype = CONSTYPE_IOEMU; + console.consback = LIBXL_CONSBACK_IOEMU; libxl_device_console_add(&ctx, domid, &console); if (d_config.num_vfbs) - libxl_create_xenpv_qemu(&ctx, d_config.vfbs, 1, &console, &dm_starting); + libxl_create_xenpv_qemu(&ctx, domid, d_config.vfbs, &dm_starting); } if (dm_starting) @@ -1854,13 +1856,27 @@ int main_cd_insert(int argc, char **argv int main_console(int argc, char **argv) { - int opt = 0; - - while ((opt = getopt(argc, argv, "hn:")) != -1) { + int opt = 0, num = 0; + libxl_console_constype type = -1; + + while ((opt = getopt(argc, argv, "hn:t:")) != -1) { switch (opt) { case ''h'': help("console"); return 0; + case ''t'': + if (!strcmp(optarg, "pv")) + type = LIBXL_CONSTYPE_PV; + else if (!strcmp(optarg, "serial")) + type = LIBXL_CONSTYPE_SERIAL; + else { + fprintf(stderr, "console type supported are: pv, serial\n"); + return 2; + } + break; + case ''n'': + num = atoi(optarg); + break; default: fprintf(stderr, "option not supported\n"); break; @@ -1872,7 +1888,10 @@ int main_console(int argc, char **argv) } find_domain(argv[optind]); - libxl_primary_console_exec(&ctx, domid); + if (type <= 0 && num == 0) + libxl_primary_console_exec(&ctx, domid); + else + libxl_console_exec(&ctx, domid, num, type); fprintf(stderr, "Unable to attach console\n"); return 1; } diff -r 1644b4efef8a tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Mon Aug 09 17:46:39 2010 +0100 +++ b/tools/libxl/xl_cmdtable.c Mon Aug 09 17:51:18 2010 +0100 @@ -86,7 +86,9 @@ struct cmd_spec cmd_table[] = { { "console", &main_console, "Attach to domain''s console", - "<Domain>", + "[options] <Domain>\n" + "-t <type> console type, pv or serial\n" + "-n <number> console number" }, { "vncviewer", &main_vncviewer, _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Jackson
2010-Aug-13  15:27 UTC
Re: [Xen-devel] [PATCH 3 of 4] libxl: support multiple consoles
Stefano Stabellini writes ("[Xen-devel] [PATCH 3 of 4] libxl: support
multiple consoles"):> This patch modifies libxenlight to support multiple consoles and
> separates the xenstore paths for pv and serial consoles:
Thanks, but:
> -    info->vnc = vfb->vnc;
> -    if (vfb->vnclisten)
...> +    if (vfb != NULL) {
> +        info->vnc = vfb->vnc;
This is something to do with framebuffers rather than consoles.  Is it
supposed to be in this patch ?
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel