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 support for sysenter/exit on x86_32 when supervisor_

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Xen support for sysenter/exit on x86_32 when supervisor_mode_kernel is
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 22 Apr 2006 11:02:14 +0000
Delivery-date: Sat, 22 Apr 2006 04:06:05 -0700
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 Ian.Campbell@xxxxxxxxxxxxx
# Node ID 3ffb6cc6b8d2a42dd4f3c6399783a5f99458023b
# Parent  d73eeceeae692cc08d68aece06b42fa7ce60edd7
Xen support for sysenter/exit on x86_32 when supervisor_mode_kernel is
enabled.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxxxxx>

diff -r d73eeceeae69 -r 3ffb6cc6b8d2 xen/arch/x86/cpu/common.c
--- a/xen/arch/x86/cpu/common.c Fri Apr 21 17:19:26 2006 +0100
+++ b/xen/arch/x86/cpu/common.c Fri Apr 21 17:19:29 2006 +0100
@@ -575,6 +575,8 @@ void __devinit cpu_init(void)
 #if defined(CONFIG_X86_32)
        t->ss0  = __HYPERVISOR_DS;
        t->esp0 = get_stack_bottom();
+       if ( supervisor_mode_kernel && cpu_has_sep )
+               wrmsr(MSR_IA32_SYSENTER_ESP, &t->esp1, 0);
 #elif defined(CONFIG_X86_64)
        /* Bottom-of-stack must be 16-byte aligned! */
        BUG_ON((get_stack_bottom() & 15) != 0);
diff -r d73eeceeae69 -r 3ffb6cc6b8d2 xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      Fri Apr 21 17:19:26 2006 +0100
+++ b/xen/arch/x86/traps.c      Fri Apr 21 17:19:29 2006 +0100
@@ -425,7 +425,8 @@ static int emulate_forced_invalid_op(str
         clear_bit(X86_FEATURE_DE,  &d);
         clear_bit(X86_FEATURE_PSE, &d);
         clear_bit(X86_FEATURE_PGE, &d);
-        clear_bit(X86_FEATURE_SEP, &d);
+        if ( !supervisor_mode_kernel )
+            clear_bit(X86_FEATURE_SEP, &d);
         if ( !IS_PRIV(current->domain) )
             clear_bit(X86_FEATURE_MTRR, &d);
     }
diff -r d73eeceeae69 -r 3ffb6cc6b8d2 xen/arch/x86/x86_32/traps.c
--- a/xen/arch/x86/x86_32/traps.c       Fri Apr 21 17:19:26 2006 +0100
+++ b/xen/arch/x86/x86_32/traps.c       Fri Apr 21 17:19:29 2006 +0100
@@ -318,6 +318,16 @@ void init_int80_direct_trap(struct vcpu 
         set_int80_direct_trap(v);
 }
 
+#ifdef CONFIG_X86_SUPERVISOR_MODE_KERNEL
+static void do_update_sysenter(void *info)
+{
+    xen_callback_t *address = info;
+
+    wrmsr(MSR_IA32_SYSENTER_CS, address->cs, 0);
+    wrmsr(MSR_IA32_SYSENTER_EIP, address->eip, 0);
+}
+#endif
+
 static long register_guest_callback(struct callback_register *reg)
 {
     long ret = 0;
@@ -336,6 +346,15 @@ static long register_guest_callback(stru
         v->arch.guest_context.failsafe_callback_cs  = reg->address.cs;
         v->arch.guest_context.failsafe_callback_eip = reg->address.eip;
         break;
+
+#ifdef CONFIG_X86_SUPERVISOR_MODE_KERNEL
+    case CALLBACKTYPE_sysenter:
+        if ( ! cpu_has_sep )
+            ret = -EINVAL;
+        else if ( on_each_cpu(do_update_sysenter, &reg->address, 1, 1) != 0 )
+            ret = -EIO;
+        break;
+#endif
 
     case CALLBACKTYPE_nmi:
         ret = register_guest_nmi_callback(reg->address.eip);
diff -r d73eeceeae69 -r 3ffb6cc6b8d2 xen/include/asm-x86/cpufeature.h
--- a/xen/include/asm-x86/cpufeature.h  Fri Apr 21 17:19:26 2006 +0100
+++ b/xen/include/asm-x86/cpufeature.h  Fri Apr 21 17:19:29 2006 +0100
@@ -104,6 +104,7 @@
 #define cpu_has_pae            boot_cpu_has(X86_FEATURE_PAE)
 #define cpu_has_pge            boot_cpu_has(X86_FEATURE_PGE)
 #define cpu_has_apic           boot_cpu_has(X86_FEATURE_APIC)
+#define cpu_has_sep            boot_cpu_has(X86_FEATURE_SEP)
 #define cpu_has_mtrr           boot_cpu_has(X86_FEATURE_MTRR)
 #define cpu_has_mmx            boot_cpu_has(X86_FEATURE_MMX)
 #define cpu_has_fxsr           boot_cpu_has(X86_FEATURE_FXSR)
@@ -125,6 +126,7 @@
 #define cpu_has_pae            1
 #define cpu_has_pge            1
 #define cpu_has_apic           boot_cpu_has(X86_FEATURE_APIC)
+#define cpu_has_sep            0
 #define cpu_has_mtrr           1
 #define cpu_has_mmx            1
 #define cpu_has_fxsr           1
diff -r d73eeceeae69 -r 3ffb6cc6b8d2 xen/include/public/callback.h
--- a/xen/include/public/callback.h     Fri Apr 21 17:19:26 2006 +0100
+++ b/xen/include/public/callback.h     Fri Apr 21 17:19:29 2006 +0100
@@ -21,6 +21,11 @@
 #define CALLBACKTYPE_event                 0
 #define CALLBACKTYPE_failsafe              1
 #define CALLBACKTYPE_syscall               2 /* x86_64 only */
+/*
+ * sysenter is only available on x86_32 with the
+ * supervisor_mode_kernel option enabled.
+ */
+#define CALLBACKTYPE_sysenter              3
 #define CALLBACKTYPE_nmi                   4
 
 /*

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Xen support for sysenter/exit on x86_32 when supervisor_mode_kernel is, Xen patchbot -unstable <=