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