diff options
Diffstat (limited to 'arch/x86/xen/setup.c')
| -rw-r--r-- | arch/x86/xen/setup.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index 2341492bf7a0..82517e4a752a 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <asm/xen/hypervisor.h> | 16 | #include <asm/xen/hypervisor.h> |
| 17 | #include <asm/xen/hypercall.h> | 17 | #include <asm/xen/hypercall.h> |
| 18 | 18 | ||
| 19 | #include <xen/interface/callback.h> | ||
| 19 | #include <xen/interface/physdev.h> | 20 | #include <xen/interface/physdev.h> |
| 20 | #include <xen/features.h> | 21 | #include <xen/features.h> |
| 21 | 22 | ||
| @@ -68,6 +69,24 @@ static void __init fiddle_vdso(void) | |||
| 68 | *mask |= 1 << VDSO_NOTE_NONEGSEG_BIT; | 69 | *mask |= 1 << VDSO_NOTE_NONEGSEG_BIT; |
| 69 | } | 70 | } |
| 70 | 71 | ||
| 72 | void xen_enable_sysenter(void) | ||
| 73 | { | ||
| 74 | int cpu = smp_processor_id(); | ||
| 75 | extern void xen_sysenter_target(void); | ||
| 76 | /* Mask events on entry, even though they get enabled immediately */ | ||
| 77 | static struct callback_register sysenter = { | ||
| 78 | .type = CALLBACKTYPE_sysenter, | ||
| 79 | .address = { __KERNEL_CS, (unsigned long)xen_sysenter_target }, | ||
| 80 | .flags = CALLBACKF_mask_events, | ||
| 81 | }; | ||
| 82 | |||
| 83 | if (!boot_cpu_has(X86_FEATURE_SEP) || | ||
| 84 | HYPERVISOR_callback_op(CALLBACKOP_register, &sysenter) != 0) { | ||
| 85 | clear_cpu_cap(&cpu_data(cpu), X86_FEATURE_SEP); | ||
| 86 | clear_cpu_cap(&boot_cpu_data, X86_FEATURE_SEP); | ||
| 87 | } | ||
| 88 | } | ||
| 89 | |||
| 71 | void __init xen_arch_setup(void) | 90 | void __init xen_arch_setup(void) |
| 72 | { | 91 | { |
| 73 | struct physdev_set_iopl set_iopl; | 92 | struct physdev_set_iopl set_iopl; |
| @@ -82,6 +101,8 @@ void __init xen_arch_setup(void) | |||
| 82 | HYPERVISOR_set_callbacks(__KERNEL_CS, (unsigned long)xen_hypervisor_callback, | 101 | HYPERVISOR_set_callbacks(__KERNEL_CS, (unsigned long)xen_hypervisor_callback, |
| 83 | __KERNEL_CS, (unsigned long)xen_failsafe_callback); | 102 | __KERNEL_CS, (unsigned long)xen_failsafe_callback); |
| 84 | 103 | ||
| 104 | xen_enable_sysenter(); | ||
| 105 | |||
| 85 | set_iopl.iopl = 1; | 106 | set_iopl.iopl = 1; |
| 86 | rc = HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl); | 107 | rc = HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl); |
| 87 | if (rc != 0) | 108 | if (rc != 0) |
