#define DT_IRQ_TYPE_LEVEL_HIGH 0x00000004
#define DT_IRQ_TYPE_LEVEL_LOW 0x00000008
-static const char *gicv_to_string(uint8_t gic_version)
+static const char *gicv_to_string(libxl_gic_version gic_version)
{
switch (gic_version) {
- case XEN_DOMCTL_CONFIG_GIC_V2:
+ case LIBXL_GIC_VERSION_V2:
return "V2";
- case XEN_DOMCTL_CONFIG_GIC_V3:
+ case LIBXL_GIC_VERSION_V3:
return "V3";
default:
return "unknown";
int libxl__arch_domain_save_config(libxl__gc *gc,
libxl_domain_config *d_config,
+ libxl__domain_build_state *state,
const xc_domain_configuration_t *xc_config)
{
switch (xc_config->gic_version) {
return ERROR_FAIL;
}
+ state->clock_frequency = xc_config->clock_frequency;
+
return 0;
}
const libxl_version_info *vers;
const struct arch_info *ainfo;
- /* convenience aliases */
- xc_domain_configuration_t *xc_config = &state->config;
-
vers = libxl_get_version_info(CTX);
if (vers == NULL) return ERROR_FAIL;
LOG(DEBUG, "constructing DTB for Xen version %d.%d guest",
vers->xen_version_major, vers->xen_version_minor);
- LOG(DEBUG, " - vGIC version: %s", gicv_to_string(xc_config->gic_version));
+ LOG(DEBUG, " - vGIC version: %s",
+ gicv_to_string(info->arch_arm.gic_version));
if (info->device_tree) {
LOG(DEBUG, " - Partial device tree provided: %s", info->device_tree);
FDT( make_memory_nodes(gc, fdt, dom) );
- switch (xc_config->gic_version) {
- case XEN_DOMCTL_CONFIG_GIC_V2:
+ switch (info->arch_arm.gic_version) {
+ case LIBXL_GIC_VERSION_V2:
FDT( make_gicv2_node(gc, fdt,
GUEST_GICD_BASE, GUEST_GICD_SIZE,
GUEST_GICC_BASE, GUEST_GICC_SIZE) );
break;
- case XEN_DOMCTL_CONFIG_GIC_V3:
+ case LIBXL_GIC_VERSION_V3:
FDT( make_gicv3_node(gc, fdt) );
break;
default:
LOG(ERROR, "Unknown GIC version %s",
- gicv_to_string(xc_config->gic_version));
+ gicv_to_string(info->arch_arm.gic_version));
rc = ERROR_FAIL;
goto out;
}
- FDT( make_timer_node(gc, fdt, ainfo, xc_config->clock_frequency) );
+ FDT( make_timer_node(gc, fdt, ainfo, state->clock_frequency) );
FDT( make_hypervisor_node(gc, fdt, vers) );
if (info->arch_arm.vuart == LIBXL_VUART_TYPE_SBSA_UART)
}
int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config,
+ libxl__domain_build_state *state,
uint32_t *domid)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
goto out;
}
- rc = libxl__arch_domain_save_config(gc, d_config, &xc_config);
+ rc = libxl__arch_domain_save_config(gc, d_config, state, &xc_config);
if (rc < 0)
goto out;
}
goto error_out;
}
- ret = libxl__domain_make(gc, d_config, &domid);
+ ret = libxl__domain_make(gc, d_config, &dcs->build_state, &domid);
if (ret) {
LOGD(ERROR, domid, "cannot make domain: %d", ret);
dcs->guest_domid = domid;
xen_pfn_t vuart_gfn;
evtchn_port_t vuart_port;
+
+ /* ARM only to deal with broken firmware */
+ uint32_t clock_frequency;
} libxl__domain_build_state;
_hidden int libxl__build_pre(libxl__gc *gc, uint32_t domid,
* on exit (even error exit), domid may be valid and refer to a domain */
_hidden int libxl__domain_make(libxl__gc *gc,
libxl_domain_config *d_config,
+ libxl__domain_build_state *state,
uint32_t *domid);
_hidden int libxl__domain_build(libxl__gc *gc,