Merge branch 'master' of /home/sam/kernel/linux-2.6/
[pandora-kernel.git] / arch / ia64 / kernel / mca_drv_asm.S
index bcfa05a..f2d4900 100644 (file)
@@ -5,41 +5,47 @@
  * 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                                          //
+       invala                          // clear RSE ?
+       cover
+       ;;
+       clrrrb
        ;;                                              
-       alloc           r16=ar.pfs,0,2,1,0              // make a new frame
+       alloc   r16=ar.pfs,0,2,3,0      // make a new frame
+       mov     ar.rsc=0
+       mov     r13=IA64_KR(CURRENT)    // current task pointer
        ;;
-       mov             r13=IA64_KR(CURRENT)            // current task pointer
+       mov     r2=r13
        ;;
-       adds            r12=IA64_TASK_THREAD_KSP_OFFSET,r13
+       addl    r22=IA64_RBS_OFFSET,r2
        ;;
-       ld8             r12=[r12]                       // stack pointer
+       mov     ar.bspstore=r22
+       addl    sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2
        ;;
-       mov             loc0=r16
-       movl            loc1=mca_handler_bh             // recovery C function
+       adds    r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
        ;;
-       mov             out0=r8                         // poisoned address
-       mov             b6=loc1
+       st1     [r2]=r0         // clear current->thread.on_ustack flag
+       mov     loc0=r16
+       movl    loc1=mca_handler_bh     // recovery C function
        ;;
-       mov             loc1=rp
+       mov     out0=r8                 // poisoned address
+       mov     out1=r9                 // iip
+       mov     out2=r10                // psr
+       mov     b6=loc1
        ;;
-       br.call.sptk.many    rp=b6                      // not return ...
+       mov     loc1=rp
+       ssm     psr.i | psr.ic
+       br.call.sptk.many rp=b6         // does not return ...
        ;;
-       mov             ar.pfs=loc0
-       mov             rp=loc1
+       mov     ar.pfs=loc0
+       mov     rp=loc1
        ;;
-       mov             r8=r0
+       mov     r8=r0
        br.ret.sptk.many rp
-       ;;
 END(mca_handler_bhhook)