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] x86, hvm: Config option to allow vmxassis

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86, hvm: Config option to allow vmxassist to be disabled.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 24 Nov 2007 19:00:08 -0800
Delivery-date: Sat, 24 Nov 2007 19:00:26 -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 1195910602 0
# Node ID 0814fb0f8a4debac73c97a55affed02a07767bcc
# Parent  dc9246357cdbe27655fd0ac7ef229d25b00c628c
x86, hvm: Config option to allow vmxassist to be disabled.
hvmloader is modified to dynamically detect this, allowing possibility
of optional full vmxassist replacement in 3.2 stable branch in future.
Currently 'vmxassist=y' is not much use since no replacement is
implemented.

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 tools/firmware/hvmloader/hvmloader.c |   13 ++++++++--
 xen/arch/x86/Rules.mk                |    5 +++
 xen/arch/x86/hvm/vmx/vmx.c           |   44 +++++++++++++++++++++++++++++++----
 xen/arch/x86/hvm/vpic.c              |    2 -
 xen/include/asm-x86/hvm/vmx/vmcs.h   |    6 +++-
 5 files changed, 62 insertions(+), 8 deletions(-)

diff -r dc9246357cdb -r 0814fb0f8a4d tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c      Fri Nov 23 16:42:44 2007 +0000
+++ b/tools/firmware/hvmloader/hvmloader.c      Sat Nov 24 13:23:22 2007 +0000
@@ -40,6 +40,7 @@ asm(
     "    cli                         \n"
     "    movl $stack_top,%esp        \n"
     "    movl %esp,%ebp              \n"
+    "    movl %eax,initial_eax       \n"
     "    call main                   \n"
     /* Relocate real-mode trampoline to 0x0. */
     "    mov  $trampoline_start,%esi \n"
@@ -97,6 +98,8 @@ asm(
     "stack_top:                      \n"
     );
 
+static unsigned int initial_eax;
+
 void create_mp_tables(void);
 int hvm_write_smbios_tables(void);
 
@@ -119,6 +122,12 @@ check_amd(void)
         "=d" (*(int *)(&id[4]))
         : "a" (0) );
     return __builtin_memcmp(id, "AuthenticAMD", 12) == 0;
+}
+
+static int
+use_vmxassist(void)
+{
+    return !check_amd() && !initial_eax;
 }
 
 static void
@@ -407,7 +416,7 @@ int main(void)
         printf(" %05x-%05x: Etherboot ROM\n",
                ETHERBOOT_PHYSICAL_ADDRESS,
                ETHERBOOT_PHYSICAL_ADDRESS + etherboot_sz - 1);
-    if ( !check_amd() )
+    if ( use_vmxassist() )
         printf(" %05x-%05x: VMXAssist\n",
                VMXASSIST_PHYSICAL_ADDRESS,
                VMXASSIST_PHYSICAL_ADDRESS + sizeof(vmxassist) - 1);
@@ -424,7 +433,7 @@ int main(void)
                ROMBIOS_PHYSICAL_ADDRESS,
                ROMBIOS_PHYSICAL_ADDRESS + rombios_sz - 1);
 
