#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,
- int store_evtchn, unsigned long *store_mfn,
- int console_evtchn, unsigned long *console_mfn,
- domid_t store_domid, domid_t console_domid)
+ libxl_domain_build_info *info)
{
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, state->store_port,
- &state->store_mfn, state->console_port,
- &state->console_mfn, state->store_domid,
- state->console_domid);
+ rc = hvm_build_set_params(ctx->xch, domid, info);
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)