anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 00/15] Xen device model support
From: Anthony PERARD <anthony.perard@citrix.com> Hi all, Here is the few change since the V10: - Add braces for blocks with single statement in the clean-up patch; - the patch that builds Xen only for x86 have been removed, instead, xen_domainbuild is built with libhw and other Xen files are built for i386 target only; - the redirection structure with function pointer have been removed, instead, there are few #define or static inline function use for the compatibility; - the platform device uses trace instead of dprintf for guest log; - introduce i440fx_xen_init and i440fx_common_init to avoid xen_enabled() in piix_pci. This series depends on the series "Introduce "machine" QemuOpts". You can find a git tree here: git://xenbits.xen.org/people/aperard/qemu-dm.git qemu-dm-v11 Anthony PERARD (12): xen: Replace some tab-indents with spaces (clean-up). xen: Make Xen build once. xen: Support new libxc calls from xen unstable. xen: Add initialisation of Xen xen: Add xenfv machine piix_pci: Introduces Xen specific call for irq. xen: Introduce Xen Interrupt Controller configure: Always use 64bits target physical addresses with xen enabled. Introduce qemu_put_ram_ptr vl.c: Introduce getter for shutdown_requested and reset_requested. xen: Set running state in xenstore. xen: Add Xen hypercall for sleep state in the cmos_s3 callback. Arun Sharma (1): xen: Initialize event channels and io rings Jun Nakajima (1): xen: Introduce the Xen mapcache Steven Smith (1): xen: Add the Xen platform pci device Makefile.objs | 3 + Makefile.target | 16 ++- configure | 71 ++++++- cpu-common.h | 1 + exec.c | 50 ++++- hw/hw.h | 3 + hw/pc.c | 19 ++- hw/pc.h | 1 + hw/pc_piix.c | 41 ++++- hw/pci_ids.h | 2 + hw/piix_pci.c | 47 ++++- hw/xen.h | 41 ++++ hw/xen_backend.c | 422 ++++++++++++++++++++----------------- hw/xen_backend.h | 6 +- hw/xen_common.h | 75 ++++++-- hw/xen_disk.c | 496 +++++++++++++++++++++++-------------------- hw/xen_domainbuild.c | 13 +- hw/xen_domainbuild.h | 5 +- hw/xen_machine_pv.c | 2 +- hw/xen_nic.c | 265 +++++++++++++----------- hw/xen_platform.c | 349 ++++++++++++++++++++++++++++++ sysemu.h | 2 + trace-events | 3 + vl.c | 12 + xen-all.c | 573 ++++++++++++++++++++++++++++++++++++++++++++++++++ xen-mapcache-stub.c | 40 ++++ xen-mapcache.c | 344 ++++++++++++++++++++++++++++++ xen-mapcache.h | 22 ++ xen-stub.c | 45 ++++ 29 files changed, 2386 insertions(+), 583 deletions(-) create mode 100644 hw/xen_platform.c create mode 100644 xen-all.c create mode 100644 xen-mapcache-stub.c create mode 100644 xen-mapcache.c create mode 100644 xen-mapcache.h create mode 100644 xen-stub.c -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 01/15] xen: Replace some tab-indents with spaces (clean-up).
From: Anthony PERARD <anthony.perard@citrix.com> And put braces for blocks with a single statement. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Acked-by: Alexander Graf <agraf@suse.de> --- hw/xen_backend.c | 411 +++++++++++++++++++++++++-------------------- hw/xen_disk.c | 492 +++++++++++++++++++++++++++++------------------------- hw/xen_nic.c | 265 ++++++++++++++++-------------- 3 files changed, 634 insertions(+), 534 deletions(-) diff --git a/hw/xen_backend.c b/hw/xen_backend.c index a2e408f..9f4ec4b 100644 --- a/hw/xen_backend.c +++ b/hw/xen_backend.c @@ -58,8 +58,9 @@ int xenstore_write_str(const char *base, const char *node, const char *val) char abspath[XEN_BUFSIZE]; snprintf(abspath, sizeof(abspath), "%s/%s", base, node); - if (!xs_write(xenstore, 0, abspath, val, strlen(val))) - return -1; + if (!xs_write(xenstore, 0, abspath, val, strlen(val))) { + return -1; + } return 0; } @@ -94,8 +95,9 @@ int xenstore_read_int(const char *base, const char *node, int *ival) int rc = -1; val = xenstore_read_str(base, node); - if (val && 1 == sscanf(val, "%d", ival)) - rc = 0; + if (val && 1 == sscanf(val, "%d", ival)) { + rc = 0; + } qemu_free(val); return rc; } @@ -134,16 +136,16 @@ int xenstore_read_fe_int(struct XenDevice *xendev, const char *node, int *ival) const char *xenbus_strstate(enum xenbus_state state) { - static const char *const name[] = { - [ XenbusStateUnknown ] = "Unknown", - [ XenbusStateInitialising ] = "Initialising", - [ XenbusStateInitWait ] = "InitWait", - [ XenbusStateInitialised ] = "Initialised", - [ XenbusStateConnected ] = "Connected", - [ XenbusStateClosing ] = "Closing", - [ XenbusStateClosed ] = "Closed", - }; - return (state < ARRAY_SIZE(name)) ? name[state] : "INVALID"; + static const char *const name[] = { + [ XenbusStateUnknown ] = "Unknown", + [ XenbusStateInitialising ] = "Initialising", + [ XenbusStateInitWait ] = "InitWait", + [ XenbusStateInitialised ] = "Initialised", + [ XenbusStateConnected ] = "Connected", + [ XenbusStateClosing ] = "Closing", + [ XenbusStateClosed ] = "Closed", + }; + return (state < ARRAY_SIZE(name)) ? name[state] : "INVALID"; } int xen_be_set_state(struct XenDevice *xendev, enum xenbus_state state) @@ -151,10 +153,11 @@ int xen_be_set_state(struct XenDevice *xendev, enum xenbus_state state) int rc; rc = xenstore_write_be_int(xendev, "state", state); - if (rc < 0) - return rc; + if (rc < 0) { + return rc; + } xen_be_printf(xendev, 1, "backend state: %s -> %s\n", - xenbus_strstate(xendev->be_state), xenbus_strstate(state)); + xenbus_strstate(xendev->be_state), xenbus_strstate(state)); xendev->be_state = state; return 0; } @@ -166,13 +169,16 @@ struct XenDevice *xen_be_find_xendev(const char *type, int dom, int dev) struct XenDevice *xendev; QTAILQ_FOREACH(xendev, &xendevs, next) { - if (xendev->dom != dom) - continue; - if (xendev->dev != dev) - continue; - if (strcmp(xendev->type, type) != 0) - continue; - return xendev; + if (xendev->dom != dom) { + continue; + } + if (xendev->dev != dev) { + continue; + } + if (strcmp(xendev->type, type) != 0) { + continue; + } + return xendev; } return NULL; } @@ -187,8 +193,9 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, char *dom0; xendev = xen_be_find_xendev(type, dom, dev); - if (xendev) - return xendev; + if (xendev) { + return xendev; + } /* init new xendev */ xendev = qemu_mallocz(ops->size); @@ -199,9 +206,9 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, dom0 = xs_get_domain_path(xenstore, 0); snprintf(xendev->be, sizeof(xendev->be), "%s/backend/%s/%d/%d", - dom0, xendev->type, xendev->dom, xendev->dev); + dom0, xendev->type, xendev->dom, xendev->dev); snprintf(xendev->name, sizeof(xendev->name), "%s-%d", - xendev->type, xendev->dev); + xendev->type, xendev->dev); free(dom0); xendev->debug = debug; @@ -209,28 +216,29 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, xendev->evtchndev = xc_evtchn_open(); if (xendev->evtchndev < 0) { - xen_be_printf(NULL, 0, "can''t open evtchn device\n"); - qemu_free(xendev); - return NULL; + xen_be_printf(NULL, 0, "can''t open evtchn device\n"); + qemu_free(xendev); + return NULL; } fcntl(xc_evtchn_fd(xendev->evtchndev), F_SETFD, FD_CLOEXEC); if (ops->flags & DEVOPS_FLAG_NEED_GNTDEV) { - xendev->gnttabdev = xc_gnttab_open(); - if (xendev->gnttabdev < 0) { - xen_be_printf(NULL, 0, "can''t open gnttab device\n"); - xc_evtchn_close(xendev->evtchndev); - qemu_free(xendev); - return NULL; - } + xendev->gnttabdev = xc_gnttab_open(); + if (xendev->gnttabdev < 0) { + xen_be_printf(NULL, 0, "can''t open gnttab device\n"); + xc_evtchn_close(xendev->evtchndev); + qemu_free(xendev); + return NULL; + } } else { - xendev->gnttabdev = -1; + xendev->gnttabdev = -1; } QTAILQ_INSERT_TAIL(&xendevs, xendev, next); - if (xendev->ops->alloc) - xendev->ops->alloc(xendev); + if (xendev->ops->alloc) { + xendev->ops->alloc(xendev); + } return xendev; } @@ -251,28 +259,33 @@ static struct XenDevice *xen_be_del_xendev(int dom, int dev) xendev = xnext; xnext = xendev->next.tqe_next; - if (xendev->dom != dom) - continue; - if (xendev->dev != dev && dev != -1) - continue; - - if (xendev->ops->free) - xendev->ops->free(xendev); - - if (xendev->fe) { - char token[XEN_BUFSIZE]; - snprintf(token, sizeof(token), "fe:%p", xendev); - xs_unwatch(xenstore, xendev->fe, token); - qemu_free(xendev->fe); - } - - if (xendev->evtchndev >= 0) - xc_evtchn_close(xendev->evtchndev); - if (xendev->gnttabdev >= 0) - xc_gnttab_close(xendev->gnttabdev); - - QTAILQ_REMOVE(&xendevs, xendev, next); - qemu_free(xendev); + if (xendev->dom != dom) { + continue; + } + if (xendev->dev != dev && dev != -1) { + continue; + } + + if (xendev->ops->free) { + xendev->ops->free(xendev); + } + + if (xendev->fe) { + char token[XEN_BUFSIZE]; + snprintf(token, sizeof(token), "fe:%p", xendev); + xs_unwatch(xenstore, xendev->fe, token); + qemu_free(xendev->fe); + } + + if (xendev->evtchndev >= 0) { + xc_evtchn_close(xendev->evtchndev); + } + if (xendev->gnttabdev >= 0) { + xc_gnttab_close(xendev->gnttabdev); + } + + QTAILQ_REMOVE(&xendevs, xendev, next); + qemu_free(xendev); } return NULL; } @@ -285,14 +298,16 @@ static struct XenDevice *xen_be_del_xendev(int dom, int dev) static void xen_be_backend_changed(struct XenDevice *xendev, const char *node) { if (node == NULL || strcmp(node, "online") == 0) { - if (xenstore_read_be_int(xendev, "online", &xendev->online) == -1) - xendev->online = 0; + if (xenstore_read_be_int(xendev, "online", &xendev->online) == -1) { + xendev->online = 0; + } } if (node) { - xen_be_printf(xendev, 2, "backend update: %s\n", node); - if (xendev->ops->backend_changed) - xendev->ops->backend_changed(xendev, node); + xen_be_printf(xendev, 2, "backend update: %s\n", node); + if (xendev->ops->backend_changed) { + xendev->ops->backend_changed(xendev, node); + } } } @@ -301,25 +316,29 @@ static void xen_be_frontend_changed(struct XenDevice *xendev, const char *node) int fe_state; if (node == NULL || strcmp(node, "state") == 0) { - if (xenstore_read_fe_int(xendev, "state", &fe_state) == -1) - fe_state = XenbusStateUnknown; - if (xendev->fe_state != fe_state) - xen_be_printf(xendev, 1, "frontend state: %s -> %s\n", - xenbus_strstate(xendev->fe_state), - xenbus_strstate(fe_state)); - xendev->fe_state = fe_state; + if (xenstore_read_fe_int(xendev, "state", &fe_state) == -1) { + fe_state = XenbusStateUnknown; + } + if (xendev->fe_state != fe_state) { + xen_be_printf(xendev, 1, "frontend state: %s -> %s\n", + xenbus_strstate(xendev->fe_state), + xenbus_strstate(fe_state)); + } + xendev->fe_state = fe_state; } if (node == NULL || strcmp(node, "protocol") == 0) { - qemu_free(xendev->protocol); - xendev->protocol = xenstore_read_fe_str(xendev, "protocol"); - if (xendev->protocol) - xen_be_printf(xendev, 1, "frontend protocol: %s\n", xendev->protocol); + qemu_free(xendev->protocol); + xendev->protocol = xenstore_read_fe_str(xendev, "protocol"); + if (xendev->protocol) { + xen_be_printf(xendev, 1, "frontend protocol: %s\n", xendev->protocol); + } } if (node) { - xen_be_printf(xendev, 2, "frontend update: %s\n", node); - if (xendev->ops->frontend_changed) - xendev->ops->frontend_changed(xendev, node); + xen_be_printf(xendev, 2, "frontend update: %s\n", node); + if (xendev->ops->frontend_changed) { + xendev->ops->frontend_changed(xendev, node); + } } } @@ -340,28 +359,28 @@ static int xen_be_try_setup(struct XenDevice *xendev) int be_state; if (xenstore_read_be_int(xendev, "state", &be_state) == -1) { - xen_be_printf(xendev, 0, "reading backend state failed\n"); - return -1; + xen_be_printf(xendev, 0, "reading backend state failed\n"); + return -1; } if (be_state != XenbusStateInitialising) { - xen_be_printf(xendev, 0, "initial backend state is wrong (%s)\n", - xenbus_strstate(be_state)); - return -1; + xen_be_printf(xendev, 0, "initial backend state is wrong (%s)\n", + xenbus_strstate(be_state)); + return -1; } xendev->fe = xenstore_read_be_str(xendev, "frontend"); if (xendev->fe == NULL) { - xen_be_printf(xendev, 0, "reading frontend path failed\n"); - return -1; + xen_be_printf(xendev, 0, "reading frontend path failed\n"); + return -1; } /* setup frontend watch */ snprintf(token, sizeof(token), "fe:%p", xendev); if (!xs_watch(xenstore, xendev->fe, token)) { - xen_be_printf(xendev, 0, "watching frontend path (%s) failed\n", - xendev->fe); - return -1; + xen_be_printf(xendev, 0, "watching frontend path (%s) failed\n", + xendev->fe); + return -1; } xen_be_set_state(xendev, XenbusStateInitialising); @@ -383,15 +402,16 @@ static int xen_be_try_init(struct XenDevice *xendev) int rc = 0; if (!xendev->online) { - xen_be_printf(xendev, 1, "not online\n"); - return -1; + xen_be_printf(xendev, 1, "not online\n"); + return -1; } - if (xendev->ops->init) - rc = xendev->ops->init(xendev); + if (xendev->ops->init) { + rc = xendev->ops->init(xendev); + } if (rc != 0) { - xen_be_printf(xendev, 1, "init() failed\n"); - return rc; + xen_be_printf(xendev, 1, "init() failed\n"); + return rc; } xenstore_write_be_str(xendev, "hotplug-status", "connected"); @@ -411,20 +431,21 @@ static int xen_be_try_connect(struct XenDevice *xendev) int rc = 0; if (xendev->fe_state != XenbusStateInitialised && - xendev->fe_state != XenbusStateConnected) { - if (xendev->ops->flags & DEVOPS_FLAG_IGNORE_STATE) { - xen_be_printf(xendev, 2, "frontend not ready, ignoring\n"); - } else { - xen_be_printf(xendev, 2, "frontend not ready (yet)\n"); - return -1; - } + xendev->fe_state != XenbusStateConnected) { + if (xendev->ops->flags & DEVOPS_FLAG_IGNORE_STATE) { + xen_be_printf(xendev, 2, "frontend not ready, ignoring\n"); + } else { + xen_be_printf(xendev, 2, "frontend not ready (yet)\n"); + return -1; + } } - if (xendev->ops->connect) - rc = xendev->ops->connect(xendev); + if (xendev->ops->connect) { + rc = xendev->ops->connect(xendev); + } if (rc != 0) { - xen_be_printf(xendev, 0, "connect() failed\n"); - return rc; + xen_be_printf(xendev, 0, "connect() failed\n"); + return rc; } xen_be_set_state(xendev, XenbusStateConnected); @@ -440,10 +461,12 @@ static void xen_be_disconnect(struct XenDevice *xendev, enum xenbus_state state) { if (xendev->be_state != XenbusStateClosing && xendev->be_state != XenbusStateClosed && - xendev->ops->disconnect) - xendev->ops->disconnect(xendev); - if (xendev->be_state != state) + xendev->ops->disconnect) { + xendev->ops->disconnect(xendev); + } + if (xendev->be_state != state) { xen_be_set_state(xendev, state); + } } /* @@ -451,8 +474,9 @@ static void xen_be_disconnect(struct XenDevice *xendev, enum xenbus_state state) */ static int xen_be_try_reset(struct XenDevice *xendev) { - if (xendev->fe_state != XenbusStateInitialising) + if (xendev->fe_state != XenbusStateInitialising) { return -1; + } xen_be_printf(xendev, 1, "device reset (for re-connect)\n"); xen_be_set_state(xendev, XenbusStateInitialising); @@ -468,31 +492,32 @@ void xen_be_check_state(struct XenDevice *xendev) /* frontend may request shutdown from almost anywhere */ if (xendev->fe_state == XenbusStateClosing || - xendev->fe_state == XenbusStateClosed) { - xen_be_disconnect(xendev, xendev->fe_state); - return; + xendev->fe_state == XenbusStateClosed) { + xen_be_disconnect(xendev, xendev->fe_state); + return; } /* check for possible backend state transitions */ for (;;) { - switch (xendev->be_state) { - case XenbusStateUnknown: - rc = xen_be_try_setup(xendev); - break; - case XenbusStateInitialising: - rc = xen_be_try_init(xendev); - break; - case XenbusStateInitWait: - rc = xen_be_try_connect(xendev); - break; + switch (xendev->be_state) { + case XenbusStateUnknown: + rc = xen_be_try_setup(xendev); + break; + case XenbusStateInitialising: + rc = xen_be_try_init(xendev); + break; + case XenbusStateInitWait: + rc = xen_be_try_connect(xendev); + break; case XenbusStateClosed: rc = xen_be_try_reset(xendev); break; - default: - rc = -1; - } - if (rc != 0) - break; + default: + rc = -1; + } + if (rc != 0) { + break; + } } } @@ -511,26 +536,28 @@ static int xenstore_scan(const char *type, int dom, struct XenDevOps *ops) snprintf(path, sizeof(path), "%s/backend/%s/%d", dom0, type, dom); free(dom0); if (!xs_watch(xenstore, path, token)) { - xen_be_printf(NULL, 0, "xen be: watching backend path (%s) failed\n", path); - return -1; + xen_be_printf(NULL, 0, "xen be: watching backend path (%s) failed\n", path); + return -1; } /* look for backends */ dev = xs_directory(xenstore, 0, path, &cdev); - if (!dev) - return 0; + if (!dev) { + return 0; + } for (j = 0; j < cdev; j++) { - xendev = xen_be_get_xendev(type, dom, atoi(dev[j]), ops); - if (xendev == NULL) - continue; - xen_be_check_state(xendev); + xendev = xen_be_get_xendev(type, dom, atoi(dev[j]), ops); + if (xendev == NULL) { + continue; + } + xen_be_check_state(xendev); } free(dev); return 0; } static void xenstore_update_be(char *watch, char *type, int dom, - struct XenDevOps *ops) + struct XenDevOps *ops) { struct XenDevice *xendev; char path[XEN_BUFSIZE], *dom0; @@ -539,25 +566,28 @@ static void xenstore_update_be(char *watch, char *type, int dom, dom0 = xs_get_domain_path(xenstore, 0); len = snprintf(path, sizeof(path), "%s/backend/%s/%d", dom0, type, dom); free(dom0); - if (strncmp(path, watch, len) != 0) - return; + if (strncmp(path, watch, len) != 0) { + return; + } if (sscanf(watch+len, "/%u/%255s", &dev, path) != 2) { - strcpy(path, ""); - if (sscanf(watch+len, "/%u", &dev) != 1) - dev = -1; + strcpy(path, ""); + if (sscanf(watch+len, "/%u", &dev) != 1) { + dev = -1; + } + } + if (dev == -1) { + return; } - if (dev == -1) - return; if (0) { - /* FIXME: detect devices being deleted from xenstore ... */ - xen_be_del_xendev(dom, dev); + /* FIXME: detect devices being deleted from xenstore ... */ + xen_be_del_xendev(dom, dev); } xendev = xen_be_get_xendev(type, dom, dev, ops); if (xendev != NULL) { - xen_be_backend_changed(xendev, path); - xen_be_check_state(xendev); + xen_be_backend_changed(xendev, path); + xen_be_check_state(xendev); } } @@ -567,10 +597,12 @@ static void xenstore_update_fe(char *watch, struct XenDevice *xendev) unsigned int len; len = strlen(xendev->fe); - if (strncmp(xendev->fe, watch, len) != 0) - return; - if (watch[len] != ''/'') - return; + if (strncmp(xendev->fe, watch, len) != 0) { + return; + } + if (watch[len] != ''/'') { + return; + } node = watch + len + 1; xen_be_frontend_changed(xendev, node); @@ -584,14 +616,17 @@ static void xenstore_update(void *unused) unsigned int dom, count; vec = xs_read_watch(xenstore, &count); - if (vec == NULL) - goto cleanup; + if (vec == NULL) { + goto cleanup; + } if (sscanf(vec[XS_WATCH_TOKEN], "be:%" PRIxPTR ":%d:%" PRIxPTR, - &type, &dom, &ops) == 3) - xenstore_update_be(vec[XS_WATCH_PATH], (void*)type, dom, (void*)ops); - if (sscanf(vec[XS_WATCH_TOKEN], "fe:%" PRIxPTR, &ptr) == 1) - xenstore_update_fe(vec[XS_WATCH_PATH], (void*)ptr); + &type, &dom, &ops) == 3) { + xenstore_update_be(vec[XS_WATCH_PATH], (void*)type, dom, (void*)ops); + } + if (sscanf(vec[XS_WATCH_TOKEN], "fe:%" PRIxPTR, &ptr) == 1) { + xenstore_update_fe(vec[XS_WATCH_PATH], (void*)ptr); + } cleanup: free(vec); @@ -604,14 +639,15 @@ static void xen_be_evtchn_event(void *opaque) port = xc_evtchn_pending(xendev->evtchndev); if (port != xendev->local_port) { - xen_be_printf(xendev, 0, "xc_evtchn_pending returned %d (expected %d)\n", - port, xendev->local_port); - return; + xen_be_printf(xendev, 0, "xc_evtchn_pending returned %d (expected %d)\n", + port, xendev->local_port); + return; } xc_evtchn_unmask(xendev->evtchndev, port); - if (xendev->ops->event) - xendev->ops->event(xendev); + if (xendev->ops->event) { + xendev->ops->event(xendev); + } } /* -------------------------------------------------------------------- */ @@ -620,17 +656,18 @@ int xen_be_init(void) { xenstore = xs_daemon_open(); if (!xenstore) { - xen_be_printf(NULL, 0, "can''t connect to xenstored\n"); - return -1; + xen_be_printf(NULL, 0, "can''t connect to xenstored\n"); + return -1; } - if (qemu_set_fd_handler(xs_fileno(xenstore), xenstore_update, NULL, NULL) < 0) - goto err; + if (qemu_set_fd_handler(xs_fileno(xenstore), xenstore_update, NULL, NULL) < 0) { + goto err; + } xen_xc = xc_interface_open(); if (xen_xc == -1) { - xen_be_printf(NULL, 0, "can''t open xen interface\n"); - goto err; + xen_be_printf(NULL, 0, "can''t open xen interface\n"); + goto err; } return 0; @@ -649,24 +686,26 @@ int xen_be_register(const char *type, struct XenDevOps *ops) int xen_be_bind_evtchn(struct XenDevice *xendev) { - if (xendev->local_port != -1) - return 0; + if (xendev->local_port != -1) { + return 0; + } xendev->local_port = xc_evtchn_bind_interdomain - (xendev->evtchndev, xendev->dom, xendev->remote_port); + (xendev->evtchndev, xendev->dom, xendev->remote_port); if (xendev->local_port == -1) { - xen_be_printf(xendev, 0, "xc_evtchn_bind_interdomain failed\n"); - return -1; + xen_be_printf(xendev, 0, "xc_evtchn_bind_interdomain failed\n"); + return -1; } xen_be_printf(xendev, 2, "bind evtchn port %d\n", xendev->local_port); qemu_set_fd_handler(xc_evtchn_fd(xendev->evtchndev), - xen_be_evtchn_event, NULL, xendev); + xen_be_evtchn_event, NULL, xendev); return 0; } void xen_be_unbind_evtchn(struct XenDevice *xendev) { - if (xendev->local_port == -1) - return; + if (xendev->local_port == -1) { + return; + } qemu_set_fd_handler(xc_evtchn_fd(xendev->evtchndev), NULL, NULL, NULL); xc_evtchn_unbind(xendev->evtchndev, xendev->local_port); xen_be_printf(xendev, 2, "unbind evtchn port %d\n", xendev->local_port); @@ -690,17 +729,21 @@ void xen_be_printf(struct XenDevice *xendev, int msg_level, const char *fmt, ... va_list args; if (xendev) { - if (msg_level > xendev->debug) + if (msg_level > xendev->debug) { return; + } qemu_log("xen be: %s: ", xendev->name); - if (msg_level == 0) + if (msg_level == 0) { fprintf(stderr, "xen be: %s: ", xendev->name); + } } else { - if (msg_level > debug) + if (msg_level > debug) { return; + } qemu_log("xen be core: "); - if (msg_level == 0) + if (msg_level == 0) { fprintf(stderr, "xen be core: "); + } } va_start(args, fmt); qemu_log_vprintf(fmt, args); diff --git a/hw/xen_disk.c b/hw/xen_disk.c index ed9e5eb..403c55f 100644 --- a/hw/xen_disk.c +++ b/hw/xen_disk.c @@ -120,17 +120,18 @@ static struct ioreq *ioreq_start(struct XenBlkDev *blkdev) struct ioreq *ioreq = NULL; if (QLIST_EMPTY(&blkdev->freelist)) { - if (blkdev->requests_total >= max_requests) - goto out; - /* allocate new struct */ - ioreq = qemu_mallocz(sizeof(*ioreq)); - ioreq->blkdev = blkdev; - blkdev->requests_total++; + if (blkdev->requests_total >= max_requests) { + goto out; + } + /* allocate new struct */ + ioreq = qemu_mallocz(sizeof(*ioreq)); + ioreq->blkdev = blkdev; + blkdev->requests_total++; qemu_iovec_init(&ioreq->v, BLKIF_MAX_SEGMENTS_PER_REQUEST); } else { - /* get one from freelist */ - ioreq = QLIST_FIRST(&blkdev->freelist); - QLIST_REMOVE(ioreq, list); + /* get one from freelist */ + ioreq = QLIST_FIRST(&blkdev->freelist); + QLIST_REMOVE(ioreq, list); qemu_iovec_reset(&ioreq->v); } QLIST_INSERT_HEAD(&blkdev->inflight, ioreq, list); @@ -173,30 +174,32 @@ static int ioreq_parse(struct ioreq *ioreq) int i; xen_be_printf(&blkdev->xendev, 3, - "op %d, nr %d, handle %d, id %" PRId64 ", sector %" PRId64 "\n", - ioreq->req.operation, ioreq->req.nr_segments, - ioreq->req.handle, ioreq->req.id, ioreq->req.sector_number); + "op %d, nr %d, handle %d, id %" PRId64 ", sector %" PRId64 "\n", + ioreq->req.operation, ioreq->req.nr_segments, + ioreq->req.handle, ioreq->req.id, ioreq->req.sector_number); switch (ioreq->req.operation) { case BLKIF_OP_READ: - ioreq->prot = PROT_WRITE; /* to memory */ - break; + ioreq->prot = PROT_WRITE; /* to memory */ + break; case BLKIF_OP_WRITE_BARRIER: if (!ioreq->req.nr_segments) { ioreq->presync = 1; return 0; } - if (!syncwrite) - ioreq->presync = ioreq->postsync = 1; - /* fall through */ + if (!syncwrite) { + ioreq->presync = ioreq->postsync = 1; + } + /* fall through */ case BLKIF_OP_WRITE: - ioreq->prot = PROT_READ; /* from memory */ - if (syncwrite) - ioreq->postsync = 1; - break; + ioreq->prot = PROT_READ; /* from memory */ + if (syncwrite) { + ioreq->postsync = 1; + } + break; default: - xen_be_printf(&blkdev->xendev, 0, "error: unknown operation (%d)\n", - ioreq->req.operation); - goto err; + xen_be_printf(&blkdev->xendev, 0, "error: unknown operation (%d)\n", + ioreq->req.operation); + goto err; }; if (ioreq->req.operation != BLKIF_OP_READ && blkdev->mode[0] != ''w'') { @@ -206,29 +209,29 @@ static int ioreq_parse(struct ioreq *ioreq) ioreq->start = ioreq->req.sector_number * blkdev->file_blk; for (i = 0; i < ioreq->req.nr_segments; i++) { - if (i == BLKIF_MAX_SEGMENTS_PER_REQUEST) { - xen_be_printf(&blkdev->xendev, 0, "error: nr_segments too big\n"); - goto err; - } - if (ioreq->req.seg[i].first_sect > ioreq->req.seg[i].last_sect) { - xen_be_printf(&blkdev->xendev, 0, "error: first > last sector\n"); - goto err; - } - if (ioreq->req.seg[i].last_sect * BLOCK_SIZE >= XC_PAGE_SIZE) { - xen_be_printf(&blkdev->xendev, 0, "error: page crossing\n"); - goto err; - } - - ioreq->domids[i] = blkdev->xendev.dom; - ioreq->refs[i] = ioreq->req.seg[i].gref; - - mem = ioreq->req.seg[i].first_sect * blkdev->file_blk; - len = (ioreq->req.seg[i].last_sect - ioreq->req.seg[i].first_sect + 1) * blkdev->file_blk; + if (i == BLKIF_MAX_SEGMENTS_PER_REQUEST) { + xen_be_printf(&blkdev->xendev, 0, "error: nr_segments too big\n"); + goto err; + } + if (ioreq->req.seg[i].first_sect > ioreq->req.seg[i].last_sect) { + xen_be_printf(&blkdev->xendev, 0, "error: first > last sector\n"); + goto err; + } + if (ioreq->req.seg[i].last_sect * BLOCK_SIZE >= XC_PAGE_SIZE) { + xen_be_printf(&blkdev->xendev, 0, "error: page crossing\n"); + goto err; + } + + ioreq->domids[i] = blkdev->xendev.dom; + ioreq->refs[i] = ioreq->req.seg[i].gref; + + mem = ioreq->req.seg[i].first_sect * blkdev->file_blk; + len = (ioreq->req.seg[i].last_sect - ioreq->req.seg[i].first_sect + 1) * blkdev->file_blk; qemu_iovec_add(&ioreq->v, (void*)mem, len); } if (ioreq->start + ioreq->v.size > blkdev->file_size) { - xen_be_printf(&blkdev->xendev, 0, "error: access beyond end of file\n"); - goto err; + xen_be_printf(&blkdev->xendev, 0, "error: access beyond end of file\n"); + goto err; } return 0; @@ -242,26 +245,31 @@ static void ioreq_unmap(struct ioreq *ioreq) int gnt = ioreq->blkdev->xendev.gnttabdev; int i; - if (ioreq->v.niov == 0) + if (ioreq->v.niov == 0) { return; + } if (batch_maps) { - if (!ioreq->pages) - return; - if (xc_gnttab_munmap(gnt, ioreq->pages, ioreq->v.niov) != 0) - xen_be_printf(&ioreq->blkdev->xendev, 0, "xc_gnttab_munmap failed: %s\n", - strerror(errno)); - ioreq->blkdev->cnt_map -= ioreq->v.niov; - ioreq->pages = NULL; + if (!ioreq->pages) { + return; + } + if (xc_gnttab_munmap(gnt, ioreq->pages, ioreq->v.niov) != 0) { + xen_be_printf(&ioreq->blkdev->xendev, 0, "xc_gnttab_munmap failed: %s\n", + strerror(errno)); + } + ioreq->blkdev->cnt_map -= ioreq->v.niov; + ioreq->pages = NULL; } else { - for (i = 0; i < ioreq->v.niov; i++) { - if (!ioreq->page[i]) - continue; - if (xc_gnttab_munmap(gnt, ioreq->page[i], 1) != 0) - xen_be_printf(&ioreq->blkdev->xendev, 0, "xc_gnttab_munmap failed: %s\n", - strerror(errno)); - ioreq->blkdev->cnt_map--; - ioreq->page[i] = NULL; - } + for (i = 0; i < ioreq->v.niov; i++) { + if (!ioreq->page[i]) { + continue; + } + if (xc_gnttab_munmap(gnt, ioreq->page[i], 1) != 0) { + xen_be_printf(&ioreq->blkdev->xendev, 0, "xc_gnttab_munmap failed: %s\n", + strerror(errno)); + } + ioreq->blkdev->cnt_map--; + ioreq->page[i] = NULL; + } } } @@ -270,35 +278,37 @@ static int ioreq_map(struct ioreq *ioreq) int gnt = ioreq->blkdev->xendev.gnttabdev; int i; - if (ioreq->v.niov == 0) + if (ioreq->v.niov == 0) { return 0; + } if (batch_maps) { - ioreq->pages = xc_gnttab_map_grant_refs - (gnt, ioreq->v.niov, ioreq->domids, ioreq->refs, ioreq->prot); - if (ioreq->pages == NULL) { - xen_be_printf(&ioreq->blkdev->xendev, 0, - "can''t map %d grant refs (%s, %d maps)\n", - ioreq->v.niov, strerror(errno), ioreq->blkdev->cnt_map); - return -1; - } - for (i = 0; i < ioreq->v.niov; i++) - ioreq->v.iov[i].iov_base = ioreq->pages + i * XC_PAGE_SIZE + - (uintptr_t)ioreq->v.iov[i].iov_base; - ioreq->blkdev->cnt_map += ioreq->v.niov; + ioreq->pages = xc_gnttab_map_grant_refs + (gnt, ioreq->v.niov, ioreq->domids, ioreq->refs, ioreq->prot); + if (ioreq->pages == NULL) { + xen_be_printf(&ioreq->blkdev->xendev, 0, + "can''t map %d grant refs (%s, %d maps)\n", + ioreq->v.niov, strerror(errno), ioreq->blkdev->cnt_map); + return -1; + } + for (i = 0; i < ioreq->v.niov; i++) { + ioreq->v.iov[i].iov_base = ioreq->pages + i * XC_PAGE_SIZE + + (uintptr_t)ioreq->v.iov[i].iov_base; + } + ioreq->blkdev->cnt_map += ioreq->v.niov; } else { - for (i = 0; i < ioreq->v.niov; i++) { - ioreq->page[i] = xc_gnttab_map_grant_ref - (gnt, ioreq->domids[i], ioreq->refs[i], ioreq->prot); - if (ioreq->page[i] == NULL) { - xen_be_printf(&ioreq->blkdev->xendev, 0, - "can''t map grant ref %d (%s, %d maps)\n", - ioreq->refs[i], strerror(errno), ioreq->blkdev->cnt_map); - ioreq_unmap(ioreq); - return -1; - } - ioreq->v.iov[i].iov_base = ioreq->page[i] + (uintptr_t)ioreq->v.iov[i].iov_base; - ioreq->blkdev->cnt_map++; - } + for (i = 0; i < ioreq->v.niov; i++) { + ioreq->page[i] = xc_gnttab_map_grant_ref + (gnt, ioreq->domids[i], ioreq->refs[i], ioreq->prot); + if (ioreq->page[i] == NULL) { + xen_be_printf(&ioreq->blkdev->xendev, 0, + "can''t map grant ref %d (%s, %d maps)\n", + ioreq->refs[i], strerror(errno), ioreq->blkdev->cnt_map); + ioreq_unmap(ioreq); + return -1; + } + ioreq->v.iov[i].iov_base = ioreq->page[i] + (uintptr_t)ioreq->v.iov[i].iov_base; + ioreq->blkdev->cnt_map++; + } } return 0; } @@ -309,54 +319,58 @@ static int ioreq_runio_qemu_sync(struct ioreq *ioreq) int i, rc, len = 0; off_t pos; - if (ioreq->req.nr_segments && ioreq_map(ioreq) == -1) - goto err; - if (ioreq->presync) - bdrv_flush(blkdev->bs); + if (ioreq->req.nr_segments && ioreq_map(ioreq) == -1) { + goto err; + } + if (ioreq->presync) { + bdrv_flush(blkdev->bs); + } switch (ioreq->req.operation) { case BLKIF_OP_READ: - pos = ioreq->start; - for (i = 0; i < ioreq->v.niov; i++) { - rc = bdrv_read(blkdev->bs, pos / BLOCK_SIZE, - ioreq->v.iov[i].iov_base, - ioreq->v.iov[i].iov_len / BLOCK_SIZE); - if (rc != 0) { - xen_be_printf(&blkdev->xendev, 0, "rd I/O error (%p, len %zd)\n", - ioreq->v.iov[i].iov_base, - ioreq->v.iov[i].iov_len); - goto err; - } - len += ioreq->v.iov[i].iov_len; - pos += ioreq->v.iov[i].iov_len; - } - break; + pos = ioreq->start; + for (i = 0; i < ioreq->v.niov; i++) { + rc = bdrv_read(blkdev->bs, pos / BLOCK_SIZE, + ioreq->v.iov[i].iov_base, + ioreq->v.iov[i].iov_len / BLOCK_SIZE); + if (rc != 0) { + xen_be_printf(&blkdev->xendev, 0, "rd I/O error (%p, len %zd)\n", + ioreq->v.iov[i].iov_base, + ioreq->v.iov[i].iov_len); + goto err; + } + len += ioreq->v.iov[i].iov_len; + pos += ioreq->v.iov[i].iov_len; + } + break; case BLKIF_OP_WRITE: case BLKIF_OP_WRITE_BARRIER: - if (!ioreq->req.nr_segments) + if (!ioreq->req.nr_segments) { break; - pos = ioreq->start; - for (i = 0; i < ioreq->v.niov; i++) { - rc = bdrv_write(blkdev->bs, pos / BLOCK_SIZE, - ioreq->v.iov[i].iov_base, - ioreq->v.iov[i].iov_len / BLOCK_SIZE); - if (rc != 0) { - xen_be_printf(&blkdev->xendev, 0, "wr I/O error (%p, len %zd)\n", - ioreq->v.iov[i].iov_base, - ioreq->v.iov[i].iov_len); - goto err; - } - len += ioreq->v.iov[i].iov_len; - pos += ioreq->v.iov[i].iov_len; - } - break; + } + pos = ioreq->start; + for (i = 0; i < ioreq->v.niov; i++) { + rc = bdrv_write(blkdev->bs, pos / BLOCK_SIZE, + ioreq->v.iov[i].iov_base, + ioreq->v.iov[i].iov_len / BLOCK_SIZE); + if (rc != 0) { + xen_be_printf(&blkdev->xendev, 0, "wr I/O error (%p, len %zd)\n", + ioreq->v.iov[i].iov_base, + ioreq->v.iov[i].iov_len); + goto err; + } + len += ioreq->v.iov[i].iov_len; + pos += ioreq->v.iov[i].iov_len; + } + break; default: - /* unknown operation (shouldn''t happen -- parse catches this) */ - goto err; + /* unknown operation (shouldn''t happen -- parse catches this) */ + goto err; } - if (ioreq->postsync) - bdrv_flush(blkdev->bs); + if (ioreq->postsync) { + bdrv_flush(blkdev->bs); + } ioreq->status = BLKIF_RSP_OKAY; ioreq_unmap(ioreq); @@ -379,8 +393,9 @@ static void qemu_aio_complete(void *opaque, int ret) } ioreq->aio_inflight--; - if (ioreq->aio_inflight > 0) + if (ioreq->aio_inflight > 0) { return; + } ioreq->status = ioreq->aio_errors ? BLKIF_RSP_ERROR : BLKIF_RSP_OKAY; ioreq_unmap(ioreq); @@ -392,12 +407,14 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq) { struct XenBlkDev *blkdev = ioreq->blkdev; - if (ioreq->req.nr_segments && ioreq_map(ioreq) == -1) - goto err; + if (ioreq->req.nr_segments && ioreq_map(ioreq) == -1) { + goto err; + } ioreq->aio_inflight++; - if (ioreq->presync) - bdrv_flush(blkdev->bs); /* FIXME: aio_flush() ??? */ + if (ioreq->presync) { + bdrv_flush(blkdev->bs); /* FIXME: aio_flush() ??? */ + } switch (ioreq->req.operation) { case BLKIF_OP_READ: @@ -405,23 +422,25 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq) bdrv_aio_readv(blkdev->bs, ioreq->start / BLOCK_SIZE, &ioreq->v, ioreq->v.size / BLOCK_SIZE, qemu_aio_complete, ioreq); - break; + break; case BLKIF_OP_WRITE: case BLKIF_OP_WRITE_BARRIER: ioreq->aio_inflight++; - if (!ioreq->req.nr_segments) + if (!ioreq->req.nr_segments) { break; + } bdrv_aio_writev(blkdev->bs, ioreq->start / BLOCK_SIZE, &ioreq->v, ioreq->v.size / BLOCK_SIZE, qemu_aio_complete, ioreq); - break; + break; default: - /* unknown operation (shouldn''t happen -- parse catches this) */ - goto err; + /* unknown operation (shouldn''t happen -- parse catches this) */ + goto err; } - if (ioreq->postsync) - bdrv_flush(blkdev->bs); /* FIXME: aio_flush() ??? */ + if (ioreq->postsync) { + bdrv_flush(blkdev->bs); /* FIXME: aio_flush() ??? */ + } qemu_aio_complete(ioreq, 0); return 0; @@ -446,36 +465,37 @@ static int blk_send_response_one(struct ioreq *ioreq) /* Place on the response ring for the relevant domain. */ switch (blkdev->protocol) { case BLKIF_PROTOCOL_NATIVE: - dst = RING_GET_RESPONSE(&blkdev->rings.native, blkdev->rings.native.rsp_prod_pvt); - break; + dst = RING_GET_RESPONSE(&blkdev->rings.native, blkdev->rings.native.rsp_prod_pvt); + break; case BLKIF_PROTOCOL_X86_32: dst = RING_GET_RESPONSE(&blkdev->rings.x86_32_part, blkdev->rings.x86_32_part.rsp_prod_pvt); - break; + break; case BLKIF_PROTOCOL_X86_64: dst = RING_GET_RESPONSE(&blkdev->rings.x86_64_part, blkdev->rings.x86_64_part.rsp_prod_pvt); - break; + break; default: - dst = NULL; + dst = NULL; } memcpy(dst, &resp, sizeof(resp)); blkdev->rings.common.rsp_prod_pvt++; RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&blkdev->rings.common, send_notify); if (blkdev->rings.common.rsp_prod_pvt == blkdev->rings.common.req_cons) { - /* - * Tail check for pending requests. Allows frontend to avoid - * notifications if requests are already in flight (lower - * overheads and promotes batching). - */ - RING_FINAL_CHECK_FOR_REQUESTS(&blkdev->rings.common, have_requests); + /* + * Tail check for pending requests. Allows frontend to avoid + * notifications if requests are already in flight (lower + * overheads and promotes batching). + */ + RING_FINAL_CHECK_FOR_REQUESTS(&blkdev->rings.common, have_requests); } else if (RING_HAS_UNCONSUMED_REQUESTS(&blkdev->rings.common)) { - have_requests = 1; + have_requests = 1; } - if (have_requests) - blkdev->more_work++; + if (have_requests) { + blkdev->more_work++; + } return send_notify; } @@ -487,28 +507,29 @@ static void blk_send_response_all(struct XenBlkDev *blkdev) while (!QLIST_EMPTY(&blkdev->finished)) { ioreq = QLIST_FIRST(&blkdev->finished); - send_notify += blk_send_response_one(ioreq); - ioreq_release(ioreq); + send_notify += blk_send_response_one(ioreq); + ioreq_release(ioreq); + } + if (send_notify) { + xen_be_send_notify(&blkdev->xendev); } - if (send_notify) - xen_be_send_notify(&blkdev->xendev); } static int blk_get_request(struct XenBlkDev *blkdev, struct ioreq *ioreq, RING_IDX rc) { switch (blkdev->protocol) { case BLKIF_PROTOCOL_NATIVE: - memcpy(&ioreq->req, RING_GET_REQUEST(&blkdev->rings.native, rc), - sizeof(ioreq->req)); - break; + memcpy(&ioreq->req, RING_GET_REQUEST(&blkdev->rings.native, rc), + sizeof(ioreq->req)); + break; case BLKIF_PROTOCOL_X86_32: blkif_get_x86_32_req(&ioreq->req, RING_GET_REQUEST(&blkdev->rings.x86_32_part, rc)); - break; + break; case BLKIF_PROTOCOL_X86_64: blkif_get_x86_64_req(&ioreq->req, RING_GET_REQUEST(&blkdev->rings.x86_64_part, rc)); - break; + break; } return 0; } @@ -524,12 +545,14 @@ static void blk_handle_requests(struct XenBlkDev *blkdev) rp = blkdev->rings.common.sring->req_prod; xen_rmb(); /* Ensure we see queued requests up to ''rp''. */ - if (use_aio) + if (use_aio) { blk_send_response_all(blkdev); + } while (rc != rp) { /* pull request from ring */ - if (RING_REQUEST_CONS_OVERFLOW(&blkdev->rings.common, rc)) + if (RING_REQUEST_CONS_OVERFLOW(&blkdev->rings.common, rc)) { break; + } ioreq = ioreq_start(blkdev); if (ioreq == NULL) { blkdev->more_work++; @@ -540,8 +563,9 @@ static void blk_handle_requests(struct XenBlkDev *blkdev) /* parse them */ if (ioreq_parse(ioreq) != 0) { - if (blk_send_response_one(ioreq)) + if (blk_send_response_one(ioreq)) { xen_be_send_notify(&blkdev->xendev); + } ioreq_release(ioreq); continue; } @@ -554,11 +578,13 @@ static void blk_handle_requests(struct XenBlkDev *blkdev) ioreq_runio_qemu_sync(ioreq); } } - if (!use_aio) + if (!use_aio) { blk_send_response_all(blkdev); + } - if (blkdev->more_work && blkdev->requests_inflight < max_requests) + if (blkdev->more_work && blkdev->requests_inflight < max_requests) { qemu_bh_schedule(blkdev->bh); + } } /* ------------------------------------------------------------- */ @@ -577,8 +603,9 @@ static void blk_alloc(struct XenDevice *xendev) QLIST_INIT(&blkdev->finished); QLIST_INIT(&blkdev->freelist); blkdev->bh = qemu_bh_new(blk_bh, blkdev); - if (xen_mode != XEN_EMULATE) + if (xen_mode != XEN_EMULATE) { batch_maps = 1; + } } static int blk_init(struct XenDevice *xendev) @@ -589,44 +616,50 @@ static int blk_init(struct XenDevice *xendev) /* read xenstore entries */ if (blkdev->params == NULL) { - blkdev->params = xenstore_read_be_str(&blkdev->xendev, "params"); + blkdev->params = xenstore_read_be_str(&blkdev->xendev, "params"); h = strchr(blkdev->params, '':''); - if (h != NULL) { - blkdev->fileproto = blkdev->params; - blkdev->filename = h+1; - *h = 0; - } else { - blkdev->fileproto = "<unset>"; - blkdev->filename = blkdev->params; - } - } - if (blkdev->mode == NULL) - blkdev->mode = xenstore_read_be_str(&blkdev->xendev, "mode"); - if (blkdev->type == NULL) - blkdev->type = xenstore_read_be_str(&blkdev->xendev, "type"); - if (blkdev->dev == NULL) - blkdev->dev = xenstore_read_be_str(&blkdev->xendev, "dev"); - if (blkdev->devtype == NULL) - blkdev->devtype = xenstore_read_be_str(&blkdev->xendev, "device-type"); + if (h != NULL) { + blkdev->fileproto = blkdev->params; + blkdev->filename = h+1; + *h = 0; + } else { + blkdev->fileproto = "<unset>"; + blkdev->filename = blkdev->params; + } + } + if (blkdev->mode == NULL) { + blkdev->mode = xenstore_read_be_str(&blkdev->xendev, "mode"); + } + if (blkdev->type == NULL) { + blkdev->type = xenstore_read_be_str(&blkdev->xendev, "type"); + } + if (blkdev->dev == NULL) { + blkdev->dev = xenstore_read_be_str(&blkdev->xendev, "dev"); + } + if (blkdev->devtype == NULL) { + blkdev->devtype = xenstore_read_be_str(&blkdev->xendev, "device-type"); + } /* do we have all we need? */ if (blkdev->params == NULL || - blkdev->mode == NULL || - blkdev->type == NULL || - blkdev->dev == NULL) - return -1; + blkdev->mode == NULL || + blkdev->type == NULL || + blkdev->dev == NULL) { + return -1; + } /* read-only ? */ if (strcmp(blkdev->mode, "w") == 0) { - qflags = BDRV_O_RDWR; + qflags = BDRV_O_RDWR; } else { - qflags = 0; - info |= VDISK_READONLY; + qflags = 0; + info |= VDISK_READONLY; } /* cdrom ? */ - if (blkdev->devtype && !strcmp(blkdev->devtype, "cdrom")) - info |= VDISK_CDROM; + if (blkdev->devtype && !strcmp(blkdev->devtype, "cdrom")) { + info |= VDISK_CDROM; + } /* init qemu block driver */ index = (blkdev->xendev.dev - 202 * 256) / 16; @@ -643,7 +676,7 @@ static int blk_init(struct XenDevice *xendev) } else { /* setup via qemu cmdline -> already setup for us */ xen_be_printf(&blkdev->xendev, 2, "get configured bdrv (cmdline setup)\n"); - blkdev->bs = blkdev->dinfo->bdrv; + blkdev->bs = blkdev->dinfo->bdrv; } blkdev->file_blk = BLOCK_SIZE; blkdev->file_size = bdrv_getlength(blkdev->bs); @@ -651,21 +684,21 @@ static int blk_init(struct XenDevice *xendev) xen_be_printf(&blkdev->xendev, 1, "bdrv_getlength: %d (%s) | drv %s\n", (int)blkdev->file_size, strerror(-blkdev->file_size), blkdev->bs->drv ? blkdev->bs->drv->format_name : "-"); - blkdev->file_size = 0; + blkdev->file_size = 0; } have_barriers = blkdev->bs->drv && blkdev->bs->drv->bdrv_flush ? 1 : 0; xen_be_printf(xendev, 1, "type \"%s\", fileproto \"%s\", filename \"%s\"," - " size %" PRId64 " (%" PRId64 " MB)\n", - blkdev->type, blkdev->fileproto, blkdev->filename, - blkdev->file_size, blkdev->file_size >> 20); + " size %" PRId64 " (%" PRId64 " MB)\n", + blkdev->type, blkdev->fileproto, blkdev->filename, + blkdev->file_size, blkdev->file_size >> 20); /* fill info */ xenstore_write_be_int(&blkdev->xendev, "feature-barrier", have_barriers); xenstore_write_be_int(&blkdev->xendev, "info", info); xenstore_write_be_int(&blkdev->xendev, "sector-size", blkdev->file_blk); xenstore_write_be_int(&blkdev->xendev, "sectors", - blkdev->file_size / blkdev->file_blk); + blkdev->file_size / blkdev->file_blk); return 0; } @@ -673,57 +706,62 @@ static int blk_connect(struct XenDevice *xendev) { struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); - if (xenstore_read_fe_int(&blkdev->xendev, "ring-ref", &blkdev->ring_ref) == -1) - return -1; + if (xenstore_read_fe_int(&blkdev->xendev, "ring-ref", &blkdev->ring_ref) == -1) { + return -1; + } if (xenstore_read_fe_int(&blkdev->xendev, "event-channel", - &blkdev->xendev.remote_port) == -1) - return -1; + &blkdev->xendev.remote_port) == -1) { + return -1; + } blkdev->protocol = BLKIF_PROTOCOL_NATIVE; if (blkdev->xendev.protocol) { - if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_32) == 0) + if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_32) == 0) { blkdev->protocol = BLKIF_PROTOCOL_X86_32; - if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_64) == 0) + } + if (strcmp(blkdev->xendev.protocol, XEN_IO_PROTO_ABI_X86_64) == 0) { blkdev->protocol = BLKIF_PROTOCOL_X86_64; + } } blkdev->sring = xc_gnttab_map_grant_ref(blkdev->xendev.gnttabdev, - blkdev->xendev.dom, - blkdev->ring_ref, - PROT_READ | PROT_WRITE); - if (!blkdev->sring) - return -1; + blkdev->xendev.dom, + blkdev->ring_ref, + PROT_READ | PROT_WRITE); + if (!blkdev->sring) { + return -1; + } blkdev->cnt_map++; switch (blkdev->protocol) { case BLKIF_PROTOCOL_NATIVE: { - blkif_sring_t *sring_native = blkdev->sring; - BACK_RING_INIT(&blkdev->rings.native, sring_native, XC_PAGE_SIZE); - break; + blkif_sring_t *sring_native = blkdev->sring; + BACK_RING_INIT(&blkdev->rings.native, sring_native, XC_PAGE_SIZE); + break; } case BLKIF_PROTOCOL_X86_32: { - blkif_x86_32_sring_t *sring_x86_32 = blkdev->sring; + blkif_x86_32_sring_t *sring_x86_32 = blkdev->sring; BACK_RING_INIT(&blkdev->rings.x86_32_part, sring_x86_32, XC_PAGE_SIZE); - break; + break; } case BLKIF_PROTOCOL_X86_64: { - blkif_x86_64_sring_t *sring_x86_64 = blkdev->sring; + blkif_x86_64_sring_t *sring_x86_64 = blkdev->sring; BACK_RING_INIT(&blkdev->rings.x86_64_part, sring_x86_64, XC_PAGE_SIZE); - break; + break; } } xen_be_bind_evtchn(&blkdev->xendev); xen_be_printf(&blkdev->xendev, 1, "ok: proto %s, ring-ref %d, " - "remote port %d, local port %d\n", - blkdev->xendev.protocol, blkdev->ring_ref, - blkdev->xendev.remote_port, blkdev->xendev.local_port); + "remote port %d, local port %d\n", + blkdev->xendev.protocol, blkdev->ring_ref, + blkdev->xendev.remote_port, blkdev->xendev.local_port); return 0; } @@ -737,14 +775,14 @@ static void blk_disconnect(struct XenDevice *xendev) bdrv_close(blkdev->bs); bdrv_delete(blkdev->bs); } - blkdev->bs = NULL; + blkdev->bs = NULL; } xen_be_unbind_evtchn(&blkdev->xendev); if (blkdev->sring) { - xc_gnttab_munmap(blkdev->xendev.gnttabdev, blkdev->sring, 1); - blkdev->cnt_map--; - blkdev->sring = NULL; + xc_gnttab_munmap(blkdev->xendev.gnttabdev, blkdev->sring, 1); + blkdev->cnt_map--; + blkdev->sring = NULL; } } @@ -754,10 +792,10 @@ static int blk_free(struct XenDevice *xendev) struct ioreq *ioreq; while (!QLIST_EMPTY(&blkdev->freelist)) { - ioreq = QLIST_FIRST(&blkdev->freelist); + ioreq = QLIST_FIRST(&blkdev->freelist); QLIST_REMOVE(ioreq, list); qemu_iovec_destroy(&ioreq->v); - qemu_free(ioreq); + qemu_free(ioreq); } qemu_free(blkdev->params); diff --git a/hw/xen_nic.c b/hw/xen_nic.c index 08055b8..ff86491 100644 --- a/hw/xen_nic.c +++ b/hw/xen_nic.c @@ -74,20 +74,23 @@ static void net_tx_response(struct XenNetDev *netdev, netif_tx_request_t *txp, i resp->status = st; #if 0 - if (txp->flags & NETTXF_extra_info) - RING_GET_RESPONSE(&netdev->tx_ring, ++i)->status = NETIF_RSP_NULL; + if (txp->flags & NETTXF_extra_info) { + RING_GET_RESPONSE(&netdev->tx_ring, ++i)->status = NETIF_RSP_NULL; + } #endif netdev->tx_ring.rsp_prod_pvt = ++i; RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netdev->tx_ring, notify); - if (notify) - xen_be_send_notify(&netdev->xendev); + if (notify) { + xen_be_send_notify(&netdev->xendev); + } if (i == netdev->tx_ring.req_cons) { - int more_to_do; - RING_FINAL_CHECK_FOR_REQUESTS(&netdev->tx_ring, more_to_do); - if (more_to_do) - netdev->tx_work++; + int more_to_do; + RING_FINAL_CHECK_FOR_REQUESTS(&netdev->tx_ring, more_to_do); + if (more_to_do) { + netdev->tx_work++; + } } } @@ -101,10 +104,11 @@ static void net_tx_error(struct XenNetDev *netdev, netif_tx_request_t *txp, RING RING_IDX cons = netdev->tx_ring.req_cons; do { - make_tx_response(netif, txp, NETIF_RSP_ERROR); - if (cons >= end) - break; - txp = RING_GET_REQUEST(&netdev->tx_ring, cons++); + make_tx_response(netif, txp, NETIF_RSP_ERROR); + if (cons >= end) { + break; + } + txp = RING_GET_REQUEST(&netdev->tx_ring, cons++); } while (1); netdev->tx_ring.req_cons = cons; netif_schedule_work(netif); @@ -122,75 +126,78 @@ static void net_tx_packets(struct XenNetDev *netdev) void *tmpbuf = NULL; for (;;) { - rc = netdev->tx_ring.req_cons; - rp = netdev->tx_ring.sring->req_prod; - xen_rmb(); /* Ensure we see queued requests up to ''rp''. */ + rc = netdev->tx_ring.req_cons; + rp = netdev->tx_ring.sring->req_prod; + xen_rmb(); /* Ensure we see queued requests up to ''rp''. */ - while ((rc != rp)) { - if (RING_REQUEST_CONS_OVERFLOW(&netdev->tx_ring, rc)) - break; - memcpy(&txreq, RING_GET_REQUEST(&netdev->tx_ring, rc), sizeof(txreq)); - netdev->tx_ring.req_cons = ++rc; + while ((rc != rp)) { + if (RING_REQUEST_CONS_OVERFLOW(&netdev->tx_ring, rc)) { + break; + } + memcpy(&txreq, RING_GET_REQUEST(&netdev->tx_ring, rc), sizeof(txreq)); + netdev->tx_ring.req_cons = ++rc; #if 1 - /* should not happen in theory, we don''t announce the * - * feature-{sg,gso,whatelse} flags in xenstore (yet?) */ - if (txreq.flags & NETTXF_extra_info) { - xen_be_printf(&netdev->xendev, 0, "FIXME: extra info flag\n"); - net_tx_error(netdev, &txreq, rc); - continue; - } - if (txreq.flags & NETTXF_more_data) { - xen_be_printf(&netdev->xendev, 0, "FIXME: more data flag\n"); - net_tx_error(netdev, &txreq, rc); - continue; - } + /* should not happen in theory, we don''t announce the * + * feature-{sg,gso,whatelse} flags in xenstore (yet?) */ + if (txreq.flags & NETTXF_extra_info) { + xen_be_printf(&netdev->xendev, 0, "FIXME: extra info flag\n"); + net_tx_error(netdev, &txreq, rc); + continue; + } + if (txreq.flags & NETTXF_more_data) { + xen_be_printf(&netdev->xendev, 0, "FIXME: more data flag\n"); + net_tx_error(netdev, &txreq, rc); + continue; + } #endif - if (txreq.size < 14) { - xen_be_printf(&netdev->xendev, 0, "bad packet size: %d\n", txreq.size); - net_tx_error(netdev, &txreq, rc); - continue; - } - - if ((txreq.offset + txreq.size) > XC_PAGE_SIZE) { - xen_be_printf(&netdev->xendev, 0, "error: page crossing\n"); - net_tx_error(netdev, &txreq, rc); - continue; - } - - xen_be_printf(&netdev->xendev, 3, "tx packet ref %d, off %d, len %d, flags 0x%x%s%s%s%s\n", - txreq.gref, txreq.offset, txreq.size, txreq.flags, - (txreq.flags & NETTXF_csum_blank) ? " csum_blank" : "", - (txreq.flags & NETTXF_data_validated) ? " data_validated" : "", - (txreq.flags & NETTXF_more_data) ? " more_data" : "", - (txreq.flags & NETTXF_extra_info) ? " extra_info" : ""); - - page = xc_gnttab_map_grant_ref(netdev->xendev.gnttabdev, - netdev->xendev.dom, - txreq.gref, PROT_READ); - if (page == NULL) { - xen_be_printf(&netdev->xendev, 0, "error: tx gref dereference failed (%d)\n", + if (txreq.size < 14) { + xen_be_printf(&netdev->xendev, 0, "bad packet size: %d\n", txreq.size); + net_tx_error(netdev, &txreq, rc); + continue; + } + + if ((txreq.offset + txreq.size) > XC_PAGE_SIZE) { + xen_be_printf(&netdev->xendev, 0, "error: page crossing\n"); + net_tx_error(netdev, &txreq, rc); + continue; + } + + xen_be_printf(&netdev->xendev, 3, "tx packet ref %d, off %d, len %d, flags 0x%x%s%s%s%s\n", + txreq.gref, txreq.offset, txreq.size, txreq.flags, + (txreq.flags & NETTXF_csum_blank) ? " csum_blank" : "", + (txreq.flags & NETTXF_data_validated) ? " data_validated" : "", + (txreq.flags & NETTXF_more_data) ? " more_data" : "", + (txreq.flags & NETTXF_extra_info) ? " extra_info" : ""); + + page = xc_gnttab_map_grant_ref(netdev->xendev.gnttabdev, + netdev->xendev.dom, + txreq.gref, PROT_READ); + if (page == NULL) { + xen_be_printf(&netdev->xendev, 0, "error: tx gref dereference failed (%d)\n", txreq.gref); - net_tx_error(netdev, &txreq, rc); - continue; - } - if (txreq.flags & NETTXF_csum_blank) { + net_tx_error(netdev, &txreq, rc); + continue; + } + if (txreq.flags & NETTXF_csum_blank) { /* have read-only mapping -> can''t fill checksum in-place */ - if (!tmpbuf) + if (!tmpbuf) { tmpbuf = qemu_malloc(XC_PAGE_SIZE); + } memcpy(tmpbuf, page + txreq.offset, txreq.size); - net_checksum_calculate(tmpbuf, txreq.size); + net_checksum_calculate(tmpbuf, txreq.size); qemu_send_packet(&netdev->nic->nc, tmpbuf, txreq.size); } else { qemu_send_packet(&netdev->nic->nc, page + txreq.offset, txreq.size); } - xc_gnttab_munmap(netdev->xendev.gnttabdev, page, 1); - net_tx_response(netdev, &txreq, NETIF_RSP_OKAY); - } - if (!netdev->tx_work) - break; - netdev->tx_work = 0; + xc_gnttab_munmap(netdev->xendev.gnttabdev, page, 1); + net_tx_response(netdev, &txreq, NETIF_RSP_OKAY); + } + if (!netdev->tx_work) { + break; + } + netdev->tx_work = 0; } qemu_free(tmpbuf); } @@ -198,9 +205,9 @@ static void net_tx_packets(struct XenNetDev *netdev) /* ------------------------------------------------------------- */ static void net_rx_response(struct XenNetDev *netdev, - netif_rx_request_t *req, int8_t st, - uint16_t offset, uint16_t size, - uint16_t flags) + netif_rx_request_t *req, int8_t st, + uint16_t offset, uint16_t size, + uint16_t flags) { RING_IDX i = netdev->rx_ring.rsp_prod_pvt; netif_rx_response_t *resp; @@ -211,16 +218,18 @@ static void net_rx_response(struct XenNetDev *netdev, resp->flags = flags; resp->id = req->id; resp->status = (int16_t)size; - if (st < 0) - resp->status = (int16_t)st; + if (st < 0) { + resp->status = (int16_t)st; + } xen_be_printf(&netdev->xendev, 3, "rx response: idx %d, status %d, flags 0x%x\n", - i, resp->status, resp->flags); + i, resp->status, resp->flags); netdev->rx_ring.rsp_prod_pvt = ++i; RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netdev->rx_ring, notify); - if (notify) - xen_be_send_notify(&netdev->xendev); + if (notify) { + xen_be_send_notify(&netdev->xendev); + } } #define NET_IP_ALIGN 2 @@ -230,17 +239,18 @@ static int net_rx_ok(VLANClientState *nc) struct XenNetDev *netdev = DO_UPCAST(NICState, nc, nc)->opaque; RING_IDX rc, rp; - if (netdev->xendev.be_state != XenbusStateConnected) - return 0; + if (netdev->xendev.be_state != XenbusStateConnected) { + return 0; + } rc = netdev->rx_ring.req_cons; rp = netdev->rx_ring.sring->req_prod; xen_rmb(); if (rc == rp || RING_REQUEST_CONS_OVERFLOW(&netdev->rx_ring, rc)) { - xen_be_printf(&netdev->xendev, 2, "%s: no rx buffers (%d/%d)\n", - __FUNCTION__, rc, rp); - return 0; + xen_be_printf(&netdev->xendev, 2, "%s: no rx buffers (%d/%d)\n", + __FUNCTION__, rc, rp); + return 0; } return 1; } @@ -252,34 +262,35 @@ static ssize_t net_rx_packet(VLANClientState *nc, const uint8_t *buf, size_t siz RING_IDX rc, rp; void *page; - if (netdev->xendev.be_state != XenbusStateConnected) - return -1; + if (netdev->xendev.be_state != XenbusStateConnected) { + return -1; + } rc = netdev->rx_ring.req_cons; rp = netdev->rx_ring.sring->req_prod; xen_rmb(); /* Ensure we see queued requests up to ''rp''. */ if (rc == rp || RING_REQUEST_CONS_OVERFLOW(&netdev->rx_ring, rc)) { - xen_be_printf(&netdev->xendev, 2, "no buffer, drop packet\n"); - return -1; + xen_be_printf(&netdev->xendev, 2, "no buffer, drop packet\n"); + return -1; } if (size > XC_PAGE_SIZE - NET_IP_ALIGN) { - xen_be_printf(&netdev->xendev, 0, "packet too big (%lu > %ld)", - (unsigned long)size, XC_PAGE_SIZE - NET_IP_ALIGN); - return -1; + xen_be_printf(&netdev->xendev, 0, "packet too big (%lu > %ld)", + (unsigned long)size, XC_PAGE_SIZE - NET_IP_ALIGN); + return -1; } memcpy(&rxreq, RING_GET_REQUEST(&netdev->rx_ring, rc), sizeof(rxreq)); netdev->rx_ring.req_cons = ++rc; page = xc_gnttab_map_grant_ref(netdev->xendev.gnttabdev, - netdev->xendev.dom, - rxreq.gref, PROT_WRITE); + netdev->xendev.dom, + rxreq.gref, PROT_WRITE); if (page == NULL) { - xen_be_printf(&netdev->xendev, 0, "error: rx gref dereference failed (%d)\n", + xen_be_printf(&netdev->xendev, 0, "error: rx gref dereference failed (%d)\n", rxreq.gref); - net_rx_response(netdev, &rxreq, NETIF_RSP_ERROR, 0, 0, 0); - return -1; + net_rx_response(netdev, &rxreq, NETIF_RSP_ERROR, 0, 0, 0); + return -1; } memcpy(page + NET_IP_ALIGN, buf, size); xc_gnttab_munmap(netdev->xendev.gnttabdev, page, 1); @@ -302,15 +313,18 @@ static int net_init(struct XenDevice *xendev) struct XenNetDev *netdev = container_of(xendev, struct XenNetDev, xendev); /* read xenstore entries */ - if (netdev->mac == NULL) - netdev->mac = xenstore_read_be_str(&netdev->xendev, "mac"); + if (netdev->mac == NULL) { + netdev->mac = xenstore_read_be_str(&netdev->xendev, "mac"); + } /* do we have all we need? */ - if (netdev->mac == NULL) - return -1; + if (netdev->mac == NULL) { + return -1; + } - if (net_parse_macaddr(netdev->conf.macaddr.a, netdev->mac) < 0) + if (net_parse_macaddr(netdev->conf.macaddr.a, netdev->mac) < 0) { return -1; + } netdev->conf.vlan = qemu_find_vlan(netdev->xendev.dev, 1); netdev->conf.peer = NULL; @@ -334,41 +348,46 @@ static int net_connect(struct XenDevice *xendev) int rx_copy; if (xenstore_read_fe_int(&netdev->xendev, "tx-ring-ref", - &netdev->tx_ring_ref) == -1) - return -1; + &netdev->tx_ring_ref) == -1) { + return -1; + } if (xenstore_read_fe_int(&netdev->xendev, "rx-ring-ref", - &netdev->rx_ring_ref) == -1) - return 1; + &netdev->rx_ring_ref) == -1) { + return 1; + } if (xenstore_read_fe_int(&netdev->xendev, "event-channel", - &netdev->xendev.remote_port) == -1) - return -1; + &netdev->xendev.remote_port) == -1) { + return -1; + } - if (xenstore_read_fe_int(&netdev->xendev, "request-rx-copy", &rx_copy) == -1) - rx_copy = 0; + if (xenstore_read_fe_int(&netdev->xendev, "request-rx-copy", &rx_copy) == -1) { + rx_copy = 0; + } if (rx_copy == 0) { - xen_be_printf(&netdev->xendev, 0, "frontend doesn''t support rx-copy.\n"); - return -1; + xen_be_printf(&netdev->xendev, 0, "frontend doesn''t support rx-copy.\n"); + return -1; } netdev->txs = xc_gnttab_map_grant_ref(netdev->xendev.gnttabdev, - netdev->xendev.dom, - netdev->tx_ring_ref, - PROT_READ | PROT_WRITE); + netdev->xendev.dom, + netdev->tx_ring_ref, + PROT_READ | PROT_WRITE); netdev->rxs = xc_gnttab_map_grant_ref(netdev->xendev.gnttabdev, - netdev->xendev.dom, - netdev->rx_ring_ref, - PROT_READ | PROT_WRITE); - if (!netdev->txs || !netdev->rxs) - return -1; + netdev->xendev.dom, + netdev->rx_ring_ref, + PROT_READ | PROT_WRITE); + if (!netdev->txs || !netdev->rxs) { + return -1; + } BACK_RING_INIT(&netdev->tx_ring, netdev->txs, XC_PAGE_SIZE); BACK_RING_INIT(&netdev->rx_ring, netdev->rxs, XC_PAGE_SIZE); xen_be_bind_evtchn(&netdev->xendev); xen_be_printf(&netdev->xendev, 1, "ok: tx-ring-ref %d, rx-ring-ref %d, " - "remote port %d, local port %d\n", - netdev->tx_ring_ref, netdev->rx_ring_ref, - netdev->xendev.remote_port, netdev->xendev.local_port); + "remote port %d, local port %d\n", + netdev->tx_ring_ref, netdev->rx_ring_ref, + netdev->xendev.remote_port, netdev->xendev.local_port); net_tx_packets(netdev); return 0; @@ -381,12 +400,12 @@ static void net_disconnect(struct XenDevice *xendev) xen_be_unbind_evtchn(&netdev->xendev); if (netdev->txs) { - xc_gnttab_munmap(netdev->xendev.gnttabdev, netdev->txs, 1); - netdev->txs = NULL; + xc_gnttab_munmap(netdev->xendev.gnttabdev, netdev->txs, 1); + netdev->txs = NULL; } if (netdev->rxs) { - xc_gnttab_munmap(netdev->xendev.gnttabdev, netdev->rxs, 1); - netdev->rxs = NULL; + xc_gnttab_munmap(netdev->xendev.gnttabdev, netdev->rxs, 1); + netdev->rxs = NULL; } if (netdev->nic) { qemu_del_vlan_client(&netdev->nic->nc); -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 02/15] xen: Make Xen build once.
From: Anthony PERARD <anthony.perard@citrix.com> xen_domainbuild is now build in libhw. And xen_machine_pv is build only for i386 targets. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> --- Makefile.objs | 3 +++ Makefile.target | 2 +- hw/xen_domainbuild.c | 10 +++++----- hw/xen_domainbuild.h | 5 +++-- hw/xen_machine_pv.c | 2 +- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Makefile.objs b/Makefile.objs index 9e98a66..8034115 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -269,6 +269,9 @@ hw-obj-$(CONFIG_DP8393X) += dp8393x.o hw-obj-$(CONFIG_DS1225Y) += ds1225y.o hw-obj-$(CONFIG_MIPSNET) += mipsnet.o +# Xen +hw-obj-$(CONFIG_XEN) += xen_domainbuild.o + # Sound sound-obj-y sound-obj-$(CONFIG_SB16) += sb16.o diff --git a/Makefile.target b/Makefile.target index 220589e..ab0a570 100644 --- a/Makefile.target +++ b/Makefile.target @@ -206,7 +206,7 @@ QEMU_CFLAGS += $(VNC_JPEG_CFLAGS) QEMU_CFLAGS += $(VNC_PNG_CFLAGS) # xen backend driver support -obj-$(CONFIG_XEN) += xen_machine_pv.o xen_domainbuild.o +obj-i386-$(CONFIG_XEN) += xen_machine_pv.o # Inter-VM PCI shared memory obj-$(CONFIG_KVM) += ivshmem.o diff --git a/hw/xen_domainbuild.c b/hw/xen_domainbuild.c index 7f1fd66..b73d47f 100644 --- a/hw/xen_domainbuild.c +++ b/hw/xen_domainbuild.c @@ -1,9 +1,9 @@ #include <signal.h> -#include "xen_backend.h" -#include "xen_domainbuild.h" #include "sysemu.h" #include "qemu-timer.h" #include "qemu-log.h" +#include "xen_backend.h" +#include "xen_domainbuild.h" #include <xenguest.h> @@ -49,7 +49,7 @@ static int xenstore_domain_mkdir(char *path) } int xenstore_domain_init1(const char *kernel, const char *ramdisk, - const char *cmdline) + const char *cmdline, ram_addr_t ram_size) { char *dom, uuid_string[42], vm[256], path[256]; int i; @@ -225,7 +225,7 @@ static void xen_domain_cleanup(void) } int xen_domain_build_pv(const char *kernel, const char *ramdisk, - const char *cmdline) + const char *cmdline, ram_addr_t ram_size) { uint32_t ssidref = 0; uint32_t flags = 0; @@ -246,7 +246,7 @@ int xen_domain_build_pv(const char *kernel, const char *ramdisk, goto err; } - xenstore_domain_init1(kernel, ramdisk, cmdline); + xenstore_domain_init1(kernel, ramdisk, cmdline, ram_size); rc = xc_domain_max_vcpus(xen_xc, xen_domid, smp_cpus); if (rc < 0) { diff --git a/hw/xen_domainbuild.h b/hw/xen_domainbuild.h index dea0121..49683f8 100644 --- a/hw/xen_domainbuild.h +++ b/hw/xen_domainbuild.h @@ -1,13 +1,14 @@ #ifndef QEMU_HW_XEN_DOMAINBUILD_H #define QEMU_HW_XEN_DOMAINBUILD_H 1 +#include "cpu-common.h" #include "xen_common.h" int xenstore_domain_init1(const char *kernel, const char *ramdisk, - const char *cmdline); + const char *cmdline, ram_addr_t ram_size); int xenstore_domain_init2(int xenstore_port, int xenstore_mfn, int console_port, int console_mfn); int xen_domain_build_pv(const char *kernel, const char *ramdisk, - const char *cmdline); + const char *cmdline, ram_addr_t ram_size); #endif /* QEMU_HW_XEN_DOMAINBUILD_H */ diff --git a/hw/xen_machine_pv.c b/hw/xen_machine_pv.c index 77a34bf..d0e6e8f 100644 --- a/hw/xen_machine_pv.c +++ b/hw/xen_machine_pv.c @@ -64,7 +64,7 @@ static void xen_init_pv(ram_addr_t ram_size, break; case XEN_CREATE: if (xen_domain_build_pv(kernel_filename, initrd_filename, - kernel_cmdline) < 0) { + kernel_cmdline, ram_size) < 0) { fprintf(stderr, "xen pv domain creation failed\n"); exit(1); } -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 03/15] xen: Support new libxc calls from xen unstable.
From: Anthony PERARD <anthony.perard@citrix.com> This patch updates the libxenctrl calls in Qemu to use the new interface, otherwise Qemu wouldn''t be able to build against new versions of the library. We check libxenctrl version in configure, from Xen 3.3.0 to Xen unstable. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Alexander Graf <agraf@suse.de> --- configure | 67 ++++++++++++++++++++++++++++++++++++++++++++++++- hw/xen_backend.c | 21 ++++++++------- hw/xen_backend.h | 6 ++-- hw/xen_common.h | 64 +++++++++++++++++++++++++++++++++++++---------- hw/xen_disk.c | 4 +- hw/xen_domainbuild.c | 3 +- 6 files changed, 133 insertions(+), 32 deletions(-) diff --git a/configure b/configure index 3036faf..a84d974 100755 --- a/configure +++ b/configure @@ -126,6 +126,7 @@ vnc_jpeg="" vnc_png="" vnc_thread="no" xen="" +xen_ctrl_version="" linux_aio="" attr="" vhost_net="" @@ -1147,20 +1148,81 @@ fi if test "$xen" != "no" ; then xen_libs="-lxenstore -lxenctrl -lxenguest" + + # Xen unstable cat > $TMPC <<EOF #include <xenctrl.h> #include <xs.h> -int main(void) { xs_daemon_open(); xc_interface_open(); return 0; } +#include <stdint.h> +#include <xen/hvm/hvm_info_table.h> +#if !defined(HVM_MAX_VCPUS) +# error HVM_MAX_VCPUS not defined +#endif +int main(void) { + xc_interface *xc; + xs_daemon_open(); + xc = xc_interface_open(0, 0, 0); + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); + xc_gnttab_open(NULL, 0); + return 0; +} EOF if compile_prog "" "$xen_libs" ; then + xen_ctrl_version=410 xen=yes - libs_softmmu="$xen_libs $libs_softmmu" + + # Xen 4.0.0 + elif ( + cat > $TMPC <<EOF +#include <xenctrl.h> +#include <xs.h> +#include <stdint.h> +#include <xen/hvm/hvm_info_table.h> +#if !defined(HVM_MAX_VCPUS) +# error HVM_MAX_VCPUS not defined +#endif +int main(void) { + xs_daemon_open(); + xc_interface_open(); + xc_gnttab_open(); + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); + return 0; +} +EOF + compile_prog "" "$xen_libs" + ) ; then + xen_ctrl_version=400 + xen=yes + + # Xen 3.3.0, 3.4.0 + elif ( + cat > $TMPC <<EOF +#include <xenctrl.h> +#include <xs.h> +int main(void) { + xs_daemon_open(); + xc_interface_open(); + xc_gnttab_open(); + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); + return 0; +} +EOF + compile_prog "" "$xen_libs" + ) ; then + xen_ctrl_version=330 + xen=yes + + # Xen not found or unsupported else if test "$xen" = "yes" ; then feature_not_found "xen" fi xen=no fi + + if test "$xen" = yes; then + libs_softmmu="$xen_libs $libs_softmmu" + fi fi ########################################## @@ -2755,6 +2817,7 @@ if test "$bluez" = "yes" ; then fi if test "$xen" = "yes" ; then echo "CONFIG_XEN=y" >> $config_host_mak + echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak fi if test "$io_thread" = "yes" ; then echo "CONFIG_IOTHREAD=y" >> $config_host_mak diff --git a/hw/xen_backend.c b/hw/xen_backend.c index 9f4ec4b..3907b83 100644 --- a/hw/xen_backend.c +++ b/hw/xen_backend.c @@ -43,7 +43,8 @@ /* ------------------------------------------------------------- */ /* public */ -int xen_xc; +XenXC xen_xc = XC_HANDLER_INITIAL_VALUE; +XenGnttab xen_xcg = XC_HANDLER_INITIAL_VALUE; struct xs_handle *xenstore = NULL; const char *xen_protocol; @@ -214,8 +215,8 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, xendev->debug = debug; xendev->local_port = -1; - xendev->evtchndev = xc_evtchn_open(); - if (xendev->evtchndev < 0) { + xendev->evtchndev = xc_evtchn_open(NULL, 0); + if (xendev->evtchndev == XC_HANDLER_INITIAL_VALUE) { xen_be_printf(NULL, 0, "can''t open evtchn device\n"); qemu_free(xendev); return NULL; @@ -223,15 +224,15 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, fcntl(xc_evtchn_fd(xendev->evtchndev), F_SETFD, FD_CLOEXEC); if (ops->flags & DEVOPS_FLAG_NEED_GNTDEV) { - xendev->gnttabdev = xc_gnttab_open(); - if (xendev->gnttabdev < 0) { + xendev->gnttabdev = xc_gnttab_open(NULL, 0); + if (xendev->gnttabdev == XC_HANDLER_INITIAL_VALUE) { xen_be_printf(NULL, 0, "can''t open gnttab device\n"); xc_evtchn_close(xendev->evtchndev); qemu_free(xendev); return NULL; } } else { - xendev->gnttabdev = -1; + xendev->gnttabdev = XC_HANDLER_INITIAL_VALUE; } QTAILQ_INSERT_TAIL(&xendevs, xendev, next); @@ -277,10 +278,10 @@ static struct XenDevice *xen_be_del_xendev(int dom, int dev) qemu_free(xendev->fe); } - if (xendev->evtchndev >= 0) { + if (xendev->evtchndev != XC_HANDLER_INITIAL_VALUE) { xc_evtchn_close(xendev->evtchndev); } - if (xendev->gnttabdev >= 0) { + if (xendev->gnttabdev != XC_HANDLER_INITIAL_VALUE) { xc_gnttab_close(xendev->gnttabdev); } @@ -664,8 +665,8 @@ int xen_be_init(void) goto err; } - xen_xc = xc_interface_open(); - if (xen_xc == -1) { + xen_xc = xc_interface_open(0, 0, 0); + if (xen_xc == XC_HANDLER_INITIAL_VALUE) { xen_be_printf(NULL, 0, "can''t open xen interface\n"); goto err; } diff --git a/hw/xen_backend.h b/hw/xen_backend.h index 1b428e3..6401c85 100644 --- a/hw/xen_backend.h +++ b/hw/xen_backend.h @@ -45,8 +45,8 @@ struct XenDevice { int remote_port; int local_port; - int evtchndev; - int gnttabdev; + XenEvtchn evtchndev; + XenGnttab gnttabdev; struct XenDevOps *ops; QTAILQ_ENTRY(XenDevice) next; @@ -55,7 +55,7 @@ struct XenDevice { /* ------------------------------------------------------------- */ /* variables */ -extern int xen_xc; +extern XenXC xen_xc; extern struct xs_handle *xenstore; extern const char *xen_protocol; diff --git a/hw/xen_common.h b/hw/xen_common.h index 8a55b44..7e123ec 100644 --- a/hw/xen_common.h +++ b/hw/xen_common.h @@ -1,6 +1,8 @@ #ifndef QEMU_HW_XEN_COMMON_H #define QEMU_HW_XEN_COMMON_H 1 +#include "config-host.h" + #include <stddef.h> #include <inttypes.h> @@ -13,22 +15,56 @@ #include "qemu-queue.h" /* - * tweaks needed to build with different xen versions - * 0x00030205 -> 3.1.0 - * 0x00030207 -> 3.2.0 - * 0x00030208 -> unstable + * We don''t support Xen prior to 3.3.0. */ -#include <xen/xen-compat.h> -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030205 -# define evtchn_port_or_error_t int -#endif -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030207 -# define xc_map_foreign_pages xc_map_foreign_batch + +/* Xen before 4.0 */ +#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 400 +static inline void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot, + xen_pfn_t *arr, int *err, + unsigned int num) +{ + return xc_map_foreign_batch(xc_handle, dom, prot, arr, num); +} #endif -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030208 -# define xen_mb() mb() -# define xen_rmb() rmb() -# define xen_wmb() wmb() + + +/* Xen before 4.1 */ +#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 410 + +typedef int XenXC; +typedef int XenEvtchn; +typedef int XenGnttab; + +# define XC_INTERFACE_FMT "%i" +# define XC_HANDLER_INITIAL_VALUE -1 + +# define xc_interface_open(logger, dombuild_logger, open_flags) \ + xc_interface_open() +# define xc_evtchn_open(logger, open_flags) xc_evtchn_open() +# define xc_gnttab_open(logger, open_flags) xc_gnttab_open() + +static inline int xc_fd(int xen_xc) +{ + return xen_xc; +} + + +/* Xen 4.1 */ +#else + +typedef xc_interface *XenXC; +typedef xc_evtchn *XenEvtchn; +typedef xc_gnttab *XenGnttab; + +# define XC_INTERFACE_FMT "%p" +# define XC_HANDLER_INITIAL_VALUE NULL + +/* FIXME There is now way to have the xen fd */ +static inline int xc_fd(xc_interface *xen_xc) +{ + return -1; +} #endif #endif /* QEMU_HW_XEN_COMMON_H */ diff --git a/hw/xen_disk.c b/hw/xen_disk.c index 403c55f..07b8ec4 100644 --- a/hw/xen_disk.c +++ b/hw/xen_disk.c @@ -242,7 +242,7 @@ err: static void ioreq_unmap(struct ioreq *ioreq) { - int gnt = ioreq->blkdev->xendev.gnttabdev; + XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev; int i; if (ioreq->v.niov == 0) { @@ -275,7 +275,7 @@ static void ioreq_unmap(struct ioreq *ioreq) static int ioreq_map(struct ioreq *ioreq) { - int gnt = ioreq->blkdev->xendev.gnttabdev; + XenGnttab gnt = ioreq->blkdev->xendev.gnttabdev; int i; if (ioreq->v.niov == 0) { diff --git a/hw/xen_domainbuild.c b/hw/xen_domainbuild.c index b73d47f..57fb4f0 100644 --- a/hw/xen_domainbuild.c +++ b/hw/xen_domainbuild.c @@ -176,8 +176,9 @@ static int xen_domain_watcher(void) for (i = 3; i < n; i++) { if (i == fd[0]) continue; - if (i == xen_xc) + if (i == xc_fd(xen_xc)) { continue; + } close(i); } -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 04/15] xen: Add initialisation of Xen
From: Anthony PERARD <anthony.perard@citrix.com> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Acked-by: Alexander Graf <agraf@suse.de> --- Makefile.target | 9 +++++++++ hw/xen.h | 13 +++++++++++++ vl.c | 2 ++ xen-all.c | 23 +++++++++++++++++++++++ xen-stub.c | 15 +++++++++++++++ 5 files changed, 62 insertions(+), 0 deletions(-) create mode 100644 xen-all.c create mode 100644 xen-stub.c diff --git a/Makefile.target b/Makefile.target index ab0a570..b08c7f7 100644 --- a/Makefile.target +++ b/Makefile.target @@ -208,6 +208,15 @@ QEMU_CFLAGS += $(VNC_PNG_CFLAGS) # xen backend driver support obj-i386-$(CONFIG_XEN) += xen_machine_pv.o +ifeq ($(TARGET_ARCH), i386) +CONFIG_NO_XEN = $(if $(subst n,,$(CONFIG_XEN)),n,y) +else +CONFIG_NO_XEN = y +endif +# xen support +obj-i386-$(CONFIG_XEN) += xen-all.o +obj-$(CONFIG_NO_XEN) += xen-stub.o + # Inter-VM PCI shared memory obj-$(CONFIG_KVM) += ivshmem.o diff --git a/hw/xen.h b/hw/xen.h index 780dcf7..1fefe3a 100644 --- a/hw/xen.h +++ b/hw/xen.h @@ -18,4 +18,17 @@ enum xen_mode { extern uint32_t xen_domid; extern enum xen_mode xen_mode; +extern int xen_allowed; + +static inline int xen_enabled(void) +{ +#ifdef CONFIG_XEN + return xen_allowed; +#else + return 0; +#endif +} + +int xen_init(void); + #endif /* QEMU_HW_XEN_H */ diff --git a/vl.c b/vl.c index 0030741..910b000 100644 --- a/vl.c +++ b/vl.c @@ -259,6 +259,7 @@ static NotifierList machine_init_done_notifiers static int tcg_allowed = 1; int kvm_allowed = 0; +int xen_allowed = 0; uint32_t xen_domid; enum xen_mode xen_mode = XEN_EMULATE; @@ -1866,6 +1867,7 @@ static struct { int *allowed; } accel_list[] = { { "tcg", "tcg", tcg_available, tcg_init, &tcg_allowed }, + { "xen", "Xen", xen_available, xen_init, &xen_allowed }, { "kvm", "KVM", kvm_available, kvm_init, &kvm_allowed }, }; diff --git a/xen-all.c b/xen-all.c new file mode 100644 index 0000000..888fb1d --- /dev/null +++ b/xen-all.c @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2010 Citrix Ltd. + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + */ + +#include "hw/xen_common.h" +#include "hw/xen_backend.h" + +/* Initialise Xen */ + +int xen_init(void) +{ + xen_xc = xc_interface_open(0, 0, 0); + if (xen_xc == XC_HANDLER_INITIAL_VALUE) { + xen_be_printf(NULL, 0, "can''t open xen interface\n"); + return -1; + } + + return 0; +} diff --git a/xen-stub.c b/xen-stub.c new file mode 100644 index 0000000..beb982f --- /dev/null +++ b/xen-stub.c @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2010 Citrix Ltd. + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + */ + +#include "qemu-common.h" +#include "hw/xen.h" + +int xen_init(void) +{ + return -ENOSYS; +} -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 05/15] xen: Add xenfv machine
From: Anthony PERARD <anthony.perard@citrix.com> Introduce the Xen FV (Fully Virtualized) machine to Qemu, some more Xen specific call will be added in further patches. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> --- hw/pc.c | 19 +++++++++++++++++-- hw/pc_piix.c | 17 +++++++++++++++++ hw/xen.h | 4 ++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index 5966bf1..6a73407 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -41,6 +41,7 @@ #include "sysemu.h" #include "blockdev.h" #include "ui/qemu-spice.h" +#include "xen.h" /* output Bochs bios info messages */ //#define DEBUG_BIOS @@ -918,7 +919,11 @@ static void pc_cpu_reset(void *opaque) CPUState *env = opaque; cpu_reset(env); - env->halted = !cpu_is_bsp(env); + if (!xen_enabled()) { + env->halted = !cpu_is_bsp(env); + } else { + env->halted = 1; + } } static CPUState *pc_new_cpu(const char *cpu_model) @@ -952,7 +957,12 @@ void pc_cpus_init(const char *cpu_model) #endif } - for(i = 0; i < smp_cpus; i++) { + if (!xen_enabled()) { + for(i = 0; i < smp_cpus; i++) { + pc_new_cpu(cpu_model); + } + } else { + /* Xen require only one Qemu VCPU */ pc_new_cpu(cpu_model); } } @@ -980,6 +990,11 @@ void pc_memory_init(ram_addr_t ram_size, *above_4g_mem_size_p = above_4g_mem_size; *below_4g_mem_size_p = below_4g_mem_size; + if (xen_enabled()) { + /* Nothing to do for Xen */ + return; + } + linux_boot = (kernel_filename != NULL); /* allocate RAM */ diff --git a/hw/pc_piix.c b/hw/pc_piix.c index b3ede89..6eff06e 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -37,6 +37,10 @@ #include "sysbus.h" #include "arch_init.h" #include "blockdev.h" +#include "xen.h" +#ifdef CONFIG_XEN +# include <xen/hvm/hvm_info_table.h> +#endif #define MAX_IDE_BUS 2 @@ -391,6 +395,16 @@ static QEMUMachine isapc_machine = { .max_cpus = 1, }; +#ifdef CONFIG_XEN +static QEMUMachine xenfv_machine = { + .name = "xenfv", + .desc = "Xen Fully-virtualized PC", + .init = pc_init_pci, + .max_cpus = HVM_MAX_VCPUS, + .default_machine_opts = "accel=xen", +}; +#endif + static void pc_machine_init(void) { qemu_register_machine(&pc_machine); @@ -399,6 +413,9 @@ static void pc_machine_init(void) qemu_register_machine(&pc_machine_v0_11); qemu_register_machine(&pc_machine_v0_10); qemu_register_machine(&isapc_machine); +#ifdef CONFIG_XEN + qemu_register_machine(&xenfv_machine); +#endif } machine_init(pc_machine_init); diff --git a/hw/xen.h b/hw/xen.h index 1fefe3a..726360a 100644 --- a/hw/xen.h +++ b/hw/xen.h @@ -31,4 +31,8 @@ static inline int xen_enabled(void) int xen_init(void); +#if defined(CONFIG_XEN) && CONFIG_XEN_CTRL_INTERFACE_VERSION < 400 +# define HVM_MAX_VCPUS 32 +#endif + #endif /* QEMU_HW_XEN_H */ -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 06/15] xen: Add the Xen platform pci device
From: Steven Smith <ssmith@xensource.com> Introduce a new emulated PCI device, specific to fully virtualized Xen guests. The device is necessary for PV on HVM drivers to work. Signed-off-by: Steven Smith <ssmith@xensource.com> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- Makefile.target | 2 + hw/hw.h | 3 + hw/pc_piix.c | 4 + hw/pci_ids.h | 2 + hw/xen.h | 2 + hw/xen_platform.c | 349 +++++++++++++++++++++++++++++++++++++++++++++++++++++ trace-events | 3 + xen-stub.c | 4 + 8 files changed, 369 insertions(+), 0 deletions(-) create mode 100644 hw/xen_platform.c diff --git a/Makefile.target b/Makefile.target index b08c7f7..c539b1e 100644 --- a/Makefile.target +++ b/Makefile.target @@ -217,6 +217,8 @@ endif obj-i386-$(CONFIG_XEN) += xen-all.o obj-$(CONFIG_NO_XEN) += xen-stub.o +obj-i386-$(CONFIG_XEN) += xen_platform.o + # Inter-VM PCI shared memory obj-$(CONFIG_KVM) += ivshmem.o diff --git a/hw/hw.h b/hw/hw.h index 5e24329..c285b2e 100644 --- a/hw/hw.h +++ b/hw/hw.h @@ -682,6 +682,9 @@ extern const VMStateDescription vmstate_usb_device; #define VMSTATE_INT32_LE(_f, _s) \ VMSTATE_SINGLE(_f, _s, 0, vmstate_info_int32_le, int32_t) +#define VMSTATE_UINT8_TEST(_f, _s, _t) \ + VMSTATE_SINGLE_TEST(_f, _s, _t, 0, vmstate_info_uint8, uint8_t) + #define VMSTATE_UINT16_TEST(_f, _s, _t) \ VMSTATE_SINGLE_TEST(_f, _s, _t, 0, vmstate_info_uint16, uint16_t) diff --git a/hw/pc_piix.c b/hw/pc_piix.c index 6eff06e..417c456 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -121,6 +121,10 @@ static void pc_init1(ram_addr_t ram_size, pc_vga_init(pci_enabled? pci_bus: NULL); + if (xen_enabled()) { + pci_xen_platform_init(pci_bus); + } + /* init basic PC hardware */ pc_basic_device_init(isa_irq, &rtc_state); diff --git a/hw/pci_ids.h b/hw/pci_ids.h index ea3418c..6e9eabc 100644 --- a/hw/pci_ids.h +++ b/hw/pci_ids.h @@ -108,3 +108,5 @@ #define PCI_DEVICE_ID_INTEL_82371AB 0x7111 #define PCI_DEVICE_ID_INTEL_82371AB_2 0x7112 #define PCI_DEVICE_ID_INTEL_82371AB_3 0x7113 + +#define PCI_VENDOR_ID_XENSOURCE 0x5853 diff --git a/hw/xen.h b/hw/xen.h index 726360a..46c4a1c 100644 --- a/hw/xen.h +++ b/hw/xen.h @@ -29,6 +29,8 @@ static inline int xen_enabled(void) #endif } +void pci_xen_platform_init(PCIBus *bus); + int xen_init(void); #if defined(CONFIG_XEN) && CONFIG_XEN_CTRL_INTERFACE_VERSION < 400 diff --git a/hw/xen_platform.c b/hw/xen_platform.c new file mode 100644 index 0000000..a03a117 --- /dev/null +++ b/hw/xen_platform.c @@ -0,0 +1,349 @@ +/* + * XEN platform pci device, formerly known as the event channel device + * + * Copyright (c) 2003-2004 Intel Corp. + * Copyright (c) 2006 XenSource + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <assert.h> + +#include "hw.h" +#include "pc.h" +#include "pci.h" +#include "irq.h" +#include "xen_common.h" +#include "net.h" +#include "xen_backend.h" +#include "rwhandler.h" +#include "trace.h" + +#include <xenguest.h> + +//#define DEBUG_PLATFORM + +#ifdef DEBUG_PLATFORM +#define DPRINTF(fmt, ...) do { \ + fprintf(stderr, "xen_platform: " fmt, ## __VA_ARGS__); \ +} while (0) +#else +#define DPRINTF(fmt, ...) do { } while (0) +#endif + +#define PFFLAG_ROM_LOCK 1 /* Sets whether ROM memory area is RW or RO */ + +typedef struct PCIXenPlatformState { + PCIDevice pci_dev; + uint8_t flags; /* used only for version_id == 2 */ + int drivers_blacklisted; + uint16_t driver_product_version; + + /* Log from guest drivers */ + char log_buffer[4096]; + int log_buffer_off; +} PCIXenPlatformState; + +#define XEN_PLATFORM_IOPORT 0x10 + +/* Send bytes to syslog */ +static void log_writeb(PCIXenPlatformState *s, char val) +{ + if (val == ''\n'' || s->log_buffer_off == sizeof(s->log_buffer) - 1) { + /* Flush buffer */ + s->log_buffer[s->log_buffer_off] = 0; + trace_xen_platform_log(s->log_buffer); + s->log_buffer_off = 0; + } else { + s->log_buffer[s->log_buffer_off++] = val; + } +} + +/* Xen Platform, Fixed IOPort */ + +static void platform_fixed_ioport_writew(void *opaque, uint32_t addr, uint32_t val) +{ + PCIXenPlatformState *s = opaque; + + switch (addr - XEN_PLATFORM_IOPORT) { + case 0: + /* TODO: */ + /* Unplug devices. Value is a bitmask of which devices to + unplug, with bit 0 the IDE devices, bit 1 the network + devices, and bit 2 the non-primary-master IDE devices. */ + break; + case 2: + switch (val) { + case 1: + DPRINTF("Citrix Windows PV drivers loaded in guest\n"); + break; + case 0: + DPRINTF("Guest claimed to be running PV product 0?\n"); + break; + default: + DPRINTF("Unknown PV product %d loaded in guest\n", val); + break; + } + s->driver_product_version = val; + break; + } +} + +static void platform_fixed_ioport_writel(void *opaque, uint32_t addr, + uint32_t val) +{ + switch (addr - XEN_PLATFORM_IOPORT) { + case 0: + /* PV driver version */ + break; + } +} + +static void platform_fixed_ioport_writeb(void *opaque, uint32_t addr, uint32_t val) +{ + PCIXenPlatformState *s = opaque; + + switch (addr - XEN_PLATFORM_IOPORT) { + case 0: /* Platform flags */ { + hvmmem_type_t mem_type = (val & PFFLAG_ROM_LOCK) ? + HVMMEM_ram_ro : HVMMEM_ram_rw; + if (xc_hvm_set_mem_type(xen_xc, xen_domid, mem_type, 0xc0, 0x40)) { + DPRINTF("unable to change ro/rw state of ROM memory area!\n"); + } else { + s->flags = val & PFFLAG_ROM_LOCK; + DPRINTF("changed ro/rw state of ROM memory area. now is %s state.\n", + (mem_type == HVMMEM_ram_ro ? "ro":"rw")); + } + break; + } + case 2: + log_writeb(s, val); + break; + } +} + +static uint32_t platform_fixed_ioport_readw(void *opaque, uint32_t addr) +{ + PCIXenPlatformState *s = opaque; + + switch (addr - XEN_PLATFORM_IOPORT) { + case 0: + if (s->drivers_blacklisted) { + /* The drivers will recognise this magic number and refuse + * to do anything. */ + return 0xd249; + } else { + /* Magic value so that you can identify the interface. */ + return 0x49d2; + } + default: + return 0xffff; + } +} + +static uint32_t platform_fixed_ioport_readb(void *opaque, uint32_t addr) +{ + PCIXenPlatformState *s = opaque; + + switch (addr - XEN_PLATFORM_IOPORT) { + case 0: + /* Platform flags */ + return s->flags; + case 2: + /* Version number */ + return 1; + default: + return 0xff; + } +} + +static void platform_fixed_ioport_reset(void *opaque) +{ + PCIXenPlatformState *s = opaque; + + platform_fixed_ioport_writeb(s, XEN_PLATFORM_IOPORT, 0); +} + +static void platform_fixed_ioport_init(PCIXenPlatformState* s) +{ + register_ioport_write(XEN_PLATFORM_IOPORT, 16, 4, platform_fixed_ioport_writel, s); + register_ioport_write(XEN_PLATFORM_IOPORT, 16, 2, platform_fixed_ioport_writew, s); + register_ioport_write(XEN_PLATFORM_IOPORT, 16, 1, platform_fixed_ioport_writeb, s); + register_ioport_read(XEN_PLATFORM_IOPORT, 16, 2, platform_fixed_ioport_readw, s); + register_ioport_read(XEN_PLATFORM_IOPORT, 16, 1, platform_fixed_ioport_readb, s); +} + +/* Xen Platform PCI Device */ + +static uint32_t xen_platform_ioport_readb(void *opaque, uint32_t addr) +{ + addr &= 0xff; + + if (addr == 0) { + return platform_fixed_ioport_readb(opaque, XEN_PLATFORM_IOPORT); + } else { + return ~0u; + } +} + +static void xen_platform_ioport_writeb(void *opaque, uint32_t addr, uint32_t val) +{ + PCIXenPlatformState *s = opaque; + + addr &= 0xff; + val &= 0xff; + + switch (addr) { + case 0: /* Platform flags */ + platform_fixed_ioport_writeb(opaque, XEN_PLATFORM_IOPORT, val); + break; + case 8: + log_writeb(s, val); + break; + default: + break; + } +} + +static void platform_ioport_map(PCIDevice *pci_dev, int region_num, pcibus_t addr, pcibus_t size, int type) +{ + PCIXenPlatformState *d = DO_UPCAST(PCIXenPlatformState, pci_dev, pci_dev); + + register_ioport_write(addr, size, 1, xen_platform_ioport_writeb, d); + register_ioport_read(addr, size, 1, xen_platform_ioport_readb, d); +} + +static uint32_t platform_mmio_read(ReadWriteHandler *handler, pcibus_t addr, int len) +{ + DPRINTF("Warning: attempted read from physical address " + "0x" TARGET_FMT_plx " in xen platform mmio space\n", addr); + + return 0; +} + +static void platform_mmio_write(ReadWriteHandler *handler, pcibus_t addr, + uint32_t val, int len) +{ + DPRINTF("Warning: attempted write of 0x%x to physical " + "address 0x" TARGET_FMT_plx " in xen platform mmio space\n", + val, addr); +} + +static ReadWriteHandler platform_mmio_handler = { + .read = &platform_mmio_read, + .write = &platform_mmio_write, +}; + +static void platform_mmio_map(PCIDevice *d, int region_num, + pcibus_t addr, pcibus_t size, int type) +{ + int mmio_io_addr; + + mmio_io_addr = cpu_register_io_memory_simple(&platform_mmio_handler, + DEVICE_NATIVE_ENDIAN); + + cpu_register_physical_memory(addr, size, mmio_io_addr); +} + +static int xen_platform_post_load(void *opaque, int version_id) +{ + PCIXenPlatformState *s = opaque; + + platform_fixed_ioport_writeb(s, XEN_PLATFORM_IOPORT, s->flags); + + return 0; +} + +static const VMStateDescription vmstate_xen_platform = { + .name = "platform", + .version_id = 4, + .minimum_version_id = 4, + .minimum_version_id_old = 4, + .post_load = xen_platform_post_load, + .fields = (VMStateField []) { + VMSTATE_PCI_DEVICE(pci_dev, PCIXenPlatformState), + VMSTATE_UINT8(flags, PCIXenPlatformState), + VMSTATE_END_OF_LIST() + } +}; + +static int xen_platform_initfn(PCIDevice *dev) +{ + PCIXenPlatformState *d = DO_UPCAST(PCIXenPlatformState, pci_dev, dev); + uint8_t *pci_conf; + + pci_conf = d->pci_dev.config; + + pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_XENSOURCE); + pci_config_set_device_id(pci_conf, 0x0001); + pci_set_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID, PCI_VENDOR_ID_XENSOURCE); + pci_set_word(pci_conf + PCI_SUBSYSTEM_ID, 0x0001); + + pci_set_word(pci_conf + PCI_COMMAND, PCI_COMMAND_IO | PCI_COMMAND_MEMORY); + + pci_config_set_revision(pci_conf, 1); + pci_config_set_prog_interface(pci_conf, 0); + + pci_config_set_class(pci_conf, PCI_CLASS_OTHERS << 8 | 0x80); + + pci_conf[PCI_INTERRUPT_PIN] = 1; + + pci_register_bar(&d->pci_dev, 0, 0x100, + PCI_BASE_ADDRESS_SPACE_IO, platform_ioport_map); + + /* reserve 16MB mmio address for share memory*/ + pci_register_bar(&d->pci_dev, 1, 0x1000000, + PCI_BASE_ADDRESS_MEM_PREFETCH, platform_mmio_map); + + platform_fixed_ioport_init(d); + + return 0; +} + +static void platform_reset(DeviceState *dev) +{ + PCIXenPlatformState *s = DO_UPCAST(PCIXenPlatformState, pci_dev.qdev, dev); + + platform_fixed_ioport_reset(s); +} + +void pci_xen_platform_init(PCIBus *bus) +{ + PCIDevice *dev; + + dev = pci_create(bus, -1, "xen-platform"); + + qdev_init_nofail(&dev->qdev); +} + +static PCIDeviceInfo xen_platform_info = { + .init = xen_platform_initfn, + .qdev.name = "xen-platform", + .qdev.desc = "XEN platform pci device", + .qdev.size = sizeof(PCIXenPlatformState), + .qdev.vmsd = &vmstate_xen_platform, + .qdev.reset = platform_reset, +}; + +static void xen_platform_register(void) +{ + pci_qdev_register(&xen_platform_info); +} + +device_init(xen_platform_register); diff --git a/trace-events b/trace-events index e6138ea..20aadab 100644 --- a/trace-events +++ b/trace-events @@ -254,3 +254,6 @@ disable spice_vmc_write(ssize_t out, int len) "spice wrottn %lu of requested %zd disable spice_vmc_read(int bytes, int len) "spice read %lu of requested %zd" disable spice_vmc_register_interface(void *scd) "spice vmc registered interface %p" disable spice_vmc_unregister_interface(void *scd) "spice vmc unregistered interface %p" + +# hw/xen_platform.c +disable xen_platform_log(char *s) "xen platform: %s" diff --git a/xen-stub.c b/xen-stub.c index beb982f..9645af2 100644 --- a/xen-stub.c +++ b/xen-stub.c @@ -9,6 +9,10 @@ #include "qemu-common.h" #include "hw/xen.h" +void pci_xen_platform_init(PCIBus *bus) +{ +} + int xen_init(void) { return -ENOSYS; -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 07/15] piix_pci: Introduces Xen specific call for irq.
From: Anthony PERARD <anthony.perard@citrix.com> This patch introduces Xen specific call in piix_pci. The specific part for Xen is in write_config, set_irq and get_pirq. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Alexander Graf <agraf@suse.de> --- hw/pc.h | 1 + hw/pc_piix.c | 6 +++++- hw/piix_pci.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- hw/xen.h | 6 ++++++ xen-all.c | 31 +++++++++++++++++++++++++++++++ xen-stub.c | 13 +++++++++++++ 6 files changed, 100 insertions(+), 4 deletions(-) diff --git a/hw/pc.h b/hw/pc.h index feb8a7a..85662c3 100644 --- a/hw/pc.h +++ b/hw/pc.h @@ -176,6 +176,7 @@ struct PCII440FXState; typedef struct PCII440FXState PCII440FXState; PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn, qemu_irq *pic, ram_addr_t ram_size); +PCIBus *i440fx_xen_init(PCII440FXState **pi440fx_state, int *piix3_devfn, qemu_irq *pic, ram_addr_t ram_size); void i440fx_init_memory_mappings(PCII440FXState *d); /* piix4.c */ diff --git a/hw/pc_piix.c b/hw/pc_piix.c index 417c456..7457bdb 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -109,7 +109,11 @@ static void pc_init1(ram_addr_t ram_size, isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 24); if (pci_enabled) { - pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, isa_irq, ram_size); + if (!xen_enabled()) { + pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, isa_irq, ram_size); + } else { + pci_bus = i440fx_xen_init(&i440fx_state, &piix3_devfn, isa_irq, ram_size); + } } else { pci_bus = NULL; i440fx_state = NULL; diff --git a/hw/piix_pci.c b/hw/piix_pci.c index 358da58..c11a7f6 100644 --- a/hw/piix_pci.c +++ b/hw/piix_pci.c @@ -29,6 +29,7 @@ #include "isa.h" #include "sysbus.h" #include "range.h" +#include "xen.h" /* * I440FX chipset data sheet. @@ -151,6 +152,13 @@ static void i440fx_write_config(PCIDevice *dev, } } +static void i440fx_write_config_xen(PCIDevice *dev, + uint32_t address, uint32_t val, int len) +{ + xen_piix_pci_write_config_client(address, val, len); + i440fx_write_config(dev, address, val, len); +} + static int i440fx_load_old(QEMUFile* f, void *opaque, int version_id) { PCII440FXState *d = opaque; @@ -216,7 +224,10 @@ static int i440fx_initfn(PCIDevice *dev) return 0; } -PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix3_devfn, qemu_irq *pic, ram_addr_t ram_size) +static PCIBus *i440fx_common_init(const char *device_name, + PCII440FXState **pi440fx_state, + int *piix3_devfn, + qemu_irq *pic, ram_addr_t ram_size) { DeviceState *dev; PCIBus *b; @@ -230,13 +241,13 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix3_devfn, qemu_irq * s->bus = b; qdev_init_nofail(dev); - d = pci_create_simple(b, 0, "i440FX"); + d = pci_create_simple(b, 0, device_name); *pi440fx_state = DO_UPCAST(PCII440FXState, dev, d); piix3 = DO_UPCAST(PIIX3State, dev, pci_create_simple_multifunction(b, -1, true, "PIIX3")); piix3->pic = pic; - pci_bus_irqs(b, piix3_set_irq, pci_slot_get_pirq, piix3, 4); + (*pi440fx_state)->piix3 = piix3; *piix3_devfn = piix3->dev.devfn; @@ -249,6 +260,28 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix3_devfn, qemu_irq * return b; } +PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix3_devfn, + qemu_irq *pic, ram_addr_t ram_size) +{ + PCIBus *b; + + b = i440fx_common_init("i440FX", pi440fx_state, piix3_devfn, pic, ram_size); + pci_bus_irqs(b, piix3_set_irq, pci_slot_get_pirq, (*pi440fx_state)->piix3, 4); + + return b; +} + +PCIBus *i440fx_xen_init(PCII440FXState **pi440fx_state, int *piix3_devfn, + qemu_irq *pic, ram_addr_t ram_size) +{ + PCIBus *b; + + b = i440fx_common_init("i440FX-xen", pi440fx_state, piix3_devfn, pic, ram_size); + pci_bus_irqs(b, xen_piix3_set_irq, xen_pci_slot_get_pirq, (*pi440fx_state)->piix3, 4); + + return b; +} + /* PIIX3 PCI to ISA bridge */ static void piix3_set_irq(void *opaque, int irq_num, int level) @@ -352,6 +385,14 @@ static PCIDeviceInfo i440fx_info[] = { .init = i440fx_initfn, .config_write = i440fx_write_config, },{ + .qdev.name = "i440FX-xen", + .qdev.desc = "Host bridge", + .qdev.size = sizeof(PCII440FXState), + .qdev.vmsd = &vmstate_i440fx, + .qdev.no_user = 1, + .init = i440fx_initfn, + .config_write = i440fx_write_config_xen, + },{ .qdev.name = "PIIX3", .qdev.desc = "ISA bridge", .qdev.size = sizeof(PIIX3State), diff --git a/hw/xen.h b/hw/xen.h index 46c4a1c..95653df 100644 --- a/hw/xen.h +++ b/hw/xen.h @@ -8,6 +8,8 @@ */ #include <inttypes.h> +#include "qemu-common.h" + /* xen-machine.c */ enum xen_mode { XEN_EMULATE = 0, // xen emulation, using xenner (default) @@ -29,6 +31,10 @@ static inline int xen_enabled(void) #endif } +int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num); +void xen_piix3_set_irq(void *opaque, int irq_num, int level); +void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len); + void pci_xen_platform_init(PCIBus *bus); int xen_init(void); diff --git a/xen-all.c b/xen-all.c index 888fb1d..7b94d61 100644 --- a/xen-all.c +++ b/xen-all.c @@ -6,9 +6,40 @@ * */ +#include "hw/pci.h" #include "hw/xen_common.h" #include "hw/xen_backend.h" +/* Xen specific function for piix pci */ + +int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num) +{ + return irq_num + ((pci_dev->devfn >> 3) << 2); +} + +void xen_piix3_set_irq(void *opaque, int irq_num, int level) +{ + xc_hvm_set_pci_intx_level(xen_xc, xen_domid, 0, 0, irq_num >> 2, + irq_num & 3, level); +} + +void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) +{ + int i; + + /* Scan for updates to PCI link routes (0x60-0x63). */ + for (i = 0; i < len; i++) { + uint8_t v = (val >> (8 * i)) & 0xff; + if (v & 0x80) { + v = 0; + } + v &= 0xf; + if (((address + i) >= 0x60) && ((address + i) <= 0x63)) { + xc_hvm_set_pci_link_route(xen_xc, xen_domid, address + i - 0x60, v); + } + } +} + /* Initialise Xen */ int xen_init(void) diff --git a/xen-stub.c b/xen-stub.c index 9645af2..216cae9 100644 --- a/xen-stub.c +++ b/xen-stub.c @@ -9,6 +9,19 @@ #include "qemu-common.h" #include "hw/xen.h" +int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num) +{ + return -1; +} + +void xen_piix3_set_irq(void *opaque, int irq_num, int level) +{ +} + +void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) +{ +} + void pci_xen_platform_init(PCIBus *bus) { } -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 08/15] xen: Introduce Xen Interrupt Controller
From: Anthony PERARD <anthony.perard@citrix.com> Every set_irq call makes a Xen hypercall. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- hw/pc_piix.c | 8 ++++++-- hw/xen.h | 2 ++ xen-all.c | 12 ++++++++++++ xen-stub.c | 5 +++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/hw/pc_piix.c b/hw/pc_piix.c index 7457bdb..1d55bc9 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -99,8 +99,12 @@ static void pc_init1(ram_addr_t ram_size, pc_memory_init(ram_size, kernel_filename, kernel_cmdline, initrd_filename, &below_4g_mem_size, &above_4g_mem_size); - cpu_irq = pc_allocate_cpu_irq(); - i8259 = i8259_init(cpu_irq[0]); + if (!xen_enabled()) { + cpu_irq = pc_allocate_cpu_irq(); + i8259 = i8259_init(cpu_irq[0]); + } else { + i8259 = xen_interrupt_controller_init(); + } isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state)); isa_irq_state->i8259 = i8259; if (pci_enabled) { diff --git a/hw/xen.h b/hw/xen.h index 95653df..12d4e5f 100644 --- a/hw/xen.h +++ b/hw/xen.h @@ -35,6 +35,8 @@ int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num); void xen_piix3_set_irq(void *opaque, int irq_num, int level); void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len); +qemu_irq *xen_interrupt_controller_init(void); + void pci_xen_platform_init(PCIBus *bus); int xen_init(void); diff --git a/xen-all.c b/xen-all.c index 7b94d61..761f2a0 100644 --- a/xen-all.c +++ b/xen-all.c @@ -40,6 +40,18 @@ void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) } } +/* Xen Interrupt Controller */ + +static void xen_set_irq(void *opaque, int irq, int level) +{ + xc_hvm_set_isa_irq_level(xen_xc, xen_domid, irq, level); +} + +qemu_irq *xen_interrupt_controller_init(void) +{ + return qemu_allocate_irqs(xen_set_irq, NULL, 16); +} + /* Initialise Xen */ int xen_init(void) diff --git a/xen-stub.c b/xen-stub.c index 216cae9..e335b67 100644 --- a/xen-stub.c +++ b/xen-stub.c @@ -22,6 +22,11 @@ void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) { } +qemu_irq *xen_interrupt_controller_init(void) +{ + return NULL; +} + void pci_xen_platform_init(PCIBus *bus) { } -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 09/15] xen: Introduce the Xen mapcache
From: Jun Nakajima <jun.nakajima@intel.com> On IA32 host or IA32 PAE host, at present, generally, we can''t create an HVM guest with more than 2G memory, because generally it''s almost impossible for Qemu to find a large enough and consecutive virtual address space to map an HVM guest''s whole physical address space. The attached patch fixes this issue using dynamic mapping based on little blocks of memory. Each call to qemu_get_ram_ptr makes a call to qemu_map_cache with the lock option, so mapcache will not unmap these ram_ptr. Signed-off-by: Jun Nakajima <jun.nakajima@intel.com> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- Makefile.target | 3 + configure | 3 + exec.c | 40 ++++++- hw/xen.h | 13 ++ hw/xen_common.h | 9 ++ xen-all.c | 64 +++++++++++ xen-mapcache-stub.c | 40 +++++++ xen-mapcache.c | 310 +++++++++++++++++++++++++++++++++++++++++++++++++++ xen-mapcache.h | 22 ++++ xen-stub.c | 4 + 10 files changed, 504 insertions(+), 4 deletions(-) create mode 100644 xen-mapcache-stub.c create mode 100644 xen-mapcache.c create mode 100644 xen-mapcache.h diff --git a/Makefile.target b/Makefile.target index c539b1e..dcdd51d 100644 --- a/Makefile.target +++ b/Makefile.target @@ -214,8 +214,11 @@ else CONFIG_NO_XEN = y endif # xen support +CONFIG_NO_XEN_MAPCACHE = $(if $(subst n,,$(CONFIG_XEN_MAPCACHE)),n,y) obj-i386-$(CONFIG_XEN) += xen-all.o obj-$(CONFIG_NO_XEN) += xen-stub.o +obj-i386-$(CONFIG_XEN_MAPCACHE) += xen-mapcache.o +obj-$(CONFIG_NO_XEN_MAPCACHE) += xen-mapcache-stub.o obj-i386-$(CONFIG_XEN) += xen_platform.o diff --git a/configure b/configure index a84d974..4fd8696 100755 --- a/configure +++ b/configure @@ -3172,6 +3172,9 @@ case "$target_arch2" in i386|x86_64) if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then echo "CONFIG_XEN=y" >> $config_target_mak + if test "$cpu" = "i386" -o "$cpu" = "x86_64"; then + echo "CONFIG_XEN_MAPCACHE=y" >> $config_target_mak + fi fi esac case "$target_arch2" in diff --git a/exec.c b/exec.c index d611100..558595a 100644 --- a/exec.c +++ b/exec.c @@ -32,6 +32,7 @@ #include "hw/qdev.h" #include "osdep.h" #include "kvm.h" +#include "hw/xen.h" #include "qemu-timer.h" #if defined(CONFIG_USER_ONLY) #include <qemu.h> @@ -51,6 +52,8 @@ #include <libutil.h> #endif #endif +#else /* !CONFIG_USER_ONLY */ +#include "xen-mapcache.h" #endif //#define DEBUG_TB_INVALIDATE @@ -2865,6 +2868,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name, } } + new_block->offset = find_ram_offset(size); if (host) { new_block->host = host; } else { @@ -2886,13 +2890,15 @@ ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); #else - new_block->host = qemu_vmalloc(size); + if (xen_mapcache_enabled()) { + xen_ram_alloc(new_block->offset, size); + } else { + new_block->host = qemu_vmalloc(size); + } #endif qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE); } } - - new_block->offset = find_ram_offset(size); new_block->length = size; QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next); @@ -2933,7 +2939,11 @@ void qemu_ram_free(ram_addr_t addr) #if defined(TARGET_S390X) && defined(CONFIG_KVM) munmap(block->host, block->length); #else - qemu_vfree(block->host); + if (xen_mapcache_enabled()) { + qemu_invalidate_entry(block->host); + } else { + qemu_vfree(block->host); + } #endif } qemu_free(block); @@ -2959,6 +2969,15 @@ void *qemu_get_ram_ptr(ram_addr_t addr) if (addr - block->offset < block->length) { QLIST_REMOVE(block, next); QLIST_INSERT_HEAD(&ram_list.blocks, block, next); + if (xen_mapcache_enabled()) { + /* We need to check if the requested address is in the RAM + * because we don''t want to map the entire memory in QEMU. + */ + if (block->offset == 0) { + return qemu_map_cache(addr, 0, 1); + } + block->host = qemu_map_cache(block->offset, block->length, 1); + } return block->host + (addr - block->offset); } } @@ -2994,11 +3013,21 @@ int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr) uint8_t *host = ptr; QLIST_FOREACH(block, &ram_list.blocks, next) { + /* This case append when the block is not mapped. */ + if (block->host == NULL) { + continue; + } if (host - block->host < block->length) { *ram_addr = block->offset + (host - block->host); return 0; } } + + if (xen_mapcache_enabled()) { + *ram_addr = qemu_ram_addr_from_mapcache(ptr); + return 0; + } + return -1; } @@ -3909,6 +3938,9 @@ void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len, if (is_write) { cpu_physical_memory_write(bounce.addr, bounce.buffer, access_len); } + if (xen_enabled()) { + qemu_invalidate_entry(buffer); + } qemu_vfree(bounce.buffer); bounce.buffer = NULL; cpu_notify_map_clients(); diff --git a/hw/xen.h b/hw/xen.h index 12d4e5f..e26d061 100644 --- a/hw/xen.h +++ b/hw/xen.h @@ -31,6 +31,15 @@ static inline int xen_enabled(void) #endif } +static inline int xen_mapcache_enabled(void) +{ +#ifdef CONFIG_XEN_MAPCACHE + return xen_enabled(); +#else + return 0; +#endif +} + int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num); void xen_piix3_set_irq(void *opaque, int irq_num, int level); void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len); @@ -41,6 +50,10 @@ void pci_xen_platform_init(PCIBus *bus); int xen_init(void); +#if defined(NEED_CPU_H) && !defined(CONFIG_USER_ONLY) +void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size); +#endif + #if defined(CONFIG_XEN) && CONFIG_XEN_CTRL_INTERFACE_VERSION < 400 # define HVM_MAX_VCPUS 32 #endif diff --git a/hw/xen_common.h b/hw/xen_common.h index 7e123ec..5a36642 100644 --- a/hw/xen_common.h +++ b/hw/xen_common.h @@ -50,6 +50,15 @@ static inline int xc_fd(int xen_xc) } +static inline int xc_domain_populate_physmap_exact + (XenXC xc_handle, uint32_t domid, unsigned long nr_extents, + unsigned int extent_order, unsigned int mem_flags, xen_pfn_t *extent_start) +{ + return xc_domain_memory_populate_physmap + (xc_handle, domid, nr_extents, extent_order, mem_flags, extent_start); +} + + /* Xen 4.1 */ #else diff --git a/xen-all.c b/xen-all.c index 761f2a0..03d1e90 100644 --- a/xen-all.c +++ b/xen-all.c @@ -10,6 +10,8 @@ #include "hw/xen_common.h" #include "hw/xen_backend.h" +#include "xen-mapcache.h" + /* Xen specific function for piix pci */ int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num) @@ -52,6 +54,64 @@ qemu_irq *xen_interrupt_controller_init(void) return qemu_allocate_irqs(xen_set_irq, NULL, 16); } + +/* Memory Ops */ + +static void xen_ram_init(ram_addr_t ram_size) +{ + RAMBlock *new_block; + ram_addr_t below_4g_mem_size, above_4g_mem_size = 0; + + new_block = qemu_mallocz(sizeof (*new_block)); + pstrcpy(new_block->idstr, sizeof (new_block->idstr), "xen.ram"); + new_block->host = NULL; + new_block->offset = 0; + new_block->length = ram_size; + + QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next); + + ram_list.phys_dirty = qemu_realloc(ram_list.phys_dirty, + new_block->length >> TARGET_PAGE_BITS); + memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS), + 0xff, new_block->length >> TARGET_PAGE_BITS); + + if (ram_size >= 0xe0000000 ) { + above_4g_mem_size = ram_size - 0xe0000000; + below_4g_mem_size = 0xe0000000; + } else { + below_4g_mem_size = ram_size; + } + + cpu_register_physical_memory(0, below_4g_mem_size, new_block->offset); +#if TARGET_PHYS_ADDR_BITS > 32 + if (above_4g_mem_size > 0) { + cpu_register_physical_memory(0x100000000ULL, above_4g_mem_size, + new_block->offset + below_4g_mem_size); + } +#endif +} + +void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size) +{ + unsigned long nr_pfn; + xen_pfn_t *pfn_list; + int i; + + nr_pfn = size >> TARGET_PAGE_BITS; + pfn_list = qemu_malloc(sizeof (*pfn_list) * nr_pfn); + + for (i = 0; i < nr_pfn; i++) { + pfn_list[i] = (ram_addr >> TARGET_PAGE_BITS) + i; + } + + if (xc_domain_populate_physmap_exact(xen_xc, xen_domid, nr_pfn, 0, 0, pfn_list)) { + hw_error("xen: failed to populate ram at %lx", ram_addr); + } + + qemu_free(pfn_list); +} + + /* Initialise Xen */ int xen_init(void) @@ -62,5 +122,9 @@ int xen_init(void) return -1; } + /* Init RAM management */ + qemu_map_cache_init(); + xen_ram_init(ram_size); + return 0; } diff --git a/xen-mapcache-stub.c b/xen-mapcache-stub.c new file mode 100644 index 0000000..541bee6 --- /dev/null +++ b/xen-mapcache-stub.c @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2011 Citrix Ltd. + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + */ + +#include "config.h" + +#include "exec-all.h" +#include "qemu-common.h" +#include "cpu-common.h" +#include "xen-mapcache.h" + +void qemu_map_cache_init(void) +{ +} + +uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, uint8_t lock) +{ + return qemu_get_ram_ptr(phys_addr); +} + +void qemu_map_cache_unlock(void *buffer) +{ +} + +ram_addr_t qemu_ram_addr_from_mapcache(void *ptr) +{ + return -1; +} + +void qemu_invalidate_map_cache(void) +{ +} + +void qemu_invalidate_entry(uint8_t *buffer) +{ +} diff --git a/xen-mapcache.c b/xen-mapcache.c new file mode 100644 index 0000000..d7f44a7 --- /dev/null +++ b/xen-mapcache.c @@ -0,0 +1,310 @@ +/* + * Copyright (C) 2011 Citrix Ltd. + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + */ + +#include "config.h" + +#include <sys/resource.h> + +#include "hw/xen_backend.h" +#include "blockdev.h" + +#include <xen/hvm/params.h> +#include <sys/mman.h> + +#include "xen-mapcache.h" + + +//#define MAPCACHE_DEBUG + +#ifdef MAPCACHE_DEBUG +# define DPRINTF(fmt, ...) do { \ + fprintf(stderr, "xen_mapcache: " fmt, ## __VA_ARGS__); \ +} while (0) +#else +# define DPRINTF(fmt, ...) do { } while (0) +#endif + +#if defined(__i386__) +# define MCACHE_BUCKET_SHIFT 16 +#elif defined(__x86_64__) +# define MCACHE_BUCKET_SHIFT 20 +#endif +#define MCACHE_BUCKET_SIZE (1UL << MCACHE_BUCKET_SHIFT) + +#define BITS_PER_LONG (sizeof(long) * 8) +#define BITS_TO_LONGS(bits) (((bits) + BITS_PER_LONG - 1) / BITS_PER_LONG) +#define DECLARE_BITMAP(name, bits) unsigned long name[BITS_TO_LONGS(bits)] + +typedef struct MapCacheEntry { + target_phys_addr_t paddr_index; + uint8_t *vaddr_base; + DECLARE_BITMAP(valid_mapping, MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT); + uint8_t lock; + struct MapCacheEntry *next; +} MapCacheEntry; + +typedef struct MapCacheRev { + uint8_t *vaddr_req; + target_phys_addr_t paddr_index; + QTAILQ_ENTRY(MapCacheRev) next; +} MapCacheRev; + +typedef struct MapCache { + MapCacheEntry *entry; + unsigned long nr_buckets; + QTAILQ_HEAD(map_cache_head, MapCacheRev) locked_entries; + + /* For most cases (>99.9%), the page address is the same. */ + target_phys_addr_t last_address_index; + uint8_t *last_address_vaddr; + unsigned long max_mcache_size; + unsigned int mcache_bucket_shift; +} MapCache; + +static MapCache *mapcache; + +static inline int test_bit(unsigned int bit, const unsigned long *map) +{ + return !!((map)[(bit) / BITS_PER_LONG] & (1UL << ((bit) % BITS_PER_LONG))); +} + +void qemu_map_cache_init(void) +{ + unsigned long size; + struct rlimit rlimit_as; + + mapcache = qemu_mallocz(sizeof (MapCache)); + + QTAILQ_INIT(&mapcache->locked_entries); + mapcache->last_address_index = -1; + + getrlimit(RLIMIT_AS, &rlimit_as); + rlimit_as.rlim_cur = rlimit_as.rlim_max; + setrlimit(RLIMIT_AS, &rlimit_as); + mapcache->max_mcache_size = rlimit_as.rlim_max; + + mapcache->nr_buckets + (((mapcache->max_mcache_size >> XC_PAGE_SHIFT) + + (1UL << (MCACHE_BUCKET_SHIFT - XC_PAGE_SHIFT)) - 1) >> + (MCACHE_BUCKET_SHIFT - XC_PAGE_SHIFT)); + + size = mapcache->nr_buckets * sizeof (MapCacheEntry); + size = (size + XC_PAGE_SIZE - 1) & ~(XC_PAGE_SIZE - 1); + DPRINTF("qemu_map_cache_init, nr_buckets = %lx size %lu\n", mapcache->nr_buckets, size); + mapcache->entry = qemu_mallocz(size); +} + +static void qemu_remap_bucket(MapCacheEntry *entry, + target_phys_addr_t size, + target_phys_addr_t address_index) +{ + uint8_t *vaddr_base; + xen_pfn_t *pfns; + int *err; + unsigned int i, j; + target_phys_addr_t nb_pfn = size >> XC_PAGE_SHIFT; + + pfns = qemu_mallocz(nb_pfn * sizeof (xen_pfn_t)); + err = qemu_mallocz(nb_pfn * sizeof (int)); + + if (entry->vaddr_base != NULL) { + if (munmap(entry->vaddr_base, size) != 0) { + perror("unmap fails"); + exit(-1); + } + } + + for (i = 0; i < nb_pfn; i++) { + pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT-XC_PAGE_SHIFT)) + i; + } + + vaddr_base = xc_map_foreign_bulk(xen_xc, xen_domid, PROT_READ|PROT_WRITE, + pfns, err, nb_pfn); + if (vaddr_base == NULL) { + perror("xc_map_foreign_bulk"); + exit(-1); + } + + entry->vaddr_base = vaddr_base; + entry->paddr_index = address_index; + + for (i = 0; i < nb_pfn; i += BITS_PER_LONG) { + unsigned long word = 0; + if ((i + BITS_PER_LONG) > nb_pfn) { + j = nb_pfn % BITS_PER_LONG; + } else { + j = BITS_PER_LONG; + } + while (j > 0) { + word = (word << 1) | !err[i + --j]; + } + entry->valid_mapping[i / BITS_PER_LONG] = word; + } + + qemu_free(pfns); + qemu_free(err); +} + +uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, uint8_t lock) +{ + MapCacheEntry *entry, *pentry = NULL; + target_phys_addr_t address_index = phys_addr >> MCACHE_BUCKET_SHIFT; + target_phys_addr_t address_offset = phys_addr & (MCACHE_BUCKET_SIZE - 1); + + if (address_index == mapcache->last_address_index && !lock) { + return mapcache->last_address_vaddr + address_offset; + } + + entry = &mapcache->entry[address_index % mapcache->nr_buckets]; + + while (entry && entry->lock && entry->paddr_index != address_index && entry->vaddr_base) { + pentry = entry; + entry = entry->next; + } + if (!entry) { + entry = qemu_mallocz(sizeof (MapCacheEntry)); + pentry->next = entry; + qemu_remap_bucket(entry, size ? : MCACHE_BUCKET_SIZE, address_index); + } else if (!entry->lock) { + if (!entry->vaddr_base || entry->paddr_index != address_index || + !test_bit(address_offset >> XC_PAGE_SHIFT, entry->valid_mapping)) { + qemu_remap_bucket(entry, size ? : MCACHE_BUCKET_SIZE, address_index); + } + } + + if (!test_bit(address_offset >> XC_PAGE_SHIFT, entry->valid_mapping)) { + mapcache->last_address_index = -1; + return NULL; + } + + mapcache->last_address_index = address_index; + mapcache->last_address_vaddr = entry->vaddr_base; + if (lock) { + MapCacheRev *reventry = qemu_mallocz(sizeof(MapCacheRev)); + entry->lock++; + reventry->vaddr_req = mapcache->last_address_vaddr + address_offset; + reventry->paddr_index = mapcache->last_address_index; + QTAILQ_INSERT_TAIL(&mapcache->locked_entries, reventry, next); + } + + return mapcache->last_address_vaddr + address_offset; +} + +ram_addr_t qemu_ram_addr_from_mapcache(void *ptr) +{ + MapCacheRev *reventry; + target_phys_addr_t paddr_index; + int found = 0; + + QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) { + if (reventry->vaddr_req == ptr) { + paddr_index = reventry->paddr_index; + found = 1; + break; + } + } + if (!found) { + fprintf(stderr, "qemu_ram_addr_from_mapcache, could not find %p\n", ptr); + QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) { + DPRINTF(" "TARGET_FMT_plx" -> %p is present\n", reventry->paddr_index, + reventry->vaddr_req); + } + abort(); + return 0; + } + + return paddr_index << MCACHE_BUCKET_SHIFT; +} + +void qemu_invalidate_entry(uint8_t *buffer) +{ + MapCacheEntry *entry = NULL, *pentry = NULL; + MapCacheRev *reventry; + target_phys_addr_t paddr_index; + int found = 0; + + if (mapcache->last_address_vaddr == buffer) { + mapcache->last_address_index = -1; + } + + QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) { + if (reventry->vaddr_req == buffer) { + paddr_index = reventry->paddr_index; + found = 1; + break; + } + } + if (!found) { + DPRINTF("qemu_invalidate_entry, could not find %p\n", buffer); + QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) { + DPRINTF(" "TARGET_FMT_plx" -> %p is present\n", reventry->paddr_index, reventry->vaddr_req); + } + return; + } + QTAILQ_REMOVE(&mapcache->locked_entries, reventry, next); + qemu_free(reventry); + + entry = &mapcache->entry[paddr_index % mapcache->nr_buckets]; + while (entry && entry->paddr_index != paddr_index) { + pentry = entry; + entry = entry->next; + } + if (!entry) { + DPRINTF("Trying to unmap address %p that is not in the mapcache!\n", buffer); + return; + } + entry->lock--; + if (entry->lock > 0 || pentry == NULL) { + return; + } + + pentry->next = entry->next; + if (munmap(entry->vaddr_base, MCACHE_BUCKET_SIZE) != 0) { + perror("unmap fails"); + exit(-1); + } + qemu_free(entry); +} + +void qemu_invalidate_map_cache(void) +{ + unsigned long i; + MapCacheRev *reventry; + + /* Flush pending AIO before destroying the mapcache */ + qemu_aio_flush(); + + QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) { + DPRINTF("There should be no locked mappings at this time, " + "but "TARGET_FMT_plx" -> %p is present\n", + reventry->paddr_index, reventry->vaddr_req); + } + + mapcache_lock(); + + for (i = 0; i < mapcache->nr_buckets; i++) { + MapCacheEntry *entry = &mapcache->entry[i]; + + if (entry->vaddr_base == NULL) { + continue; + } + + if (munmap(entry->vaddr_base, MCACHE_BUCKET_SIZE) != 0) { + perror("unmap fails"); + exit(-1); + } + + entry->paddr_index = 0; + entry->vaddr_base = NULL; + } + + mapcache->last_address_index = -1; + mapcache->last_address_vaddr = NULL; + + mapcache_unlock(); +} diff --git a/xen-mapcache.h b/xen-mapcache.h new file mode 100644 index 0000000..ef3717f --- /dev/null +++ b/xen-mapcache.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2011 Citrix Ltd. + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + */ + +#ifndef XEN_MAPCACHE_H +#define XEN_MAPCACHE_H + +void qemu_map_cache_init(void); +uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, uint8_t lock); +void qemu_map_cache_unlock(void *phys_addr); +ram_addr_t qemu_ram_addr_from_mapcache(void *ptr); +void qemu_invalidate_entry(uint8_t *buffer); +void qemu_invalidate_map_cache(void); + +#define mapcache_lock() ((void)0) +#define mapcache_unlock() ((void)0) + +#endif /* !XEN_MAPCACHE_H */ diff --git a/xen-stub.c b/xen-stub.c index e335b67..eebc223 100644 --- a/xen-stub.c +++ b/xen-stub.c @@ -22,6 +22,10 @@ void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) { } +void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size) +{ +} + qemu_irq *xen_interrupt_controller_init(void) { return NULL; -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 10/15] configure: Always use 64bits target physical addresses with xen enabled.
From: Anthony PERARD <anthony.perard@citrix.com> With MapCache, we can handle a 64b target, even with a 32b host/qemu. So, we need to have target_phys_addr_t to 64bits. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Acked-by: Alexander Graf <agraf@suse.de> --- configure | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/configure b/configure index 4fd8696..ecab08c 100755 --- a/configure +++ b/configure @@ -3171,6 +3171,7 @@ echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak case "$target_arch2" in i386|x86_64) if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then + target_phys_bits=64 echo "CONFIG_XEN=y" >> $config_target_mak if test "$cpu" = "i386" -o "$cpu" = "x86_64"; then echo "CONFIG_XEN_MAPCACHE=y" >> $config_target_mak -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 11/15] Introduce qemu_put_ram_ptr
From: Anthony PERARD <anthony.perard@citrix.com> This function allows to unlock a ram_ptr give by qemu_get_ram_ptr. After a call to qemu_put_ram_ptr, the pointer may be unmap from QEMU when used with Xen. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Acked-by: Alexander Graf <agraf@suse.de> --- cpu-common.h | 1 + exec.c | 10 ++++++++++ xen-mapcache.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 0 deletions(-) diff --git a/cpu-common.h b/cpu-common.h index 54d21d4..1f1c886 100644 --- a/cpu-common.h +++ b/cpu-common.h @@ -55,6 +55,7 @@ void *qemu_get_ram_ptr(ram_addr_t addr); /* Same but slower, to use for migration, where the order of * RAMBlocks must not change. */ void *qemu_safe_ram_ptr(ram_addr_t addr); +void qemu_put_ram_ptr(void *addr); /* This should not be used by devices. */ int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr); ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr); diff --git a/exec.c b/exec.c index 558595a..3f3caaa 100644 --- a/exec.c +++ b/exec.c @@ -3007,6 +3007,13 @@ void *qemu_safe_ram_ptr(ram_addr_t addr) return NULL; } +void qemu_put_ram_ptr(void *addr) +{ + if (xen_mapcache_enabled()) { + qemu_map_cache_unlock(addr); + } +} + int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr) { RAMBlock *block; @@ -3722,6 +3729,7 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, cpu_physical_memory_set_dirty_flags( addr1, (0xff & ~CODE_DIRTY_FLAG)); } + qemu_put_ram_ptr(ptr); } } else { if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && @@ -3752,6 +3760,7 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK); memcpy(buf, ptr, l); + qemu_put_ram_ptr(ptr); } } len -= l; @@ -3792,6 +3801,7 @@ void cpu_physical_memory_write_rom(target_phys_addr_t addr, /* ROM/RAM case */ ptr = qemu_get_ram_ptr(addr1); memcpy(ptr, buf, l); + qemu_put_ram_ptr(ptr); } len -= l; buf += l; diff --git a/xen-mapcache.c b/xen-mapcache.c index d7f44a7..6398456 100644 --- a/xen-mapcache.c +++ b/xen-mapcache.c @@ -195,6 +195,40 @@ uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, u return mapcache->last_address_vaddr + address_offset; } +void qemu_map_cache_unlock(void *buffer) +{ + MapCacheEntry *entry = NULL, *pentry = NULL; + MapCacheRev *reventry; + target_phys_addr_t paddr_index; + int found = 0; + + QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) { + if (reventry->vaddr_req == buffer) { + paddr_index = reventry->paddr_index; + found = 1; + break; + } + } + if (!found) { + return; + } + QTAILQ_REMOVE(&mapcache->locked_entries, reventry, next); + qemu_free(reventry); + + entry = &mapcache->entry[paddr_index % mapcache->nr_buckets]; + while (entry && entry->paddr_index != paddr_index) { + pentry = entry; + entry = entry->next; + } + if (!entry) { + return; + } + entry->lock--; + if (entry->lock > 0) { + entry->lock--; + } +} + ram_addr_t qemu_ram_addr_from_mapcache(void *ptr) { MapCacheRev *reventry; -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 12/15] vl.c: Introduce getter for shutdown_requested and reset_requested.
From: Anthony PERARD <anthony.perard@citrix.com> Introduce two functions qemu_shutdown_requested_get and qemu_reset_requested_get to get the value of shutdown/reset_requested without reset it. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Alexander Graf <agraf@suse.de> --- sysemu.h | 2 ++ vl.c | 10 ++++++++++ 2 files changed, 12 insertions(+), 0 deletions(-) diff --git a/sysemu.h b/sysemu.h index 0a83ab9..37992b6 100644 --- a/sysemu.h +++ b/sysemu.h @@ -63,6 +63,8 @@ void qemu_system_shutdown_request(void); void qemu_system_powerdown_request(void); void qemu_system_debug_request(void); void qemu_system_vmstop_request(int reason); +int qemu_shutdown_requested_get(void); +int qemu_reset_requested_get(void); int qemu_shutdown_requested(void); int qemu_reset_requested(void); int qemu_powerdown_requested(void); diff --git a/vl.c b/vl.c index 910b000..f7d317e 100644 --- a/vl.c +++ b/vl.c @@ -1222,6 +1222,16 @@ static int powerdown_requested; static int debug_requested; static int vmstop_requested; +int qemu_shutdown_requested_get(void) +{ + return shutdown_requested; +} + +int qemu_reset_requested_get(void) +{ + return reset_requested; +} + int qemu_shutdown_requested(void) { int r = shutdown_requested; -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 13/15] xen: Initialize event channels and io rings
From: Arun Sharma <arun.sharma@intel.com> Open and bind event channels; map ioreq and buffered ioreq rings. Signed-off-by: Arun Sharma <arun.sharma@intel.com> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Alexander Graf <agraf@suse.de> --- hw/xen_common.h | 2 + xen-all.c | 411 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 413 insertions(+), 0 deletions(-) diff --git a/hw/xen_common.h b/hw/xen_common.h index 5a36642..a5fc74b 100644 --- a/hw/xen_common.h +++ b/hw/xen_common.h @@ -76,4 +76,6 @@ static inline int xc_fd(xc_interface *xen_xc) } #endif +void destroy_hvm_domain(void); + #endif /* QEMU_HW_XEN_COMMON_H */ diff --git a/xen-all.c b/xen-all.c index 03d1e90..f96fd7d 100644 --- a/xen-all.c +++ b/xen-all.c @@ -6,12 +6,58 @@ * */ +#include <sys/mman.h> + #include "hw/pci.h" #include "hw/xen_common.h" #include "hw/xen_backend.h" #include "xen-mapcache.h" +#include <xen/hvm/ioreq.h> +#include <xen/hvm/params.h> + +//#define DEBUG_XEN + +#ifdef DEBUG_XEN +#define DPRINTF(fmt, ...) \ + do { fprintf(stderr, "xen: " fmt, ## __VA_ARGS__); } while (0) +#else +#define DPRINTF(fmt, ...) \ + do { } while (0) +#endif + +/* Compatibility with older version */ +#if __XEN_LATEST_INTERFACE_VERSION__ < 0x0003020a +# define xen_vcpu_eport(shared_page, i) \ + (shared_page->vcpu_iodata[i].vp_eport) +# define xen_vcpu_ioreq(shared_page, vcpu) \ + (shared_page->vcpu_iodata[vcpu].vp_ioreq) +# define FMT_ioreq_size PRIx64 +#else +# define xen_vcpu_eport(shared_page, i) \ + (shared_page->vcpu_ioreq[i].vp_eport) +# define xen_vcpu_ioreq(shared_page, vcpu) \ + (shared_page->vcpu_ioreq[vcpu]) +# define FMT_ioreq_size "u" +#endif + +#define BUFFER_IO_MAX_DELAY 100 + +typedef struct XenIOState { + shared_iopage_t *shared_page; + buffered_iopage_t *buffered_io_page; + QEMUTimer *buffered_io_timer; + /* the evtchn port for polling the notification, */ + evtchn_port_t *ioreq_local_port; + /* the evtchn fd for polling */ + XenEvtchn xce_handle; + /* which vcpu we are serving */ + int send_vcpu; + + Notifier exit; +} XenIOState; + /* Xen specific function for piix pci */ int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num) @@ -112,19 +158,384 @@ void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size) } +/* VCPU Operations, MMIO, IO ring ... */ + +/* get the ioreq packets from share mem */ +static ioreq_t *cpu_get_ioreq_from_shared_memory(XenIOState *state, int vcpu) +{ + ioreq_t *req = xen_vcpu_ioreq(&state->shared_page, vcpu); + + if (req->state != STATE_IOREQ_READY) { + DPRINTF("I/O request not ready: " + "%x, ptr: %x, port: %"PRIx64", " + "data: %"PRIx64", count: %" FMT_ioreq_size ", size: %" FMT_ioreq_size "\n", + req->state, req->data_is_ptr, req->addr, + req->data, req->count, req->size); + return NULL; + } + + xen_rmb(); /* see IOREQ_READY /then/ read contents of ioreq */ + + req->state = STATE_IOREQ_INPROCESS; + return req; +} + +/* use poll to get the port notification */ +/* ioreq_vec--out,the */ +/* retval--the number of ioreq packet */ +static ioreq_t *cpu_get_ioreq(XenIOState *state) +{ + int i; + evtchn_port_t port; + + port = xc_evtchn_pending(state->xce_handle); + if (port != -1) { + for (i = 0; i < smp_cpus; i++) { + if (state->ioreq_local_port[i] == port) { + break; + } + } + + if (i == smp_cpus) { + hw_error("Fatal error while trying to get io event!\n"); + } + + /* unmask the wanted port again */ + xc_evtchn_unmask(state->xce_handle, port); + + /* get the io packet from shared memory */ + state->send_vcpu = i; + return cpu_get_ioreq_from_shared_memory(state, i); + } + + /* read error or read nothing */ + return NULL; +} + +static uint32_t do_inp(pio_addr_t addr, unsigned long size) +{ + switch (size) { + case 1: + return cpu_inb(addr); + case 2: + return cpu_inw(addr); + case 4: + return cpu_inl(addr); + default: + hw_error("inp: bad size: %04"FMT_pioaddr" %lx", addr, size); + } +} + +static void do_outp(pio_addr_t addr, + unsigned long size, uint32_t val) +{ + switch (size) { + case 1: + return cpu_outb(addr, val); + case 2: + return cpu_outw(addr, val); + case 4: + return cpu_outl(addr, val); + default: + hw_error("outp: bad size: %04"FMT_pioaddr" %lx", addr, size); + } +} + +static void cpu_ioreq_pio(ioreq_t *req) +{ + int i, sign; + + sign = req->df ? -1 : 1; + + if (req->dir == IOREQ_READ) { + if (!req->data_is_ptr) { + req->data = do_inp(req->addr, req->size); + } else { + uint32_t tmp; + + for (i = 0; i < req->count; i++) { + tmp = do_inp(req->addr, req->size); + cpu_physical_memory_write(req->data + (sign * i * req->size), + (uint8_t *) &tmp, req->size); + } + } + } else if (req->dir == IOREQ_WRITE) { + if (!req->data_is_ptr) { + do_outp(req->addr, req->size, req->data); + } else { + for (i = 0; i < req->count; i++) { + uint32_t tmp = 0; + + cpu_physical_memory_read(req->data + (sign * i * req->size), + (uint8_t*) &tmp, req->size); + do_outp(req->addr, req->size, tmp); + } + } + } +} + +static void cpu_ioreq_move(ioreq_t *req) +{ + int i, sign; + + sign = req->df ? -1 : 1; + + if (!req->data_is_ptr) { + if (req->dir == IOREQ_READ) { + for (i = 0; i < req->count; i++) { + cpu_physical_memory_read(req->addr + (sign * i * req->size), + (uint8_t *) &req->data, req->size); + } + } else if (req->dir == IOREQ_WRITE) { + for (i = 0; i < req->count; i++) { + cpu_physical_memory_write(req->addr + (sign * i * req->size), + (uint8_t *) &req->data, req->size); + } + } + } else { + target_ulong tmp; + + if (req->dir == IOREQ_READ) { + for (i = 0; i < req->count; i++) { + cpu_physical_memory_read(req->addr + (sign * i * req->size), + (uint8_t*) &tmp, req->size); + cpu_physical_memory_write(req->data + (sign * i * req->size), + (uint8_t*) &tmp, req->size); + } + } else if (req->dir == IOREQ_WRITE) { + for (i = 0; i < req->count; i++) { + cpu_physical_memory_read(req->data + (sign * i * req->size), + (uint8_t*) &tmp, req->size); + cpu_physical_memory_write(req->addr + (sign * i * req->size), + (uint8_t*) &tmp, req->size); + } + } + } +} + +static void handle_ioreq(ioreq_t *req) +{ + if (!req->data_is_ptr && (req->dir == IOREQ_WRITE) && + (req->size < sizeof (target_ulong))) { + req->data &= ((target_ulong) 1 << (8 * req->size)) - 1; + } + + switch (req->type) { + case IOREQ_TYPE_PIO: + cpu_ioreq_pio(req); + break; + case IOREQ_TYPE_COPY: + cpu_ioreq_move(req); + break; + case IOREQ_TYPE_TIMEOFFSET: + break; + case IOREQ_TYPE_INVALIDATE: + qemu_invalidate_map_cache(); + break; + default: + hw_error("Invalid ioreq type 0x%x\n", req->type); + } +} + +static void handle_buffered_iopage(XenIOState *state) +{ + buf_ioreq_t *buf_req = NULL; + ioreq_t req; + int qw; + + if (!state->buffered_io_page) { + return; + } + + while (state->buffered_io_page->read_pointer != state->buffered_io_page->write_pointer) { + buf_req = &state->buffered_io_page->buf_ioreq[ + state->buffered_io_page->read_pointer % IOREQ_BUFFER_SLOT_NUM]; + req.size = 1UL << buf_req->size; + req.count = 1; + req.addr = buf_req->addr; + req.data = buf_req->data; + req.state = STATE_IOREQ_READY; + req.dir = buf_req->dir; + req.df = 1; + req.type = buf_req->type; + req.data_is_ptr = 0; + qw = (req.size == 8); + if (qw) { + buf_req = &state->buffered_io_page->buf_ioreq[ + (state->buffered_io_page->read_pointer + 1) % IOREQ_BUFFER_SLOT_NUM]; + req.data |= ((uint64_t)buf_req->data) << 32; + } + + handle_ioreq(&req); + + xen_mb(); + state->buffered_io_page->read_pointer += qw ? 2 : 1; + } +} + +static void handle_buffered_io(void *opaque) +{ + XenIOState *state = opaque; + + handle_buffered_iopage(state); + qemu_mod_timer(state->buffered_io_timer, + BUFFER_IO_MAX_DELAY + qemu_get_clock(rt_clock)); +} + +static void cpu_handle_ioreq(void *opaque) +{ + XenIOState *state = opaque; + ioreq_t *req = cpu_get_ioreq(state); + + handle_buffered_iopage(state); + if (req) { + handle_ioreq(req); + + if (req->state != STATE_IOREQ_INPROCESS) { + fprintf(stderr, "Badness in I/O request ... not in service?!: " + "%x, ptr: %x, port: %"PRIx64", " + "data: %"PRIx64", count: %" FMT_ioreq_size ", size: %" FMT_ioreq_size "\n", + req->state, req->data_is_ptr, req->addr, + req->data, req->count, req->size); + destroy_hvm_domain(); + return; + } + + xen_wmb(); /* Update ioreq contents /then/ update state. */ + + /* + * We do this before we send the response so that the tools + * have the opportunity to pick up on the reset before the + * guest resumes and does a hlt with interrupts disabled which + * causes Xen to powerdown the domain. + */ + if (vm_running) { + if (qemu_shutdown_requested_get()) { + destroy_hvm_domain(); + } + if (qemu_reset_requested_get()) { + qemu_system_reset(); + } + } + + req->state = STATE_IORESP_READY; + xc_evtchn_notify(state->xce_handle, state->ioreq_local_port[state->send_vcpu]); + } +} + +static void xen_main_loop_prepare(XenIOState *state) +{ + int evtchn_fd = -1; + + if (state->xce_handle != XC_HANDLER_INITIAL_VALUE) { + evtchn_fd = xc_evtchn_fd(state->xce_handle); + } + + state->buffered_io_timer = qemu_new_timer(rt_clock, handle_buffered_io, + state); + qemu_mod_timer(state->buffered_io_timer, qemu_get_clock(rt_clock)); + + if (evtchn_fd != -1) { + qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, state); + } +} + + /* Initialise Xen */ +static void xen_vm_change_state_handler(void *opaque, int running, int reason) +{ + XenIOState *state = opaque; + if (running) { + xen_main_loop_prepare(state); + } +} + +static void xen_exit_notifier(Notifier *n) +{ + XenIOState *state = container_of(n, XenIOState, exit); + + xc_evtchn_close(state->xce_handle); +} + int xen_init(void) { + int i, rc; + unsigned long ioreq_pfn; + XenIOState *state; + xen_xc = xc_interface_open(0, 0, 0); if (xen_xc == XC_HANDLER_INITIAL_VALUE) { xen_be_printf(NULL, 0, "can''t open xen interface\n"); return -1; } + state = qemu_mallocz(sizeof (XenIOState)); + + state->xce_handle = xc_evtchn_open(NULL, 0); + if (state->xce_handle == XC_HANDLER_INITIAL_VALUE) { + perror("xen: event channel open"); + return -errno; + } + + state->exit.notify = xen_exit_notifier; + qemu_add_exit_notifier(&state->exit); + + xc_get_hvm_param(xen_xc, xen_domid, HVM_PARAM_IOREQ_PFN, &ioreq_pfn); + DPRINTF("shared page at pfn %lx\n", ioreq_pfn); + state->shared_page = xc_map_foreign_range(xen_xc, xen_domid, XC_PAGE_SIZE, + PROT_READ|PROT_WRITE, ioreq_pfn); + if (state->shared_page == NULL) { + hw_error("map shared IO page returned error %d handle=" XC_INTERFACE_FMT, + errno, xen_xc); + } + + xc_get_hvm_param(xen_xc, xen_domid, HVM_PARAM_BUFIOREQ_PFN, &ioreq_pfn); + DPRINTF("buffered io page at pfn %lx\n", ioreq_pfn); + state->buffered_io_page = xc_map_foreign_range(xen_xc, xen_domid, XC_PAGE_SIZE, + PROT_READ|PROT_WRITE, ioreq_pfn); + if (state->buffered_io_page == NULL) { + hw_error("map buffered IO page returned error %d", errno); + } + + state->ioreq_local_port = qemu_mallocz(smp_cpus * sizeof (evtchn_port_t)); + + /* FIXME: how about if we overflow the page here? */ + for (i = 0; i < smp_cpus; i++) { + rc = xc_evtchn_bind_interdomain(state->xce_handle, xen_domid, + xen_vcpu_eport(state->shared_page, i)); + if (rc == -1) { + fprintf(stderr, "bind interdomain ioctl error %d\n", errno); + return -1; + } + state->ioreq_local_port[i] = rc; + } + /* Init RAM management */ qemu_map_cache_init(); xen_ram_init(ram_size); + qemu_add_vm_change_state_handler(xen_vm_change_state_handler, state); + return 0; } + +void destroy_hvm_domain(void) +{ + XenXC xc_handle; + int sts; + + xc_handle = xc_interface_open(0, 0, 0); + if (xc_handle == XC_HANDLER_INITIAL_VALUE) { + fprintf(stderr, "Cannot acquire xenctrl handle\n"); + } else { + sts = xc_domain_shutdown(xc_handle, xen_domid, SHUTDOWN_poweroff); + if (sts != 0) { + fprintf(stderr, "? xc_domain_shutdown failed to issue poweroff, " + "sts %d, %s\n", sts, strerror(errno)); + } else { + fprintf(stderr, "Issued domain %d poweroff\n", xen_domid); + } + xc_interface_close(xc_handle); + } +} -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 14/15] xen: Set running state in xenstore.
From: Anthony PERARD <anthony.perard@citrix.com> This tells to the xen management tool that the machine can begin run. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Acked-by: Alexander Graf <agraf@suse.de> --- xen-all.c | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-) diff --git a/xen-all.c b/xen-all.c index f96fd7d..279efd0 100644 --- a/xen-all.c +++ b/xen-all.c @@ -55,6 +55,8 @@ typedef struct XenIOState { /* which vcpu we are serving */ int send_vcpu; + struct xs_handle *xenstore; + Notifier exit; } XenIOState; @@ -423,6 +425,17 @@ static void cpu_handle_ioreq(void *opaque) } } +static void xenstore_record_dm_state(XenIOState *s, const char *state) +{ + char path[50]; + + snprintf(path, sizeof (path), "/local/domain/0/device-model/%u/state", xen_domid); + if (!xs_write(s->xenstore, XBT_NULL, path, state, strlen(state))) { + fprintf(stderr, "error recording dm state\n"); + exit(1); + } +} + static void xen_main_loop_prepare(XenIOState *state) { int evtchn_fd = -1; @@ -438,6 +451,9 @@ static void xen_main_loop_prepare(XenIOState *state) if (evtchn_fd != -1) { qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, state); } + + /* record state running */ + xenstore_record_dm_state(state, "running"); } @@ -456,6 +472,7 @@ static void xen_exit_notifier(Notifier *n) XenIOState *state = container_of(n, XenIOState, exit); xc_evtchn_close(state->xce_handle); + xs_daemon_close(state->xenstore); } int xen_init(void) @@ -478,6 +495,12 @@ int xen_init(void) return -errno; } + state->xenstore = xs_daemon_open(); + if (state->xenstore == NULL) { + perror("xen: xenstore open"); + return -errno; + } + state->exit.notify = xen_exit_notifier; qemu_add_exit_notifier(&state->exit); -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
anthony.perard@citrix.com
2011-Mar-01 18:35 UTC
[Xen-devel] [PATCH V11 15/15] xen: Add Xen hypercall for sleep state in the cmos_s3 callback.
From: Anthony PERARD <anthony.perard@citrix.com> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> --- hw/pc_piix.c | 6 +++++- hw/xen.h | 1 + xen-all.c | 9 +++++++++ xen-stub.c | 4 ++++ 4 files changed, 19 insertions(+), 1 deletions(-) diff --git a/hw/pc_piix.c b/hw/pc_piix.c index 1d55bc9..5ec7d7f 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -181,7 +181,11 @@ static void pc_init1(ram_addr_t ram_size, uint8_t *eeprom_buf = qemu_mallocz(8 * 256); /* XXX: make this persistent */ i2c_bus *smbus; - cmos_s3 = qemu_allocate_irqs(pc_cmos_set_s3_resume, rtc_state, 1); + if (!xen_enabled()) { + cmos_s3 = qemu_allocate_irqs(pc_cmos_set_s3_resume, rtc_state, 1); + } else { + cmos_s3 = qemu_allocate_irqs(xen_cmos_set_s3_resume, rtc_state, 1); + } smi_irq = qemu_allocate_irqs(pc_acpi_smi_interrupt, first_cpu, 1); /* TODO: Populate SPD eeprom data. */ smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100, diff --git a/hw/xen.h b/hw/xen.h index e26d061..d8ee1e4 100644 --- a/hw/xen.h +++ b/hw/xen.h @@ -43,6 +43,7 @@ static inline int xen_mapcache_enabled(void) int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num); void xen_piix3_set_irq(void *opaque, int irq_num, int level); void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len); +void xen_cmos_set_s3_resume(void *opaque, int irq, int level); qemu_irq *xen_interrupt_controller_init(void); diff --git a/xen-all.c b/xen-all.c index 279efd0..09e3792 100644 --- a/xen-all.c +++ b/xen-all.c @@ -9,6 +9,7 @@ #include <sys/mman.h> #include "hw/pci.h" +#include "hw/pc.h" #include "hw/xen_common.h" #include "hw/xen_backend.h" @@ -90,6 +91,14 @@ void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) } } +void xen_cmos_set_s3_resume(void *opaque, int irq, int level) +{ + pc_cmos_set_s3_resume(opaque, irq, level); + if (level) { + xc_set_hvm_param(xen_xc, xen_domid, HVM_PARAM_ACPI_S_STATE, 3); + } +} + /* Xen Interrupt Controller */ static void xen_set_irq(void *opaque, int irq, int level) diff --git a/xen-stub.c b/xen-stub.c index eebc223..718eb05 100644 --- a/xen-stub.c +++ b/xen-stub.c @@ -22,6 +22,10 @@ void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) { } +void xen_cmos_set_s3_resume(void *opaque, int irq, int level) +{ +} + void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size) { } -- 1.7.2.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Anthony Liguori
2011-Mar-11 16:29 UTC
[Xen-devel] Re: [Qemu-devel] [PATCH V11 00/15] Xen device model support
On 03/01/2011 12:35 PM, anthony.perard@citrix.com wrote:> From: Anthony PERARD<anthony.perard@citrix.com> > > Hi all, > > Here is the few change since the V10: > > - Add braces for blocks with single statement in the clean-up patch; > - the patch that builds Xen only for x86 have been removed, instead, > xen_domainbuild is built with libhw and other Xen files are built for i386 > target only; > - the redirection structure with function pointer have been removed, instead, > there are few #define or static inline function use for the compatibility; > - the platform device uses trace instead of dprintf for guest log; > - introduce i440fx_xen_init and i440fx_common_init to avoid xen_enabled() in > piix_pci. > > > > This series depends on the series "Introduce "machine" QemuOpts". > > You can find a git tree here: > > git://xenbits.xen.org/people/aperard/qemu-dm.git qemu-dm-v11I''ll go through this series as soon as I can, but I''d like Alex to review it to. Alex, do you mind looking through these patches and Ack''ing as appropriate? Regards, Anthony Liguori> > Anthony PERARD (12): > xen: Replace some tab-indents with spaces (clean-up). > xen: Make Xen build once. > xen: Support new libxc calls from xen unstable. > xen: Add initialisation of Xen > xen: Add xenfv machine > piix_pci: Introduces Xen specific call for irq. > xen: Introduce Xen Interrupt Controller > configure: Always use 64bits target physical addresses with xen > enabled. > Introduce qemu_put_ram_ptr > vl.c: Introduce getter for shutdown_requested and reset_requested. > xen: Set running state in xenstore. > xen: Add Xen hypercall for sleep state in the cmos_s3 callback. > > Arun Sharma (1): > xen: Initialize event channels and io rings > > Jun Nakajima (1): > xen: Introduce the Xen mapcache > > Steven Smith (1): > xen: Add the Xen platform pci device > > Makefile.objs | 3 + > Makefile.target | 16 ++- > configure | 71 ++++++- > cpu-common.h | 1 + > exec.c | 50 ++++- > hw/hw.h | 3 + > hw/pc.c | 19 ++- > hw/pc.h | 1 + > hw/pc_piix.c | 41 ++++- > hw/pci_ids.h | 2 + > hw/piix_pci.c | 47 ++++- > hw/xen.h | 41 ++++ > hw/xen_backend.c | 422 ++++++++++++++++++++----------------- > hw/xen_backend.h | 6 +- > hw/xen_common.h | 75 ++++++-- > hw/xen_disk.c | 496 +++++++++++++++++++++++-------------------- > hw/xen_domainbuild.c | 13 +- > hw/xen_domainbuild.h | 5 +- > hw/xen_machine_pv.c | 2 +- > hw/xen_nic.c | 265 +++++++++++++----------- > hw/xen_platform.c | 349 ++++++++++++++++++++++++++++++ > sysemu.h | 2 + > trace-events | 3 + > vl.c | 12 + > xen-all.c | 573 ++++++++++++++++++++++++++++++++++++++++++++++++++ > xen-mapcache-stub.c | 40 ++++ > xen-mapcache.c | 344 ++++++++++++++++++++++++++++++ > xen-mapcache.h | 22 ++ > xen-stub.c | 45 ++++ > 29 files changed, 2386 insertions(+), 583 deletions(-) > create mode 100644 hw/xen_platform.c > create mode 100644 xen-all.c > create mode 100644 xen-mapcache-stub.c > create mode 100644 xen-mapcache.c > create mode 100644 xen-mapcache.h > create mode 100644 xen-stub.c >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-11 20:47 UTC
[Xen-devel] Re: [Qemu-devel] [PATCH V11 00/15] Xen device model support
On 11.03.2011, at 17:29, Anthony Liguori wrote:> On 03/01/2011 12:35 PM, anthony.perard@citrix.com wrote: >> From: Anthony PERARD<anthony.perard@citrix.com> >> >> Hi all, >> >> Here is the few change since the V10: >> >> - Add braces for blocks with single statement in the clean-up patch; >> - the patch that builds Xen only for x86 have been removed, instead, >> xen_domainbuild is built with libhw and other Xen files are built for i386 >> target only; >> - the redirection structure with function pointer have been removed, instead, >> there are few #define or static inline function use for the compatibility; >> - the platform device uses trace instead of dprintf for guest log; >> - introduce i440fx_xen_init and i440fx_common_init to avoid xen_enabled() in >> piix_pci. >> >> >> >> This series depends on the series "Introduce "machine" QemuOpts". >> >> You can find a git tree here: >> >> git://xenbits.xen.org/people/aperard/qemu-dm.git qemu-dm-v11 > > I''ll go through this series as soon as I can, but I''d like Alex to review it to. > > Alex, do you mind looking through these patches and Ack''ing as appropriate?Oh, sure. I was mostly waiting for others to comment on it before I go through it and ack it again. Has it evolved to that point now? I''d gladly go through and ack everything as appropriate then. Alex _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-22 14:23 UTC
[Xen-devel] Re: [Qemu-devel] [PATCH V11 00/15] Xen device model support
On 03/01/2011 07:35 PM, anthony.perard@citrix.com wrote:> From: Anthony PERARD<anthony.perard@citrix.com> > > Hi all, > > Here is the few change since the V10: > > - Add braces for blocks with single statement in the clean-up patch; > - the patch that builds Xen only for x86 have been removed, instead, > xen_domainbuild is built with libhw and other Xen files are built for i386 > target only; > - the redirection structure with function pointer have been removed, instead, > there are few #define or static inline function use for the compatibility;ARGH! The point of the redirection structure was so I can plug in with xenner and replace all the xen calls with in-qemu versions. If you remove it, I''ll have to put it back in in the xenner patch set :(. We need some sort of abstraction between calling xs_ functions and actually calling them. Wrapping all xs_ calls in static inlines would be fine for that, as would the indirect calling table. Alex _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Anthony PERARD
2011-Mar-22 14:47 UTC
Re: [Xen-devel] Re: [Qemu-devel] [PATCH V11 00/15] Xen device model support
On Tue, Mar 22, 2011 at 14:23, Alexander Graf <agraf@suse.de> wrote:> On 03/01/2011 07:35 PM, anthony.perard@citrix.com wrote: >> >> From: Anthony PERARD<anthony.perard@citrix.com> >> >> Hi all, >> >> Here is the few change since the V10: >> >> - Add braces for blocks with single statement in the clean-up patch; >> - the patch that builds Xen only for x86 have been removed, instead, >> xen_domainbuild is built with libhw and other Xen files are built for >> i386 >> target only; >> - the redirection structure with function pointer have been removed, >> instead, >> there are few #define or static inline function use for the >> compatibility; > > ARGH! > > The point of the redirection structure was so I can plug in with xenner and > replace all the xen calls with in-qemu versions. If you remove it, I''ll have > to put it back in in the xenner patch set :(. > > We need some sort of abstraction between calling xs_ functions and actually > calling them. Wrapping all xs_ calls in static inlines would be fine for > that, as would the indirect calling table.As my series doesn''t change a lot of things in the xen code, I think it is better than you put it back in your patch set. Regards, -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-22 15:13 UTC
Re: [Xen-devel] Re: [Qemu-devel] [PATCH V11 00/15] Xen device model support
On 03/22/2011 03:47 PM, Anthony PERARD wrote:> On Tue, Mar 22, 2011 at 14:23, Alexander Graf<agraf@suse.de> wrote: >> On 03/01/2011 07:35 PM, anthony.perard@citrix.com wrote: >>> From: Anthony PERARD<anthony.perard@citrix.com> >>> >>> Hi all, >>> >>> Here is the few change since the V10: >>> >>> - Add braces for blocks with single statement in the clean-up patch; >>> - the patch that builds Xen only for x86 have been removed, instead, >>> xen_domainbuild is built with libhw and other Xen files are built for >>> i386 >>> target only; >>> - the redirection structure with function pointer have been removed, >>> instead, >>> there are few #define or static inline function use for the >>> compatibility; >> ARGH! >> >> The point of the redirection structure was so I can plug in with xenner and >> replace all the xen calls with in-qemu versions. If you remove it, I''ll have >> to put it back in in the xenner patch set :(. >> >> We need some sort of abstraction between calling xs_ functions and actually >> calling them. Wrapping all xs_ calls in static inlines would be fine for >> that, as would the indirect calling table. > As my series doesn''t change a lot of things in the xen code, I think > it is better than you put it back in your patch set.Ok, I''ll try to see if I can get things based on top of your patch set, then do actual code review. Alex _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-22 15:40 UTC
Re: [Xen-devel] Re: [Qemu-devel] [PATCH V11 00/15] Xen device model support
On 03/22/2011 03:47 PM, Anthony PERARD wrote:> On Tue, Mar 22, 2011 at 14:23, Alexander Graf<agraf@suse.de> wrote: >> On 03/01/2011 07:35 PM, anthony.perard@citrix.com wrote: >>> From: Anthony PERARD<anthony.perard@citrix.com> >>> >>> Hi all, >>> >>> Here is the few change since the V10: >>> >>> - Add braces for blocks with single statement in the clean-up patch; >>> - the patch that builds Xen only for x86 have been removed, instead, >>> xen_domainbuild is built with libhw and other Xen files are built for >>> i386 >>> target only; >>> - the redirection structure with function pointer have been removed, >>> instead, >>> there are few #define or static inline function use for the >>> compatibility; >> ARGH! >> >> The point of the redirection structure was so I can plug in with xenner and >> replace all the xen calls with in-qemu versions. If you remove it, I''ll have >> to put it back in in the xenner patch set :(. >> >> We need some sort of abstraction between calling xs_ functions and actually >> calling them. Wrapping all xs_ calls in static inlines would be fine for >> that, as would the indirect calling table. > As my series doesn''t change a lot of things in the xen code, I think > it is better than you put it back in your patch set.Hrm. This is on a SLES11SP1 system w/ Xen 4.0.1. Alex agraf@toonie:/dev/shm> git clone git://xenbits.xen.org/people/aperard/qemu-dm.git Initialized empty Git repository in /dev/shm/qemu-dm/.git/ remote: Counting objects: 74570, done. remote: Compressing objects: 100% (15699/15699), done. remote: Total 74570 (delta 59960), reused 73357 (delta 58769) Receiving objects: 100% (74570/74570), 22.24 MiB | 1296 KiB/s, done. Resolving deltas: 100% (59960/59960), done. agraf@toonie:/dev/shm/qemu-dm> git checkout origin/qemu-dm-v11 Note: moving to "origin/qemu-dm-v11" which isn''t a local branch If you want to create a new branch from this checkout, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new_branch_name> HEAD is now at 47d548f... xen: Add Xen hypercall for sleep state in the cmos_s3 callback. agraf@toonie:/dev/shm/qemu-dm> ./configure --target-list=x86_64-softmmu make -j Install prefix /usr/local BIOS directory /usr/local/share/qemu binary directory /usr/local/bin config directory /usr/local/etc Manual directory /usr/local/share/man ELF interp prefix /usr/gnemul/qemu-%M Source path /dev/shm/qemu-dm C compiler gcc Host C compiler gcc CFLAGS -O2 -g QEMU_CFLAGS -Werror -m64 -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wendif-labels -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fstack-protector-all -Wmissing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits LDFLAGS -Wl,--warn-common -m64 -g make make install install host CPU x86_64 host big endian no target list x86_64-softmmu tcg debug enabled no Mon debug enabled no gprof enabled no sparse enabled no strip binaries yes profiler no static build no -Werror enabled yes SDL support yes curses support yes curl support yes check support no mingw32 support no Audio drivers oss Extra audio cards ac97 es1370 sb16 hda Block whitelist Mixer emulation no VNC TLS support no VNC SASL support no VNC JPEG support yes VNC PNG support yes VNC thread no xen support yes brlapi support no bluez support no Documentation yes NPTL support yes GUEST_BASE yes PIE user targets no vde support no IO thread no Linux AIO support no ATTR/XATTR support yes Install blobs yes KVM support yes fdt support no preadv support yes fdatasync yes madvise yes posix_madvise yes uuid support yes vhost-net support no Trace backend nop Trace output file trace-<pid> spice support no rbd support no xfsctl support no agraf@toonie:/dev/shm/qemu-dm> make -j GEN x86_64-softmmu/config-devices.mak GEN config-all-devices.mak GEN qemu-options.texi GEN qemu-img-cmds.texi GEN qemu-monitor.texi GEN qemu-nbd.8 GEN qemu-tech.html GEN config-host.h GEN QMP/qmp-commands.txt GEN trace.h GEN qemu-options.def GEN trace.c GEN qemu-img-cmds.h GEN qemu-img.1 AS optionrom/multiboot.o AS optionrom/linuxboot.o Building optionrom/linuxboot.img Building optionrom/multiboot.img Building optionrom/linuxboot.raw Building optionrom/multiboot.raw Signing optionrom/multiboot.bin Signing optionrom/linuxboot.bin GEN qemu-doc.html GEN qemu.1 CC qemu-nbd.o CC qemu-tool.o CC qemu-error.o CC osdep.o CC oslib-posix.o CC trace.o CC cutils.o CC qemu-option.o CC module.o CC nbd.o CC block.o CC qemu-malloc.o CC cache-utils.o CC aio.o CC aes.o CC qemu-config.o CC posix-aio-compat.o CC block/raw.o CC block/cow.o CC block/qcow.o CC block/vdi.o CC block/vmdk.o CC block/cloop.o CC block/dmg.o CC block/bochs.o CC block/vpc.o CC block/vvfat.o CC block/qcow2.o CC block/qcow2-refcount.o CC block/qcow2-cluster.o CC block/qcow2-snapshot.o CC block/qcow2-cache.o CC block/qed.o CC block/qed-gencb.o CC block/qed-l2-cache.o CC block/qed-table.o CC block/qed-cluster.o CC block/qed-check.o CC block/parallels.o CC block/nbd.o CC block/blkdebug.o CC block/sheepdog.o CC block/blkverify.o CC block/raw-posix.o CC block/curl.o CC qint.o CC qstring.o CC qdict.o CC qlist.o CC qfloat.o CC qbool.o CC qjson.o CC json-lexer.o CC json-streamer.o CC json-parser.o CC qerror.o CC qemu-timer-common.o CC qemu-img.o CC qemu-io.o CC cmd.o CC blockdev.o CC net.o CC libhw64/vl.o CC libhw64/virtio.o CC libhw64/loader.o CC net/queue.o CC libhw64/virtio-console.o CC libhw64/fw_cfg.o CC net/checksum.o CC net/util.o CC libhw64/pci.o CC net/socket.o CC libhw64/pci_bridge.o CC libhw64/msix.o CC net/dump.o CC libhw64/msi.o CC libhw64/pci_host.o CC libhw64/pcie_host.o CC libhw64/ioh3420.o CC net/tap.o CC libhw64/xio3130_upstream.o CC net/tap-linux.o CC fsdev/qemu-fsdev.o CC net/slirp.o CC libhw64/xio3130_downstream.o CC libhw64/watchdog.o CC libhw64/serial.o CC libhw64/parallel.o CC readline.o CC console.o CC libhw64/i8254.o CC libhw64/pcspk.o CC cursor.o CC libhw64/pckbd.o CC async.o CC os-posix.o CC tcg-runtime.o CC host-utils.o CC irq.o CC libhw64/usb-uhci.o CC libhw64/usb-ohci.o CC ioport.o CC libhw64/fdc.o CC libhw64/acpi.o CC libhw64/acpi_piix4.o CC input.o CC libhw64/pm_smbus.o CC libhw64/apm.o CC i2c.o CC libhw64/dma.o CC smbus.o CC libhw64/hpet.o CC smbus_eeprom.o CC libhw64/applesmc.o CC eeprom93xx.o CC libhw64/wdt_i6300esb.o CC scsi-disk.o CC libhw64/pcie.o CC cdrom.o CC scsi-generic.o CC libhw64/pcie_aer.o CC libhw64/pcie_port.o CC scsi-bus.o CC usb.o CC libhw64/ne2000.o CC usb-hub.o CC usb-linux.o CC libhw64/eepro100.o CC usb-hid.o CC usb-msd.o CC usb-wacom.o CC libhw64/pcnet-pci.o CC usb-serial.o CC usb-net.o CC libhw64/pcnet.o CC usb-bus.o CC usb-desc.o CC libhw64/e1000.o CC libhw64/rtl8139.o CC bt.o CC libhw64/ne2000-isa.o CC libhw64/ide/core.o CC libhw64/ide/qdev.o CC bt-host.o CC libhw64/ide/pci.o CC bt-vhci.o CC libhw64/ide/isa.o CC bt-l2cap.o CC bt-sdp.o CC libhw64/ide/piix.o CC bt-hci.o CC bt-hid.o CC usb-bt.o CC libhw64/ide/ahci.o CC bt-hci-csr.o CC buffered_file.o CC libhw64/ide/ich.o CC migration.o CC migration-tcp.o CC qemu-sockets.o CC libhw64/lsi53c895a.o CC qemu-char.o CC libhw64/dma-helpers.o CC savevm.o CC msmouse.o CC libhw64/sysbus.o CC libhw64/isa-bus.o CC libhw64/qdev-addr.o CC ps2.o CC libhw64/vga-pci.o CC qdev.o CC libhw64/vga-isa.o CC qdev-properties.o CC block-migration.o CC libhw64/vmware_vga.o CC pflib.o CC libhw64/xen_domainbuild.o CC libhw64/sb16.o CC bitmap.o CC bitops.o CC libhw64/es1370.o CC migration-exec.o CC migration-unix.o CC libhw64/ac97.o CC migration-fd.o CC audio/audio.o CC libhw64/intel-hda.o CC audio/noaudio.o CC libhw64/hda-audio.o CC libhw64/virtio-9p-debug.o CC audio/wavaudio.o CC libhw64/virtio-9p-local.o CC audio/mixeng.o CC audio/sdlaudio.o CC libhw64/virtio-9p-xattr.o CC audio/ossaudio.o CC libhw64/virtio-9p-xattr-user.o CC libhw64/virtio-9p-posix-acl.o CC audio/wavcapture.o CC ui/keymaps.o CC ui/sdl.o CC ui/sdl_zoom.o CC ui/x_keymap.o CC ui/curses.o CC ui/vnc.o CC ui/d3des.o CC ui/vnc-enc-zlib.o CC ui/vnc-enc-hextile.o CC ui/vnc-enc-tight.o CC ui/vnc-palette.o CC ui/vnc-enc-zrle.o CC ui/vnc-jobs-sync.o CC iov.o CC acl.o CC compatfd.o CC notify.o CC event_notifier.o CC qemu-timer.o CC slirp/cksum.o CC slirp/if.o CC slirp/ip_icmp.o CC slirp/ip_input.o CC slirp/ip_output.o CC slirp/slirp.o CC slirp/mbuf.o CC slirp/misc.o CC slirp/sbuf.o CC slirp/socket.o CC slirp/tcp_input.o CC slirp/tcp_output.o CC slirp/tcp_subr.o CC slirp/tcp_timer.o CC slirp/udp.o CC slirp/bootp.o CC slirp/tftp.o CC xen_backend.o CC xen_devconfig.o CC xen_console.o CC xenfb.o CC xen_disk.o CC xen_nic.o CC libdis/i386-dis.o LINK qemu-nbd LINK qemu-img LINK qemu-io rm multiboot.o linuxboot.raw linuxboot.img multiboot.raw multiboot.img linuxboot.o GEN config-target.h GEN x86_64-softmmu/qmp-commands.h GEN x86_64-softmmu/hmp-commands.h CC x86_64-softmmu/arch_init.o CC x86_64-softmmu/cpus.o CC x86_64-softmmu/gdbstub.o CC x86_64-softmmu/virtio-pci.o CC x86_64-softmmu/vhost_net.o CC x86_64-softmmu/machine.o CC x86_64-softmmu/balloon.o CC x86_64-softmmu/virtio-blk.o CC x86_64-softmmu/virtio-balloon.o CC x86_64-softmmu/virtio-net.o CC x86_64-softmmu/virtio-serial-bus.o CC x86_64-softmmu/rwhandler.o CC x86_64-softmmu/virtio-9p.o CC x86_64-softmmu/kvm.o CC x86_64-softmmu/kvm-all.o CC x86_64-softmmu/xen-stub.o CC x86_64-softmmu/ivshmem.o CC x86_64-softmmu/exec.o CC x86_64-softmmu/translate-all.o CC x86_64-softmmu/cpu-exec.o CC x86_64-softmmu/translate.o CC x86_64-softmmu/tcg/tcg.o CC x86_64-softmmu/fpu/softfloat-native.o CC x86_64-softmmu/op_helper.o CC x86_64-softmmu/helper.o CC x86_64-softmmu/cpuid.o CC x86_64-softmmu/disas.o CC x86_64-softmmu/xen_machine_pv.o CC x86_64-softmmu/xen-all.o CC x86_64-softmmu/xen-mapcache.o CC x86_64-softmmu/xen_platform.o CC x86_64-softmmu/vga.o CC x86_64-softmmu/mc146818rtc.o CC x86_64-softmmu/i8259.o CC x86_64-softmmu/pc.o CC x86_64-softmmu/cirrus_vga.o CC x86_64-softmmu/apic.o CC x86_64-softmmu/ioapic.o CC x86_64-softmmu/piix_pci.o CC x86_64-softmmu/vmport.o CC x86_64-softmmu/device-hotplug.o CC x86_64-softmmu/pci-hotplug.o CC x86_64-softmmu/smbios.o CC x86_64-softmmu/wdt_ib700.o CC x86_64-softmmu/debugcon.o CC x86_64-softmmu/multiboot.o CC x86_64-softmmu/pc_piix.o CC x86_64-softmmu/kvmclock.o CC x86_64-softmmu/monitor.o LINK x86_64-softmmu/qemu-system-x86_64 xen-all.o: In function `xen_pci_slot_get_pirq'': /dev/shm/qemu-dm/xen-all.c:67: multiple definition of `xen_pci_slot_get_pirq'' xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:13: first defined here xen-all.o: In function `xen_init'': /dev/shm/qemu-dm/xen-all.c:488: multiple definition of `xen_init'' xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:43: first defined here xen-all.o: In function `xen_ram_alloc'': /dev/shm/qemu-dm/xen-all.c:152: multiple definition of `xen_ram_alloc'' xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:30: first defined here xen-all.o: In function `xen_interrupt_controller_init'': /dev/shm/qemu-dm/xen-all.c:110: multiple definition of `xen_interrupt_controller_init'' xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:34: first defined here xen-all.o: In function `xen_cmos_set_s3_resume'': /dev/shm/qemu-dm/xen-all.c:95: multiple definition of `xen_cmos_set_s3_resume'' xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:26: first defined here xen-all.o: In function `xen_piix_pci_write_config_client'': /dev/shm/qemu-dm/xen-all.c:78: multiple definition of `xen_piix_pci_write_config_client'' xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:22: first defined here xen-all.o: In function `xen_piix3_set_irq'': /dev/shm/qemu-dm/xen-all.c:72: multiple definition of `xen_piix3_set_irq'' xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:18: first defined here xen_platform.o: In function `pci_xen_platform_init'': /dev/shm/qemu-dm/hw/xen_platform.c:327: multiple definition of `pci_xen_platform_init'' xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:39: first defined here collect2: ld returned 1 exit status make[1]: *** [qemu-system-x86_64] Error 1 make: *** [subdir-x86_64-softmmu] Error 2 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-22 15:52 UTC
Re: [Xen-devel] Re: [Qemu-devel] [PATCH V11 00/15] Xen device model support
On 03/22/2011 04:40 PM, Alexander Graf wrote:> On 03/22/2011 03:47 PM, Anthony PERARD wrote: >> On Tue, Mar 22, 2011 at 14:23, Alexander Graf<agraf@suse.de> wrote: >>> On 03/01/2011 07:35 PM, anthony.perard@citrix.com wrote: >>>> From: Anthony PERARD<anthony.perard@citrix.com> >>>> >>>> Hi all, >>>> >>>> Here is the few change since the V10: >>>> >>>> - Add braces for blocks with single statement in the clean-up >>>> patch; >>>> - the patch that builds Xen only for x86 have been removed, >>>> instead, >>>> xen_domainbuild is built with libhw and other Xen files are >>>> built for >>>> i386 >>>> target only; >>>> - the redirection structure with function pointer have been >>>> removed, >>>> instead, >>>> there are few #define or static inline function use for the >>>> compatibility; >>> ARGH! >>> >>> The point of the redirection structure was so I can plug in with >>> xenner and >>> replace all the xen calls with in-qemu versions. If you remove it, >>> I''ll have >>> to put it back in in the xenner patch set :(. >>> >>> We need some sort of abstraction between calling xs_ functions and >>> actually >>> calling them. Wrapping all xs_ calls in static inlines would be fine >>> for >>> that, as would the indirect calling table. >> As my series doesn''t change a lot of things in the xen code, I think >> it is better than you put it back in your patch set. > > Hrm. This is on a SLES11SP1 system w/ Xen 4.0.1. > > > Alex > > > agraf@toonie:/dev/shm> git clone > git://xenbits.xen.org/people/aperard/qemu-dm.git > Initialized empty Git repository in /dev/shm/qemu-dm/.git/ > remote: Counting objects: 74570, done. > remote: Compressing objects: 100% (15699/15699), done. > remote: Total 74570 (delta 59960), reused 73357 (delta 58769) > Receiving objects: 100% (74570/74570), 22.24 MiB | 1296 KiB/s, done. > Resolving deltas: 100% (59960/59960), done. > agraf@toonie:/dev/shm/qemu-dm> git checkout origin/qemu-dm-v11 > Note: moving to "origin/qemu-dm-v11" which isn''t a local branch > If you want to create a new branch from this checkout, you may do so > (now or later) by using -b with the checkout command again. Example: > git checkout -b <new_branch_name> > HEAD is now at 47d548f... xen: Add Xen hypercall for sleep state in > the cmos_s3 callback. > agraf@toonie:/dev/shm/qemu-dm> ./configure --target-list=x86_64-softmmu > make -j > Install prefix /usr/local > BIOS directory /usr/local/share/qemu > binary directory /usr/local/bin > config directory /usr/local/etc > Manual directory /usr/local/share/man > ELF interp prefix /usr/gnemul/qemu-%M > Source path /dev/shm/qemu-dm > C compiler gcc > Host C compiler gcc > CFLAGS -O2 -g > QEMU_CFLAGS -Werror -m64 -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE > -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes > -Wredundant-decls -Wall -Wundef -Wendif-labels -Wwrite-strings > -Wmissing-prototypes -fno-strict-aliasing -fstack-protector-all > -Wmissing-include-dirs -Wempty-body -Wnested-externs -Wformat-security > -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration > -Wold-style-definition -Wtype-limits > LDFLAGS -Wl,--warn-common -m64 -g > make make > install install > host CPU x86_64 > host big endian no > target list x86_64-softmmu > tcg debug enabled no > Mon debug enabled no > gprof enabled no > sparse enabled no > strip binaries yes > profiler no > static build no > -Werror enabled yes > SDL support yes > curses support yes > curl support yes > check support no > mingw32 support no > Audio drivers oss > Extra audio cards ac97 es1370 sb16 hda > Block whitelist > Mixer emulation no > VNC TLS support no > VNC SASL support no > VNC JPEG support yes > VNC PNG support yes > VNC thread no > xen support yes > brlapi support no > bluez support no > Documentation yes > NPTL support yes > GUEST_BASE yes > PIE user targets no > vde support no > IO thread no > Linux AIO support no > ATTR/XATTR support yes > Install blobs yes > KVM support yes > fdt support no > preadv support yes > fdatasync yes > madvise yes > posix_madvise yes > uuid support yes > vhost-net support no > Trace backend nop > Trace output file trace-<pid> > spice support no > rbd support no > xfsctl support no > agraf@toonie:/dev/shm/qemu-dm> make -j > GEN x86_64-softmmu/config-devices.mak > GEN config-all-devices.mak > GEN qemu-options.texi > GEN qemu-img-cmds.texi > GEN qemu-monitor.texi > GEN qemu-nbd.8 > GEN qemu-tech.html > GEN config-host.h > GEN QMP/qmp-commands.txt > GEN trace.h > GEN qemu-options.def > GEN trace.c > GEN qemu-img-cmds.h > GEN qemu-img.1 > AS optionrom/multiboot.o > AS optionrom/linuxboot.o > Building optionrom/linuxboot.img > Building optionrom/multiboot.img > Building optionrom/linuxboot.raw > Building optionrom/multiboot.raw > Signing optionrom/multiboot.bin > Signing optionrom/linuxboot.bin > GEN qemu-doc.html > GEN qemu.1 > CC qemu-nbd.o > CC qemu-tool.o > CC qemu-error.o > CC osdep.o > CC oslib-posix.o > CC trace.o > CC cutils.o > CC qemu-option.o > CC module.o > CC nbd.o > CC block.o > CC qemu-malloc.o > CC cache-utils.o > CC aio.o > CC aes.o > CC qemu-config.o > CC posix-aio-compat.o > CC block/raw.o > CC block/cow.o > CC block/qcow.o > CC block/vdi.o > CC block/vmdk.o > CC block/cloop.o > CC block/dmg.o > CC block/bochs.o > CC block/vpc.o > CC block/vvfat.o > CC block/qcow2.o > CC block/qcow2-refcount.o > CC block/qcow2-cluster.o > CC block/qcow2-snapshot.o > CC block/qcow2-cache.o > CC block/qed.o > CC block/qed-gencb.o > CC block/qed-l2-cache.o > CC block/qed-table.o > CC block/qed-cluster.o > CC block/qed-check.o > CC block/parallels.o > CC block/nbd.o > CC block/blkdebug.o > CC block/sheepdog.o > CC block/blkverify.o > CC block/raw-posix.o > CC block/curl.o > CC qint.o > CC qstring.o > CC qdict.o > CC qlist.o > CC qfloat.o > CC qbool.o > CC qjson.o > CC json-lexer.o > CC json-streamer.o > CC json-parser.o > CC qerror.o > CC qemu-timer-common.o > CC qemu-img.o > CC qemu-io.o > CC cmd.o > CC blockdev.o > CC net.o > CC libhw64/vl.o > CC libhw64/virtio.o > CC libhw64/loader.o > CC net/queue.o > CC libhw64/virtio-console.o > CC libhw64/fw_cfg.o > CC net/checksum.o > CC net/util.o > CC libhw64/pci.o > CC net/socket.o > CC libhw64/pci_bridge.o > CC libhw64/msix.o > CC net/dump.o > CC libhw64/msi.o > CC libhw64/pci_host.o > CC libhw64/pcie_host.o > CC libhw64/ioh3420.o > CC net/tap.o > CC libhw64/xio3130_upstream.o > CC net/tap-linux.o > CC fsdev/qemu-fsdev.o > CC net/slirp.o > CC libhw64/xio3130_downstream.o > CC libhw64/watchdog.o > CC libhw64/serial.o > CC libhw64/parallel.o > CC readline.o > CC console.o > CC libhw64/i8254.o > CC libhw64/pcspk.o > CC cursor.o > CC libhw64/pckbd.o > CC async.o > CC os-posix.o > CC tcg-runtime.o > CC host-utils.o > CC irq.o > CC libhw64/usb-uhci.o > CC libhw64/usb-ohci.o > CC ioport.o > CC libhw64/fdc.o > CC libhw64/acpi.o > CC libhw64/acpi_piix4.o > CC input.o > CC libhw64/pm_smbus.o > CC libhw64/apm.o > CC i2c.o > CC libhw64/dma.o > CC smbus.o > CC libhw64/hpet.o > CC smbus_eeprom.o > CC libhw64/applesmc.o > CC eeprom93xx.o > CC libhw64/wdt_i6300esb.o > CC scsi-disk.o > CC libhw64/pcie.o > CC cdrom.o > CC scsi-generic.o > CC libhw64/pcie_aer.o > CC libhw64/pcie_port.o > CC scsi-bus.o > CC usb.o > CC libhw64/ne2000.o > CC usb-hub.o > CC usb-linux.o > CC libhw64/eepro100.o > CC usb-hid.o > CC usb-msd.o > CC usb-wacom.o > CC libhw64/pcnet-pci.o > CC usb-serial.o > CC usb-net.o > CC libhw64/pcnet.o > CC usb-bus.o > CC usb-desc.o > CC libhw64/e1000.o > CC libhw64/rtl8139.o > CC bt.o > CC libhw64/ne2000-isa.o > CC libhw64/ide/core.o > CC libhw64/ide/qdev.o > CC bt-host.o > CC libhw64/ide/pci.o > CC bt-vhci.o > CC libhw64/ide/isa.o > CC bt-l2cap.o > CC bt-sdp.o > CC libhw64/ide/piix.o > CC bt-hci.o > CC bt-hid.o > CC usb-bt.o > CC libhw64/ide/ahci.o > CC bt-hci-csr.o > CC buffered_file.o > CC libhw64/ide/ich.o > CC migration.o > CC migration-tcp.o > CC qemu-sockets.o > CC libhw64/lsi53c895a.o > CC qemu-char.o > CC libhw64/dma-helpers.o > CC savevm.o > CC msmouse.o > CC libhw64/sysbus.o > CC libhw64/isa-bus.o > CC libhw64/qdev-addr.o > CC ps2.o > CC libhw64/vga-pci.o > CC qdev.o > CC libhw64/vga-isa.o > CC qdev-properties.o > CC block-migration.o > CC libhw64/vmware_vga.o > CC pflib.o > CC libhw64/xen_domainbuild.o > CC libhw64/sb16.o > CC bitmap.o > CC bitops.o > CC libhw64/es1370.o > CC migration-exec.o > CC migration-unix.o > CC libhw64/ac97.o > CC migration-fd.o > CC audio/audio.o > CC libhw64/intel-hda.o > CC audio/noaudio.o > CC libhw64/hda-audio.o > CC libhw64/virtio-9p-debug.o > CC audio/wavaudio.o > CC libhw64/virtio-9p-local.o > CC audio/mixeng.o > CC audio/sdlaudio.o > CC libhw64/virtio-9p-xattr.o > CC audio/ossaudio.o > CC libhw64/virtio-9p-xattr-user.o > CC libhw64/virtio-9p-posix-acl.o > CC audio/wavcapture.o > CC ui/keymaps.o > CC ui/sdl.o > CC ui/sdl_zoom.o > CC ui/x_keymap.o > CC ui/curses.o > CC ui/vnc.o > CC ui/d3des.o > CC ui/vnc-enc-zlib.o > CC ui/vnc-enc-hextile.o > CC ui/vnc-enc-tight.o > CC ui/vnc-palette.o > CC ui/vnc-enc-zrle.o > CC ui/vnc-jobs-sync.o > CC iov.o > CC acl.o > CC compatfd.o > CC notify.o > CC event_notifier.o > CC qemu-timer.o > CC slirp/cksum.o > CC slirp/if.o > CC slirp/ip_icmp.o > CC slirp/ip_input.o > CC slirp/ip_output.o > CC slirp/slirp.o > CC slirp/mbuf.o > CC slirp/misc.o > CC slirp/sbuf.o > CC slirp/socket.o > CC slirp/tcp_input.o > CC slirp/tcp_output.o > CC slirp/tcp_subr.o > CC slirp/tcp_timer.o > CC slirp/udp.o > CC slirp/bootp.o > CC slirp/tftp.o > CC xen_backend.o > CC xen_devconfig.o > CC xen_console.o > CC xenfb.o > CC xen_disk.o > CC xen_nic.o > CC libdis/i386-dis.o > LINK qemu-nbd > LINK qemu-img > LINK qemu-io > rm multiboot.o linuxboot.raw linuxboot.img multiboot.raw multiboot.img > linuxboot.o > GEN config-target.h > GEN x86_64-softmmu/qmp-commands.h > GEN x86_64-softmmu/hmp-commands.h > CC x86_64-softmmu/arch_init.o > CC x86_64-softmmu/cpus.o > CC x86_64-softmmu/gdbstub.o > CC x86_64-softmmu/virtio-pci.o > CC x86_64-softmmu/vhost_net.o > CC x86_64-softmmu/machine.o > CC x86_64-softmmu/balloon.o > CC x86_64-softmmu/virtio-blk.o > CC x86_64-softmmu/virtio-balloon.o > CC x86_64-softmmu/virtio-net.o > CC x86_64-softmmu/virtio-serial-bus.o > CC x86_64-softmmu/rwhandler.o > CC x86_64-softmmu/virtio-9p.o > CC x86_64-softmmu/kvm.o > CC x86_64-softmmu/kvm-all.o > CC x86_64-softmmu/xen-stub.o > CC x86_64-softmmu/ivshmem.o > CC x86_64-softmmu/exec.o > CC x86_64-softmmu/translate-all.o > CC x86_64-softmmu/cpu-exec.o > CC x86_64-softmmu/translate.o > CC x86_64-softmmu/tcg/tcg.o > CC x86_64-softmmu/fpu/softfloat-native.o > CC x86_64-softmmu/op_helper.o > CC x86_64-softmmu/helper.o > CC x86_64-softmmu/cpuid.o > CC x86_64-softmmu/disas.o > CC x86_64-softmmu/xen_machine_pv.o > CC x86_64-softmmu/xen-all.o > CC x86_64-softmmu/xen-mapcache.o > CC x86_64-softmmu/xen_platform.o > CC x86_64-softmmu/vga.o > CC x86_64-softmmu/mc146818rtc.o > CC x86_64-softmmu/i8259.o > CC x86_64-softmmu/pc.o > CC x86_64-softmmu/cirrus_vga.o > CC x86_64-softmmu/apic.o > CC x86_64-softmmu/ioapic.o > CC x86_64-softmmu/piix_pci.o > CC x86_64-softmmu/vmport.o > CC x86_64-softmmu/device-hotplug.o > CC x86_64-softmmu/pci-hotplug.o > CC x86_64-softmmu/smbios.o > CC x86_64-softmmu/wdt_ib700.o > CC x86_64-softmmu/debugcon.o > CC x86_64-softmmu/multiboot.o > CC x86_64-softmmu/pc_piix.o > CC x86_64-softmmu/kvmclock.o > CC x86_64-softmmu/monitor.o > LINK x86_64-softmmu/qemu-system-x86_64 > xen-all.o: In function `xen_pci_slot_get_pirq'': > /dev/shm/qemu-dm/xen-all.c:67: multiple definition of > `xen_pci_slot_get_pirq'' > xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:13: first defined here > xen-all.o: In function `xen_init'': > /dev/shm/qemu-dm/xen-all.c:488: multiple definition of `xen_init'' > xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:43: first defined here > xen-all.o: In function `xen_ram_alloc'': > /dev/shm/qemu-dm/xen-all.c:152: multiple definition of `xen_ram_alloc'' > xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:30: first defined here > xen-all.o: In function `xen_interrupt_controller_init'': > /dev/shm/qemu-dm/xen-all.c:110: multiple definition of > `xen_interrupt_controller_init'' > xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:34: first defined here > xen-all.o: In function `xen_cmos_set_s3_resume'': > /dev/shm/qemu-dm/xen-all.c:95: multiple definition of > `xen_cmos_set_s3_resume'' > xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:26: first defined here > xen-all.o: In function `xen_piix_pci_write_config_client'': > /dev/shm/qemu-dm/xen-all.c:78: multiple definition of > `xen_piix_pci_write_config_client'' > xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:22: first defined here > xen-all.o: In function `xen_piix3_set_irq'': > /dev/shm/qemu-dm/xen-all.c:72: multiple definition of `xen_piix3_set_irq'' > xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:18: first defined here > xen_platform.o: In function `pci_xen_platform_init'': > /dev/shm/qemu-dm/hw/xen_platform.c:327: multiple definition of > `pci_xen_platform_init'' > xen-stub.o:/dev/shm/qemu-dm/xen-stub.c:39: first defined here > collect2: ld returned 1 exit status > make[1]: *** [qemu-system-x86_64] Error 1 > make: *** [subdir-x86_64-softmmu] Error 2This should be the correct fix: diff --git a/Makefile.target b/Makefile.target index c0db745..91bbf39 100644 --- a/Makefile.target +++ b/Makefile.target @@ -212,10 +212,11 @@ endif # xen backend driver support obj-i386-$(CONFIG_XEN) += xen_machine_pv.o xen_domainbuild.o -ifeq ($(TARGET_ARCH), i386) -CONFIG_NO_XEN = $(if $(subst n,,$(CONFIG_XEN)),n,y) +ifeq ($(TARGET_BASE_ARCH),i386) + CONFIG_NO_KVM = $(if $(subst n,,$(CONFIG_KVM)),n,y) else -CONFIG_NO_XEN = y + CONFIG_XEN + CONFIG_NO_XEN = y endif # xen support CONFIG_NO_XEN_MAPCACHE = $(if $(subst n,,$(CONFIG_XEN_MAPCACHE)),n,y) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Anthony PERARD
2011-Mar-22 17:22 UTC
Re: [Xen-devel] Re: [Qemu-devel] [PATCH V11 00/15] Xen device model support
On Tue, 22 Mar 2011, Alexander Graf wrote:> On 03/22/2011 04:40 PM, Alexander Graf wrote: > > make[1]: *** [qemu-system-x86_64] Error 1 > > > This should be the correct fix: > > > diff --git a/Makefile.target b/Makefile.target > index c0db745..91bbf39 100644 > --- a/Makefile.target > +++ b/Makefile.target > @@ -212,10 +212,11 @@ endif > # xen backend driver support > obj-i386-$(CONFIG_XEN) += xen_machine_pv.o xen_domainbuild.o > > -ifeq ($(TARGET_ARCH), i386) > -CONFIG_NO_XEN = $(if $(subst n,,$(CONFIG_XEN)),n,y) > +ifeq ($(TARGET_BASE_ARCH),i386) > + CONFIG_NO_KVM = $(if $(subst n,,$(CONFIG_KVM)),n,y)with ''s/KVM/XEN/g'' ;)> else > -CONFIG_NO_XEN = y > + CONFIG_XEN > + CONFIG_NO_XEN = y > endif > # xen support > CONFIG_NO_XEN_MAPCACHE = $(if $(subst n,,$(CONFIG_XEN_MAPCACHE)),n,y)Yep, this is the fix. Could you use this fix and continue to review ? or did I need to resend the all patch series ? Regards, -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-22 17:23 UTC
Re: [Xen-devel] Re: [Qemu-devel] [PATCH V11 00/15] Xen device model support
On 03/22/2011 06:22 PM, Anthony PERARD wrote:> On Tue, 22 Mar 2011, Alexander Graf wrote: > >> On 03/22/2011 04:40 PM, Alexander Graf wrote: >>> make[1]: *** [qemu-system-x86_64] Error 1 >> >> This should be the correct fix: >> >> >> diff --git a/Makefile.target b/Makefile.target >> index c0db745..91bbf39 100644 >> --- a/Makefile.target >> +++ b/Makefile.target >> @@ -212,10 +212,11 @@ endif >> # xen backend driver support >> obj-i386-$(CONFIG_XEN) += xen_machine_pv.o xen_domainbuild.o >> >> -ifeq ($(TARGET_ARCH), i386) >> -CONFIG_NO_XEN = $(if $(subst n,,$(CONFIG_XEN)),n,y) >> +ifeq ($(TARGET_BASE_ARCH),i386) >> + CONFIG_NO_KVM = $(if $(subst n,,$(CONFIG_KVM)),n,y) > with ''s/KVM/XEN/g'' > ;) > >> else >> -CONFIG_NO_XEN = y >> + CONFIG_XEN >> + CONFIG_NO_XEN = y >> endif >> # xen support >> CONFIG_NO_XEN_MAPCACHE = $(if $(subst n,,$(CONFIG_XEN_MAPCACHE)),n,y) > Yep, this is the fix. > > Could you use this fix and continue to review ? or did I need to resend > the all patch series ?No, I''m still at it. It takes much longer than I expected :) Alex _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-23 10:43 UTC
[Xen-devel] Re: [Qemu-devel] [PATCH V11 03/15] xen: Support new libxc calls from xen unstable.
On 01.03.2011, at 19:35, Anthony.Perard@citrix.com wrote:> From: Anthony PERARD <anthony.perard@citrix.com> > > This patch updates the libxenctrl calls in Qemu to use the new interface, > otherwise Qemu wouldn''t be able to build against new versions of the > library. > > We check libxenctrl version in configure, from Xen 3.3.0 to Xen > unstable. > > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > Acked-by: Alexander Graf <agraf@suse.de> > --- > configure | 67 ++++++++++++++++++++++++++++++++++++++++++++++++- > hw/xen_backend.c | 21 ++++++++------- > hw/xen_backend.h | 6 ++-- > hw/xen_common.h | 64 +++++++++++++++++++++++++++++++++++++---------- > hw/xen_disk.c | 4 +- > hw/xen_domainbuild.c | 3 +- > 6 files changed, 133 insertions(+), 32 deletions(-) > > diff --git a/configure b/configure > index 3036faf..a84d974 100755 > --- a/configure > +++ b/configure > @@ -126,6 +126,7 @@ vnc_jpeg="" > vnc_png="" > vnc_thread="no" > xen="" > +xen_ctrl_version="" > linux_aio="" > attr="" > vhost_net="" > @@ -1147,20 +1148,81 @@ fi > > if test "$xen" != "no" ; then > xen_libs="-lxenstore -lxenctrl -lxenguest" > + > + # Xen unstable > cat > $TMPC <<EOF > #include <xenctrl.h> > #include <xs.h> > -int main(void) { xs_daemon_open(); xc_interface_open(); return 0; } > +#include <stdint.h> > +#include <xen/hvm/hvm_info_table.h> > +#if !defined(HVM_MAX_VCPUS) > +# error HVM_MAX_VCPUS not defined > +#endif > +int main(void) { > + xc_interface *xc; > + xs_daemon_open(); > + xc = xc_interface_open(0, 0, 0); > + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); > + xc_gnttab_open(NULL, 0); > + return 0; > +} > EOF > if compile_prog "" "$xen_libs" ; then > + xen_ctrl_version=410 > xen=yes > - libs_softmmu="$xen_libs $libs_softmmu" > + > + # Xen 4.0.0 > + elif ( > + cat > $TMPC <<EOF > +#include <xenctrl.h> > +#include <xs.h> > +#include <stdint.h> > +#include <xen/hvm/hvm_info_table.h> > +#if !defined(HVM_MAX_VCPUS) > +# error HVM_MAX_VCPUS not defined > +#endif > +int main(void) { > + xs_daemon_open(); > + xc_interface_open(); > + xc_gnttab_open(); > + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); > + return 0; > +} > +EOF > + compile_prog "" "$xen_libs" > + ) ; then > + xen_ctrl_version=400 > + xen=yes > + > + # Xen 3.3.0, 3.4.0 > + elif ( > + cat > $TMPC <<EOF > +#include <xenctrl.h> > +#include <xs.h> > +int main(void) { > + xs_daemon_open(); > + xc_interface_open(); > + xc_gnttab_open(); > + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); > + return 0; > +} > +EOF > + compile_prog "" "$xen_libs" > + ) ; then > + xen_ctrl_version=330 > + xen=yes > + > + # Xen not found or unsupported > else > if test "$xen" = "yes" ; then > feature_not_found "xen" > fi > xen=no > fi > + > + if test "$xen" = yes; then > + libs_softmmu="$xen_libs $libs_softmmu" > + fi > fi > > ########################################## > @@ -2755,6 +2817,7 @@ if test "$bluez" = "yes" ; then > fi > if test "$xen" = "yes" ; then > echo "CONFIG_XEN=y" >> $config_host_mak > + echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak > fi > if test "$io_thread" = "yes" ; then > echo "CONFIG_IOTHREAD=y" >> $config_host_mak > diff --git a/hw/xen_backend.c b/hw/xen_backend.c > index 9f4ec4b..3907b83 100644 > --- a/hw/xen_backend.c > +++ b/hw/xen_backend.c > @@ -43,7 +43,8 @@ > /* ------------------------------------------------------------- */ > > /* public */ > -int xen_xc; > +XenXC xen_xc = XC_HANDLER_INITIAL_VALUE; > +XenGnttab xen_xcg = XC_HANDLER_INITIAL_VALUE; > struct xs_handle *xenstore = NULL; > const char *xen_protocol; > > @@ -214,8 +215,8 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, > xendev->debug = debug; > xendev->local_port = -1; > > - xendev->evtchndev = xc_evtchn_open(); > - if (xendev->evtchndev < 0) { > + xendev->evtchndev = xc_evtchn_open(NULL, 0); > + if (xendev->evtchndev == XC_HANDLER_INITIAL_VALUE) { > xen_be_printf(NULL, 0, "can''t open evtchn device\n"); > qemu_free(xendev); > return NULL; > @@ -223,15 +224,15 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, > fcntl(xc_evtchn_fd(xendev->evtchndev), F_SETFD, FD_CLOEXEC); > > if (ops->flags & DEVOPS_FLAG_NEED_GNTDEV) { > - xendev->gnttabdev = xc_gnttab_open(); > - if (xendev->gnttabdev < 0) { > + xendev->gnttabdev = xc_gnttab_open(NULL, 0); > + if (xendev->gnttabdev == XC_HANDLER_INITIAL_VALUE) { > xen_be_printf(NULL, 0, "can''t open gnttab device\n"); > xc_evtchn_close(xendev->evtchndev); > qemu_free(xendev); > return NULL; > } > } else { > - xendev->gnttabdev = -1; > + xendev->gnttabdev = XC_HANDLER_INITIAL_VALUE; > } > > QTAILQ_INSERT_TAIL(&xendevs, xendev, next); > @@ -277,10 +278,10 @@ static struct XenDevice *xen_be_del_xendev(int dom, int dev) > qemu_free(xendev->fe); > } > > - if (xendev->evtchndev >= 0) { > + if (xendev->evtchndev != XC_HANDLER_INITIAL_VALUE) { > xc_evtchn_close(xendev->evtchndev); > } > - if (xendev->gnttabdev >= 0) { > + if (xendev->gnttabdev != XC_HANDLER_INITIAL_VALUE) { > xc_gnttab_close(xendev->gnttabdev); > } > > @@ -664,8 +665,8 @@ int xen_be_init(void) > goto err; > } > > - xen_xc = xc_interface_open(); > - if (xen_xc == -1) { > + xen_xc = xc_interface_open(0, 0, 0); > + if (xen_xc == XC_HANDLER_INITIAL_VALUE) { > xen_be_printf(NULL, 0, "can''t open xen interface\n"); > goto err; > } > diff --git a/hw/xen_backend.h b/hw/xen_backend.h > index 1b428e3..6401c85 100644 > --- a/hw/xen_backend.h > +++ b/hw/xen_backend.h > @@ -45,8 +45,8 @@ struct XenDevice { > int remote_port; > int local_port; > > - int evtchndev; > - int gnttabdev; > + XenEvtchn evtchndev; > + XenGnttab gnttabdev; > > struct XenDevOps *ops; > QTAILQ_ENTRY(XenDevice) next; > @@ -55,7 +55,7 @@ struct XenDevice { > /* ------------------------------------------------------------- */ > > /* variables */ > -extern int xen_xc; > +extern XenXC xen_xc; > extern struct xs_handle *xenstore; > extern const char *xen_protocol; > > diff --git a/hw/xen_common.h b/hw/xen_common.h > index 8a55b44..7e123ec 100644 > --- a/hw/xen_common.h > +++ b/hw/xen_common.h > @@ -1,6 +1,8 @@ > #ifndef QEMU_HW_XEN_COMMON_H > #define QEMU_HW_XEN_COMMON_H 1 > > +#include "config-host.h" > + > #include <stddef.h> > #include <inttypes.h> > > @@ -13,22 +15,56 @@ > #include "qemu-queue.h" > > /* > - * tweaks needed to build with different xen versions > - * 0x00030205 -> 3.1.0 > - * 0x00030207 -> 3.2.0 > - * 0x00030208 -> unstable > + * We don''t support Xen prior to 3.3.0. > */ > -#include <xen/xen-compat.h> > -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030205 > -# define evtchn_port_or_error_t int > -#endif > -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030207 > -# define xc_map_foreign_pages xc_map_foreign_batch > + > +/* Xen before 4.0 */ > +#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 400 > +static inline void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot, > + xen_pfn_t *arr, int *err, > + unsigned int num) > +{ > + return xc_map_foreign_batch(xc_handle, dom, prot, arr, num); > +} > #endif > -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030208 > -# define xen_mb() mb() > -# define xen_rmb() rmb() > -# define xen_wmb() wmb() > + > + > +/* Xen before 4.1 */ > +#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 410 > + > +typedef int XenXC; > +typedef int XenEvtchn; > +typedef int XenGnttab; > + > +# define XC_INTERFACE_FMT "%i" > +# define XC_HANDLER_INITIAL_VALUE -1 > + > +# define xc_interface_open(logger, dombuild_logger, open_flags) \ > + xc_interface_open() > +# define xc_evtchn_open(logger, open_flags) xc_evtchn_open() > +# define xc_gnttab_open(logger, open_flags) xc_gnttab_open()defines really bite me when abstracting the interface through an indirect calling table. I had to change the code this way to make it work with xenner: diff --git a/hw/xen_common.h b/hw/xen_common.h index a5fc74b..0c09b37 100644 --- a/hw/xen_common.h +++ b/hw/xen_common.h @@ -39,10 +39,23 @@ typedef int XenGnttab; # define XC_INTERFACE_FMT "%i" # define XC_HANDLER_INITIAL_VALUE -1 -# define xc_interface_open(logger, dombuild_logger, open_flags) \ - xc_interface_open() -# define xc_evtchn_open(logger, open_flags) xc_evtchn_open() -# define xc_gnttab_open(logger, open_flags) xc_gnttab_open() +static inline XenEvtchn xen_xc_evtchn_open(void *logger, + unsigned int open_flags) +{ + return xc_evtchn_open(); +} + +static inline XenGnttab xen_xc_gnttab_open(void *logger, + unsigned int open_flags) +{ + return xc_gnttab_open(); +} + +static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, + unsigned int open_flags) +{ + return xc_interface_open(); +} static inline int xc_fd(int xen_xc) { @@ -69,6 +82,24 @@ typedef xc_gnttab *XenGnttab; # define XC_INTERFACE_FMT "%p" # define XC_HANDLER_INITIAL_VALUE NULL +static inline XenEvtchn xen_xc_evtchn_open(void *logger, + unsigned int open_flags) +{ + return xc_evtchn_open(logger, open_flags); +} + +static inline XenGnttab xen_xc_gnttab_open(void *logger, + unsigned int open_flags) +{ + return xc_gnttab_open(logger, open_flags); +} + +static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, + int open_flags) +{ + return xc_interface_open(logger, dombuild_logger, open_flags); +} + /* FIXME There is now way to have the xen fd */ static inline int xc_fd(xc_interface *xen_xc) { Leave it as is in your patch and I''ll change it in my xenner patch set again, but I wanted to make sure that you''re aware of the issues going along with #defines. Alex _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-23 10:57 UTC
[Xen-devel] Re: [Qemu-devel] [PATCH V11 02/15] xen: Make Xen build once.
On 01.03.2011, at 19:35, Anthony.Perard@citrix.com wrote:> From: Anthony PERARD <anthony.perard@citrix.com> > > xen_domainbuild is now build in libhw. And xen_machine_pv is build only > for i386 targets. > > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> > --- > Makefile.objs | 3 +++ > Makefile.target | 2 +- > hw/xen_domainbuild.c | 10 +++++----- > hw/xen_domainbuild.h | 5 +++-- > hw/xen_machine_pv.c | 2 +- > 5 files changed, 13 insertions(+), 9 deletions(-) > > diff --git a/Makefile.objs b/Makefile.objs > index 9e98a66..8034115 100644 > --- a/Makefile.objs > +++ b/Makefile.objs > @@ -269,6 +269,9 @@ hw-obj-$(CONFIG_DP8393X) += dp8393x.o > hw-obj-$(CONFIG_DS1225Y) += ds1225y.o > hw-obj-$(CONFIG_MIPSNET) += mipsnet.o > > +# Xen > +hw-obj-$(CONFIG_XEN) += xen_domainbuild.oWhy is this in generic code? Xen is x86 only and really should stay that way IMHO.> + > # Sound > sound-obj-y > sound-obj-$(CONFIG_SB16) += sb16.o > diff --git a/Makefile.target b/Makefile.target > index 220589e..ab0a570 100644 > --- a/Makefile.target > +++ b/Makefile.target > @@ -206,7 +206,7 @@ QEMU_CFLAGS += $(VNC_JPEG_CFLAGS) > QEMU_CFLAGS += $(VNC_PNG_CFLAGS) > > # xen backend driver support > -obj-$(CONFIG_XEN) += xen_machine_pv.o xen_domainbuild.o > +obj-i386-$(CONFIG_XEN) += xen_machine_pv.o > > # Inter-VM PCI shared memory > obj-$(CONFIG_KVM) += ivshmem.o > diff --git a/hw/xen_domainbuild.c b/hw/xen_domainbuild.c > index 7f1fd66..b73d47f 100644 > --- a/hw/xen_domainbuild.c > +++ b/hw/xen_domainbuild.c > @@ -1,9 +1,9 @@ > #include <signal.h> > -#include "xen_backend.h" > -#include "xen_domainbuild.h" > #include "sysemu.h" > #include "qemu-timer.h" > #include "qemu-log.h" > +#include "xen_backend.h" > +#include "xen_domainbuild.h" > > #include <xenguest.h> > > @@ -49,7 +49,7 @@ static int xenstore_domain_mkdir(char *path) > } > > int xenstore_domain_init1(const char *kernel, const char *ramdisk, > - const char *cmdline) > + const char *cmdline, ram_addr_t ram_size)Isn''t ram_size a global anyways? What''s the rationale behind moving it to a parameter? Not saying I''m against it, just missed the reasoning here :) Alex _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-23 12:08 UTC
[Xen-devel] Re: [Qemu-devel] [PATCH V11 06/15] xen: Add the Xen platform pci device
On 01.03.2011, at 19:35, Anthony.Perard@citrix.com wrote:> From: Steven Smith <ssmith@xensource.com> > > Introduce a new emulated PCI device, specific to fully virtualized Xen > guests. The device is necessary for PV on HVM drivers to work. > > Signed-off-by: Steven Smith <ssmith@xensource.com> > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > --- > Makefile.target | 2 + > hw/hw.h | 3 + > hw/pc_piix.c | 4 + > hw/pci_ids.h | 2 + > hw/xen.h | 2 + > hw/xen_platform.c | 349 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > trace-events | 3 + > xen-stub.c | 4 + > 8 files changed, 369 insertions(+), 0 deletions(-) > create mode 100644 hw/xen_platform.c > > diff --git a/Makefile.target b/Makefile.target > index b08c7f7..c539b1e 100644 > --- a/Makefile.target > +++ b/Makefile.target > @@ -217,6 +217,8 @@ endif > obj-i386-$(CONFIG_XEN) += xen-all.o > obj-$(CONFIG_NO_XEN) += xen-stub.o > > +obj-i386-$(CONFIG_XEN) += xen_platform.o > + > # Inter-VM PCI shared memory > obj-$(CONFIG_KVM) += ivshmem.o > > diff --git a/hw/hw.h b/hw/hw.h > index 5e24329..c285b2e 100644 > --- a/hw/hw.h > +++ b/hw/hw.h > @@ -682,6 +682,9 @@ extern const VMStateDescription vmstate_usb_device; > #define VMSTATE_INT32_LE(_f, _s) \ > VMSTATE_SINGLE(_f, _s, 0, vmstate_info_int32_le, int32_t) > > +#define VMSTATE_UINT8_TEST(_f, _s, _t) \ > + VMSTATE_SINGLE_TEST(_f, _s, _t, 0, vmstate_info_uint8, uint8_t) > + > #define VMSTATE_UINT16_TEST(_f, _s, _t) \ > VMSTATE_SINGLE_TEST(_f, _s, _t, 0, vmstate_info_uint16, uint16_t) > > diff --git a/hw/pc_piix.c b/hw/pc_piix.c > index 6eff06e..417c456 100644 > --- a/hw/pc_piix.c > +++ b/hw/pc_piix.c > @@ -121,6 +121,10 @@ static void pc_init1(ram_addr_t ram_size, > > pc_vga_init(pci_enabled? pci_bus: NULL); > > + if (xen_enabled()) { > + pci_xen_platform_init(pci_bus);It probably makes sense to fold that function in here. That way you wouldn''t need the entry in the stub file. Alex _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-23 12:33 UTC
[Xen-devel] Re: [Qemu-devel] [PATCH V11 09/15] xen: Introduce the Xen mapcache
On 01.03.2011, at 19:35, Anthony.Perard@citrix.com wrote:> From: Jun Nakajima <jun.nakajima@intel.com> > > On IA32 host or IA32 PAE host, at present, generally, we can''t create > an HVM guest with more than 2G memory, because generally it''s almost > impossible for Qemu to find a large enough and consecutive virtual > address space to map an HVM guest''s whole physical address space. > The attached patch fixes this issue using dynamic mapping based on > little blocks of memory. > > Each call to qemu_get_ram_ptr makes a call to qemu_map_cache with the > lock option, so mapcache will not unmap these ram_ptr. > > Signed-off-by: Jun Nakajima <jun.nakajima@intel.com> > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > --- > Makefile.target | 3 + > configure | 3 + > exec.c | 40 ++++++- > hw/xen.h | 13 ++ > hw/xen_common.h | 9 ++ > xen-all.c | 64 +++++++++++ > xen-mapcache-stub.c | 40 +++++++ > xen-mapcache.c | 310 +++++++++++++++++++++++++++++++++++++++++++++++++++ > xen-mapcache.h | 22 ++++ > xen-stub.c | 4 + > 10 files changed, 504 insertions(+), 4 deletions(-) > create mode 100644 xen-mapcache-stub.c > create mode 100644 xen-mapcache.c > create mode 100644 xen-mapcache.h > > diff --git a/Makefile.target b/Makefile.target > index c539b1e..dcdd51d 100644 > --- a/Makefile.target > +++ b/Makefile.target > @@ -214,8 +214,11 @@ else > CONFIG_NO_XEN = y > endif > # xen support > +CONFIG_NO_XEN_MAPCACHE = $(if $(subst n,,$(CONFIG_XEN_MAPCACHE)),n,y) > obj-i386-$(CONFIG_XEN) += xen-all.o > obj-$(CONFIG_NO_XEN) += xen-stub.o > +obj-i386-$(CONFIG_XEN_MAPCACHE) += xen-mapcache.o > +obj-$(CONFIG_NO_XEN_MAPCACHE) += xen-mapcache-stub.o > > obj-i386-$(CONFIG_XEN) += xen_platform.o > > diff --git a/configure b/configure > index a84d974..4fd8696 100755 > --- a/configure > +++ b/configure > @@ -3172,6 +3172,9 @@ case "$target_arch2" in > i386|x86_64) > if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then > echo "CONFIG_XEN=y" >> $config_target_mak > + if test "$cpu" = "i386" -o "$cpu" = "x86_64"; then > + echo "CONFIG_XEN_MAPCACHE=y" >> $config_target_mak > + fi > fi > esac > case "$target_arch2" in > diff --git a/exec.c b/exec.c > index d611100..558595a 100644 > --- a/exec.c > +++ b/exec.c > @@ -32,6 +32,7 @@ > #include "hw/qdev.h" > #include "osdep.h" > #include "kvm.h" > +#include "hw/xen.h" > #include "qemu-timer.h" > #if defined(CONFIG_USER_ONLY) > #include <qemu.h> > @@ -51,6 +52,8 @@ > #include <libutil.h> > #endif > #endif > +#else /* !CONFIG_USER_ONLY */ > +#include "xen-mapcache.h" > #endif > > //#define DEBUG_TB_INVALIDATE > @@ -2865,6 +2868,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name, > } > } > > + new_block->offset = find_ram_offset(size); > if (host) { > new_block->host = host; > } else { > @@ -2886,13 +2890,15 @@ ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name, > PROT_EXEC|PROT_READ|PROT_WRITE, > MAP_SHARED | MAP_ANONYMOUS, -1, 0); > #else > - new_block->host = qemu_vmalloc(size); > + if (xen_mapcache_enabled()) { > + xen_ram_alloc(new_block->offset, size); > + } else { > + new_block->host = qemu_vmalloc(size); > + } > #endif > qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE); > } > } > - > - new_block->offset = find_ram_offset(size); > new_block->length = size; > > QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next); > @@ -2933,7 +2939,11 @@ void qemu_ram_free(ram_addr_t addr) > #if defined(TARGET_S390X) && defined(CONFIG_KVM) > munmap(block->host, block->length); > #else > - qemu_vfree(block->host); > + if (xen_mapcache_enabled()) { > + qemu_invalidate_entry(block->host); > + } else { > + qemu_vfree(block->host); > + } > #endif > } > qemu_free(block); > @@ -2959,6 +2969,15 @@ void *qemu_get_ram_ptr(ram_addr_t addr) > if (addr - block->offset < block->length) { > QLIST_REMOVE(block, next); > QLIST_INSERT_HEAD(&ram_list.blocks, block, next); > + if (xen_mapcache_enabled()) { > + /* We need to check if the requested address is in the RAM > + * because we don''t want to map the entire memory in QEMU. > + */ > + if (block->offset == 0) { > + return qemu_map_cache(addr, 0, 1); > + } > + block->host = qemu_map_cache(block->offset, block->length, 1); > + } > return block->host + (addr - block->offset); > } > } > @@ -2994,11 +3013,21 @@ int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr) > uint8_t *host = ptr; > > QLIST_FOREACH(block, &ram_list.blocks, next) { > + /* This case append when the block is not mapped. */ > + if (block->host == NULL) { > + continue; > + } > if (host - block->host < block->length) { > *ram_addr = block->offset + (host - block->host); > return 0; > } > } > + > + if (xen_mapcache_enabled()) { > + *ram_addr = qemu_ram_addr_from_mapcache(ptr); > + return 0; > + } > + > return -1; > } > > @@ -3909,6 +3938,9 @@ void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len, > if (is_write) { > cpu_physical_memory_write(bounce.addr, bounce.buffer, access_len); > } > + if (xen_enabled()) { > + qemu_invalidate_entry(buffer); > + } > qemu_vfree(bounce.buffer); > bounce.buffer = NULL; > cpu_notify_map_clients(); > diff --git a/hw/xen.h b/hw/xen.h > index 12d4e5f..e26d061 100644 > --- a/hw/xen.h > +++ b/hw/xen.h > @@ -31,6 +31,15 @@ static inline int xen_enabled(void) > #endif > } > > +static inline int xen_mapcache_enabled(void) > +{ > +#ifdef CONFIG_XEN_MAPCACHE > + return xen_enabled(); > +#else > + return 0; > +#endif > +} > + > int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num); > void xen_piix3_set_irq(void *opaque, int irq_num, int level); > void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len); > @@ -41,6 +50,10 @@ void pci_xen_platform_init(PCIBus *bus); > > int xen_init(void); > > +#if defined(NEED_CPU_H) && !defined(CONFIG_USER_ONLY) > +void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size); > +#endif > + > #if defined(CONFIG_XEN) && CONFIG_XEN_CTRL_INTERFACE_VERSION < 400 > # define HVM_MAX_VCPUS 32 > #endif > diff --git a/hw/xen_common.h b/hw/xen_common.h > index 7e123ec..5a36642 100644 > --- a/hw/xen_common.h > +++ b/hw/xen_common.h > @@ -50,6 +50,15 @@ static inline int xc_fd(int xen_xc) > } > > > +static inline int xc_domain_populate_physmap_exact > + (XenXC xc_handle, uint32_t domid, unsigned long nr_extents, > + unsigned int extent_order, unsigned int mem_flags, xen_pfn_t *extent_start) > +{ > + return xc_domain_memory_populate_physmap > + (xc_handle, domid, nr_extents, extent_order, mem_flags, extent_start); > +} > + > + > /* Xen 4.1 */ > #else > > diff --git a/xen-all.c b/xen-all.c > index 761f2a0..03d1e90 100644 > --- a/xen-all.c > +++ b/xen-all.c > @@ -10,6 +10,8 @@ > #include "hw/xen_common.h" > #include "hw/xen_backend.h" > > +#include "xen-mapcache.h" > + > /* Xen specific function for piix pci */ > > int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num) > @@ -52,6 +54,64 @@ qemu_irq *xen_interrupt_controller_init(void) > return qemu_allocate_irqs(xen_set_irq, NULL, 16); > } > > + > +/* Memory Ops */ > + > +static void xen_ram_init(ram_addr_t ram_size) > +{ > + RAMBlock *new_block; > + ram_addr_t below_4g_mem_size, above_4g_mem_size = 0; > + > + new_block = qemu_mallocz(sizeof (*new_block)); > + pstrcpy(new_block->idstr, sizeof (new_block->idstr), "xen.ram"); > + new_block->host = NULL; > + new_block->offset = 0; > + new_block->length = ram_size; > + > + QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next); > + > + ram_list.phys_dirty = qemu_realloc(ram_list.phys_dirty, > + new_block->length >> TARGET_PAGE_BITS); > + memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS), > + 0xff, new_block->length >> TARGET_PAGE_BITS); > + > + if (ram_size >= 0xe0000000 ) { > + above_4g_mem_size = ram_size - 0xe0000000; > + below_4g_mem_size = 0xe0000000; > + } else { > + below_4g_mem_size = ram_size; > + } > + > + cpu_register_physical_memory(0, below_4g_mem_size, new_block->offset); > +#if TARGET_PHYS_ADDR_BITS > 32 > + if (above_4g_mem_size > 0) { > + cpu_register_physical_memory(0x100000000ULL, above_4g_mem_size, > + new_block->offset + below_4g_mem_size); > + } > +#endif > +} > + > +void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size) > +{ > + unsigned long nr_pfn; > + xen_pfn_t *pfn_list; > + int i; > + > + nr_pfn = size >> TARGET_PAGE_BITS; > + pfn_list = qemu_malloc(sizeof (*pfn_list) * nr_pfn); > + > + for (i = 0; i < nr_pfn; i++) { > + pfn_list[i] = (ram_addr >> TARGET_PAGE_BITS) + i; > + } > + > + if (xc_domain_populate_physmap_exact(xen_xc, xen_domid, nr_pfn, 0, 0, pfn_list)) { > + hw_error("xen: failed to populate ram at %lx", ram_addr); > + } > + > + qemu_free(pfn_list); > +} > + > + > /* Initialise Xen */ > > int xen_init(void) > @@ -62,5 +122,9 @@ int xen_init(void) > return -1; > } > > + /* Init RAM management */ > + qemu_map_cache_init(); > + xen_ram_init(ram_size); > + > return 0; > } > diff --git a/xen-mapcache-stub.c b/xen-mapcache-stub.c > new file mode 100644 > index 0000000..541bee6 > --- /dev/null > +++ b/xen-mapcache-stub.c > @@ -0,0 +1,40 @@ > +/* > + * Copyright (C) 2011 Citrix Ltd. > + * > + * This work is licensed under the terms of the GNU GPL, version 2. See > + * the COPYING file in the top-level directory. > + * > + */ > + > +#include "config.h" > + > +#include "exec-all.h" > +#include "qemu-common.h" > +#include "cpu-common.h" > +#include "xen-mapcache.h" > + > +void qemu_map_cache_init(void) > +{ > +} > + > +uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, uint8_t lock) > +{ > + return qemu_get_ram_ptr(phys_addr); > +} > + > +void qemu_map_cache_unlock(void *buffer) > +{ > +} > + > +ram_addr_t qemu_ram_addr_from_mapcache(void *ptr) > +{ > + return -1; > +} > + > +void qemu_invalidate_map_cache(void) > +{ > +} > + > +void qemu_invalidate_entry(uint8_t *buffer) > +{ > +} > diff --git a/xen-mapcache.c b/xen-mapcache.c > new file mode 100644 > index 0000000..d7f44a7 > --- /dev/null > +++ b/xen-mapcache.c > @@ -0,0 +1,310 @@ > +/* > + * Copyright (C) 2011 Citrix Ltd. > + * > + * This work is licensed under the terms of the GNU GPL, version 2. See > + * the COPYING file in the top-level directory. > + * > + */ > + > +#include "config.h" > + > +#include <sys/resource.h> > + > +#include "hw/xen_backend.h" > +#include "blockdev.h" > + > +#include <xen/hvm/params.h> > +#include <sys/mman.h> > + > +#include "xen-mapcache.h" > + > + > +//#define MAPCACHE_DEBUG > + > +#ifdef MAPCACHE_DEBUG > +# define DPRINTF(fmt, ...) do { \ > + fprintf(stderr, "xen_mapcache: " fmt, ## __VA_ARGS__); \ > +} while (0) > +#else > +# define DPRINTF(fmt, ...) do { } while (0) > +#endif > + > +#if defined(__i386__) > +# define MCACHE_BUCKET_SHIFT 16 > +#elif defined(__x86_64__) > +# define MCACHE_BUCKET_SHIFT 20 > +#endif > +#define MCACHE_BUCKET_SIZE (1UL << MCACHE_BUCKET_SHIFT) > + > +#define BITS_PER_LONG (sizeof(long) * 8) > +#define BITS_TO_LONGS(bits) (((bits) + BITS_PER_LONG - 1) / BITS_PER_LONG) > +#define DECLARE_BITMAP(name, bits) unsigned long name[BITS_TO_LONGS(bits)] > + > +typedef struct MapCacheEntry { > + target_phys_addr_t paddr_index; > + uint8_t *vaddr_base; > + DECLARE_BITMAP(valid_mapping, MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT); > + uint8_t lock; > + struct MapCacheEntry *next; > +} MapCacheEntry; > + > +typedef struct MapCacheRev { > + uint8_t *vaddr_req; > + target_phys_addr_t paddr_index; > + QTAILQ_ENTRY(MapCacheRev) next; > +} MapCacheRev; > + > +typedef struct MapCache { > + MapCacheEntry *entry; > + unsigned long nr_buckets; > + QTAILQ_HEAD(map_cache_head, MapCacheRev) locked_entries; > + > + /* For most cases (>99.9%), the page address is the same. */ > + target_phys_addr_t last_address_index; > + uint8_t *last_address_vaddr; > + unsigned long max_mcache_size; > + unsigned int mcache_bucket_shift; > +} MapCache; > + > +static MapCache *mapcache; > + > +static inline int test_bit(unsigned int bit, const unsigned long *map) > +{ > + return !!((map)[(bit) / BITS_PER_LONG] & (1UL << ((bit) % BITS_PER_LONG))); > +}We have a bitmap framework in qemu now. Please use that :). See bitmap.h / bitops.h / bitops.c. Alex _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-23 12:36 UTC
[Xen-devel] Re: [Qemu-devel] [PATCH V11 13/15] xen: Initialize event channels and io rings
On 01.03.2011, at 19:35, Anthony.Perard@citrix.com wrote:> From: Arun Sharma <arun.sharma@intel.com> > > Open and bind event channels; map ioreq and buffered ioreq rings. > > Signed-off-by: Arun Sharma <arun.sharma@intel.com> > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > Acked-by: Alexander Graf <agraf@suse.de> > --- > hw/xen_common.h | 2 + > xen-all.c | 411 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 413 insertions(+), 0 deletions(-) > > diff --git a/hw/xen_common.h b/hw/xen_common.h > index 5a36642..a5fc74b 100644 > --- a/hw/xen_common.h > +++ b/hw/xen_common.h > @@ -76,4 +76,6 @@ static inline int xc_fd(xc_interface *xen_xc) > } > #endif > > +void destroy_hvm_domain(void); > + > #endif /* QEMU_HW_XEN_COMMON_H */ > diff --git a/xen-all.c b/xen-all.c > index 03d1e90..f96fd7d 100644 > --- a/xen-all.c > +++ b/xen-all.c > @@ -6,12 +6,58 @@ > * > */ > > +#include <sys/mman.h> > + > #include "hw/pci.h" > #include "hw/xen_common.h" > #include "hw/xen_backend.h" > > #include "xen-mapcache.h" > > +#include <xen/hvm/ioreq.h> > +#include <xen/hvm/params.h> > + > +//#define DEBUG_XEN > + > +#ifdef DEBUG_XEN > +#define DPRINTF(fmt, ...) \ > + do { fprintf(stderr, "xen: " fmt, ## __VA_ARGS__); } while (0) > +#else > +#define DPRINTF(fmt, ...) \ > + do { } while (0) > +#endif > + > +/* Compatibility with older version */ > +#if __XEN_LATEST_INTERFACE_VERSION__ < 0x0003020a > +# define xen_vcpu_eport(shared_page, i) \ > + (shared_page->vcpu_iodata[i].vp_eport) > +# define xen_vcpu_ioreq(shared_page, vcpu) \ > + (shared_page->vcpu_iodata[vcpu].vp_ioreq) > +# define FMT_ioreq_size PRIx64 > +#else > +# define xen_vcpu_eport(shared_page, i) \ > + (shared_page->vcpu_ioreq[i].vp_eport) > +# define xen_vcpu_ioreq(shared_page, vcpu) \ > + (shared_page->vcpu_ioreq[vcpu])Could you please change these to static inline functions? Alex _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-23 12:37 UTC
[Xen-devel] Re: [Qemu-devel] [PATCH V11 00/15] Xen device model support
On 01.03.2011, at 19:35, Anthony.Perard@citrix.com wrote:> From: Anthony PERARD <anthony.perard@citrix.com> > > Hi all, > > Here is the few change since the V10: > > - Add braces for blocks with single statement in the clean-up patch; > - the patch that builds Xen only for x86 have been removed, instead, > xen_domainbuild is built with libhw and other Xen files are built for i386 > target only; > - the redirection structure with function pointer have been removed, instead, > there are few #define or static inline function use for the compatibility; > - the platform device uses trace instead of dprintf for guest log; > - introduce i440fx_xen_init and i440fx_common_init to avoid xen_enabled() in > piix_pci. >Nice series. I''m confident that V12 will go in :) Alex _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Anthony PERARD
2011-Mar-28 14:50 UTC
Re: [Xen-devel] Re: [Qemu-devel] [PATCH V11 02/15] xen: Make Xen build once.
On Wed, Mar 23, 2011 at 10:57, Alexander Graf <agraf@suse.de> wrote:> > On 01.03.2011, at 19:35, Anthony.Perard@citrix.com wrote: > >> From: Anthony PERARD <anthony.perard@citrix.com> >> >> xen_domainbuild is now build in libhw. And xen_machine_pv is build only >> for i386 targets. >> >> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> >> --- >> Makefile.objs | 3 +++ >> Makefile.target | 2 +- >> hw/xen_domainbuild.c | 10 +++++----- >> hw/xen_domainbuild.h | 5 +++-- >> hw/xen_machine_pv.c | 2 +- >> 5 files changed, 13 insertions(+), 9 deletions(-) >> >> diff --git a/Makefile.objs b/Makefile.objs >> index 9e98a66..8034115 100644 >> --- a/Makefile.objs >> +++ b/Makefile.objs >> @@ -269,6 +269,9 @@ hw-obj-$(CONFIG_DP8393X) += dp8393x.o >> hw-obj-$(CONFIG_DS1225Y) += ds1225y.o >> hw-obj-$(CONFIG_MIPSNET) += mipsnet.o >> >> +# Xen >> +hw-obj-$(CONFIG_XEN) += xen_domainbuild.o > > Why is this in generic code? Xen is x86 only and really should stay that way IMHO.I just try to build more object globally to avoid unnecessary i386-isms.>> + >> # Sound >> sound-obj-y >> sound-obj-$(CONFIG_SB16) += sb16.o >> diff --git a/Makefile.target b/Makefile.target >> index 220589e..ab0a570 100644 >> --- a/Makefile.target >> +++ b/Makefile.target >> @@ -206,7 +206,7 @@ QEMU_CFLAGS += $(VNC_JPEG_CFLAGS) >> QEMU_CFLAGS += $(VNC_PNG_CFLAGS) >> >> # xen backend driver support >> -obj-$(CONFIG_XEN) += xen_machine_pv.o xen_domainbuild.o >> +obj-i386-$(CONFIG_XEN) += xen_machine_pv.o >> >> # Inter-VM PCI shared memory >> obj-$(CONFIG_KVM) += ivshmem.o >> diff --git a/hw/xen_domainbuild.c b/hw/xen_domainbuild.c >> index 7f1fd66..b73d47f 100644 >> --- a/hw/xen_domainbuild.c >> +++ b/hw/xen_domainbuild.c >> @@ -1,9 +1,9 @@ >> #include <signal.h> >> -#include "xen_backend.h" >> -#include "xen_domainbuild.h" >> #include "sysemu.h" >> #include "qemu-timer.h" >> #include "qemu-log.h" >> +#include "xen_backend.h" >> +#include "xen_domainbuild.h" >> >> #include <xenguest.h> >> >> @@ -49,7 +49,7 @@ static int xenstore_domain_mkdir(char *path) >> } >> >> int xenstore_domain_init1(const char *kernel, const char *ramdisk, >> - const char *cmdline) >> + const char *cmdline, ram_addr_t ram_size) > > Isn''t ram_size a global anyways? What''s the rationale behind moving it to a parameter? Not saying I''m against it, just missed the reasoning here :)I put ram_size in a parameter because I don''t found a way to access to is global variable, and also because in these function, ram_size is read only. So, I can just remove this patch and just put both xen_machine_pv xen_domainbuild in obj-i386-y. Regards, -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Anthony PERARD
2011-Mar-28 15:22 UTC
Re: [Xen-devel] Re: [Qemu-devel] [PATCH V11 03/15] xen: Support new libxc calls from xen unstable.
On Wed, Mar 23, 2011 at 10:43, Alexander Graf <agraf@suse.de> wrote:> > On 01.03.2011, at 19:35, Anthony.Perard@citrix.com wrote: > >> From: Anthony PERARD <anthony.perard@citrix.com> >> >> This patch updates the libxenctrl calls in Qemu to use the new interface, >> otherwise Qemu wouldn''t be able to build against new versions of the >> library. >> >> We check libxenctrl version in configure, from Xen 3.3.0 to Xen >> unstable. >> >> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> >> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> >> Acked-by: Alexander Graf <agraf@suse.de> >> --- >> configure | 67 ++++++++++++++++++++++++++++++++++++++++++++++++- >> hw/xen_backend.c | 21 ++++++++------- >> hw/xen_backend.h | 6 ++-- >> hw/xen_common.h | 64 +++++++++++++++++++++++++++++++++++++---------- >> hw/xen_disk.c | 4 +- >> hw/xen_domainbuild.c | 3 +- >> 6 files changed, 133 insertions(+), 32 deletions(-) >> >> diff --git a/configure b/configure >> index 3036faf..a84d974 100755 >> --- a/configure >> +++ b/configure >> @@ -126,6 +126,7 @@ vnc_jpeg="" >> vnc_png="" >> vnc_thread="no" >> xen="" >> +xen_ctrl_version="" >> linux_aio="" >> attr="" >> vhost_net="" >> @@ -1147,20 +1148,81 @@ fi >> >> if test "$xen" != "no" ; then >> xen_libs="-lxenstore -lxenctrl -lxenguest" >> + >> + # Xen unstable >> cat > $TMPC <<EOF >> #include <xenctrl.h> >> #include <xs.h> >> -int main(void) { xs_daemon_open(); xc_interface_open(); return 0; } >> +#include <stdint.h> >> +#include <xen/hvm/hvm_info_table.h> >> +#if !defined(HVM_MAX_VCPUS) >> +# error HVM_MAX_VCPUS not defined >> +#endif >> +int main(void) { >> + xc_interface *xc; >> + xs_daemon_open(); >> + xc = xc_interface_open(0, 0, 0); >> + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); >> + xc_gnttab_open(NULL, 0); >> + return 0; >> +} >> EOF >> if compile_prog "" "$xen_libs" ; then >> + xen_ctrl_version=410 >> xen=yes >> - libs_softmmu="$xen_libs $libs_softmmu" >> + >> + # Xen 4.0.0 >> + elif ( >> + cat > $TMPC <<EOF >> +#include <xenctrl.h> >> +#include <xs.h> >> +#include <stdint.h> >> +#include <xen/hvm/hvm_info_table.h> >> +#if !defined(HVM_MAX_VCPUS) >> +# error HVM_MAX_VCPUS not defined >> +#endif >> +int main(void) { >> + xs_daemon_open(); >> + xc_interface_open(); >> + xc_gnttab_open(); >> + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); >> + return 0; >> +} >> +EOF >> + compile_prog "" "$xen_libs" >> + ) ; then >> + xen_ctrl_version=400 >> + xen=yes >> + >> + # Xen 3.3.0, 3.4.0 >> + elif ( >> + cat > $TMPC <<EOF >> +#include <xenctrl.h> >> +#include <xs.h> >> +int main(void) { >> + xs_daemon_open(); >> + xc_interface_open(); >> + xc_gnttab_open(); >> + xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0); >> + return 0; >> +} >> +EOF >> + compile_prog "" "$xen_libs" >> + ) ; then >> + xen_ctrl_version=330 >> + xen=yes >> + >> + # Xen not found or unsupported >> else >> if test "$xen" = "yes" ; then >> feature_not_found "xen" >> fi >> xen=no >> fi >> + >> + if test "$xen" = yes; then >> + libs_softmmu="$xen_libs $libs_softmmu" >> + fi >> fi >> >> ########################################## >> @@ -2755,6 +2817,7 @@ if test "$bluez" = "yes" ; then >> fi >> if test "$xen" = "yes" ; then >> echo "CONFIG_XEN=y" >> $config_host_mak >> + echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak >> fi >> if test "$io_thread" = "yes" ; then >> echo "CONFIG_IOTHREAD=y" >> $config_host_mak >> diff --git a/hw/xen_backend.c b/hw/xen_backend.c >> index 9f4ec4b..3907b83 100644 >> --- a/hw/xen_backend.c >> +++ b/hw/xen_backend.c >> @@ -43,7 +43,8 @@ >> /* ------------------------------------------------------------- */ >> >> /* public */ >> -int xen_xc; >> +XenXC xen_xc = XC_HANDLER_INITIAL_VALUE; >> +XenGnttab xen_xcg = XC_HANDLER_INITIAL_VALUE; >> struct xs_handle *xenstore = NULL; >> const char *xen_protocol; >> >> @@ -214,8 +215,8 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, >> xendev->debug = debug; >> xendev->local_port = -1; >> >> - xendev->evtchndev = xc_evtchn_open(); >> - if (xendev->evtchndev < 0) { >> + xendev->evtchndev = xc_evtchn_open(NULL, 0); >> + if (xendev->evtchndev == XC_HANDLER_INITIAL_VALUE) { >> xen_be_printf(NULL, 0, "can''t open evtchn device\n"); >> qemu_free(xendev); >> return NULL; >> @@ -223,15 +224,15 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, >> fcntl(xc_evtchn_fd(xendev->evtchndev), F_SETFD, FD_CLOEXEC); >> >> if (ops->flags & DEVOPS_FLAG_NEED_GNTDEV) { >> - xendev->gnttabdev = xc_gnttab_open(); >> - if (xendev->gnttabdev < 0) { >> + xendev->gnttabdev = xc_gnttab_open(NULL, 0); >> + if (xendev->gnttabdev == XC_HANDLER_INITIAL_VALUE) { >> xen_be_printf(NULL, 0, "can''t open gnttab device\n"); >> xc_evtchn_close(xendev->evtchndev); >> qemu_free(xendev); >> return NULL; >> } >> } else { >> - xendev->gnttabdev = -1; >> + xendev->gnttabdev = XC_HANDLER_INITIAL_VALUE; >> } >> >> QTAILQ_INSERT_TAIL(&xendevs, xendev, next); >> @@ -277,10 +278,10 @@ static struct XenDevice *xen_be_del_xendev(int dom, int dev) >> qemu_free(xendev->fe); >> } >> >> - if (xendev->evtchndev >= 0) { >> + if (xendev->evtchndev != XC_HANDLER_INITIAL_VALUE) { >> xc_evtchn_close(xendev->evtchndev); >> } >> - if (xendev->gnttabdev >= 0) { >> + if (xendev->gnttabdev != XC_HANDLER_INITIAL_VALUE) { >> xc_gnttab_close(xendev->gnttabdev); >> } >> >> @@ -664,8 +665,8 @@ int xen_be_init(void) >> goto err; >> } >> >> - xen_xc = xc_interface_open(); >> - if (xen_xc == -1) { >> + xen_xc = xc_interface_open(0, 0, 0); >> + if (xen_xc == XC_HANDLER_INITIAL_VALUE) { >> xen_be_printf(NULL, 0, "can''t open xen interface\n"); >> goto err; >> } >> diff --git a/hw/xen_backend.h b/hw/xen_backend.h >> index 1b428e3..6401c85 100644 >> --- a/hw/xen_backend.h >> +++ b/hw/xen_backend.h >> @@ -45,8 +45,8 @@ struct XenDevice { >> int remote_port; >> int local_port; >> >> - int evtchndev; >> - int gnttabdev; >> + XenEvtchn evtchndev; >> + XenGnttab gnttabdev; >> >> struct XenDevOps *ops; >> QTAILQ_ENTRY(XenDevice) next; >> @@ -55,7 +55,7 @@ struct XenDevice { >> /* ------------------------------------------------------------- */ >> >> /* variables */ >> -extern int xen_xc; >> +extern XenXC xen_xc; >> extern struct xs_handle *xenstore; >> extern const char *xen_protocol; >> >> diff --git a/hw/xen_common.h b/hw/xen_common.h >> index 8a55b44..7e123ec 100644 >> --- a/hw/xen_common.h >> +++ b/hw/xen_common.h >> @@ -1,6 +1,8 @@ >> #ifndef QEMU_HW_XEN_COMMON_H >> #define QEMU_HW_XEN_COMMON_H 1 >> >> +#include "config-host.h" >> + >> #include <stddef.h> >> #include <inttypes.h> >> >> @@ -13,22 +15,56 @@ >> #include "qemu-queue.h" >> >> /* >> - * tweaks needed to build with different xen versions >> - * 0x00030205 -> 3.1.0 >> - * 0x00030207 -> 3.2.0 >> - * 0x00030208 -> unstable >> + * We don''t support Xen prior to 3.3.0. >> */ >> -#include <xen/xen-compat.h> >> -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030205 >> -# define evtchn_port_or_error_t int >> -#endif >> -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030207 >> -# define xc_map_foreign_pages xc_map_foreign_batch >> + >> +/* Xen before 4.0 */ >> +#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 400 >> +static inline void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot, >> + xen_pfn_t *arr, int *err, >> + unsigned int num) >> +{ >> + return xc_map_foreign_batch(xc_handle, dom, prot, arr, num); >> +} >> #endif >> -#if __XEN_LATEST_INTERFACE_VERSION__ < 0x00030208 >> -# define xen_mb() mb() >> -# define xen_rmb() rmb() >> -# define xen_wmb() wmb() >> + >> + >> +/* Xen before 4.1 */ >> +#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 410 >> + >> +typedef int XenXC; >> +typedef int XenEvtchn; >> +typedef int XenGnttab; >> + >> +# define XC_INTERFACE_FMT "%i" >> +# define XC_HANDLER_INITIAL_VALUE -1 >> + >> +# define xc_interface_open(logger, dombuild_logger, open_flags) \ >> + xc_interface_open() >> +# define xc_evtchn_open(logger, open_flags) xc_evtchn_open() >> +# define xc_gnttab_open(logger, open_flags) xc_gnttab_open() > > > defines really bite me when abstracting the interface through an indirect calling table. I had to change the code this way to make it work with xenner: > > > diff --git a/hw/xen_common.h b/hw/xen_common.h > index a5fc74b..0c09b37 100644 > --- a/hw/xen_common.h > +++ b/hw/xen_common.h > @@ -39,10 +39,23 @@ typedef int XenGnttab; > # define XC_INTERFACE_FMT "%i" > # define XC_HANDLER_INITIAL_VALUE -1 > > -# define xc_interface_open(logger, dombuild_logger, open_flags) \ > - xc_interface_open() > -# define xc_evtchn_open(logger, open_flags) xc_evtchn_open() > -# define xc_gnttab_open(logger, open_flags) xc_gnttab_open() > +static inline XenEvtchn xen_xc_evtchn_open(void *logger, > + unsigned int open_flags) > +{ > + return xc_evtchn_open(); > +} > + > +static inline XenGnttab xen_xc_gnttab_open(void *logger, > + unsigned int open_flags) > +{ > + return xc_gnttab_open(); > +} > + > +static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, > + unsigned int open_flags) > +{ > + return xc_interface_open(); > +} > > static inline int xc_fd(int xen_xc) > { > @@ -69,6 +82,24 @@ typedef xc_gnttab *XenGnttab; > # define XC_INTERFACE_FMT "%p" > # define XC_HANDLER_INITIAL_VALUE NULL > > +static inline XenEvtchn xen_xc_evtchn_open(void *logger, > + unsigned int open_flags) > +{ > + return xc_evtchn_open(logger, open_flags); > +} > + > +static inline XenGnttab xen_xc_gnttab_open(void *logger, > + unsigned int open_flags) > +{ > + return xc_gnttab_open(logger, open_flags); > +} > + > +static inline XenXC xen_xc_interface_open(void *logger, void *dombuild_logger, > + int open_flags) > +{ > + return xc_interface_open(logger, dombuild_logger, open_flags); > +} > + > /* FIXME There is now way to have the xen fd */ > static inline int xc_fd(xc_interface *xen_xc) > { > > > Leave it as is in your patch and I''ll change it in my xenner patch set again, but I wanted to make sure that you''re aware of the issues going along with #defines.I understand the issues with the defines. I just trying to address both comment from Anthony and you. But, I think these static inline instead of the #defines will be ok. So I will put it in my series. -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Anthony PERARD
2011-Mar-28 16:08 UTC
[Xen-devel] Re: [Qemu-devel] [PATCH V11 06/15] xen: Add the Xen platform pci device
On Wed, Mar 23, 2011 at 12:08, Alexander Graf <agraf@suse.de> wrote:>> diff --git a/hw/pc_piix.c b/hw/pc_piix.c >> index 6eff06e..417c456 100644 >> --- a/hw/pc_piix.c >> +++ b/hw/pc_piix.c >> @@ -121,6 +121,10 @@ static void pc_init1(ram_addr_t ram_size, >> >> pc_vga_init(pci_enabled? pci_bus: NULL); >> >> + if (xen_enabled()) { >> + pci_xen_platform_init(pci_bus); > > It probably makes sense to fold that function in here. That way you wouldn''t need the entry in the stub file.Yes, I will do that. Thanks, -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Anthony PERARD
2011-Mar-28 16:28 UTC
Re: [Xen-devel] Re: [Qemu-devel] [PATCH V11 09/15] xen: Introduce the Xen mapcache
On Wed, Mar 23, 2011 at 12:33, Alexander Graf <agraf@suse.de> wrote:> We have a bitmap framework in qemu now. Please use that :). See bitmap.h / bitops.h / bitops.c.Will do. Thanks, -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Anthony PERARD
2011-Mar-28 16:30 UTC
Re: [Xen-devel] Re: [Qemu-devel] [PATCH V11 13/15] xen: Initialize event channels and io rings
On Wed, Mar 23, 2011 at 12:36, Alexander Graf <agraf@suse.de> wrote:>> +/* Compatibility with older version */ >> +#if __XEN_LATEST_INTERFACE_VERSION__ < 0x0003020a >> +# define xen_vcpu_eport(shared_page, i) \ >> + (shared_page->vcpu_iodata[i].vp_eport) >> +# define xen_vcpu_ioreq(shared_page, vcpu) \ >> + (shared_page->vcpu_iodata[vcpu].vp_ioreq) >> +# define FMT_ioreq_size PRIx64 >> +#else >> +# define xen_vcpu_eport(shared_page, i) \ >> + (shared_page->vcpu_ioreq[i].vp_eport) >> +# define xen_vcpu_ioreq(shared_page, vcpu) \ >> + (shared_page->vcpu_ioreq[vcpu]) > > Could you please change these to static inline functions?Yes, I will do that. Regards, -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Alexander Graf
2011-Mar-28 17:29 UTC
Re: [Xen-devel] Re: [Qemu-devel] [PATCH V11 02/15] xen: Make Xen build once.
On 03/28/2011 04:50 PM, Anthony PERARD wrote:> On Wed, Mar 23, 2011 at 10:57, Alexander Graf<agraf@suse.de> wrote: >> On 01.03.2011, at 19:35, Anthony.Perard@citrix.com wrote: >> >>> From: Anthony PERARD<anthony.perard@citrix.com> >>> >>> xen_domainbuild is now build in libhw. And xen_machine_pv is build only >>> for i386 targets. >>> >>> Signed-off-by: Anthony PERARD<anthony.perard@citrix.com> >>> --- >>> Makefile.objs | 3 +++ >>> Makefile.target | 2 +- >>> hw/xen_domainbuild.c | 10 +++++----- >>> hw/xen_domainbuild.h | 5 +++-- >>> hw/xen_machine_pv.c | 2 +- >>> 5 files changed, 13 insertions(+), 9 deletions(-) >>> >>> diff --git a/Makefile.objs b/Makefile.objs >>> index 9e98a66..8034115 100644 >>> --- a/Makefile.objs >>> +++ b/Makefile.objs >>> @@ -269,6 +269,9 @@ hw-obj-$(CONFIG_DP8393X) += dp8393x.o >>> hw-obj-$(CONFIG_DS1225Y) += ds1225y.o >>> hw-obj-$(CONFIG_MIPSNET) += mipsnet.o >>> >>> +# Xen >>> +hw-obj-$(CONFIG_XEN) += xen_domainbuild.o >> Why is this in generic code? Xen is x86 only and really should stay that way IMHO. > I just try to build more object globally to avoid unnecessary i386-isms. > >>> + >>> # Sound >>> sound-obj-y >>> sound-obj-$(CONFIG_SB16) += sb16.o >>> diff --git a/Makefile.target b/Makefile.target >>> index 220589e..ab0a570 100644 >>> --- a/Makefile.target >>> +++ b/Makefile.target >>> @@ -206,7 +206,7 @@ QEMU_CFLAGS += $(VNC_JPEG_CFLAGS) >>> QEMU_CFLAGS += $(VNC_PNG_CFLAGS) >>> >>> # xen backend driver support >>> -obj-$(CONFIG_XEN) += xen_machine_pv.o xen_domainbuild.o >>> +obj-i386-$(CONFIG_XEN) += xen_machine_pv.o >>> >>> # Inter-VM PCI shared memory >>> obj-$(CONFIG_KVM) += ivshmem.o >>> diff --git a/hw/xen_domainbuild.c b/hw/xen_domainbuild.c >>> index 7f1fd66..b73d47f 100644 >>> --- a/hw/xen_domainbuild.c >>> +++ b/hw/xen_domainbuild.c >>> @@ -1,9 +1,9 @@ >>> #include<signal.h> >>> -#include "xen_backend.h" >>> -#include "xen_domainbuild.h" >>> #include "sysemu.h" >>> #include "qemu-timer.h" >>> #include "qemu-log.h" >>> +#include "xen_backend.h" >>> +#include "xen_domainbuild.h" >>> >>> #include<xenguest.h> >>> >>> @@ -49,7 +49,7 @@ static int xenstore_domain_mkdir(char *path) >>> } >>> >>> int xenstore_domain_init1(const char *kernel, const char *ramdisk, >>> - const char *cmdline) >>> + const char *cmdline, ram_addr_t ram_size) >> Isn''t ram_size a global anyways? What''s the rationale behind moving it to a parameter? Not saying I''m against it, just missed the reasoning here :) > I put ram_size in a parameter because I don''t found a way to access to > is global variable, and also because in these function, ram_size is > read only. > > So, I can just remove this patch and just put both xen_machine_pv > xen_domainbuild in obj-i386-y.Sounds good to me. No need to build stuff generically that won''t be used generically :). Alex _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel