All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Xen-devel@lists.xensource.com
Subject: [PATCH 17/18] PVH xen: HVM support of PVH guest creation/destruction
Date: Mon, 24 Jun 2013 17:01:46 -0700	[thread overview]
Message-ID: <1372118507-16864-18-git-send-email-mukesh.rathor@oracle.com> (raw)
In-Reply-To: <1372118507-16864-1-git-send-email-mukesh.rathor@oracle.com>

This patch implements the HVM/vmx portion of the guest create, ie
vcpu and domain initilization. Some changes to support the destroy path.

Signed-off-by: Mukesh Rathor <mukesh.rathor@oracle.com>
---
 xen/arch/x86/hvm/hvm.c     |   67 ++++++++++++++++++++++++++++++++++++++++++-
 xen/arch/x86/hvm/vmx/vmx.c |   40 ++++++++++++++++++++++++++
 2 files changed, 105 insertions(+), 2 deletions(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 3c1597b..2988a5f 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -510,6 +510,30 @@ static int hvm_print_line(
     return X86EMUL_OKAY;
 }
 
+static int pvh_dom_initialise(struct domain *d)
+{
+    int rc;
+
+    if ( !d->arch.hvm_domain.hap_enabled )
+        return -EINVAL;
+
+    spin_lock_init(&d->arch.hvm_domain.irq_lock);
+
+    hvm_init_cacheattr_region_list(d);
+
+    if ( (rc = paging_enable(d, PG_refcounts|PG_translate|PG_external)) != 0 )
+        goto pvh_dominit_fail;
+
+    if ( (rc = hvm_funcs.domain_initialise(d)) != 0 )
+        goto pvh_dominit_fail;
+
+    return 0;
+
+pvh_dominit_fail:
+    hvm_destroy_cacheattr_region_list(d);
+    return rc;
+}
+
 int hvm_domain_initialise(struct domain *d)
 {
     int rc;
@@ -520,6 +544,8 @@ int hvm_domain_initialise(struct domain *d)
                  "on a non-VT/AMDV platform.\n");
         return -EINVAL;
     }
+    if ( is_pvh_domain(d) )
+        return pvh_dom_initialise(d);
 
     spin_lock_init(&d->arch.hvm_domain.pbuf_lock);
     spin_lock_init(&d->arch.hvm_domain.irq_lock);
@@ -584,6 +610,9 @@ int hvm_domain_initialise(struct domain *d)
 
 void hvm_domain_relinquish_resources(struct domain *d)
 {
+    if ( is_pvh_domain(d) )
+        return;
+
     if ( hvm_funcs.nhvm_domain_relinquish_resources )
         hvm_funcs.nhvm_domain_relinquish_resources(d);
 
@@ -609,10 +638,14 @@ void hvm_domain_relinquish_resources(struct domain *d)
 void hvm_domain_destroy(struct domain *d)
 {
     hvm_funcs.domain_destroy(d);
+    hvm_destroy_cacheattr_region_list(d);
+
+    if ( is_pvh_domain(d) )
+        return;
+
     rtc_deinit(d);
     stdvga_deinit(d);
     vioapic_deinit(d);
-    hvm_destroy_cacheattr_region_list(d);
 }
 
 static int hvm_save_tsc_adjust(struct domain *d, hvm_domain_context_t *h)
@@ -1066,6 +1099,30 @@ static int __init __hvm_register_CPU_XSAVE_save_and_restore(void)
 }
 __initcall(__hvm_register_CPU_XSAVE_save_and_restore);
 
+static int pvh_vcpu_initialise(struct vcpu *v)
+{
+    int rc;
+
+    if ( (rc = hvm_funcs.vcpu_initialise(v)) != 0 )
+        return rc;
+
+    softirq_tasklet_init(&v->arch.hvm_vcpu.assert_evtchn_irq_tasklet,
+                         (void(*)(unsigned long))hvm_assert_evtchn_irq,
+                         (unsigned long)v);
+
+    v->arch.hvm_vcpu.hcall_64bit = 1;    /* PVH 32bitfixme. */
+    v->arch.user_regs.eflags = 2;
+    v->arch.hvm_vcpu.inject_trap.vector = -1;
+
+    if ( (rc = hvm_vcpu_cacheattr_init(v)) != 0 )
+    {
+        hvm_funcs.vcpu_destroy(v);
+        return rc;
+    }
+
+    return 0;
+}
+
 int hvm_vcpu_initialise(struct vcpu *v)
 {
     int rc;
@@ -1077,6 +1134,9 @@ int hvm_vcpu_initialise(struct vcpu *v)
     spin_lock_init(&v->arch.hvm_vcpu.tm_lock);
     INIT_LIST_HEAD(&v->arch.hvm_vcpu.tm_list);
 
+    if ( is_pvh_vcpu(v) )
+        return pvh_vcpu_initialise(v);
+
     if ( (rc = vlapic_init(v)) != 0 )
         goto fail1;
 
@@ -1165,7 +1225,10 @@ void hvm_vcpu_destroy(struct vcpu *v)
 
     tasklet_kill(&v->arch.hvm_vcpu.assert_evtchn_irq_tasklet);
     hvm_vcpu_cacheattr_destroy(v);
-    vlapic_destroy(v);
+
+    if ( !is_pvh_vcpu(v) )
+        vlapic_destroy(v);
+
     hvm_funcs.vcpu_destroy(v);
 
     /* Event channel is already freed by evtchn_destroy(). */
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index 62cb84d..cb82523 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -82,6 +82,9 @@ static int vmx_domain_initialise(struct domain *d)
 {
     int rc;
 
+    if ( is_pvh_domain(d) )
+        return 0;
+
     if ( (rc = vmx_alloc_vlapic_mapping(d)) != 0 )
         return rc;
 
@@ -90,6 +93,9 @@ static int vmx_domain_initialise(struct domain *d)
 
 static void vmx_domain_destroy(struct domain *d)
 {
+    if ( is_pvh_domain(d) )
+        return;
+
     vmx_free_vlapic_mapping(d);
 }
 
@@ -113,6 +119,12 @@ static int vmx_vcpu_initialise(struct vcpu *v)
 
     vpmu_initialise(v);
 
+    if ( is_pvh_vcpu(v) )
+    {
+        /* This for hvm_long_mode_enabled(v). */
+        v->arch.hvm_vcpu.guest_efer = EFER_SCE | EFER_LMA | EFER_LME;
+        return 0;
+    }
     vmx_install_vlapic_mapping(v);
 
     /* %eax == 1 signals full real-mode support to the guest loader. */
@@ -1034,6 +1046,28 @@ static void vmx_update_host_cr3(struct vcpu *v)
     vmx_vmcs_exit(v);
 }
 
+/*
+ * PVH guest never causes CR3 write vmexit. This is called during the guest
+ * setup.
+ */
+static void vmx_update_pvh_cr(struct vcpu *v, unsigned int cr)
+{
+    vmx_vmcs_enter(v);
+    switch ( cr )
+    {
+    case 3:
+        __vmwrite(GUEST_CR3, v->arch.hvm_vcpu.guest_cr[3]);
+        hvm_asid_flush_vcpu(v);
+        break;
+
+    default:
+        printk(XENLOG_ERR
+               "PVH: d%d v%d unexpected cr%d update at rip:%lx\n",
+               v->domain->domain_id, v->vcpu_id, cr, __vmread(GUEST_RIP));
+    }
+    vmx_vmcs_exit(v);
+}
+
 void vmx_update_debug_state(struct vcpu *v)
 {
     unsigned long mask;
@@ -1053,6 +1087,12 @@ void vmx_update_debug_state(struct vcpu *v)
 
 static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr)
 {
+    if ( is_pvh_vcpu(v) )
+    {
+        vmx_update_pvh_cr(v, cr);
+        return;
+    }
+
     vmx_vmcs_enter(v);
 
     switch ( cr )
-- 
1.7.2.3

  parent reply	other threads:[~2013-06-25  0:01 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-25  0:01 [PATCH 00/18][V7]: PVH xen: Phase I, Version 7 patches Mukesh Rathor
2013-06-25  0:01 ` [PATCH 01/18] PVH xen: turn gdb_frames/gdt_ents into union Mukesh Rathor
2013-06-25  8:40   ` Jan Beulich
2013-06-25  0:01 ` [PATCH 02/18] PVH xen: add params to read_segment_register Mukesh Rathor
2013-06-25  0:01 ` [PATCH 03/18] PVH xen: Move e820 fields out of pv_domain struct Mukesh Rathor
2013-06-25  8:44   ` Jan Beulich
2013-06-25  0:01 ` [PATCH 04/18] PVH xen: vmx related preparatory changes for PVH Mukesh Rathor
2013-06-25  8:48   ` Jan Beulich
2013-06-25  0:01 ` [PATCH 05/18] PVH xen: hvm/vmcs " Mukesh Rathor
2013-06-25  8:51   ` Jan Beulich
2013-06-25  0:01 ` [PATCH 06/18] PVH xen: Introduce PVH guest type and some basic changes Mukesh Rathor
2013-06-25  9:01   ` Jan Beulich
2013-06-26  1:14     ` Mukesh Rathor
2013-06-26  8:18       ` Jan Beulich
2013-06-25  0:01 ` [PATCH 07/18] PVH xen: domain create, schedular related code changes Mukesh Rathor
2013-06-25  9:13   ` Jan Beulich
2013-06-25  0:01 ` [PATCH 08/18] PVH xen: support invalid op emulation for PVH Mukesh Rathor
2013-06-25  9:16   ` Jan Beulich
2013-06-25  0:01 ` [PATCH 09/18] PVH xen: Support privileged " Mukesh Rathor
2013-06-25  9:36   ` Jan Beulich
2013-06-26 22:41     ` Mukesh Rathor
2013-06-27  7:22       ` Jan Beulich
2013-06-27 23:43         ` Mukesh Rathor
2013-06-28  9:20           ` Jan Beulich
2013-07-03  1:38             ` Mukesh Rathor
2013-07-03 10:21               ` Jan Beulich
2013-07-04  2:00                 ` Mukesh Rathor
2013-07-04  8:04                   ` Jan Beulich
2013-07-06  1:43                     ` Mukesh Rathor
2013-06-25  0:01 ` [PATCH 10/18] PVH xen: interrupt/event-channel delivery to PVH Mukesh Rathor
2013-06-25 14:29   ` Konrad Rzeszutek Wilk
2013-07-12  0:29     ` Mukesh Rathor
2013-06-25  0:01 ` [PATCH 11/18] PVH xen: additional changes to support PVH guest creation and execution Mukesh Rathor
2013-06-25  0:01 ` [PATCH 12/18] PVH xen: mapcache and show registers Mukesh Rathor
2013-06-25  9:45   ` Jan Beulich
2013-06-25  0:01 ` [PATCH 13/18] PVH xen: mtrr, tsc, grant changes Mukesh Rathor
2013-06-25 14:30   ` Konrad Rzeszutek Wilk
2013-06-25  0:01 ` [PATCH 14/18] PVH xen: Checks, asserts, and limitations for PVH Mukesh Rathor
2013-06-25  9:54   ` Jan Beulich
2013-06-27  2:43     ` Mukesh Rathor
2013-06-27  7:25       ` Jan Beulich
2013-06-25  0:01 ` [PATCH 15/18] PVH xen: add hypercall support " Mukesh Rathor
2013-06-25 10:12   ` Jan Beulich
2013-06-27  3:09     ` Mukesh Rathor
2013-06-27  7:29       ` Jan Beulich
2013-06-25  0:01 ` [PATCH 16/18] PVH xen: vmcs related changes Mukesh Rathor
2013-06-25 10:17   ` Jan Beulich
2013-06-25  0:01 ` Mukesh Rathor [this message]
2013-06-25  0:01 ` [PATCH 18/18] PVH xen: introduce vmx_pvh.c Mukesh Rathor
2013-06-25 10:49   ` Jan Beulich
2013-06-27  3:30     ` Mukesh Rathor
2013-06-27  7:41       ` Jan Beulich
2013-06-28  1:28         ` Mukesh Rathor
2013-06-28  9:26           ` Jan Beulich
2013-06-28  1:35     ` Mukesh Rathor
2013-06-28  9:31       ` Jan Beulich
2013-06-29  3:03         ` Mukesh Rathor
2013-07-01  8:49           ` Jan Beulich
2013-07-06  1:31         ` Mukesh Rathor
2013-07-08  8:31           ` Jan Beulich
2013-07-08 23:09             ` Mukesh Rathor
2013-07-09  0:01               ` Mukesh Rathor
2013-07-09  7:31                 ` Jan Beulich
2013-07-10  0:33                   ` Mukesh Rathor
2013-07-10  7:20                     ` Jan Beulich
2013-06-28  2:28     ` Mukesh Rathor
2013-06-28  9:44       ` Jan Beulich
2013-06-29  3:04         ` Mukesh Rathor
2013-07-01  8:54           ` Jan Beulich
2013-07-02  2:01             ` Mukesh Rathor
2013-07-03  1:40         ` Mukesh Rathor
2013-07-03 10:25           ` Jan Beulich
2013-07-04  2:02             ` Mukesh Rathor
2013-07-04  8:07               ` Jan Beulich
2013-07-16  2:00         ` Mukesh Rathor
2013-07-16  6:50           ` Jan Beulich
2013-07-17  0:47             ` Mukesh Rathor
2013-07-17  6:36               ` Jan Beulich
2013-06-25 10:17 ` [PATCH 00/18][V7]: PVH xen: Phase I, Version 7 patches George Dunlap
2013-06-26  0:04   ` Mukesh Rathor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1372118507-16864-18-git-send-email-mukesh.rathor@oracle.com \
    --to=mukesh.rathor@oracle.com \
    --cc=Xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.