Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1b901c2 authored by Russ Anderson's avatar Russ Anderson Committed by Tony Luck
Browse files

[IA64] MCA recovery improvements



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: default avatarRuss Anderson <rja@sgi.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 446b8831
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -132,8 +132,7 @@ mca_handler_bh(unsigned long paddr)
	spin_unlock(&mca_bh_lock);

	/* This process is about to be killed itself */
	force_sig(SIGKILL, current);
	schedule();
	do_exit(SIGKILL);
}

/**
@@ -439,6 +438,7 @@ recover_from_read_error(slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_chec
			psr2 = (struct ia64_psr *)&pmsa->pmsa_ipsr;
			psr2->cpl = 0;
			psr2->ri  = 0;
			psr2->i  = 0;

			return 1;
		}
+15 −3
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@

#include <asm/asmmacro.h>
#include <asm/processor.h>
#include <asm/ptrace.h>

GLOBAL_ENTRY(mca_handler_bhhook)
	invala						// clear RSE ?
@@ -20,12 +21,21 @@ GLOBAL_ENTRY(mca_handler_bhhook)
	;;						
	alloc		r16=ar.pfs,0,2,1,0		// make a new frame
	;;
	mov		ar.rsc=0
	;;
	mov		r13=IA64_KR(CURRENT)		// current task pointer
	;;
	adds		r12=IA64_TASK_THREAD_KSP_OFFSET,r13
	mov		r2=r13
	;;
	addl		r22=IA64_RBS_OFFSET,r2
	;;
	mov		ar.bspstore=r22
	;;
	ld8		r12=[r12]			// stack pointer
	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
	;;
@@ -34,7 +44,9 @@ GLOBAL_ENTRY(mca_handler_bhhook)
	;;
	mov		loc1=rp
	;;
	br.call.sptk.many    rp=b6			// not return ...
	ssm		psr.i
	;;
	br.call.sptk.many    rp=b6			// does not return ...
	;;
	mov		ar.pfs=loc0
	mov 		rp=loc1