linux/arch/ia64/kernel/mca_drv_asm.S
<<
>>
Prefs
   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