forked from Minki/linux
b1b901c202
Jack Steiner uncovered some opportunities for improvement in the MCA recovery code. 1) Set bsp to save registers on the kernel stack. 2) Disable interrupts while in the MCA recovery code. 3) Change the way the user process is killed, to avoid a panic in schedule. Testing shows that these changes make the recovery code much more reliable with the 2.6.12 kernel. Signed-off-by: Russ Anderson <rja@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
58 lines
1.1 KiB
ArmAsm
58 lines
1.1 KiB
ArmAsm
/*
|
|
* File: mca_drv_asm.S
|
|
* Purpose: Assembly portion of Generic MCA handling
|
|
*
|
|
* 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 //
|
|
;;
|
|
alloc r16=ar.pfs,0,2,1,0 // make a new frame
|
|
;;
|
|
mov ar.rsc=0
|
|
;;
|
|
mov r13=IA64_KR(CURRENT) // current task pointer
|
|
;;
|
|
mov r2=r13
|
|
;;
|
|
addl r22=IA64_RBS_OFFSET,r2
|
|
;;
|
|
mov ar.bspstore=r22
|
|
;;
|
|
addl sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2
|
|
;;
|
|
adds r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
|
|
;;
|
|
st1 [r2]=r0 // clear current->thread.on_ustack flag
|
|
mov loc0=r16
|
|
movl loc1=mca_handler_bh // recovery C function
|
|
;;
|
|
mov out0=r8 // poisoned address
|
|
mov b6=loc1
|
|
;;
|
|
mov loc1=rp
|
|
;;
|
|
ssm psr.i
|
|
;;
|
|
br.call.sptk.many rp=b6 // does not return ...
|
|
;;
|
|
mov ar.pfs=loc0
|
|
mov rp=loc1
|
|
;;
|
|
mov r8=r0
|
|
br.ret.sptk.many rp
|
|
;;
|
|
END(mca_handler_bhhook)
|