stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [backports for 3.x, 4.x] x86/iopl/64: Properly context-switch IOPL on Xen PV
@ 2016-04-05 19:24 Kamal Mostafa
  2016-04-05 19:24 ` [3.2 backport] " Kamal Mostafa
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Kamal Mostafa @ 2016-04-05 19:24 UTC (permalink / raw)
  To: stable, Greg Kroah-Hartman, Kamal Mostafa, Sasha Levin,
	Luis Henriques, Jiri Slaby, Zefan Li, Ben Hutchings
  Cc: Andy Lutomirski

Here is a backport of this stable patch for pre-4.4 kernels (before the
advent of X86_FEATURE_XENPV):

  b7a58459 x86/iopl/64: Properly context-switch IOPL on Xen PV

Supplied backports:

  - [3.2 backport]
  - [3.x backport] (for 3.4 through 3.19)
  - [4.x backport] (for 4.1 and 4.2)

 -Kamal

----------

Andy Lutomirski (1):
  x86/iopl/64: Properly context-switch IOPL on Xen PV

 arch/x86/include/asm/xen/hypervisor.h |  2 ++
 arch/x86/kernel/process_64.c          | 12 ++++++++++++
 arch/x86/xen/enlighten.c              |  2 +-
 3 files changed, 15 insertions(+), 1 deletion(-)

-- 
2.7.4


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [3.2 backport] x86/iopl/64: Properly context-switch IOPL on Xen PV
  2016-04-05 19:24 [backports for 3.x, 4.x] x86/iopl/64: Properly context-switch IOPL on Xen PV Kamal Mostafa
@ 2016-04-05 19:24 ` Kamal Mostafa
  2016-04-25 22:29   ` Ben Hutchings
  2016-04-05 19:24 ` [3.x " Kamal Mostafa
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 7+ messages in thread
From: Kamal Mostafa @ 2016-04-05 19:24 UTC (permalink / raw)
  To: stable, Greg Kroah-Hartman, Kamal Mostafa, Sasha Levin,
	Luis Henriques, Jiri Slaby, Zefan Li, Ben Hutchings
  Cc: Andy Lutomirski

From: Andy Lutomirski <luto@kernel.org>

commit b7a584598aea7ca73140cb87b40319944dd3393f upstream.

On Xen PV, regs->flags doesn't reliably reflect IOPL and the
exit-to-userspace code doesn't change IOPL.  We need to context
switch it manually.

I'm doing this without going through paravirt because this is
specific to Xen PV.  After the dust settles, we can merge this with
the 32-bit code, tidy up the iopl syscall implementation, and remove
the set_iopl pvop entirely.

Fixes XSA-171.

Reviewewd-by: Jan Beulich <JBeulich@suse.com>
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: David Vrabel <david.vrabel@citrix.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jan Beulich <JBeulich@suse.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/693c3bd7aeb4d3c27c92c622b7d0f554a458173c.1458162709.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
[ kamal: backport to 3.2-stable: no X86_FEATURE_XENPV so just call
  xen_pv_domain() directly ]
Acked-by: Andy Lutomirski <luto@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
---
 arch/x86/include/asm/xen/hypervisor.h |  2 ++
 arch/x86/kernel/process_64.c          | 12 ++++++++++++
 arch/x86/xen/enlighten.c              |  2 +-
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/xen/hypervisor.h b/arch/x86/include/asm/xen/hypervisor.h
index 66d0fff..fc500f9 100644
--- a/arch/x86/include/asm/xen/hypervisor.h
+++ b/arch/x86/include/asm/xen/hypervisor.h
@@ -72,4 +72,6 @@ static inline bool xen_x2apic_para_available(void)
 }
 #endif
 
+extern void xen_set_iopl_mask(unsigned mask);
+
 #endif /* _ASM_X86_XEN_HYPERVISOR_H */
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index ee2e70c..e505a4d 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -52,6 +52,7 @@
 #include <asm/syscalls.h>
 #include <asm/debugreg.h>
 #include <asm/nmi.h>
+#include <asm/xen/hypervisor.h>
 
 asmlinkage extern void ret_from_fork(void);
 
