xref: /openbmc/linux/arch/ia64/kernel/mca_drv_asm.S (revision ca55b2fe)
1/*
2 * File:        mca_drv_asm.S
3 * Purpose:     Assembly portion of Generic MCA handling
4 *
5 * Copyright (C) 2004 FUJITSU LIMITED
6 * Copyright (C) 2004 Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
7 */
8#include <linux/threads.h>
9
10#include <asm/asmmacro.h>
11#include <asm/processor.h>
12#include <asm/ptrace.h>
13
14GLOBAL_ENTRY(mca_handler_bhhook)
15	invala				// clear RSE ?
16	cover
17	;;
18	clrrrb
19	;;
20	alloc	r16=ar.pfs,0,2,3,0	// make a new frame
21	mov	ar.rsc=0
22	mov	r13=IA64_KR(CURRENT)	// current task pointer
23	;;
24	mov	r2=r13
25	;;
26	addl	r22=IA64_RBS_OFFSET,r2
27	;;
28	mov	ar.bspstore=r22
29	addl	sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2
30	;;
31	adds	r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
32	;;
33	st1	[r2]=r0		// clear current->thread.on_ustack flag
34	mov	loc0=r16
35	movl	loc1=mca_handler_bh	// recovery C function
36	;;
37	mov	out0=r8			// poisoned address
38	mov	out1=r9			// iip
39	mov	out2=r10		// psr
40	mov	b6=loc1
41	;;
42	mov	loc1=rp
43	ssm	psr.ic
44	;;
45	srlz.i
46	;;
47	ssm	psr.i
48	br.call.sptk.many rp=b6		// does not return ...
49	;;
50	mov	ar.pfs=loc0
51	mov 	rp=loc1
52	;;
53	mov	r8=r0
54	br.ret.sptk.many rp
55END(mca_handler_bhhook)
56