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