pfn 0 is a legitimate (albeit unlikely) frame to use, so skipping it is wrong.
This behaviour appears to exists simply to cover the fact that zero is the
default value of an uninitialised field in dom.
ARM already clears the frames at the point that the pfns are allocated,
meaning that the added clear_page() is wasteful. Alter x86 to match ARM and
clear the page when it is allocated.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
Tested-by: Julien Grall <julien.grall@arm.com>
Release-acked-by: Julien Grall <julien.grall@linaro.org>
xc_clear_domain_page(dom->xch, dom->guest_domid, dom->console_pfn);
xc_clear_domain_page(dom->xch, dom->guest_domid, dom->xenstore_pfn);
xc_clear_domain_page(dom->xch, dom->guest_domid, base + MEMACCESS_PFN_OFFSET);
- xc_clear_domain_page(dom->xch, dom->guest_domid, base + VUART_PFN_OFFSET);
+ xc_clear_domain_page(dom->xch, dom->guest_domid, dom->vuart_gfn);
+
xc_hvm_param_set(dom->xch, dom->guest_domid, HVM_PARAM_CONSOLE_PFN,
dom->console_pfn);
xc_hvm_param_set(dom->xch, dom->guest_domid, HVM_PARAM_STORE_PFN,
return rc;
}
-static int clear_page(struct xc_dom_image *dom, xen_pfn_t pfn)
-{
- xen_pfn_t dst;
- int rc;
-
- if ( pfn == 0 )
- return 0;
-
- dst = xc_dom_p2m(dom, pfn);
- DOMPRINTF("%s: pfn 0x%" PRIpfn ", mfn 0x%" PRIpfn "",
- __FUNCTION__, pfn, dst);
- rc = xc_clear_domain_page(dom->xch, dom->guest_domid, dst);
- if ( rc != 0 )
- xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
- "%s: xc_clear_domain_page failed (pfn 0x%" PRIpfn
- ", rc=%d)", __FUNCTION__, pfn, rc);
- return rc;
-}
-
/* ------------------------------------------------------------------------ */
if ( (rc = dom->arch_hooks->setup_pgtables(dom)) != 0 )
return rc;
- if ( (rc = clear_page(dom, dom->console_pfn)) != 0 )
- return rc;
- if ( (rc = clear_page(dom, dom->xenstore_pfn)) != 0 )
- return rc;
- if ( (rc = clear_page(dom, dom->vuart_gfn)) != 0 )
- return rc;
-
/* start info page */
if ( dom->arch_hooks->start_info )
dom->arch_hooks->start_info(dom);
dom->xenstore_pfn = xc_dom_alloc_page(dom, "xenstore");
if ( dom->xenstore_pfn == INVALID_PFN )
return -1;
+ xc_clear_domain_page(dom->xch, dom->guest_domid,
+ xc_dom_p2m(dom, dom->xenstore_pfn));
dom->console_pfn = xc_dom_alloc_page(dom, "console");
if ( dom->console_pfn == INVALID_PFN )
return -1;
+ xc_clear_domain_page(dom->xch, dom->guest_domid,
+ xc_dom_p2m(dom, dom->console_pfn));
dom->alloc_bootstack = 1;
special_pfn(SPECIALPAGE_IDENT_PT) << PAGE_SHIFT);
dom->console_pfn = special_pfn(SPECIALPAGE_CONSOLE);
+ xc_clear_domain_page(dom->xch, dom->guest_domid, dom->console_pfn);
+
dom->xenstore_pfn = special_pfn(SPECIALPAGE_XENSTORE);
+ xc_clear_domain_page(dom->xch, dom->guest_domid, dom->xenstore_pfn);
+
dom->parms.virt_hypercall = -1;
rc = 0;