xen_console: support the new extended xenstore protocol
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. Changes in v4: - add a compatibility implementation of xs_open/xs_close. Changes in v5: - fix code style. [agraf] fix build error due to missing stub Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
9fbe478444
commit
0f51726adc
1
hw/xen.h
1
hw/xen.h
@ -41,6 +41,7 @@ qemu_irq *xen_interrupt_controller_init(void);
|
|||||||
int xen_init(void);
|
int xen_init(void);
|
||||||
int xen_hvm_init(void);
|
int xen_hvm_init(void);
|
||||||
void xen_vcpu_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)
|
#if defined(NEED_CPU_H) && !defined(CONFIG_USER_ONLY)
|
||||||
void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size);
|
void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size);
|
||||||
|
@ -85,6 +85,18 @@ static inline int xc_domain_add_to_physmap(int xc_handle, uint32_t domid,
|
|||||||
return xc_memory_op(xc_handle, XENMEM_add_to_physmap, &xatp);
|
return xc_memory_op(xc_handle, XENMEM_add_to_physmap, &xatp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct xs_handle *xs_open(unsigned long flags)
|
||||||
|
{
|
||||||
|
return xs_daemon_open();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void xs_close(struct xs_handle *xsh)
|
||||||
|
{
|
||||||
|
if (xsh != NULL) {
|
||||||
|
xs_daemon_close(xsh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Xen 4.1 */
|
/* Xen 4.1 */
|
||||||
#else
|
#else
|
||||||
|
@ -179,8 +179,9 @@ static void xencons_send(struct XenConsole *con)
|
|||||||
static int con_init(struct XenDevice *xendev)
|
static int con_init(struct XenDevice *xendev)
|
||||||
{
|
{
|
||||||
struct XenConsole *con = container_of(xendev, struct XenConsole, xendev);
|
struct XenConsole *con = container_of(xendev, struct XenConsole, xendev);
|
||||||
char *type, *dom;
|
char *type, *dom, label[32];
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
const char *output;
|
||||||
|
|
||||||
/* setup */
|
/* setup */
|
||||||
dom = xs_get_domain_path(xenstore, con->xendev.dom);
|
dom = xs_get_domain_path(xenstore, con->xendev.dom);
|
||||||
@ -194,11 +195,14 @@ static int con_init(struct XenDevice *xendev)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!serial_hds[con->xendev.dev])
|
output = xenstore_read_str(con->console, "output");
|
||||||
xen_be_printf(xendev, 1, "WARNING: serial line %d not configured\n",
|
/* output is a pty by default */
|
||||||
con->xendev.dev);
|
if (output == NULL) {
|
||||||
else
|
output = "pty";
|
||||||
con->chr = serial_hds[con->xendev.dev];
|
}
|
||||||
|
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:
|
out:
|
||||||
qemu_free(type);
|
qemu_free(type);
|
||||||
|
60
xen-all.c
60
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)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
pts = cs->filename + 4;
|
||||||
|
|
||||||
|
/* We now have everything we need to set the xenstore entry. */
|
||||||
|
xs = xs_open(0);
|
||||||
|
if (xs == NULL) {
|
||||||
|
fprintf(stderr, "Could not contact XenStore\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
path = xs_get_domain_path(xs, domid);
|
||||||
|
if (path == NULL) {
|
||||||
|
fprintf(stderr, "xs_get_domain_path() error\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
newpath = realloc(path, (strlen(path) + strlen(string) +
|
||||||
|
strlen("/tty") + 1));
|
||||||
|
if (newpath == NULL) {
|
||||||
|
fprintf(stderr, "realloc error\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
path = newpath;
|
||||||
|
|
||||||
|
strcat(path, string);
|
||||||
|
strcat(path, "/tty");
|
||||||
|
if (!xs_write(xs, XBT_NULL, path, pts, strlen(pts))) {
|
||||||
|
fprintf(stderr, "xs_write for '%s' fail", string);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
free(path);
|
||||||
|
xs_close(xs);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void xenstore_store_pv_console_info(int i, CharDriverState *chr)
|
||||||
|
{
|
||||||
|
if (i == 0) {
|
||||||
|
store_dev_info(xen_domid, chr, "/console");
|
||||||
|
} else {
|
||||||
|
char buf[32];
|
||||||
|
snprintf(buf, sizeof(buf), "/device/console/%d", i);
|
||||||
|
store_dev_info(xen_domid, chr, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void xenstore_record_dm_state(XenIOState *s, const char *state)
|
static void xenstore_record_dm_state(XenIOState *s, const char *state)
|
||||||
{
|
{
|
||||||
char path[50];
|
char path[50];
|
||||||
|
@ -9,6 +9,10 @@
|
|||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "hw/xen.h"
|
#include "hw/xen.h"
|
||||||
|
|
||||||
|
void xenstore_store_pv_console_info(int i, CharDriverState *chr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
|
int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user