powerpc/64s: Fix stack setup in watchdog soft_nmi_common()
The watchdog soft-NMI exception stack setup loads a stack pointer
twice, which is an obvious error. It ends up using the system reset
interrupt (true-NMI) stack, which is also a bug because the watchdog
could be preempted by a system reset interrupt that overwrites the
NMI stack.
Change the soft-NMI to use the "emergency stack". The current kernel
stack is not used, because of the longer-term goal to prevent
asynchronous stack access using soft-disable.
Fixes: 2104180a53 ("powerpc/64s: implement arch-specific hardlockup watchdog")
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
			
			
This commit is contained in:
		
							parent
							
								
									bb272221e9
								
							
						
					
					
						commit
						cc491f1d35
					
				| @ -1325,10 +1325,18 @@ EXC_VIRT_NONE(0x5800, 0x100) | ||||
| 	std	r10,PACA_EXGEN+EX_R13(r13);		\
 | ||||
| 	EXCEPTION_PROLOG_PSERIES_1(soft_nmi_common, _H) | ||||
| 
 | ||||
| /* | ||||
|  * Branch to soft_nmi_interrupt using the emergency stack. The emergency | ||||
|  * stack is one that is usable by maskable interrupts so long as MSR_EE | ||||
|  * remains off. It is used for recovery when something has corrupted the | ||||
|  * normal kernel stack, for example. The "soft NMI" must not use the process | ||||
|  * stack because we want irq disabled sections to avoid touching the stack | ||||
|  * at all (other than PMU interrupts), so use the emergency stack for this, | ||||
|  * and run it entirely with interrupts hard disabled. | ||||
|  */ | ||||
| EXC_COMMON_BEGIN(soft_nmi_common) | ||||
| 	mr	r10,r1 | ||||
| 	ld	r1,PACAEMERGSP(r13) | ||||
| 	ld	r1,PACA_NMI_EMERG_SP(r13) | ||||
| 	subi	r1,r1,INT_FRAME_SIZE | ||||
| 	EXCEPTION_COMMON_NORET_STACK(PACA_EXGEN, 0x900, | ||||
| 			system_reset, soft_nmi_interrupt, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user