From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Egger Subject: [PATCH 11/12] Nested Virtualization: enablement Date: Mon, 20 Dec 2010 17:12:36 +0100 Message-ID: <201012201712.37032.Christoph.Egger@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary-00=_1B4DNgghTzZXjWs" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: "xen-devel@lists.xensource.com" List-Id: xen-devel@lists.xenproject.org --Boundary-00=_1B4DNgghTzZXjWs Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline -- ---to satisfy European Law for business letters: Advanced Micro Devices GmbH Einsteinring 24, 85609 Dornach b. Muenchen Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632 --Boundary-00=_1B4DNgghTzZXjWs Content-Type: text/x-diff; charset="iso 8859-15"; name="xen_nh11_enable.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xen_nh11_enable.diff" Content-Description: xen_nh11_enable.diff # HG changeset patch # User cegger # Date 1292839444 -3600 Implement generic piece to finally enable nested virtualization Signed-off-by: Christoph Egger diff -r 9d27b197ca34 -r c4837a54b175 xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -939,10 +939,16 @@ int hvm_vcpu_initialise(struct vcpu *v) if ( (rc = hvm_funcs.vcpu_initialise(v)) != 0 ) goto fail2; + rc = nestedhvm_vcpu_initialise(v); + if ( rc < 0 ) { + printk("%s: nestedhvm_vcpu_initialise returned %i\n", __func__, rc); + goto fail3; + } + /* Create ioreq event channel. */ rc = alloc_unbound_xen_event_channel(v, 0); if ( rc < 0 ) - goto fail3; + goto fail4; /* Register ioreq event channel. */ v->arch.hvm_vcpu.xen_port = rc; @@ -957,12 +963,12 @@ int hvm_vcpu_initialise(struct vcpu *v) #ifdef CONFIG_COMPAT rc = setup_compat_arg_xlat(v); if ( rc != 0 ) - goto fail3; + goto fail4; #endif rc = hvm_vcpu_cacheattr_init(v); if ( rc != 0 ) - goto fail4; + goto fail5; tasklet_init(&v->arch.hvm_vcpu.assert_evtchn_irq_tasklet, (void(*)(unsigned long))hvm_assert_evtchn_irq, @@ -987,10 +993,12 @@ int hvm_vcpu_initialise(struct vcpu *v) return 0; - fail4: + fail5: #ifdef CONFIG_COMPAT free_compat_arg_xlat(v); #endif + fail4: + nestedhvm_vcpu_destroy(v); fail3: hvm_funcs.vcpu_destroy(v); fail2: @@ -1001,9 +1009,16 @@ int hvm_vcpu_initialise(struct vcpu *v) void hvm_vcpu_destroy(struct vcpu *v) { + int rc; + + rc = nestedhvm_vcpu_destroy(v); + if (rc) + gdprintk(XENLOG_ERR, "nestedhvm_vcpu_destroy() failed with %i\n", rc); + #ifdef CONFIG_COMPAT free_compat_arg_xlat(v); #endif + tasklet_kill(&v->arch.hvm_vcpu.assert_evtchn_irq_tasklet); hvm_vcpu_cacheattr_destroy(v); vlapic_destroy(v); @@ -3224,6 +3239,16 @@ long do_hvm_op(unsigned long op, XEN_GUE case HVM_PARAM_ACPI_IOPORTS_LOCATION: rc = pmtimer_change_ioport(d, a.value); break; + case HVM_PARAM_NESTEDHVM: + if ( a.value > 1 ) + rc = -EINVAL; + if ( !is_hvm_domain(d) ) + rc = -EINVAL; + /* Remove the check below once we have + * shadow-on-shadow. + */ + if ( !paging_mode_hap(d) && a.value ) + rc = -EINVAL; } if ( rc == 0 ) --Boundary-00=_1B4DNgghTzZXjWs Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --Boundary-00=_1B4DNgghTzZXjWs--