| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* | 
					
						
							|  |  |  |  * File:        mca_drv_asm.S | 
					
						
							|  |  |  |  * Purpose:     Assembly portion of Generic MCA handling | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2004 FUJITSU LIMITED | 
					
						
							| 
									
										
										
										
											2008-01-07 10:11:57 +09:00
										 |  |  |  * Copyright (C) 2004 Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  */ | 
					
						
							|  |  |  | #include <linux/threads.h> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/asmmacro.h> | 
					
						
							|  |  |  | #include <asm/processor.h> | 
					
						
							| 
									
										
										
										
											2005-04-06 00:07:00 -07:00
										 |  |  | #include <asm/ptrace.h> | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | GLOBAL_ENTRY(mca_handler_bhhook) | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	invala				// clear RSE ? | 
					
						
							|  |  |  | 	cover | 
					
						
							|  |  |  | 	;;
 | 
					
						
							|  |  |  | 	clrrrb | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	;;						
 | 
					
						
							| 
									
										
										
										
											2006-03-24 09:49:52 -08:00
										 |  |  | 	alloc	r16=ar.pfs,0,2,3,0	// make a new frame | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	mov	ar.rsc=0 | 
					
						
							|  |  |  | 	mov	r13=IA64_KR(CURRENT)	// current task pointer | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	;;
 | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	mov	r2=r13 | 
					
						
							| 
									
										
										
										
											2005-04-06 00:07:00 -07:00
										 |  |  | 	;;
 | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	addl	r22=IA64_RBS_OFFSET,r2 | 
					
						
							| 
									
										
										
										
											2005-04-06 00:07:00 -07:00
										 |  |  | 	;;
 | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	mov	ar.bspstore=r22 | 
					
						
							|  |  |  | 	addl	sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	;;
 | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	adds	r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13 | 
					
						
							| 
									
										
										
										
											2005-04-06 00:07:00 -07:00
										 |  |  | 	;;
 | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	st1	[r2]=r0		// clear current->thread.on_ustack flag | 
					
						
							|  |  |  | 	mov	loc0=r16 | 
					
						
							|  |  |  | 	movl	loc1=mca_handler_bh	// recovery C function | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	;;
 | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	mov	out0=r8			// poisoned address | 
					
						
							| 
									
										
										
										
											2006-03-24 09:49:52 -08:00
										 |  |  | 	mov	out1=r9			// iip | 
					
						
							|  |  |  | 	mov	out2=r10		// psr | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	mov	b6=loc1 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	;;
 | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	mov	loc1=rp | 
					
						
							| 
									
										
										
										
											2007-06-28 16:05:34 -07:00
										 |  |  | 	ssm	psr.ic | 
					
						
							|  |  |  | 	;;
 | 
					
						
							|  |  |  | 	srlz.i | 
					
						
							|  |  |  | 	;;
 | 
					
						
							|  |  |  | 	ssm	psr.i | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	br.call.sptk.many rp=b6		// does not return ... | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	;;
 | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	mov	ar.pfs=loc0 | 
					
						
							|  |  |  | 	mov 	rp=loc1 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	;;
 | 
					
						
							| 
									
										
										
										
											2005-09-16 13:44:56 +09:00
										 |  |  | 	mov	r8=r0 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	br.ret.sptk.many rp | 
					
						
							|  |  |  | END(mca_handler_bhhook) |