powerpc/64s: Exception macro for stack frame and initial register save
This code is common to a few exceptions, and another user will be added. This causes a trivial change to generated code: - 604: std r9,416(r1) - 608: mfspr r11,314 - 60c: std r11,368(r1) - 610: mfspr r12,315 + 604: mfspr r11,314 + 608: mfspr r12,315 + 60c: std r9,416(r1) + 610: std r11,368(r1) machine_check_powernv_early could also use this, but that requires non trivial changes to generated code, so that's for another patch. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
		
							parent
							
								
									83a980f7f4
								
							
						
					
					
						commit
						a4087a4d38
					
				| @ -323,6 +323,15 @@ END_FTR_SECTION_NESTED(ftr,ftr,943) | ||||
| 
 | ||||
| #define NOTEST(n) | ||||
| 
 | ||||
| #define EXCEPTION_PROLOG_COMMON_1()					   \ | ||||
| 	std	r9,_CCR(r1);		/* save CR in stackframe	*/ \ | ||||
| 	std	r11,_NIP(r1);		/* save SRR0 in stackframe	*/ \ | ||||
| 	std	r12,_MSR(r1);		/* save SRR1 in stackframe	*/ \ | ||||
| 	std	r10,0(r1);		/* make stack chain pointer	*/ \ | ||||
| 	std	r0,GPR0(r1);		/* save r0 in stackframe	*/ \ | ||||
| 	std	r10,GPR1(r1);		/* save r1 in stackframe	*/ \ | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * The common exception prolog is used for all except a few exceptions | ||||
|  * such as a segment miss on a kernel address.  We have to be prepared | ||||
| @ -347,12 +356,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943) | ||||
| 	addi	r3,r13,area;		/* r3 -> where regs are saved*/	   \ | ||||
| 	RESTORE_CTR(r1, area);						   \ | ||||
| 	b	bad_stack;						   \ | ||||
| 3:	std	r9,_CCR(r1);		/* save CR in stackframe	*/ \ | ||||
| 	std	r11,_NIP(r1);		/* save SRR0 in stackframe	*/ \ | ||||
| 	std	r12,_MSR(r1);		/* save SRR1 in stackframe	*/ \ | ||||
| 	std	r10,0(r1);		/* make stack chain pointer	*/ \ | ||||
| 	std	r0,GPR0(r1);		/* save r0 in stackframe	*/ \ | ||||
| 	std	r10,GPR1(r1);		/* save r1 in stackframe	*/ \ | ||||
| 3:	EXCEPTION_PROLOG_COMMON_1();					   \ | ||||
| 	beq	4f;			/* if from kernel mode		*/ \ | ||||
| 	ACCOUNT_CPU_USER_ENTRY(r13, r9, r10);				   \ | ||||
| 	SAVE_PPR(area, r9, r10);					   \ | ||||
|  | ||||
| @ -929,17 +929,12 @@ EXC_VIRT_NONE(0x4e60, 0x20) | ||||
| TRAMP_KVM_HV(PACA_EXGEN, 0xe60) | ||||
| TRAMP_REAL_BEGIN(hmi_exception_early) | ||||
| 	EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_HV, 0xe60) | ||||
| 	mr	r10,r1			/* Save r1			*/ | ||||
| 	ld	r1,PACAEMERGSP(r13)	/* Use emergency stack		*/ | ||||
| 	mr	r10,r1			/* Save r1 */ | ||||
| 	ld	r1,PACAEMERGSP(r13)	/* Use emergency stack for realmode */ | ||||
| 	subi	r1,r1,INT_FRAME_SIZE	/* alloc stack frame		*/ | ||||
| 	std	r9,_CCR(r1)		/* save CR in stackframe	*/ | ||||
| 	mfspr	r11,SPRN_HSRR0		/* Save HSRR0 */ | ||||
| 	std	r11,_NIP(r1)		/* save HSRR0 in stackframe	*/ | ||||
| 	mfspr	r12,SPRN_HSRR1		/* Save SRR1 */ | ||||
| 	std	r12,_MSR(r1)		/* save SRR1 in stackframe	*/ | ||||
| 	std	r10,0(r1)		/* make stack chain pointer	*/ | ||||
| 	std	r0,GPR0(r1)		/* save r0 in stackframe	*/ | ||||
| 	std	r10,GPR1(r1)		/* save r1 in stackframe	*/ | ||||
| 	mfspr	r12,SPRN_HSRR1		/* Save HSRR1 */ | ||||
| 	EXCEPTION_PROLOG_COMMON_1() | ||||
| 	EXCEPTION_PROLOG_COMMON_2(PACA_EXGEN) | ||||
| 	EXCEPTION_PROLOG_COMMON_3(0xe60) | ||||
| 	addi	r3,r1,STACK_FRAME_OVERHEAD | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user