|
@@ -48,6 +48,7 @@
|
|
|
#include <asm/syscalls.h>
|
|
|
#include <asm/debugreg.h>
|
|
|
#include <asm/switch_to.h>
|
|
|
+#include <asm/xen/hypervisor.h>
|
|
|
|
|
|
asmlinkage extern void ret_from_fork(void);
|
|
|
|
|
@@ -411,6 +412,17 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
|
|
|
task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV))
|
|
|
__switch_to_xtra(prev_p, next_p, tss);
|
|
|
|
|
|
+#ifdef CONFIG_XEN
|
|
|
+ /*
|
|
|
+ * On Xen PV, IOPL bits in pt_regs->flags have no effect, and
|
|
|
+ * current_pt_regs()->flags may not match the current task's
|
|
|
+ * intended IOPL. We need to switch it manually.
|
|
|
+ */
|
|
|
+ if (unlikely(static_cpu_has(X86_FEATURE_XENPV) &&
|
|
|
+ prev->iopl != next->iopl))
|
|
|
+ xen_set_iopl_mask(next->iopl);
|
|
|
+#endif
|
|
|
+
|
|
|
if (static_cpu_has_bug(X86_BUG_SYSRET_SS_ATTRS)) {
|
|
|
/*
|
|
|
* AMD CPUs have a misfeature: SYSRET sets the SS selector but
|