From patchwork Fri Dec 27 13:45:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 11311179 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4DD86139A for ; Fri, 27 Dec 2019 13:46:58 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1F75520882 for ; Fri, 27 Dec 2019 13:46:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=citrix.com header.i=@citrix.com header.b="b/ppZqBD" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1F75520882 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=citrix.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ikpvu-0003Mh-US; Fri, 27 Dec 2019 13:45:38 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ikpvt-0003MQ-Gg for xen-devel@lists.xenproject.org; Fri, 27 Dec 2019 13:45:37 +0000 X-Inumbo-ID: 23ce3542-28af-11ea-b6f1-bc764e2007e4 Received: from esa6.hc3370-68.iphmx.com (unknown [216.71.155.175]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 23ce3542-28af-11ea-b6f1-bc764e2007e4; Fri, 27 Dec 2019 13:45:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1577454327; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=Ob/U7KrE5sk+3yZo0czd2/Jt8RFS24kv/BXiOsuPlT4=; b=b/ppZqBDG8MGbadsHYx/wllTetibl2XkI2BNwPjRuMHX0pLfcECMFKc9 MhyBXgO8Oy9BOJOkQBEUajP+93yE9X1Jqpst5WXggjlmDbvRTrOz6OfEt xBbtU8pXLIT6ZlSl0c5gHwu7KBWAu8r7OPHIi1CmZLrc9mlQV2+P7mHaI U=; Authentication-Results: esa6.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=andrew.cooper3@citrix.com; spf=Pass smtp.mailfrom=Andrew.Cooper3@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: None (esa6.hc3370-68.iphmx.com: no sender authenticity information available from domain of andrew.cooper3@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa6.hc3370-68.iphmx.com; envelope-from="Andrew.Cooper3@citrix.com"; x-sender="andrew.cooper3@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa6.hc3370-68.iphmx.com: domain of Andrew.Cooper3@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa6.hc3370-68.iphmx.com; envelope-from="Andrew.Cooper3@citrix.com"; x-sender="Andrew.Cooper3@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ip4:168.245.78.127 ~all" Received-SPF: None (esa6.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa6.hc3370-68.iphmx.com; envelope-from="Andrew.Cooper3@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: iHykdEvh2sYqilKpgTYghiekTEi0q2ebJhEqIIjy3j9sJCpF+z/yQeJNv3jkIJI4ngxD+A5c18 0MfWJ30Q4tZQ4IqFo+5qSA0zOGcD59i0pBPJVmgHyW8frPLVE9blyhY0VA9NtNB0H8Pd6/fcka cDqLUgwAQjSMl6slVbskyeJ7ApUwWfQmUuDPTMt5ao3nTbcTaOW563koLXTjcPeBVO5FdkoSg3 qALgCEFOA3SbPfVYbKU2kBs4tJTJdBsh/An8iepvxPSYqj61PfANwShRxALpcnEuFAfyTZymey 0hQ= X-SBRS: 2.7 X-MesageID: 10618866 X-Ironport-Server: esa6.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.69,363,1571716800"; d="scan'208";a="10618866" From: Andrew Cooper To: Xen-devel Date: Fri, 27 Dec 2019 13:45:16 +0000 Message-ID: <20191227134516.15530-1-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.11.0 MIME-Version: 1.0 Subject: [Xen-devel] [PATCH] tools/libxl: Reposition build_pre() logic between architectures X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Julien Grall , Wei Liu , Andrew Cooper , Jan Beulich , Anthony Perard , Ian Jackson , Volodymyr Babchuk , =?utf-8?q?Roger_Pau_Monn?= =?utf-8?q?=C3=A9?= Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" The call to xc_domain_disable_migrate() is made only from x86, while its handling in Xen is common. Move it to the libxl__build_pre(). hvm_set_conf_params(), hvm_set_viridian_features(), hvm_set_mca_capabilities(), and the altp2m logic is all in common code (parts ifdef'd) but despite this, is all actually x86 specific. Move it into x86 specific code, and fold all of the xc_hvm_param_set() calls together into hvm_set_conf_params() in a far more coherent way. Finally - ensure that all hypercalls have their return values checked. No practical change in constructed domains. Fewer useless hypercalls now to construct an ARM guest. Signed-off-by: Andrew Cooper Acked-by: Wei Liu --- CC: Ian Jackson CC: Wei Liu CC: Anthony Perard CC: Jan Beulich CC: Wei Liu CC: Roger Pau Monné CC: Stefano Stabellini CC: Julien Grall CC: Volodymyr Babchuk --- tools/libxl/libxl_dom.c | 183 ++---------------------------------------------- tools/libxl/libxl_x86.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 185 insertions(+), 179 deletions(-) diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index cdb294ab8d..573c63692b 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -243,149 +243,6 @@ static int numa_place_domain(libxl__gc *gc, uint32_t domid, return rc; } -static unsigned long timer_mode(const libxl_domain_build_info *info) -{ - const libxl_timer_mode mode = info->timer_mode; - assert(mode >= LIBXL_TIMER_MODE_DELAY_FOR_MISSED_TICKS && - mode <= LIBXL_TIMER_MODE_ONE_MISSED_TICK_PENDING); - return ((unsigned long)mode); -} - -#if defined(__i386__) || defined(__x86_64__) -static int hvm_set_viridian_features(libxl__gc *gc, uint32_t domid, - libxl_domain_build_info *const info) -{ - libxl_bitmap enlightenments; - libxl_viridian_enlightenment v; - uint64_t mask = 0; - - libxl_bitmap_init(&enlightenments); - libxl_bitmap_alloc(CTX, &enlightenments, - LIBXL_BUILDINFO_HVM_VIRIDIAN_ENABLE_DISABLE_WIDTH); - - if (libxl_defbool_val(info->u.hvm.viridian)) { - /* Enable defaults */ - libxl_bitmap_set(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_BASE); - libxl_bitmap_set(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_FREQ); - libxl_bitmap_set(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_TIME_REF_COUNT); - libxl_bitmap_set(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_APIC_ASSIST); - libxl_bitmap_set(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_CRASH_CTL); - } - - libxl_for_each_set_bit(v, info->u.hvm.viridian_enable) { - if (libxl_bitmap_test(&info->u.hvm.viridian_disable, v)) { - LOG(ERROR, "%s group both enabled and disabled", - libxl_viridian_enlightenment_to_string(v)); - goto err; - } - if (libxl_viridian_enlightenment_to_string(v)) /* check validity */ - libxl_bitmap_set(&enlightenments, v); - } - - libxl_for_each_set_bit(v, info->u.hvm.viridian_disable) - if (libxl_viridian_enlightenment_to_string(v)) /* check validity */ - libxl_bitmap_reset(&enlightenments, v); - - /* The base set is a pre-requisite for all others */ - if (!libxl_bitmap_is_empty(&enlightenments) && - !libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_BASE)) { - LOG(ERROR, "base group not enabled"); - goto err; - } - - libxl_for_each_set_bit(v, enlightenments) - LOG(DETAIL, "%s group enabled", libxl_viridian_enlightenment_to_string(v)); - - if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_BASE)) { - mask |= HVMPV_base_freq; - - if (!libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_FREQ)) - mask |= HVMPV_no_freq; - } - - if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_TIME_REF_COUNT)) - mask |= HVMPV_time_ref_count; - - if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_REFERENCE_TSC)) - mask |= HVMPV_reference_tsc; - - if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_HCALL_REMOTE_TLB_FLUSH)) - mask |= HVMPV_hcall_remote_tlb_flush; - - if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_APIC_ASSIST)) - mask |= HVMPV_apic_assist; - - if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_CRASH_CTL)) - mask |= HVMPV_crash_ctl; - - if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_SYNIC)) - mask |= HVMPV_synic; - - if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_STIMER)) - mask |= HVMPV_time_ref_count | HVMPV_synic | HVMPV_stimer; - - if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_HCALL_IPI)) - mask |= HVMPV_hcall_ipi; - - if (mask != 0 && - xc_hvm_param_set(CTX->xch, - domid, - HVM_PARAM_VIRIDIAN, - mask) != 0) { - LOGE(ERROR, "Couldn't set viridian feature mask (0x%"PRIx64")", mask); - goto err; - } - - libxl_bitmap_dispose(&enlightenments); - return 0; - -err: - libxl_bitmap_dispose(&enlightenments); - return ERROR_FAIL; -} - -static int hvm_set_mca_capabilities(libxl__gc *gc, uint32_t domid, - libxl_domain_build_info *const info) -{ - unsigned long caps = info->u.hvm.mca_caps; - - if (!caps) - return 0; - - return xc_hvm_param_set(CTX->xch, domid, HVM_PARAM_MCA_CAP, caps); -} -#endif - -static void hvm_set_conf_params(xc_interface *handle, uint32_t domid, - libxl_domain_build_info *const info) -{ - switch(info->type) { - case LIBXL_DOMAIN_TYPE_PVH: - xc_hvm_param_set(handle, domid, HVM_PARAM_PAE_ENABLED, true); - xc_hvm_param_set(handle, domid, HVM_PARAM_TIMER_MODE, - timer_mode(info)); - xc_hvm_param_set(handle, domid, HVM_PARAM_NESTEDHVM, - libxl_defbool_val(info->nested_hvm)); - break; - case LIBXL_DOMAIN_TYPE_HVM: - xc_hvm_param_set(handle, domid, HVM_PARAM_PAE_ENABLED, - libxl_defbool_val(info->u.hvm.pae)); -#if defined(__i386__) || defined(__x86_64__) - xc_hvm_param_set(handle, domid, HVM_PARAM_HPET_ENABLED, - libxl_defbool_val(info->u.hvm.hpet)); -#endif - xc_hvm_param_set(handle, domid, HVM_PARAM_TIMER_MODE, - timer_mode(info)); - xc_hvm_param_set(handle, domid, HVM_PARAM_VPT_ALIGN, - libxl_defbool_val(info->u.hvm.vpt_align)); - xc_hvm_param_set(handle, domid, HVM_PARAM_NESTEDHVM, - libxl_defbool_val(info->nested_hvm)); - break; - default: - abort(); - } -} - int libxl__build_pre(libxl__gc *gc, uint32_t domid, libxl_domain_config *d_config, libxl__domain_build_state *state) { @@ -400,6 +257,12 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, return ERROR_FAIL; } + if (libxl_defbool_val(d_config->b_info.disable_migrate) && + xc_domain_disable_migrate(ctx->xch, domid) != 0) { + LOG(ERROR, "Couldn't set nomigrate"); + return ERROR_FAIL; + } + /* * Check if the domain has any CPU or node affinity already. If not, try * to build up the latter via automatic NUMA placement. In fact, in case @@ -522,40 +385,6 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, state->store_port = xc_evtchn_alloc_unbound(ctx->xch, domid, state->store_domid); state->console_port = xc_evtchn_alloc_unbound(ctx->xch, domid, state->console_domid); - if (info->type != LIBXL_DOMAIN_TYPE_PV) - hvm_set_conf_params(ctx->xch, domid, info); - -#if defined(__i386__) || defined(__x86_64__) - if (info->type == LIBXL_DOMAIN_TYPE_HVM) { - rc = hvm_set_viridian_features(gc, domid, info); - if (rc) - return rc; - - rc = hvm_set_mca_capabilities(gc, domid, info); - if (rc) - return rc; - } -#endif - - /* Alternate p2m support on x86 is available only for PVH/HVM guests. */ - if (info->type == LIBXL_DOMAIN_TYPE_HVM) { - /* The config parameter "altp2m" replaces the parameter "altp2mhvm". For - * legacy reasons, both parameters are accepted on x86 HVM guests. - * - * If the legacy field info->u.hvm.altp2m is set, activate altp2m. - * Otherwise set altp2m based on the field info->altp2m. */ - if (info->altp2m == LIBXL_ALTP2M_MODE_DISABLED && - libxl_defbool_val(info->u.hvm.altp2m)) - xc_hvm_param_set(ctx->xch, domid, HVM_PARAM_ALTP2M, - libxl_defbool_val(info->u.hvm.altp2m)); - else - xc_hvm_param_set(ctx->xch, domid, HVM_PARAM_ALTP2M, - info->altp2m); - } else if (info->type == LIBXL_DOMAIN_TYPE_PVH) { - xc_hvm_param_set(ctx->xch, domid, HVM_PARAM_ALTP2M, - info->altp2m); - } - rc = libxl__arch_domain_create(gc, d_config, domid); return rc; diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index 8b804537ba..1cae0e2b26 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -285,14 +285,193 @@ static int libxl__e820_alloc(libxl__gc *gc, uint32_t domid, return 0; } +static unsigned long timer_mode(const libxl_domain_build_info *info) +{ + const libxl_timer_mode mode = info->timer_mode; + assert(mode >= LIBXL_TIMER_MODE_DELAY_FOR_MISSED_TICKS && + mode <= LIBXL_TIMER_MODE_ONE_MISSED_TICK_PENDING); + return ((unsigned long)mode); +} + +static int hvm_set_viridian_features(libxl__gc *gc, uint32_t domid, + const libxl_domain_build_info *info) +{ + libxl_bitmap enlightenments; + libxl_viridian_enlightenment v; + uint64_t mask = 0; + + libxl_bitmap_init(&enlightenments); + libxl_bitmap_alloc(CTX, &enlightenments, + LIBXL_BUILDINFO_HVM_VIRIDIAN_ENABLE_DISABLE_WIDTH); + + if (libxl_defbool_val(info->u.hvm.viridian)) { + /* Enable defaults */ + libxl_bitmap_set(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_BASE); + libxl_bitmap_set(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_FREQ); + libxl_bitmap_set(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_TIME_REF_COUNT); + libxl_bitmap_set(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_APIC_ASSIST); + libxl_bitmap_set(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_CRASH_CTL); + } + + libxl_for_each_set_bit(v, info->u.hvm.viridian_enable) { + if (libxl_bitmap_test(&info->u.hvm.viridian_disable, v)) { + LOG(ERROR, "%s group both enabled and disabled", + libxl_viridian_enlightenment_to_string(v)); + goto err; + } + if (libxl_viridian_enlightenment_to_string(v)) /* check validity */ + libxl_bitmap_set(&enlightenments, v); + } + + libxl_for_each_set_bit(v, info->u.hvm.viridian_disable) + if (libxl_viridian_enlightenment_to_string(v)) /* check validity */ + libxl_bitmap_reset(&enlightenments, v); + + /* The base set is a pre-requisite for all others */ + if (!libxl_bitmap_is_empty(&enlightenments) && + !libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_BASE)) { + LOG(ERROR, "base group not enabled"); + goto err; + } + + libxl_for_each_set_bit(v, enlightenments) + LOG(DETAIL, "%s group enabled", libxl_viridian_enlightenment_to_string(v)); + + if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_BASE)) { + mask |= HVMPV_base_freq; + + if (!libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_FREQ)) + mask |= HVMPV_no_freq; + } + + if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_TIME_REF_COUNT)) + mask |= HVMPV_time_ref_count; + + if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_REFERENCE_TSC)) + mask |= HVMPV_reference_tsc; + + if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_HCALL_REMOTE_TLB_FLUSH)) + mask |= HVMPV_hcall_remote_tlb_flush; + + if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_APIC_ASSIST)) + mask |= HVMPV_apic_assist; + + if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_CRASH_CTL)) + mask |= HVMPV_crash_ctl; + + if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_SYNIC)) + mask |= HVMPV_synic; + + if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_STIMER)) + mask |= HVMPV_time_ref_count | HVMPV_synic | HVMPV_stimer; + + if (libxl_bitmap_test(&enlightenments, LIBXL_VIRIDIAN_ENLIGHTENMENT_HCALL_IPI)) + mask |= HVMPV_hcall_ipi; + + if (mask != 0 && + xc_hvm_param_set(CTX->xch, + domid, + HVM_PARAM_VIRIDIAN, + mask) != 0) { + LOGE(ERROR, "Couldn't set viridian feature mask (0x%"PRIx64")", mask); + goto err; + } + + libxl_bitmap_dispose(&enlightenments); + return 0; + +err: + libxl_bitmap_dispose(&enlightenments); + return ERROR_FAIL; +} + +static int hvm_set_conf_params(libxl__gc *gc, uint32_t domid, + const libxl_domain_build_info *info) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + xc_interface *xch = ctx->xch; + int ret = ERROR_FAIL; + bool pae = true, altp2m = info->altp2m; + + switch(info->type) { + case LIBXL_DOMAIN_TYPE_HVM: + pae = libxl_defbool_val(info->u.hvm.pae); + + /* The config parameter "altp2m" replaces the parameter "altp2mhvm". For + * legacy reasons, both parameters are accepted on x86 HVM guests. + * + * If the legacy field info->u.hvm.altp2m is set, activate altp2m. + * Otherwise set altp2m based on the field info->altp2m. */ + if (info->altp2m == LIBXL_ALTP2M_MODE_DISABLED && + libxl_defbool_val(info->u.hvm.altp2m)) + altp2m = libxl_defbool_val(info->u.hvm.altp2m); + + if (xc_hvm_param_set(xch, domid, HVM_PARAM_HPET_ENABLED, + libxl_defbool_val(info->u.hvm.hpet))) { + LOG(ERROR, "Couldn't set HVM_PARAM_HPET_ENABLED"); + goto out; + } + if (xc_hvm_param_set(xch, domid, HVM_PARAM_VPT_ALIGN, + libxl_defbool_val(info->u.hvm.vpt_align))) { + LOG(ERROR, "Couldn't set HVM_PARAM_VPT_ALIGN"); + goto out; + } + if (info->u.hvm.mca_caps && + xc_hvm_param_set(CTX->xch, domid, HVM_PARAM_MCA_CAP, + info->u.hvm.mca_caps)) { + LOG(ERROR, "Couldn't set HVM_PARAM_MCA_CAP"); + goto out; + } + + /* Fallthrough */ + case LIBXL_DOMAIN_TYPE_PVH: + if (xc_hvm_param_set(xch, domid, HVM_PARAM_PAE_ENABLED, pae)) { + LOG(ERROR, "Couldn't set HVM_PARAM_PAE_ENABLED"); + goto out; + } + if (xc_hvm_param_set(xch, domid, HVM_PARAM_TIMER_MODE, + timer_mode(info))) { + LOG(ERROR, "Couldn't set HVM_PARAM_TIMER_MODE"); + goto out; + } + if (xc_hvm_param_set(xch, domid, HVM_PARAM_NESTEDHVM, + libxl_defbool_val(info->nested_hvm))) { + LOG(ERROR, "Couldn't set HVM_PARAM_NESTEDHVM"); + goto out; + } + if (xc_hvm_param_set(xch, domid, HVM_PARAM_ALTP2M, altp2m)) { + LOG(ERROR, "Couldn't set HVM_PARAM_ALTP2M"); + goto out; + } + break; + + default: + abort(); + } + + ret = 0; + + out: + return ret; +} + int libxl__arch_domain_create(libxl__gc *gc, libxl_domain_config *d_config, uint32_t domid) { + const libxl_domain_build_info *info = &d_config->b_info; int ret = 0; int tsc_mode; uint32_t rtc_timeoffset; libxl_ctx *ctx = libxl__gc_owner(gc); + if (info->type != LIBXL_DOMAIN_TYPE_PV && + (ret = hvm_set_conf_params(gc, domid, info)) != 0) + goto out; + + if (info->type == LIBXL_DOMAIN_TYPE_HVM && + (ret = hvm_set_viridian_features(gc, domid, info)) != 0) + goto out; + if (d_config->b_info.type == LIBXL_DOMAIN_TYPE_PV) xc_domain_set_memmap_limit(ctx->xch, domid, (d_config->b_info.max_memkb + @@ -322,8 +501,6 @@ int libxl__arch_domain_create(libxl__gc *gc, libxl_domain_config *d_config, goto out; } - if (libxl_defbool_val(d_config->b_info.disable_migrate)) - xc_domain_disable_migrate(ctx->xch, domid); rtc_timeoffset = d_config->b_info.rtc_timeoffset; if (libxl_defbool_val(d_config->b_info.localtime)) { time_t t;