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
This commit is contained in:
commit
5938930e71
5 changed files with 15 additions and 5 deletions
|
@ -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:
|
||||||
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)
|
||||||
* 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)
|
||||||
|
|
||||||
#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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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 @@ bail:
|
||||||
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();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue