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