Commit 5938930e authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc

Pull powerpc fixes from Benjamin Herrenschmidt:
 "So here are 3 fixes still for 3.10.  Fixes are simple, bugs are nasty
  (though not recent regressions, nasty enough) and all targeted at
  stable"

* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc:
  powerpc: Fix missing/delayed calls to irq_work
  powerpc: Fix emulation of illegal instructions on PowerNV platform
  powerpc: Fix stack overflow crash in resume_kernel when ftracing
parents f21afc25 230b3034
...@@ -513,7 +513,7 @@ label##_common: \ ...@@ -513,7 +513,7 @@ label##_common: \
*/ */
#define STD_EXCEPTION_COMMON_ASYNC(trap, label, hdlr) \ #define STD_EXCEPTION_COMMON_ASYNC(trap, label, hdlr) \
EXCEPTION_COMMON(trap, label, hdlr, ret_from_except_lite, \ EXCEPTION_COMMON(trap, label, hdlr, ret_from_except_lite, \
FINISH_NAP;RUNLATCH_ON;DISABLE_INTS) FINISH_NAP;DISABLE_INTS;RUNLATCH_ON)
/* /*
* When the idle code in power4_idle puts the CPU into NAP mode, * When the idle code in power4_idle puts the CPU into NAP mode,
......
...@@ -683,7 +683,7 @@ machine_check_common: ...@@ -683,7 +683,7 @@ machine_check_common:
STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception)
STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception)
STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_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(0xe60, hmi_exception, .unknown_exception)
#ifdef CONFIG_PPC_DOORBELL #ifdef CONFIG_PPC_DOORBELL
STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception) STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception)
......
...@@ -162,7 +162,7 @@ notrace unsigned int __check_irq_replay(void) ...@@ -162,7 +162,7 @@ notrace unsigned int __check_irq_replay(void)
* in case we also had a rollover while hard disabled * in case we also had a rollover while hard disabled
*/ */
local_paca->irq_happened &= ~PACA_IRQ_DEC; local_paca->irq_happened &= ~PACA_IRQ_DEC;
if (decrementer_check_overflow()) if ((happened & PACA_IRQ_DEC) || decrementer_check_overflow())
return 0x900; return 0x900;
/* Finally check if an external interrupt happened */ /* Finally check if an external interrupt happened */
......
...@@ -1369,7 +1369,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) ...@@ -1369,7 +1369,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
/* Called with hard IRQs off */ /* Called with hard IRQs off */
void __ppc64_runlatch_on(void) void notrace __ppc64_runlatch_on(void)
{ {
struct thread_info *ti = current_thread_info(); struct thread_info *ti = current_thread_info();
unsigned long ctrl; unsigned long ctrl;
...@@ -1382,7 +1382,7 @@ void __ppc64_runlatch_on(void) ...@@ -1382,7 +1382,7 @@ void __ppc64_runlatch_on(void)
} }
/* Called with hard IRQs off */ /* Called with hard IRQs off */
void __ppc64_runlatch_off(void) void notrace __ppc64_runlatch_off(void)
{ {
struct thread_info *ti = current_thread_info(); struct thread_info *ti = current_thread_info();
unsigned long ctrl; unsigned long ctrl;
......
...@@ -1165,6 +1165,16 @@ void __kprobes program_check_exception(struct pt_regs *regs) ...@@ -1165,6 +1165,16 @@ void __kprobes program_check_exception(struct pt_regs *regs)
exception_exit(prev_state); exception_exit(prev_state);
} }
/*
* 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) void alignment_exception(struct pt_regs *regs)
{ {
enum ctx_state prev_state = exception_enter(); enum ctx_state prev_state = exception_enter();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment