diff options
author | Wei Liu <wei.liu2@citrix.com> | 2013-04-26 11:11:37 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2013-04-26 15:55:10 +0100 |
commit | 0114d259ebcd1f87966e2849f6ac1af8d9dd89c5 (patch) | |
tree | a0f3fe704328639c31bab95b2270192f6a1575ca /tools/libxc/xc_dom_x86.c | |
parent | 7259d4d3df40d273725b8c074f169b98846dec97 (diff) | |
download | xen-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/xc_dom_x86.c')
-rw-r--r-- | tools/libxc/xc_dom_x86.c | 34 |
1 files changed, 34 insertions, 0 deletions
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) |