lkml.org 
[lkml]   [2017]   [Mar]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[v5 18/20] x86/traps: Fixup general protection faults caused by UMIP
    Date
    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_exception will emulate dummy results for these
    instructions. If emulation is successful, the result is passed to the
    user space program and no SIGSEGV signal is emitted.

    Please note that fixup_umip_exception also caters for the case when
    the fault originated while running in virtual-8086 mode.

    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Borislav Petkov <bp@suse.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Chen Yucong <slaoub@gmail.com>
    Cc: Chris Metcalf <cmetcalf@mellanox.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Fenghua Yu <fenghua.yu@intel.com>
    Cc: Huang Rui <ray.huang@amd.com>
    Cc: Jiri Slaby <jslaby@suse.cz>
    Cc: Jonathan Corbet <corbet@lwn.net>
    Cc: Michael S. Tsirkin <mst@redhat.com>
    Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Ravi V. Shankar <ravi.v.shankar@intel.com>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Liang Z. Li <liang.z.li@intel.com>
    Cc: Alexandre Julliard <julliard@winehq.org>
    Cc: Stas Sergeev <stsp@list.ru>
    Cc: x86@kernel.org
    Cc: linux-msdos@vger.kernel.org
    Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
    ---
    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 948443e..86efbcb 100644
    --- a/arch/x86/kernel/traps.c
    +++ b/arch/x86/kernel/traps.c
    @@ -65,6 +65,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>
    @@ -492,6 +493,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;
    +
    if (v8086_mode(regs)) {
    local_irq_enable();
    handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code);
    --
    2.9.3
    \
     
     \ /
      Last update: 2017-03-03 22:45    [W:3.111 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site