do_exchange(dom, PHYS_PFN(_boot_target - dom->parms.virt_base),
virt_to_mfn(&_boot_page));
- /* Make sure the bootstrap page table does not RW-map any of our current
- * page table frames */
- if ( (rc = xc_dom_update_guest_p2m(dom))) {
- printk("xc_dom_update_guest_p2m returned %d\n", rc);
- errnum = ERR_BOOT_FAILURE;
- goto out;
- }
-
if ( dom->arch_hooks->setup_pgtables )
if ( (rc = dom->arch_hooks->setup_pgtables(dom))) {
printk("setup_pgtables returned %d\n", rc);
* Note that the input is offset by rambase.
*/
xen_pfn_t *p2m_host;
- void *p2m_guest;
/* physical memory
*
int xc_dom_parse_image(struct xc_dom_image *dom);
int xc_dom_set_arch_hooks(struct xc_dom_image *dom);
int xc_dom_build_image(struct xc_dom_image *dom);
-int xc_dom_update_guest_p2m(struct xc_dom_image *dom);
int xc_dom_boot_xen_init(struct xc_dom_image *dom, xc_interface *xch,
uint32_t domid);
return -1;
/* initial mm setup */
- if ( (rc = xc_dom_update_guest_p2m(dom)) != 0 )
- return rc;
if ( dom->arch_hooks->setup_pgtables &&
(rc = dom->arch_hooks->setup_pgtables(dom)) != 0 )
return rc;
return 0;
}
-int xc_dom_update_guest_p2m(struct xc_dom_image *dom)
-{
- uint32_t *p2m_32;
- uint64_t *p2m_64;
- xen_pfn_t i;
-
- if ( !dom->p2m_guest )
- return 0;
-
- switch ( dom->arch_hooks->sizeof_pfn )
- {
- case 4:
- DOMPRINTF("%s: dst 32bit, pages 0x%" PRIpfn "",
- __FUNCTION__, dom->p2m_size);
- p2m_32 = dom->p2m_guest;
- for ( i = 0; i < dom->p2m_size; i++ )
- if ( dom->p2m_host[i] != INVALID_PFN )
- p2m_32[i] = dom->p2m_host[i];
- else
- p2m_32[i] = (uint32_t) - 1;
- break;
- case 8:
- DOMPRINTF("%s: dst 64bit, pages 0x%" PRIpfn "",
- __FUNCTION__, dom->p2m_size);
- p2m_64 = dom->p2m_guest;
- for ( i = 0; i < dom->p2m_size; i++ )
- if ( dom->p2m_host[i] != INVALID_PFN )
- p2m_64[i] = dom->p2m_host[i];
- else
- p2m_64[i] = (uint64_t) - 1;
- break;
- default:
- xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
- "sizeof_pfn is invalid (is %d, can be 4 or 8)",
- dom->arch_hooks->sizeof_pfn);
- return -1;
- }
- return 0;
-}
-
static int xc_dom_build_module(struct xc_dom_image *dom, unsigned int mod)
{
size_t unziplen, modulelen;
#define MAPPING_MAX 2
struct xc_dom_x86_mapping maps[MAPPING_MAX];
const struct xc_dom_params *params;
+
+ /* PV: Pointer to the in-guest P2M. */
+ void *p2m_guest;
};
/* get guest IO ABI protocol */
xen_pfn_t l3pfn,
xen_pfn_t l3mfn)
{
+ struct xc_dom_image_x86 *domx86 = dom->arch_private;
+ uint32_t *p2m_guest = domx86->p2m_guest;
xen_pfn_t new_l3mfn;
struct xc_mmu *mmu;
void *l3tab;
if ( !new_l3mfn )
goto out;
- dom->p2m_host[l3pfn] = new_l3mfn;
- if ( xc_dom_update_guest_p2m(dom) != 0 )
- goto out;
+ p2m_guest[l3pfn] = dom->p2m_host[l3pfn] = new_l3mfn;
if ( xc_add_mmu_update(dom->xch, mmu,
(((unsigned long long)new_l3mfn)
static int setup_pgtables_x86_32_pae(struct xc_dom_image *dom)
{
struct xc_dom_image_x86 *domx86 = dom->arch_private;
- xen_pfn_t l3mfn, l3pfn;
+ uint32_t *p2m_guest = domx86->p2m_guest;
+ xen_pfn_t l3mfn, l3pfn, i;
+
+ /* Copy dom->p2m_host[] into the guest. */
+ for ( i = 0; i < dom->p2m_size; ++i )
+ {
+ if ( dom->p2m_host[i] != INVALID_PFN )
+ p2m_guest[i] = dom->p2m_host[i];
+ else
+ p2m_guest[i] = -1;
+ }
l3pfn = domx86->maps[0].lvls[2].pfn;
l3mfn = xc_dom_p2m(dom, l3pfn);
static int setup_pgtables_x86_64(struct xc_dom_image *dom)
{
+ struct xc_dom_image_x86 *domx86 = dom->arch_private;
+ uint64_t *p2m_guest = domx86->p2m_guest;
+ xen_pfn_t i;
+
+ /* Copy dom->p2m_host[] into the guest. */
+ for ( i = 0; i < dom->p2m_size; ++i )
+ {
+ if ( dom->p2m_host[i] != INVALID_PFN )
+ p2m_guest[i] = dom->p2m_host[i];
+ else
+ p2m_guest[i] = -1;
+ }
+
return setup_pgtables_pv(dom);
}
static int alloc_p2m_list(struct xc_dom_image *dom, size_t p2m_alloc_size)
{
+ struct xc_dom_image_x86 *domx86 = dom->arch_private;
+
if ( xc_dom_alloc_segment(dom, &dom->p2m_seg, "phys2mach",
0, p2m_alloc_size) )
return -1;
- dom->p2m_guest = xc_dom_seg_to_ptr(dom, &dom->p2m_seg);
- if ( dom->p2m_guest == NULL )
+
+ domx86->p2m_guest = xc_dom_seg_to_ptr(dom, &dom->p2m_seg);
+ if ( domx86->p2m_guest == NULL )
return -1;
return 0;