#include <xenguest.h>
#define INVALID_PFN ((xen_pfn_t)-1)
-#define INVALID_EVTCHN (~0u)
-#define INVALID_DOMID (~0)
#define X86_HVM_NR_SPECIAL_PAGES 8
#define X86_HVM_END_SPECIAL_REGION 0xff000u
* Details for the toolstack-prepared rings.
*
* *_gfn fields are allocated by the domain builder.
- * *_{evtchn,domid} fields must be provided by the caller.
*/
xen_pfn_t console_gfn;
xen_pfn_t xenstore_gfn;
- unsigned int console_evtchn;
- unsigned int xenstore_evtchn;
- uint32_t console_domid;
- uint32_t xenstore_domid;
-
/*
* initrd parameters as specified in start_info page
* Depending on capabilities of the booted kernel this may be a virtual
/* misc xen domain config stuff */
unsigned long flags;
+ unsigned int console_evtchn;
+ unsigned int xenstore_evtchn;
+ uint32_t console_domid;
+ uint32_t xenstore_domid;
xen_pfn_t shared_info_mfn;
xc_interface *xch;
dom->xenstore_gfn);
xc_hvm_param_set(dom->xch, dom->guest_domid, HVM_PARAM_MONITOR_RING_PFN,
base + MEMACCESS_PFN_OFFSET);
-
+ /* allocated by toolstack */
xc_hvm_param_set(dom->xch, dom->guest_domid, HVM_PARAM_CONSOLE_EVTCHN,
dom->console_evtchn);
xc_hvm_param_set(dom->xch, dom->guest_domid, HVM_PARAM_STORE_EVTCHN,
return ptr;
}
-static int xc_dom_check_required_fields(struct xc_dom_image *dom)
-{
- int rc = 0;
-
- if ( dom->console_evtchn == INVALID_EVTCHN )
- {
- xc_dom_panic(dom->xch, XC_INVALID_PARAM,
- "%s: Caller didn't set dom->console_evtchn", __func__);
- rc = -1;
- }
- if ( dom->console_domid == INVALID_DOMID )
- {
- xc_dom_panic(dom->xch, XC_INVALID_PARAM,
- "%s: Caller didn't set dom->console_domid", __func__);
- rc = -1;
- }
-
- if ( dom->xenstore_evtchn == INVALID_EVTCHN )
- {
- xc_dom_panic(dom->xch, XC_INVALID_PARAM,
- "%s: Caller didn't set dom->xenstore_evtchn", __func__);
- rc = -1;
- }
- if ( dom->xenstore_domid == INVALID_DOMID )
- {
- xc_dom_panic(dom->xch, XC_INVALID_PARAM,
- "%s: Caller didn't set dom->xenstore_domid", __func__);
- rc = -1;
- }
-
- if ( rc )
- errno = EINVAL;
-
- return rc;
-}
-
int xc_dom_boot_image(struct xc_dom_image *dom)
{
xc_dominfo_t info;
DOMPRINTF_CALLED(dom->xch);
- if ( (rc = xc_dom_check_required_fields(dom)) != 0 )
- return rc;
-
/* misc stuff*/
if ( (rc = dom->arch_hooks->bootearly(dom)) != 0 )
return rc;
dom->flags |= flags;
dom->console_evtchn = console_evtchn;
- dom->console_domid = 0;
dom->xenstore_evtchn = store_evtchn;
- dom->xenstore_domid = 0;
if ( (rc = xc_dom_boot_xen_init(dom, xch, domid)) != 0 )
goto out;
dom->parms.elf_paddr_offset = UNSET_ADDR;
dom->parms.p2m_base = UNSET_ADDR;
- dom->console_evtchn = INVALID_EVTCHN;
- dom->xenstore_evtchn = INVALID_EVTCHN;
- dom->console_domid = INVALID_DOMID;
- dom->xenstore_domid = INVALID_DOMID;
-
dom->flags = SIF_VIRT_P2M_4TOOLS;
dom->alloc_malloc += sizeof(*dom);
dom->xenstore_gfn = special_pfn(SPECIALPAGE_XENSTORE);
xc_clear_domain_page(dom->xch, dom->guest_domid, dom->xenstore_gfn);
xc_hvm_param_set(xch, domid, HVM_PARAM_STORE_PFN, dom->xenstore_gfn);
- xc_hvm_param_set(dom->xch, dom->guest_domid, HVM_PARAM_STORE_EVTCHN,
- dom->xenstore_evtchn);
xc_hvm_param_set(xch, domid, HVM_PARAM_BUFIOREQ_PFN,
special_pfn(SPECIALPAGE_BUFIOREQ));
dom->console_gfn = special_pfn(SPECIALPAGE_CONSOLE);
xc_clear_domain_page(dom->xch, dom->guest_domid, dom->console_gfn);
xc_hvm_param_set(xch, domid, HVM_PARAM_CONSOLE_PFN, dom->console_gfn);
- xc_hvm_param_set(dom->xch, dom->guest_domid, HVM_PARAM_CONSOLE_EVTCHN,
- dom->console_evtchn);
xc_hvm_param_set(xch, domid, HVM_PARAM_PAGING_RING_PFN,
special_pfn(SPECIALPAGE_PAGING));
}
static int hvm_build_set_params(xc_interface *handle, uint32_t domid,
- libxl_domain_build_info *info)
+ libxl_domain_build_info *info,
+ int store_evtchn, unsigned long *store_mfn,
+ int console_evtchn, unsigned long *console_mfn,
+ domid_t store_domid, domid_t console_domid)
{
struct hvm_info_table *va_hvm;
uint8_t *va_map, sum;
+ uint64_t str_mfn, cons_mfn;
int i;
if (info->type == LIBXL_DOMAIN_TYPE_HVM) {
munmap(va_map, XC_PAGE_SIZE);
}
+ xc_hvm_param_get(handle, domid, HVM_PARAM_STORE_PFN, &str_mfn);
+ xc_hvm_param_get(handle, domid, HVM_PARAM_CONSOLE_PFN, &cons_mfn);
+ xc_hvm_param_set(handle, domid, HVM_PARAM_STORE_EVTCHN, store_evtchn);
+ xc_hvm_param_set(handle, domid, HVM_PARAM_CONSOLE_EVTCHN, console_evtchn);
+
+ *store_mfn = str_mfn;
+ *console_mfn = cons_mfn;
+
+ xc_dom_gnttab_hvm_seed(handle, domid, *console_mfn, *store_mfn, console_domid, store_domid);
return 0;
}
dom->container_type = XC_DOM_HVM_CONTAINER;
- dom->console_evtchn = state->console_port;
- dom->console_domid = state->console_domid;
- dom->xenstore_evtchn = state->store_port;
- dom->xenstore_domid = state->store_domid;
-
/* The params from the configuration file are in Mb, which are then
* multiplied by 1 Kb. This was then divided off when calling
* the old xc_hvm_build_target_mem() which then turned them to bytes.
goto out;
}
- rc = hvm_build_set_params(ctx->xch, domid, info);
+ rc = hvm_build_set_params(ctx->xch, domid, info, state->store_port,
+ &state->store_mfn, state->console_port,
+ &state->console_mfn, state->store_domid,
+ state->console_domid);
if (rc != 0) {
LOG(ERROR, "hvm build set params failed");
goto out;
goto out;
}
- state->console_mfn = dom->console_gfn;
- state->store_mfn = dom->xenstore_gfn;
-
xc_dom_release(dom);
return 0;
#define STUBDOM_SPECIAL_CONSOLES 3
#define TAP_DEVICE_SUFFIX "-emu"
#define DOMID_XS_PATH "domid"
+#define INVALID_DOMID ~0
/* Size macros. */
#define __AC(X,Y) (X##Y)