@@ -518,6 +519,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(xen_pv_domain() &&
+		     prev->iopl != next->iopl))
+		xen_set_iopl_mask(next->iopl);
+#endif
+
 	return prev_p;
 }
 
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 81afe1b..b255312 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -768,7 +768,7 @@ static void xen_load_sp0(struct tss_struct *tss,
 	xen_mc_issue(PARAVIRT_LAZY_CPU);
 }
 
-static void xen_set_iopl_mask(unsigned mask)
+void xen_set_iopl_mask(unsigned mask)
 {
 	struct physdev_set_iopl set_iopl;
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [3.x backport] x86/iopl/64: Properly context-switch IOPL on Xen PV
  2016-04-05 19:24 [backports for 3.x, 4.x] x86/iopl/64: Properly context-switch IOPL on Xen PV Kamal Mostafa
  2016-04-05 19:24 ` [3.2 backport] " Kamal Mostafa
@ 2016-04-05 19:24 ` Kamal Mostafa
  2016-04-05 19:24 ` [4.x " Kamal Mostafa
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Kamal Mostafa @ 2016-04-05 19:24 UTC (permalink / raw)
  To: stable, Greg Kroah-Hartman, Kamal Mostafa, Sasha Levin,
	Luis Henriques, Jiri Slaby, Zefan Li, Ben Hutchings
  Cc: Andy Lutomirski

From: Andy Lutomirski <luto@kernel.org>

commit b7a584598aea7ca73140cb87b40319944dd3393f upstream.

On Xen PV, regs->flags doesn't reliably reflect IOPL and the
exit-to-userspace code doesn't change IOPL.  We need to context
switch it manually.

I'm doing this without going through paravirt because this is
specific to Xen PV.  After the dust settles, we can merge this with
the 32-bit code, tidy up the iopl syscall implementation, and remove
the set_iopl pvop entirely.

Fixes XSA-171.

Reviewewd-by: Jan Beulich <JBeulich@suse.com>
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: David Vrabel <david.vrabel@citrix.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jan Beulich <JBeulich@suse.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/693c3bd7aeb4d3c27c92c622b7d0f554a458173c.1458162709.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
[ kamal: backport to 3.19-stable: no X86_FEATURE_XENPV so just call
  xen_pv_domain() directly ]
Acked-by: Andy Lutomirski <luto@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
---
 arch/x86/include/asm/xen/hypervisor.h |  2 ++
 arch/x86/kernel/process_64.c          | 12 ++++++++++++
 arch/x86/xen/enlighten.c              |  2 +-
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/xen/hypervisor.h b/arch/x86/include/asm/xen/hypervisor.h
index d866959..d2ad00a 100644
--- a/arch/x86/include/asm/xen/hypervisor.h
+++ b/arch/x86/include/asm/xen/hypervisor.h
@@ -57,4 +57,6 @@ static inline bool xen_x2apic_para_available(void)
 }
 #endif
 
+extern void xen_set_iopl_mask(unsigned mask);
+
 #endif /* _ASM_X86_XEN_HYPERVISOR_H */
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index e2d26ce..4b8716d 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -49,6 +49,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);
 
@@ -427,6 +428,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(xen_pv_domain() &&
+		     prev->iopl != next->iopl))
+		xen_set_iopl_mask(next->iopl);
+#endif
+
 	return prev_p;
 }
 
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index b2de632..7c8af52 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -955,7 +955,7 @@ static void xen_load_sp0(struct tss_struct *tss,
 	xen_mc_issue(PARAVIRT_LAZY_CPU);
 }
 
-static void xen_set_iopl_mask(unsigned mask)
+void xen_set_iopl_mask(unsigned mask)
 {
 	struct physdev_set_iopl set_iopl;
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [4.x backport] x86/iopl/64: Properly context-switch IOPL on Xen PV
  2016-04-05 19:24 [backports for 3.x, 4.x] x86/iopl/64: Properly context-switch IOPL on Xen PV Kamal Mostafa
  2016-04-05 19:24 ` [3.2 backport] " Kamal Mostafa
  2016-04-05 19:24 ` [3.x " Kamal Mostafa
@ 2016-04-05 19:24 ` Kamal Mostafa
  2016-04-11  8:55 ` [backports for 3.x, 4.x] " Luis Henriques
  2016-04-11 10:57 ` Zefan Li
  4 siblings, 0 replies; 7+ messages in thread
From: Kamal Mostafa @ 2016-04-05 19:24 UTC (permalink / raw)
  To: stable, Greg Kroah-Hartman, Kamal Mostafa, Sasha Levin,
	Luis Henriques, Jiri Slaby, Zefan Li, Ben Hutchings
  Cc: Andy Lutomirski

From: Andy Lutomirski <luto@kernel.org>

commit b7a584598aea7ca73140cb87b40319944dd3393f upstream.

On Xen PV, regs->flags doesn't reliably reflect IOPL and the
exit-to-userspace code doesn't change IOPL.  We need to context
switch it manually.

I'm doing this without going through paravirt because this is
specific to Xen PV.  After the dust settles, we can merge this with
the 32-bit code, tidy up the iopl syscall implementation, and remove
the set_iopl pvop entirely.

Fixes XSA-171.

Reviewewd-by: Jan Beulich <JBeulich@suse.com>
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: David Vrabel <david.vrabel@citrix.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jan Beulich <JBeulich@suse.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/693c3bd7aeb4d3c27c92c622b7d0f554a458173c.1458162709.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
[ kamal: backport to 4.2-stable: no X86_FEATURE_XENPV so just call
  xen_pv_domain() directly ]
Acked-by: Andy Lutomirski <luto@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
---
 arch/x86/include/asm/xen/hypervisor.h |  2 ++
 arch/x86/kernel/process_64.c          | 12 ++++++++++++
 arch/x86/xen/enlighten.c              |  2 +-
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/xen/hypervisor.h b/arch/x86/include/asm/xen/hypervisor.h
index d866959..d2ad00a 100644
--- a/arch/x86/include/asm/xen/hypervisor.h
+++ b/arch/x86/include/asm/xen/hypervisor.h
@@ -57,4 +57,6 @@ static inline bool xen_x2apic_para_available(void)
 }
 #endif
 
