lkml.org 
[lkml]   [2014]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.4 37/44] powerpc: Fix emulation of illegal instructions on PowerNV platform
    Date
    3.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Paul Mackerras <paulus@samba.org>

    commit bf593907f7236e95698a76b7c7a2bbf8b1165327 upstream.

    Normally, the kernel emulates a few instructions that are unimplemented
    on some processors (e.g. the old dcba instruction), or privileged (e.g.
    mfpvr). The emulation of unimplemented instructions is currently not
    working on the PowerNV platform. The reason is that on these machines,
    unimplemented and illegal instructions cause a hypervisor emulation
    assist interrupt, rather than a program interrupt as on older CPUs.
    Our vector for the emulation assist interrupt just calls
    program_check_exception() directly, without setting the bit in SRR1
    that indicates an illegal instruction interrupt. This fixes it by
    making the emulation assist interrupt set that bit before calling
    program_check_interrupt(). With this, old programs that use no-longer
    implemented instructions such as dcba now work again.

    Signed-off-by: Paul Mackerras <paulus@samba.org>
    Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    [bwh: Backported to 3.2: adjust context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    Cc: Yijing Wang <wangyijing@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/powerpc/kernel/exceptions-64s.S | 2 +-
    arch/powerpc/kernel/traps.c | 10 ++++++++++
    2 files changed, 11 insertions(+), 1 deletion(-)

    --- a/arch/powerpc/kernel/exceptions-64s.S
    +++ b/arch/powerpc/kernel/exceptions-64s.S
    @@ -491,7 +491,7 @@ machine_check_common:
    STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception)
    STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception)
    STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception)
    - STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception)
    + STD_EXCEPTION_COMMON(0xe40, emulation_assist, .emulation_assist_interrupt)
    STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception)
    STD_EXCEPTION_COMMON_ASYNC(0xf00, performance_monitor, .performance_monitor_exception)
    STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception)
    --- a/arch/powerpc/kernel/traps.c
    +++ b/arch/powerpc/kernel/traps.c
    @@ -1074,6 +1074,16 @@ void __kprobes program_check_exception(s
    _exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
    }

    +/*
    + * This occurs when running in hypervisor mode on POWER6 or later
    + * and an illegal instruction is encountered.
    + */
    +void __kprobes emulation_assist_interrupt(struct pt_regs *regs)
    +{
    + regs->msr |= REASON_ILLEGAL;
    + program_check_exception(regs);
    +}
    +
    void alignment_exception(struct pt_regs *regs)
    {
    int sig, code, fixed = 0;



    \
     
     \ /
      Last update: 2014-07-12 02:41    [W:4.134 / U:0.572 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site