On Thu, 30 Jun 2011, Alexander Graf wrote: > On 06/29/2011 01:12 PM, stefano.stabell...@eu.citrix.com wrote: > > From: Stefano Stabellini<stefano.stabell...@eu.citrix.com> > > > > Since CS 21994 on xen-unstable.hg and CS > > 466608f3a32e1f9808acdf832a5843af37e5fcec on qemu-xen-unstable.git, few > > changes have been introduced to the PV console xenstore protocol, as > > described by the document docs/misc/console.txt under xen-unstable.hg. > > > > From the Qemu point of view, very few modifications are needed to > > correctly support the protocol: read from xenstore the "output" node > > that tell us what the output of the PV console is going to be. > > In case the output is a tty, write to xenstore the device name. > > > > Changes in v2: > > > > - fix error paths: free malloc'ed strings and close the xenstore > > connection before returning; > > > > - remove useless snprintf in xenstore_store_pv_console_info if i == 0. > > > > Changes in v3: > > > > - replace xs_daemon_open/xs_daemon_close with xs_open/xs_close. > > > > Signed-off-by: Stefano Stabellini<stefano.stabell...@eu.citrix.com> > > --- > > hw/xen.h | 1 + > > hw/xen_console.c | 16 +++++++++----- > > xen-all.c | 60 > > ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > 3 files changed, 71 insertions(+), 6 deletions(-) > > > > diff --git a/hw/xen.h b/hw/xen.h > > index d435ca0..dad0ca0 100644 > > --- a/hw/xen.h > > +++ b/hw/xen.h > > @@ -50,6 +50,7 @@ qemu_irq *xen_interrupt_controller_init(void); > > int xen_init(void); > > int xen_hvm_init(void); > > void xen_vcpu_init(void); > > +void xenstore_store_pv_console_info(int i, struct CharDriverState *chr); > > > > #if defined(NEED_CPU_H)&& !defined(CONFIG_USER_ONLY) > > void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size); > > diff --git a/hw/xen_console.c b/hw/xen_console.c > > index 519d5f5..e81afcd 100644 > > --- a/hw/xen_console.c > > +++ b/hw/xen_console.c > > @@ -179,8 +179,9 @@ static void xencons_send(struct XenConsole *con) > > static int con_init(struct XenDevice *xendev) > > { > > struct XenConsole *con = container_of(xendev, struct XenConsole, > > xendev); > > - char *type, *dom; > > + char *type, *dom, label[32]; > > int ret = 0; > > + const char *output; > > > > /* setup */ > > dom = xs_get_domain_path(xenstore, con->xendev.dom); > > @@ -194,11 +195,14 @@ static int con_init(struct XenDevice *xendev) > > goto out; > > } > > > > - if (!serial_hds[con->xendev.dev]) > > - xen_be_printf(xendev, 1, "WARNING: serial line %d not configured\n", > > - con->xendev.dev); > > - else > > - con->chr = serial_hds[con->xendev.dev]; > > + output = xenstore_read_str(con->console, "output"); > > + /* output is a pty by default */ > > + if (output == NULL) { > > + output = "pty"; > > Not sure I understand. Why would a pty be the default? stdio makes a lot > more sense, no?
ptys are always been the default in the xen world. Besides qemu is always executed by the toolstack, so stdio might be used for something else... > > + } > > + snprintf(label, sizeof(label), "xencons%d", con->xendev.dev); > > + con->chr = qemu_chr_open(label, output, NULL); > > + xenstore_store_pv_console_info(con->xendev.dev, con->chr); > > > > out: > > qemu_free(type); > > diff --git a/xen-all.c b/xen-all.c > > index 6099bff..3fd04ef 100644 > > --- a/xen-all.c > > +++ b/xen-all.c > > @@ -737,6 +737,66 @@ static void cpu_handle_ioreq(void *opaque) > > } > > } > > > > +static int store_dev_info(int domid, CharDriverState *cs, const char > > *string) > > +{ > > + struct xs_handle *xs = NULL; > > + char *path = NULL; > > + char *newpath = NULL; > > + char *pts = NULL; > > + int ret = -1; > > + > > + /* Only continue if we're talking to a pty. */ > > + if (strncmp(cs->filename, "pty:", 4)) { > > What's wrong with !pty? Nothing wrong, we don't need to write anything back to xenstore in that case.