diff options
author | Julien Grall <julien.grall@linaro.org> | 2013-06-26 14:23:35 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2013-06-26 17:22:40 +0100 |
commit | de6562b4df1bce0a57bcd7cc09fc4ec494077444 (patch) | |
tree | 42b25ace4054ae8d6a4b373fdd877ed79f51d42e /tools | |
parent | dfeccbeaa6536ceb3303380361b7ac18e1013292 (diff) | |
download | xen-de6562b4df1bce0a57bcd7cc09fc4ec494077444.tar.gz xen-de6562b4df1bce0a57bcd7cc09fc4ec494077444.tar.bz2 xen-de6562b4df1bce0a57bcd7cc09fc4ec494077444.zip |
libxc: Fix guest boot on ARM after XSA-55
XSA-55 has exposed errors for guest creation on ARM:
- domain virt_base was not defined;
- xc_dom_alloc_segment allocates pfn from 0 instead of the RAM base address.
Signed-off-by: Julien Grall <julien.grall@linaro.org>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/libxc/xc_dom_armzimageloader.c | 1 | ||||
-rw-r--r-- | tools/libxc/xc_dom_core.c | 10 |
2 files changed, 7 insertions, 4 deletions
diff --git a/tools/libxc/xc_dom_armzimageloader.c b/tools/libxc/xc_dom_armzimageloader.c index 4cbbbab16f..54728b817f 100644 --- a/tools/libxc/xc_dom_armzimageloader.c +++ b/tools/libxc/xc_dom_armzimageloader.c @@ -123,6 +123,7 @@ static int xc_dom_parse_zimage_kernel(struct xc_dom_image *dom) dom->kernel_seg.vend = v_end; dom->parms.virt_entry = entry_addr; + dom->parms.virt_base = rambase; dom->guest_type = "xen-3.0-armv7l"; DOMPRINTF("%s: %s: RAM starts at %"PRI_xen_pfn, diff --git a/tools/libxc/xc_dom_core.c b/tools/libxc/xc_dom_core.c index 3df71714aa..0f367f6b8b 100644 --- a/tools/libxc/xc_dom_core.c +++ b/tools/libxc/xc_dom_core.c @@ -488,6 +488,7 @@ int xc_dom_alloc_segment(struct xc_dom_image *dom, { unsigned int page_size = XC_DOM_PAGE_SIZE(dom); xen_pfn_t pages = (size + page_size - 1) / page_size; + xen_pfn_t pfn; void *ptr; if ( start == 0 ) @@ -509,16 +510,17 @@ int xc_dom_alloc_segment(struct xc_dom_image *dom, } seg->vstart = start; - seg->pfn = (seg->vstart - dom->parms.virt_base) / page_size; + pfn = (seg->vstart - dom->parms.virt_base) / page_size; + seg->pfn = pfn + dom->rambase_pfn; if ( pages > dom->total_pages || /* multiple test avoids overflow probs */ - seg->pfn > dom->total_pages || - pages > dom->total_pages - seg->pfn) + pfn > dom->total_pages || + pages > dom->total_pages - pfn) { xc_dom_panic(dom->xch, XC_OUT_OF_MEMORY, "%s: segment %s too large (0x%"PRIpfn" > " "0x%"PRIpfn" - 0x%"PRIpfn" pages)", - __FUNCTION__, name, pages, dom->total_pages, seg->pfn); + __FUNCTION__, name, pages, dom->total_pages, pfn); return -1; } |