mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ARCv2: STAR 9000793984: Handle return from intr to Delay Slot
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
This commit is contained in:
		
							parent
							
								
									1f6ccfff63
								
							
						
					
					
						commit
						4255b07f2c
					
				
					 3 changed files with 53 additions and 0 deletions
				
			
		| 
						 | 
					@ -56,6 +56,7 @@ int main(void)
 | 
				
			||||||
	DEFINE(PT_r5, offsetof(struct pt_regs, r5));
 | 
						DEFINE(PT_r5, offsetof(struct pt_regs, r5));
 | 
				
			||||||
	DEFINE(PT_r6, offsetof(struct pt_regs, r6));
 | 
						DEFINE(PT_r6, offsetof(struct pt_regs, r6));
 | 
				
			||||||
	DEFINE(PT_r7, offsetof(struct pt_regs, r7));
 | 
						DEFINE(PT_r7, offsetof(struct pt_regs, r7));
 | 
				
			||||||
 | 
						DEFINE(PT_ret, offsetof(struct pt_regs, ret));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DEFINE(SZ_CALLEE_REGS, sizeof(struct callee_regs));
 | 
						DEFINE(SZ_CALLEE_REGS, sizeof(struct callee_regs));
 | 
				
			||||||
	DEFINE(SZ_PT_REGS, sizeof(struct pt_regs));
 | 
						DEFINE(SZ_PT_REGS, sizeof(struct pt_regs));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -163,6 +163,9 @@ END(EV_TLBProtV)
 | 
				
			||||||
;####### Return from Intr #######
 | 
					;####### Return from Intr #######
 | 
				
			||||||
 | 
					
 | 
				
			||||||
debug_marker_l1:
 | 
					debug_marker_l1:
 | 
				
			||||||
 | 
						bbit1.nt r0, STATUS_DE_BIT, .Lintr_ret_to_delay_slot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lisr_ret_fast_path:
 | 
				
			||||||
	; Handle special case #1: (Entry via Exception, Return via IRQ)
 | 
						; Handle special case #1: (Entry via Exception, Return via IRQ)
 | 
				
			||||||
	;
 | 
						;
 | 
				
			||||||
	; Exception in U mode, preempted in kernel, Intr taken (K mode), orig
 | 
						; Exception in U mode, preempted in kernel, Intr taken (K mode), orig
 | 
				
			||||||
| 
						 | 
					@ -186,4 +189,51 @@ debug_marker_syscall:
 | 
				
			||||||
	EXCEPTION_EPILOGUE
 | 
						EXCEPTION_EPILOGUE
 | 
				
			||||||
	rtie
 | 
						rtie
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;####### Return from Intr to insn in delay slot #######
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; Handle special case #2: (Entry via Exception in Delay Slot, Return via IRQ)
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; Intr returning to a Delay Slot (DS) insn
 | 
				
			||||||
 | 
					; (since IRQ NOT allowed in DS in ARCv2, this can only happen if orig
 | 
				
			||||||
 | 
					; entry was via Exception in DS which got preempted in kernel).
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					; IRQ RTIE won't reliably restore DE bit and/or BTA, needs handling
 | 
				
			||||||
 | 
					.Lintr_ret_to_delay_slot:
 | 
				
			||||||
 | 
					debug_marker_ds:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ld	r2, [@intr_to_DE_cnt]
 | 
				
			||||||
 | 
						add	r2, r2, 1
 | 
				
			||||||
 | 
						st	r2, [@intr_to_DE_cnt]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ld	r2, [sp, PT_ret]
 | 
				
			||||||
 | 
						ld	r3, [sp, PT_status32]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bic  	r0, r3, STATUS_U_MASK|STATUS_DE_MASK|STATUS_IE_MASK|STATUS_L_MASK
 | 
				
			||||||
 | 
						st	r0, [sp, PT_status32]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mov	r1, .Lintr_ret_to_delay_slot_2
 | 
				
			||||||
 | 
						st	r1, [sp, PT_ret]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						st	r2, [sp, 0]
 | 
				
			||||||
 | 
						st	r3, [sp, 4]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						b	.Lisr_ret_fast_path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lintr_ret_to_delay_slot_2:
 | 
				
			||||||
 | 
						sub	sp, sp, SZ_PT_REGS
 | 
				
			||||||
 | 
						st	r9, [sp, -4]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ld	r9, [sp, 0]
 | 
				
			||||||
 | 
						sr	r9, [eret]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ld	r9, [sp, 4]
 | 
				
			||||||
 | 
						sr	r9, [erstatus]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ld	r9, [sp, 8]
 | 
				
			||||||
 | 
						sr	r9, [erbta]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ld	r9, [sp, -4]
 | 
				
			||||||
 | 
						add	sp, sp, SZ_PT_REGS
 | 
				
			||||||
 | 
						rtie
 | 
				
			||||||
 | 
					
 | 
				
			||||||
END(ret_from_exception)
 | 
					END(ret_from_exception)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,6 +30,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FIX_PTR(x)  __asm__ __volatile__(";" : "+r"(x))
 | 
					#define FIX_PTR(x)  __asm__ __volatile__(";" : "+r"(x))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned int intr_to_DE_cnt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Part of U-boot ABI: see head.S */
 | 
					/* Part of U-boot ABI: see head.S */
 | 
				
			||||||
int __initdata uboot_tag;
 | 
					int __initdata uboot_tag;
 | 
				
			||||||
char __initdata *uboot_arg;
 | 
					char __initdata *uboot_arg;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue