Merge branch 'master' of /usr/src/linux-2.6
[linux-2.6] / arch / ia64 / kernel / mca_drv_asm.S
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) Hidetoshi Seto (seto.hidetoshi@jp.fujitsu.com)
7  */
8 #include <linux/config.h>
9 #include <linux/threads.h>
10
11 #include <asm/asmmacro.h>
12 #include <asm/processor.h>
13 #include <asm/ptrace.h>
14
15 GLOBAL_ENTRY(mca_handler_bhhook)
16         invala                                          // clear RSE ?
17         ;;                                              //
18         cover                                           // 
19         ;;                                              //
20         clrrrb                                          //
21         ;;                                              
22         alloc           r16=ar.pfs,0,2,1,0              // make a new frame
23         ;;
24         mov             ar.rsc=0
25         ;;
26         mov             r13=IA64_KR(CURRENT)            // current task pointer
27         ;;
28         mov             r2=r13
29         ;;
30         addl            r22=IA64_RBS_OFFSET,r2
31         ;;
32         mov             ar.bspstore=r22
33         ;;
34         addl            sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2
35         ;;
36         adds            r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
37         ;;
38         st1             [r2]=r0                         // clear current->thread.on_ustack flag
39         mov             loc0=r16
40         movl            loc1=mca_handler_bh             // recovery C function
41         ;;
42         mov             out0=r8                         // poisoned address
43         mov             b6=loc1
44         ;;
45         mov             loc1=rp
46         ;;
47         ssm             psr.i
48         ;;
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
56         ;;
57 END(mca_handler_bhhook)