|  | /* | 
|  | * File:        mca_drv_asm.S | 
|  | * Purpose:     Assembly portion of Generic MCA handling | 
|  | * | 
|  | * Copyright (C) 2004 FUJITSU LIMITED | 
|  | * Copyright (C) Hidetoshi Seto (seto.hidetoshi@jp.fujitsu.com) | 
|  | */ | 
|  | #include <linux/config.h> | 
|  | #include <linux/threads.h> | 
|  |  | 
|  | #include <asm/asmmacro.h> | 
|  | #include <asm/processor.h> | 
|  | #include <asm/ptrace.h> | 
|  |  | 
|  | GLOBAL_ENTRY(mca_handler_bhhook) | 
|  | invala						// clear RSE ? | 
|  | ;;						// | 
|  | cover						// | 
|  | ;;						// | 
|  | clrrrb						// | 
|  | ;; | 
|  | alloc		r16=ar.pfs,0,2,1,0		// make a new frame | 
|  | ;; | 
|  | mov		ar.rsc=0 | 
|  | ;; | 
|  | mov		r13=IA64_KR(CURRENT)		// current task pointer | 
|  | ;; | 
|  | mov		r2=r13 | 
|  | ;; | 
|  | addl		r22=IA64_RBS_OFFSET,r2 | 
|  | ;; | 
|  | mov		ar.bspstore=r22 | 
|  | ;; | 
|  | addl		sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2 | 
|  | ;; | 
|  | adds		r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13 | 
|  | ;; | 
|  | st1		[r2]=r0				// clear current->thread.on_ustack flag | 
|  | mov		loc0=r16 | 
|  | movl		loc1=mca_handler_bh		// recovery C function | 
|  | ;; | 
|  | mov		out0=r8				// poisoned address | 
|  | mov		b6=loc1 | 
|  | ;; | 
|  | mov		loc1=rp | 
|  | ;; | 
|  | ssm		psr.i | 
|  | ;; | 
|  | br.call.sptk.many    rp=b6			// does not return ... | 
|  | ;; | 
|  | mov		ar.pfs=loc0 | 
|  | mov 		rp=loc1 | 
|  | ;; | 
|  | mov		r8=r0 | 
|  | br.ret.sptk.many rp | 
|  | ;; | 
|  | END(mca_handler_bhhook) |