+extern void xen_set_iopl_mask(unsigned mask);
+
 #endif /* _ASM_X86_XEN_HYPERVISOR_H */
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index adff851..87a848b 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -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);
 
@@ -417,6 +418,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(xen_pv_domain() &&
+		     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
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index f83c0ba..79858f7 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -959,7 +959,7 @@ static void xen_load_sp0(struct tss_struct *tss,
 	tss->x86_tss.sp0 = thread->sp0;
 }
 
-static void xen_set_iopl_mask(unsigned mask)
+void xen_set_iopl_mask(unsigned mask)
 {
 	struct physdev_set_iopl set_iopl;
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [backports for 3.x, 4.x] x86/iopl/64: Properly context-switch IOPL on Xen PV
  2016-04-05 19:24 [backports for 3.x, 4.x] x86/iopl/64: Properly context-switch IOPL on Xen PV Kamal Mostafa
                   ` (2 preceding siblings ...)
  2016-04-05 19:24 ` [4.x " Kamal Mostafa
@ 2016-04-11  8:55 ` Luis Henriques
  2016-04-11 10:57 ` Zefan Li
  4 siblings, 0 replies; 7+ messages in thread
From: Luis Henriques @ 2016-04-11  8:55 UTC (permalink / raw)
  To: Kamal Mostafa
  Cc: stable, Greg Kroah-Hartman, Sasha Levin, Jiri Slaby, Zefan Li,
	Ben Hutchings, Andy Lutomirski

On Tue, Apr 05, 2016 at 12:24:21PM -0700, Kamal Mostafa wrote:
> Here is a backport of this stable patch for pre-4.4 kernels (before the
> advent of X86_FEATURE_XENPV):
> 
>   b7a58459 x86/iopl/64: Properly context-switch IOPL on Xen PV
> 
> Supplied backports:
> 
>   - [3.2 backport]
>   - [3.x backport] (for 3.4 through 3.19)
>   - [4.x backport] (for 4.1 and 4.2)
>

Thanks Kamal, I'm queuing this for the 3.16 kernel.

Cheers,
--
Lu�s

>  -Kamal
> 
> ----------
> 
> Andy Lutomirski (1):
>   x86/iopl/64: Properly context-switch IOPL on Xen PV
> 
>  arch/x86/include/asm/xen/hypervisor.h |  2 ++
>  arch/x86/kernel/process_64.c          | 12 ++++++++++++
>  arch/x86/xen/enlighten.c              |  2 +-
>  3 files changed, 15 insertions(+), 1 deletion(-)
> 
> -- 
> 2.7.4
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [backports for 3.x, 4.x] x86/iopl/64: Properly context-switch IOPL on Xen PV
  2016-04-05 19:24 [backports for 3.x, 4.x] x86/iopl/64: Properly context-switch IOPL on Xen PV Kamal Mostafa
                   ` (3 preceding siblings ...)
  2016-04-11  8:55 ` [backports for 3.x, 4.x] " Luis Henriques
@ 2016-04-11 10:57 ` Zefan Li
  4 siblings, 0 replies; 7+ messages in thread
From: Zefan Li @ 2016-04-11 10:57 UTC (permalink / raw)
  To: Kamal Mostafa, stable, Greg Kroah-Hartman, Sasha Levin,
	Luis Henriques, Jiri Slaby, Ben Hutchings
  Cc: Andy Lutomirski

On 2016/4/6 3:24, Kamal Mostafa wrote:
> Here is a backport of this stable patch for pre-4.4 kernels (before the
> advent of X86_FEATURE_XENPV):
> 
>   b7a58459 x86/iopl/64: Properly context-switch IOPL on Xen PV
> 
> Supplied backports:
> 
>   - [3.2 backport]
>   - [3.x backport] (for 3.4 through 3.19)

I'll queue it up for 3.4.y. Thanks!

>   - [4.x backport] (for 4.1 and 4.2)
> 
>  -Kamal
> 
> ----------
> 
> Andy Lutomirski (1):
>   x86/iopl/64: Properly context-switch IOPL on Xen PV
> 
>  arch/x86/include/asm/xen/hypervisor.h |  2 ++
>  arch/x86/kernel/process_64.c          | 12 ++++++++++++
>  arch/x86/xen/enlighten.c              |  2 +-
>  3 files changed, 15 insertions(+), 1 deletion(-)
> 


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [3.2 backport] x86/iopl/64: Properly context-switch IOPL on Xen PV
  2016-04-05 19:24 ` [3.2 backport] " Kamal Mostafa
@ 2016-04-25 22:29   ` Ben Hutchings
  0 siblings, 0 replies; 7+ messages in thread
From: Ben Hutchings @ 2016-04-25 22:29 UTC (permalink / raw)
  To: Kamal Mostafa, stable, Greg Kroah-Hartman, Sasha Levin,
	Luis Henriques, Jiri Slaby, Zefan Li
  Cc: Andy Lutomirski

[-- Attachment #1: Type: text/plain, Size: 553 bytes --]

On Tue, 2016-04-05 at 12:24 -0700, Kamal Mostafa wrote:
> From: Andy Lutomirski <luto@kernel.org>
> 
> commit b7a584598aea7ca73140cb87b40319944dd3393f upstream.
[...]
> [ kamal: backport to 3.2-stable: no X86_FEATURE_XENPV so just call
>   xen_pv_domain() directly ]
[...]

Thanks; I already made a similar backport for Debian which I've queued
up for 3.2.80.

Ben.

-- 
Ben Hutchings
The generation of random numbers is too important to be left to chance.
                                                            - Robert Coveyou

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2016-04-25 22:29 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-05 19:24 [backports for 3.x, 4.x] x86/iopl/64: Properly context-switch IOPL on Xen PV Kamal Mostafa
2016-04-05 19:24 ` [3.2 backport] " Kamal Mostafa
2016-04-25 22:29   ` Ben Hutchings
2016-04-05 19:24 ` [3.x " Kamal Mostafa
2016-04-05 19:24 ` [4.x " Kamal Mostafa
2016-04-11  8:55 ` [backports for 3.x, 4.x] " Luis Henriques
2016-04-11 10:57 ` Zefan Li

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).