Re: [v2 6/7] x86/traps: Fixup general protection faults caused by UMIP

Ricardo Neri <[email protected]>
Newsgroups org.kernel.vger.linux-msdos,org.kernel.vger.linux-kernel
Message-ID <1482878061.106950.11.camel@ranerica-desktop>
On Fri, 2016-12-23 at 18:11 -0800, Andy Lutomirski wrote:
> On Fri, Dec 23, 2016 at 5:37 PM, Ricardo Neri
> <[email protected]> wrote:
> > If the User-Mode Instruction Prevention CPU feature is available and
> > enabled, a general protection fault will be issued if the instructions
> > sgdt, sldt, sidt, str or smsw are executed from user-mode context
> > (CPL > 0). If the fault was caused by any of the instructions protected
> > by UMIP, fixup_umip_exceptino will emulate dummy results for these
> > instructions.
> >
> > Cc: Andy Lutomirski <[email protected]>
> > Cc: Andrew Morton <[email protected]>
> > Cc: H. Peter Anvin <[email protected]>
> > Cc: Borislav Petkov <[email protected]>
> > Cc: Brian Gerst <[email protected]>
> > Cc: Chen Yucong <[email protected]>
> > Cc: Chris Metcalf <[email protected]>
> > Cc: Dave Hansen <[email protected]>
> > Cc: Fenghua Yu <[email protected]>
> > Cc: Huang Rui <[email protected]>
> > Cc: Jiri Slaby <[email protected]>
> > Cc: Jonathan Corbet <[email protected]>
> > Cc: Michael S. Tsirkin <[email protected]>
> > Cc: Paul Gortmaker <[email protected]>
> > Cc: Peter Zijlstra <[email protected]>
> > Cc: Ravi V. Shankar <[email protected]>
> > Cc: Shuah Khan <[email protected]>
> > Cc: Vlastimil Babka <[email protected]>
> > Cc: Tony Luck <[email protected]>
> > Cc: Paolo Bonzini <[email protected]>
> > Cc: Liang Z. Li <[email protected]>
> > Cc: Alexandre Julliard <[email protected]>
> > Cc: Stas Sergeev <[email protected]>
> > Cc: [email protected]
> > Cc: [email protected]
> > Signed-off-by: Ricardo Neri <[email protected]>
> > ---
> >  arch/x86/kernel/traps.c | 4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
> > index bf0c6d0..5044fb3 100644
> > --- a/arch/x86/kernel/traps.c
> > +++ b/arch/x86/kernel/traps.c
> > @@ -64,6 +64,7 @@
> >  #include <asm/trace/mpx.h>
> >  #include <asm/mpx.h>
> >  #include <asm/vm86.h>
> > +#include <asm/umip.h>
> >
> >  #ifdef CONFIG_X86_64
> >  #include <asm/x86_init.h>
> > @@ -491,6 +492,9 @@ do_general_protection(struct pt_regs *regs, long error_code)
> >         RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
> >         cond_local_irq_enable(regs);
> >
> > +       if (user_mode(regs) && !fixup_umip_exception(regs))
> > +               return;
> > +
> 
> I would do fixup_umip_exception(regs) == 0 to make it more obvious
> what's going on.

Sure. I will make this change.
> 
> Also, since you're allowing this in v8086 mode, I think this should
> have an explicit test in
> tools/testing/selftests/x86/entry_from_vm86.c.  I *think* it will work
> fine, but the pt_regs handling in vm86 mode is quite scary and has
> been rewritten recently.

I will include a test for this.

Thanks and BR,
Ricardo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.