root/arch/ia64/kernel/mca_drv_asm.S

/* [<][>][^][v][top][bottom][index][help] */
   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 
  15 GLOBAL_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
  56 END(mca_handler_bhhook)

/* [<][>][^][v][top][bottom][index][help] */