aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc
diff options
context:
space:
mode:
authorWei Liu <wei.liu2@citrix.com>2013-04-26 11:11:37 +0100
committerIan Campbell <ian.campbell@citrix.com>2013-04-26 15:55:10 +0100
commit0114d259ebcd1f87966e2849f6ac1af8d9dd89c5 (patch)
treea0f3fe704328639c31bab95b2270192f6a1575ca /tools/libxc
parent7259d4d3df40d273725b8c074f169b98846dec97 (diff)
downloadxen-0114d259ebcd1f87966e2849f6ac1af8d9dd89c5.tar.gz
xen-0114d259ebcd1f87966e2849f6ac1af8d9dd89c5.tar.bz2
xen-0114d259ebcd1f87966e2849f6ac1af8d9dd89c5.zip
libxl: write IO ABI for disk frontends
This is a patch to forward-port a Xend behaviour. Xend writes IO ABI used for all frontends. Blkfront before 2.6.26 relies on this behaviour otherwise guest cannot boot when running in 32-on-64 mode. Blkfront after 2.6.26 writes that node itself, in which case it's just an overwrite to an existing node which should be OK. In fact Xend writes the ABI for all frontends including console and vif. But nowadays only old disk frontends rely on that behaviour so that we only write the ABI for disk frontends in libxl, minimizing the impact. Signed-off-by: Wei Liu <wei.liu2@citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'tools/libxc')
-rw-r--r--tools/libxc/xc_dom_arm.c7
-rw-r--r--tools/libxc/xc_dom_x86.c34
-rw-r--r--tools/libxc/xenctrl.h10
3 files changed, 51 insertions, 0 deletions
diff --git a/tools/libxc/xc_dom_arm.c b/tools/libxc/xc_dom_arm.c
index 041832e68e..aaf35ca70d 100644
--- a/tools/libxc/xc_dom_arm.c
+++ b/tools/libxc/xc_dom_arm.c
@@ -29,6 +29,13 @@
#define CONSOLE_PFN_OFFSET 0
#define XENSTORE_PFN_OFFSET 1
+/* get guest IO ABI protocol */
+const char *xc_domain_get_native_protocol(xc_interface *xch,
+ uint32_t domid)
+{
+ return XEN_IO_PROTO_ABI_ARM;
+}
+
/* ------------------------------------------------------------------------ */
/*
* arm guests are hybrid and start off with paging disabled, therefore no
diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c
index d89526d789..f1be43bed6 100644
--- a/tools/libxc/xc_dom_x86.c
+++ b/tools/libxc/xc_dom_x86.c
@@ -47,6 +47,40 @@
#define round_down(addr, mask) ((addr) & ~(mask))
#define round_up(addr, mask) ((addr) | (mask))
+/* get guest IO ABI protocol */
+const char *xc_domain_get_native_protocol(xc_interface *xch,
+ uint32_t domid)
+{
+ int ret;
+ uint32_t guest_width;
+ const char *protocol;
+ DECLARE_DOMCTL;
+
+ memset(&domctl, 0, sizeof(domctl));
+ domctl.domain = domid;
+ domctl.cmd = XEN_DOMCTL_get_address_size;
+
+ ret = do_domctl(xch, &domctl);
+
+ if ( ret )
+ return NULL;
+
+ guest_width = domctl.u.address_size.size;
+
+ switch (guest_width) {
+ case 32: /* 32 bit guest */
+ protocol = XEN_IO_PROTO_ABI_X86_32;
+ break;
+ case 64: /* 64 bit guest */
+ protocol = XEN_IO_PROTO_ABI_X86_64;
+ break;
+ default:
+ protocol = NULL;
+ }
+
+ return protocol;
+}
+
static unsigned long
nr_page_tables(struct xc_dom_image *dom,
xen_vaddr_t start, xen_vaddr_t end, unsigned long bits)
diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h
index 54a2d5aff5..c024af439b 100644
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
@@ -672,6 +672,16 @@ int xc_domain_hvm_setcontext(xc_interface *xch,
uint32_t size);
/**
+ * This function will return guest IO ABI protocol
+ *
+ * @parm xch a handle to an open hypervisor interface
+ * @parm domid the domain to get IO ABI protocol for
+ * @return guest protocol on success, NULL on failure
+ */
+const char *xc_domain_get_native_protocol(xc_interface *xch,
+ uint32_t domid);
+
+/**
* This function returns information about the execution context of a
* particular vcpu of a domain.
*