aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/xen/setup.c27
-rw-r--r--include/asm-x86/xen/hypercall.h12
2 files changed, 29 insertions, 10 deletions
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
index f52f3855fb6b..bea3d4f779db 100644
--- a/arch/x86/xen/setup.c
+++ b/arch/x86/xen/setup.c
@@ -91,19 +91,25 @@ static void __init fiddle_vdso(void)
91 *mask |= 1 << VDSO_NOTE_NONEGSEG_BIT; 91 *mask |= 1 << VDSO_NOTE_NONEGSEG_BIT;
92} 92}
93 93
94void xen_enable_sysenter(void) 94static __cpuinit int register_callback(unsigned type, const void *func)
95{ 95{
96 int cpu = smp_processor_id(); 96 struct callback_register callback = {
97 extern void xen_sysenter_target(void); 97 .type = type,
98 /* Mask events on entry, even though they get enabled immediately */ 98 .address = XEN_CALLBACK(__KERNEL_CS, func),
99 static struct callback_register sysenter = {
100 .type = CALLBACKTYPE_sysenter,
101 .address = XEN_CALLBACK(__KERNEL_CS, xen_sysenter_target),
102 .flags = CALLBACKF_mask_events, 99 .flags = CALLBACKF_mask_events,
103 }; 100 };
104 101
102 return HYPERVISOR_callback_op(CALLBACKOP_register, &callback);
103}
104
105void __cpuinit xen_enable_sysenter(void)
106{
107 int cpu = smp_processor_id();
108 extern void xen_sysenter_target(void);
109
105 if (!boot_cpu_has(X86_FEATURE_SEP) || 110 if (!boot_cpu_has(X86_FEATURE_SEP) ||
106 HYPERVISOR_callback_op(CALLBACKOP_register, &sysenter) != 0) { 111 register_callback(CALLBACKTYPE_sysenter,
112 xen_sysenter_target) != 0) {
107 clear_cpu_cap(&cpu_data(cpu), X86_FEATURE_SEP); 113 clear_cpu_cap(&cpu_data(cpu), X86_FEATURE_SEP);
108 clear_cpu_cap(&boot_cpu_data, X86_FEATURE_SEP); 114 clear_cpu_cap(&boot_cpu_data, X86_FEATURE_SEP);
109 } 115 }
@@ -120,8 +126,9 @@ void __init xen_arch_setup(void)
120 if (!xen_feature(XENFEAT_auto_translated_physmap)) 126 if (!xen_feature(XENFEAT_auto_translated_physmap))
121 HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_pae_extended_cr3); 127 HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_pae_extended_cr3);
122 128
123 HYPERVISOR_set_callbacks(__KERNEL_CS, (unsigned long)xen_hypervisor_callback, 129 if (register_callback(CALLBACKTYPE_event, xen_hypervisor_callback) ||
124 __KERNEL_CS, (unsigned long)xen_failsafe_callback); 130 register_callback(CALLBACKTYPE_failsafe, xen_failsafe_callback))
131 BUG();
125 132
126 xen_enable_sysenter(); 133 xen_enable_sysenter();
127 134
diff --git a/include/asm-x86/xen/hypercall.h b/include/asm-x86/xen/hypercall.h
index d0c5dedcb001..25366641f3f8 100644
--- a/include/asm-x86/xen/hypercall.h
+++ b/include/asm-x86/xen/hypercall.h
@@ -226,6 +226,7 @@ HYPERVISOR_stack_switch(unsigned long ss, unsigned long esp)
226 return _hypercall2(int, stack_switch, ss, esp); 226 return _hypercall2(int, stack_switch, ss, esp);
227} 227}
228 228
229#ifdef CONFIG_X86_32
229static inline int 230static inline int
230HYPERVISOR_set_callbacks(unsigned long event_selector, 231HYPERVISOR_set_callbacks(unsigned long event_selector,
231 unsigned long event_address, 232 unsigned long event_address,
@@ -236,6 +237,17 @@ HYPERVISOR_set_callbacks(unsigned long event_selector,
236 event_selector, event_address, 237 event_selector, event_address,
237 failsafe_selector, failsafe_address); 238 failsafe_selector, failsafe_address);
238} 239}
240#else /* CONFIG_X86_64 */
241static inline int
242HYPERVISOR_set_callbacks(unsigned long event_address,
243 unsigned long failsafe_address,
244 unsigned long syscall_address)
245{
246 return _hypercall3(int, set_callbacks,
247 event_address, failsafe_address,
248 syscall_address);
249}
250#endif /* CONFIG_X86_{32,64} */
239 251
240static inline int 252static inline int
241HYPERVISOR_callback_op(int cmd, void *arg) 253HYPERVISOR_callback_op(int cmd, void *arg)