| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include <linux/linkage.h> | 
					
						
							|  |  |  | #include <asm/assembler.h> | 
					
						
							|  |  |  | #include "abort-macro.S" | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * Function: v5tj_early_abort | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-06-26 16:01:26 +01:00
										 |  |  |  * Params  : r2 = pt_regs | 
					
						
							|  |  |  |  *	   : r4 = aborted context pc | 
					
						
							| 
									
										
										
										
											2011-06-26 14:35:07 +01:00
										 |  |  |  *	   : r5 = aborted context psr | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-06-26 16:01:26 +01:00
										 |  |  |  * Returns : r4 - r11, r13 preserved | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Purpose : obtain information about current aborted instruction. | 
					
						
							|  |  |  |  * Note: we read user space.  This means we might cause a data | 
					
						
							|  |  |  |  * abort here if the I-TLB and D-TLB aren't seeing the same | 
					
						
							|  |  |  |  * picture.  Unfortunately, this does happen.  We live with it. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 	.align	5
 | 
					
						
							|  |  |  | ENTRY(v5tj_early_abort) | 
					
						
							|  |  |  | 	mrc	p15, 0, r1, c5, c0, 0		@ get FSR
 | 
					
						
							|  |  |  | 	mrc	p15, 0, r0, c6, c0, 0		@ get FAR
 | 
					
						
							|  |  |  | 	bic	r1, r1, #1 << 11 | 1 << 10	@ clear bits 11 and 10 of FSR
 | 
					
						
							| 
									
										
										
										
											2011-06-26 14:35:07 +01:00
										 |  |  | 	tst	r5, #PSR_J_BIT			@ Java? | 
					
						
							| 
									
										
										
										
											2011-06-26 16:01:26 +01:00
										 |  |  | 	bne	do_DataAbort | 
					
						
							| 
									
										
										
										
											2011-06-26 14:35:07 +01:00
										 |  |  | 	do_thumb_abort fsr=r1, pc=r4, psr=r5, tmp=r3 | 
					
						
							|  |  |  | 	ldreq	r3, [r4]			@ read aborted ARM instruction
 | 
					
						
							| 
									
										
										
										
											2011-06-26 14:42:02 +01:00
										 |  |  | 	do_ldrd_abort tmp=ip, insn=r3 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	tst	r3, #1 << 20			@ L = 0 -> write
 | 
					
						
							|  |  |  | 	orreq	r1, r1, #1 << 11		@ yes.
 | 
					
						
							| 
									
										
										
										
											2011-06-26 16:01:26 +01:00
										 |  |  | 	b	do_DataAbort |