WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] vmx: Restore correct host SYSENTER parame

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] vmx: Restore correct host SYSENTER parameters on vmexit.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 14 Nov 2007 04:40:14 -0800
Delivery-date: Wed, 14 Nov 2007 04:41:12 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1194980727 0
# Node ID a35586bd493bc8622be66fd3029cb1b087a929b6
# Parent  ab516ca6e984156fcc0498b135542a9e687aa626
vmx: Restore correct host SYSENTER parameters on vmexit.
Also simplify vmx_set_host_env().
HOST_GDT_BASE does not have to change when we shift CPU.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/vmx/vmcs.c        |   37 +++++++++++++++++++++----------------
 xen/include/asm-x86/hvm/vmx/vmcs.h |    6 +++---
 2 files changed, 24 insertions(+), 19 deletions(-)

diff -r ab516ca6e984 -r a35586bd493b xen/arch/x86/hvm/vmx/vmcs.c
--- a/xen/arch/x86/hvm/vmx/vmcs.c       Tue Nov 13 18:30:47 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/vmcs.c       Tue Nov 13 19:05:27 2007 +0000
@@ -399,20 +399,14 @@ struct xgt_desc {
 
 static void vmx_set_host_env(struct vcpu *v)
 {
-    unsigned int tr, cpu;
-    struct xgt_desc desc;
-
-    cpu = smp_processor_id();
-
-    __asm__ __volatile__ ( "sidt (%0) \n" : : "a" (&desc) : "memory" );
-    __vmwrite(HOST_IDTR_BASE, desc.address);
-
-    __asm__ __volatile__ ( "sgdt (%0) \n" : : "a" (&desc) : "memory" );
-    __vmwrite(HOST_GDTR_BASE, desc.address);
-
-    __asm__ __volatile__ ( "str (%0) \n" : : "a" (&tr) : "memory" );
-    __vmwrite(HOST_TR_SELECTOR, tr);
+    unsigned int cpu = smp_processor_id();
+
+    __vmwrite(HOST_IDTR_BASE, (unsigned long)idt_tables[cpu]);
+
+    __vmwrite(HOST_TR_SELECTOR, __TSS(cpu) << 3);
     __vmwrite(HOST_TR_BASE, (unsigned long)&init_tss[cpu]);
+
+    __vmwrite(HOST_SYSENTER_ESP, get_stack_bottom());
 
     /*
      * Skip end of cpu_user_regs when entering the hypervisor because the
@@ -454,6 +448,8 @@ static int construct_vmcs(struct vcpu *v
 static int construct_vmcs(struct vcpu *v)
 {
     union vmcs_arbytes arbytes;
+    uint16_t sysenter_cs;
+    unsigned long sysenter_eip;
 
     vmx_vmcs_enter(v);
 
@@ -489,6 +485,9 @@ static int construct_vmcs(struct vcpu *v
     __vmwrite(IO_BITMAP_A, virt_to_maddr(hvm_io_bitmap));
     __vmwrite(IO_BITMAP_B, virt_to_maddr(hvm_io_bitmap + PAGE_SIZE));
 
+    /* Host GDTR base. */
+    __vmwrite(HOST_GDTR_BASE, GDT_VIRT_START(v));
+
     /* Host data selectors. */
     __vmwrite(HOST_SS_SELECTOR, __HYPERVISOR_DS);
     __vmwrite(HOST_DS_SELECTOR, __HYPERVISOR_DS);
@@ -505,6 +504,12 @@ static int construct_vmcs(struct vcpu *v
     /* Host CS:RIP. */
     __vmwrite(HOST_CS_SELECTOR, __HYPERVISOR_CS);
     __vmwrite(HOST_RIP, (unsigned long)vmx_asm_vmexit_handler);
+
+    /* Host SYSENTER CS:RIP. */
+    rdmsrl(MSR_IA32_SYSENTER_CS, sysenter_cs);
+    __vmwrite(HOST_SYSENTER_CS, sysenter_cs);
+    rdmsrl(MSR_IA32_SYSENTER_EIP, sysenter_eip);
+    __vmwrite(HOST_SYSENTER_EIP, sysenter_eip);
 
     /* MSR intercepts. */
     __vmwrite(VM_EXIT_MSR_LOAD_COUNT, 0);
@@ -903,9 +908,9 @@ void vmcs_dump_vcpu(void)
            (unsigned long long)vmr(HOST_CR3),
            (unsigned long long)vmr(HOST_CR4));
     printk("Sysenter RSP=%016llx CS:RIP=%04x:%016llx\n",
-           (unsigned long long)vmr(HOST_IA32_SYSENTER_ESP),
-           (int)vmr(HOST_IA32_SYSENTER_CS),
-           (unsigned long long)vmr(HOST_IA32_SYSENTER_EIP));
+           (unsigned long long)vmr(HOST_SYSENTER_ESP),
+           (int)vmr(HOST_SYSENTER_CS),
+           (unsigned long long)vmr(HOST_SYSENTER_EIP));
 
     printk("*** Control State ***\n");
     printk("PinBased=%08x CPUBased=%08x SecondaryExec=%08x\n",
diff -r ab516ca6e984 -r a35586bd493b xen/include/asm-x86/hvm/vmx/vmcs.h
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h        Tue Nov 13 18:30:47 2007 +0000
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h        Tue Nov 13 19:05:27 2007 +0000
@@ -235,7 +235,7 @@ enum vmcs_field {
     GUEST_INTERRUPTIBILITY_INFO     = 0x00004824,
     GUEST_ACTIVITY_STATE            = 0x00004826,
     GUEST_SYSENTER_CS               = 0x0000482A,
-    HOST_IA32_SYSENTER_CS           = 0x00004c00,
+    HOST_SYSENTER_CS                = 0x00004c00,
     CR0_GUEST_HOST_MASK             = 0x00006000,
     CR4_GUEST_HOST_MASK             = 0x00006002,
     CR0_READ_SHADOW                 = 0x00006004,
@@ -274,8 +274,8 @@ enum vmcs_field {
     HOST_TR_BASE                    = 0x00006c0a,
     HOST_GDTR_BASE                  = 0x00006c0c,
     HOST_IDTR_BASE                  = 0x00006c0e,
-    HOST_IA32_SYSENTER_ESP          = 0x00006c10,
-    HOST_IA32_SYSENTER_EIP          = 0x00006c12,
+    HOST_SYSENTER_ESP               = 0x00006c10,
+    HOST_SYSENTER_EIP               = 0x00006c12,
     HOST_RSP                        = 0x00006c14,
     HOST_RIP                        = 0x00006c16,
 };

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] vmx: Restore correct host SYSENTER parameters on vmexit., Xen patchbot-unstable <=