-    if ( !check_amd() )
+    if ( use_vmxassist() )
     {
         printf("Loading VMXAssist ...\n");
         memcpy((void *)VMXASSIST_PHYSICAL_ADDRESS,
diff -r dc9246357cdb -r 0814fb0f8a4d xen/arch/x86/Rules.mk
--- a/xen/arch/x86/Rules.mk     Fri Nov 23 16:42:44 2007 +0000
+++ b/xen/arch/x86/Rules.mk     Sat Nov 24 13:23:22 2007 +0000
@@ -11,6 +11,11 @@ xenoprof := y
 #
 pae ?= n
 supervisor_mode_kernel ?= n
+vmxassist ?= y
+
+ifeq ($(vmxassist),y)
+CFLAGS += -DVMXASSIST
+endif
 
 # Solaris grabs stdarg.h and friends from the system include directory.
 ifneq ($(XEN_OS),SunOS)
diff -r dc9246357cdb -r 0814fb0f8a4d xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Fri Nov 23 16:42:44 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Sat Nov 24 13:23:22 2007 +0000
@@ -92,6 +92,11 @@ static int vmx_vcpu_initialise(struct vc
 
     vmx_install_vlapic_mapping(v);
 
+#ifndef VMXASSIST
+    if ( v->vcpu_id == 0 )
+        v->arch.guest_context.user_regs.eax = 1;
+#endif
+
     return 0;
 }
 
@@ -701,7 +706,9 @@ static void vmx_load_cpu_state(struct vc
     v->arch.hvm_vmx.shadow_gs = data->shadow_gs;
 #endif
 
+#ifdef VMXASSIST
     v->arch.hvm_vmx.vmxassist_enabled = !(data->cr0 & X86_CR0_PE);
+#endif
 
     hvm_set_guest_time(v, data->tsc);
 
@@ -961,9 +968,11 @@ static void vmx_init_ap_context(
     struct vcpu_guest_context *ctxt, int vcpuid, int trampoline_vector)
 {
     memset(ctxt, 0, sizeof(*ctxt));
+#ifdef VMXASSIST
     ctxt->user_regs.eip = VMXASSIST_BASE;
     ctxt->user_regs.edx = vcpuid;
     ctxt->user_regs.ebx = trampoline_vector;
+#endif
 }
 
 void do_nmi(struct cpu_user_regs *);
@@ -1045,7 +1054,10 @@ static void vmx_update_guest_cr(struct v
 
         v->arch.hvm_vcpu.hw_cr[0] =
             v->arch.hvm_vcpu.guest_cr[0] |
-            X86_CR0_PE | X86_CR0_NE | X86_CR0_PG | X86_CR0_WP;
+            X86_CR0_NE | X86_CR0_PG | X86_CR0_WP;
+#ifdef VMXASSIST
+        v->arch.hvm_vcpu.hw_cr[0] |= X86_CR0_PE;
+#endif
         __vmwrite(GUEST_CR0, v->arch.hvm_vcpu.hw_cr[0]);
         __vmwrite(CR0_READ_SHADOW, v->arch.hvm_vcpu.guest_cr[0]);
         break;
@@ -1246,6 +1258,7 @@ static void vmx_do_cpuid(struct cpu_user
     unsigned int input = regs->eax;
     unsigned int eax, ebx, ecx, edx;
 
+#ifdef VMXASSIST
     if ( input == 0x40000003 )
     {
         /*
@@ -1280,6 +1293,7 @@ static void vmx_do_cpuid(struct cpu_user
         regs->edx = (u32)(value >> 32);
         return;
     }
+#endif
 
     hvm_cpuid(input, &eax, &ebx, &ecx, &edx);
 
@@ -1816,6 +1830,8 @@ static void vmx_io_instruction(unsigned 
     }
 }
 
+#ifdef VMXASSIST
+
 static void vmx_world_save(struct vcpu *v, struct vmx_assist_context *c)
 {
     struct cpu_user_regs *regs = guest_cpu_user_regs();
@@ -2057,6 +2073,19 @@ static int vmx_set_cr0(unsigned long val
 
     return 1;
 }
+
+#else /* !defined(VMXASSIST) */
+
+#define vmx_set_cr0(v) hvm_set_cr0(v)
+
+static int vmx_realmode(struct cpu_user_regs *regs)
+{
+    gdprintk(XENLOG_ERR, "Attempt to enter real mode on VCPU %d\n",
+             current->vcpu_id);
+    return -EINVAL;
+}
+
+#endif
 
 #define CASE_SET_REG(REG, reg)      \
     case REG_ ## REG: regs->reg = value; break
@@ -2677,9 +2706,16 @@ static void vmx_failed_vmentry(unsigned 
                                struct cpu_user_regs *regs)
 {
     unsigned int failed_vmentry_reason = (uint16_t)exit_reason;
-    unsigned long exit_qualification;
-
-    exit_qualification = __vmread(EXIT_QUALIFICATION);
+    unsigned long exit_qualification = __vmread(EXIT_QUALIFICATION);
+
+#ifndef VMXASSIST
+    if ( (failed_vmentry_reason == EXIT_REASON_INVALID_GUEST_STATE) &&
+         (exit_qualification == 0) &&
+         !(current->arch.hvm_vcpu.hw_cr[0] & X86_CR0_PE) &&
+         (vmx_realmode(regs) == 0) )
+        return;
+#endif
+
     printk("Failed vm entry (exit reason 0x%x) ", exit_reason);
     switch ( failed_vmentry_reason )
     {
diff -r dc9246357cdb -r 0814fb0f8a4d xen/arch/x86/hvm/vpic.c
--- a/xen/arch/x86/hvm/vpic.c   Fri Nov 23 16:42:44 2007 +0000
+++ b/xen/arch/x86/hvm/vpic.c   Sat Nov 24 13:23:22 2007 +0000
@@ -271,7 +271,7 @@ static void vpic_ioport_write(
             vpic->imr = val;
             break;
         case 1:
-#if 1 /* Delete me when vmxassist is retired. */
+#ifdef VMXASSIST
             /* Which mode is irqbase programmed in? */
             current->arch.hvm_vmx.irqbase_mode =
                 current->arch.hvm_vmx.vmxassist_enabled;
diff -r dc9246357cdb -r 0814fb0f8a4d xen/include/asm-x86/hvm/vmx/vmcs.h
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h        Fri Nov 23 16:42:44 2007 +0000
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h        Sat Nov 24 13:23:22 2007 +0000
@@ -22,7 +22,10 @@
 #include <asm/config.h>
 #include <asm/hvm/io.h>
 #include <asm/hvm/vmx/cpu.h>
+
+#ifdef VMXASSIST
 #include <public/hvm/vmx_assist.h>
+#endif
 
 extern void start_vmx(void);
 extern void vmcs_dump_vcpu(void);
@@ -85,10 +88,11 @@ struct arch_vmx_struct {
     unsigned int         host_msr_count;
     struct vmx_msr_entry *host_msr_area;
 
-    /* Following fields are all specific to vmxassist. */
+#ifdef VMXASSIST
     unsigned long        vmxassist_enabled:1;
     unsigned long        irqbase_mode:1;
     unsigned char        pm_irqbase[2];
+#endif
 };
 
 int vmx_create_vmcs(struct vcpu *v);

_______________________________________________
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] x86, hvm: Config option to allow vmxassist to be disabled., Xen patchbot-unstable <=