@@ -16,30 +16,18 @@
#include "init-dom-json.h"
-#define XENSTORE_PFN_OFFSET 1
#define STR_MAX_LENGTH 128
-static int alloc_xs_page(struct xc_interface_core *xch,
- libxl_dominfo *info,
- uint64_t *xenstore_pfn)
+static int get_xs_page(struct xc_interface_core *xch, libxl_dominfo *info,
+ uint64_t *xenstore_pfn)
{
int rc;
- const xen_pfn_t base = GUEST_MAGIC_BASE >> XC_PAGE_SHIFT;
- xen_pfn_t p2m = (GUEST_MAGIC_BASE >> XC_PAGE_SHIFT) + XENSTORE_PFN_OFFSET;
- rc = xc_domain_setmaxmem(xch, info->domid,
- info->max_memkb + (XC_PAGE_SIZE/1024));
- if (rc < 0)
- return rc;
-
- rc = xc_domain_populate_physmap_exact(xch, info->domid, 1, 0, 0, &p2m);
- if (rc < 0)
- return rc;
-
- *xenstore_pfn = base + XENSTORE_PFN_OFFSET;
- rc = xc_clear_domain_page(xch, info->domid, *xenstore_pfn);
- if (rc < 0)
- return rc;
+ rc = xc_hvm_param_get(xch, info->domid, HVM_PARAM_STORE_PFN, xenstore_pfn);
+ if (rc < 0) {
+ printf("Failed to get HVM_PARAM_STORE_PFN\n");
+ return 1;
+ }
return 0;
}
@@ -100,6 +88,7 @@ static bool do_xs_write_vm(struct xs_handle *xsh, xs_transaction_t t,
*/
static int create_xenstore(struct xs_handle *xsh,
libxl_dominfo *info, libxl_uuid uuid,
+ uint64_t xenstore_pfn,
evtchn_port_t xenstore_port)
{
domid_t domid;
@@ -145,8 +134,7 @@ static int create_xenstore(struct xs_handle *xsh,
rc = snprintf(target_memkb_str, STR_MAX_LENGTH, "%"PRIu64, info->current_memkb);
if (rc < 0 || rc >= STR_MAX_LENGTH)
return rc;
- rc = snprintf(ring_ref_str, STR_MAX_LENGTH, "%lld",
- (GUEST_MAGIC_BASE >> XC_PAGE_SHIFT) + XENSTORE_PFN_OFFSET);
+ rc = snprintf(ring_ref_str, STR_MAX_LENGTH, "%"PRIu64, xenstore_pfn);
if (rc < 0 || rc >= STR_MAX_LENGTH)
return rc;
rc = snprintf(xenstore_port_str, STR_MAX_LENGTH, "%u", xenstore_port);
@@ -230,7 +218,6 @@ static int init_domain(struct xs_handle *xsh,
libxl_uuid uuid;
uint64_t xenstore_evtchn, xenstore_pfn;
int rc;
- struct xenstore_domain_interface *intf;
printf("Init dom0less domain: %u\n", info->domid);
@@ -245,20 +232,11 @@ static int init_domain(struct xs_handle *xsh,
if (!xenstore_evtchn)
return 0;
- /* Alloc xenstore page */
- if (alloc_xs_page(xch, info, &xenstore_pfn) != 0) {
- printf("Error on alloc magic pages\n");
- return 1;
- }
-
- intf = xenforeignmemory_map(xfh, info->domid, PROT_READ | PROT_WRITE, 1,
- &xenstore_pfn, NULL);
- if (!intf) {
- printf("Error mapping xenstore page\n");
+ /* Get xenstore page */
+ if (get_xs_page(xch, info, &xenstore_pfn) != 0) {
+ printf("Error on getting xenstore page\n");
return 1;
}
- intf->connection = XENSTORE_RECONNECT;
- xenforeignmemory_unmap(xfh, intf, 1);
rc = xc_dom_gnttab_seed(xch, info->domid, true,
(xen_pfn_t)-1, xenstore_pfn, 0, 0);
@@ -272,19 +250,11 @@ static int init_domain(struct xs_handle *xsh,
if (rc)
err(1, "gen_stub_json_config");
- /* Now everything is ready: set HVM_PARAM_STORE_PFN */
- rc = xc_hvm_param_set(xch, info->domid, HVM_PARAM_STORE_PFN,
- xenstore_pfn);
- if (rc < 0)
- return rc;
-
- rc = create_xenstore(xsh, info, uuid, xenstore_evtchn);
+ rc = create_xenstore(xsh, info, uuid, xenstore_pfn, xenstore_evtchn);
if (rc)
err(1, "writing to xenstore");
- rc = xs_introduce_domain(xsh, info->domid,
- (GUEST_MAGIC_BASE >> XC_PAGE_SHIFT) + XENSTORE_PFN_OFFSET,
- xenstore_evtchn);
+ rc = xs_introduce_domain(xsh, info->domid, xenstore_pfn, xenstore_evtchn);
if (!rc)
err(1, "xs_introduce_domain");
return 0;