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

Andy Lutomirski <[email protected]>
Newsgroups org.kernel.vger.linux-msdos,org.kernel.vger.linux-kernel
Message-ID <CALCETrUW+zRnYT0oG_cwkn3xOjpTgKVtT71GeA2JucTkF5+Log@mail.gmail.com>
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.

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.
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.