| /* | 
 |  * This file is subject to the terms and conditions of the GNU General Public | 
 |  * License.  See the file "COPYING" in the main directory of this archive | 
 |  * for more details. | 
 |  * | 
 |  * Copyright (c) 2004-2008 Silicon Graphics, Inc.  All Rights Reserved. | 
 |  */ | 
 |  | 
 | /* | 
 |  * The xp_nofault_PIOR function takes a pointer to a remote PIO register | 
 |  * and attempts to load and consume a value from it.  This function | 
 |  * will be registered as a nofault code block.  In the event that the | 
 |  * PIO read fails, the MCA handler will force the error to look | 
 |  * corrected and vector to the xp_error_PIOR which will return an error. | 
 |  * | 
 |  * The definition of "consumption" and the time it takes for an MCA | 
 |  * to surface is processor implementation specific.  This code | 
 |  * is sufficient on Itanium through the Montvale processor family. | 
 |  * It may need to be adjusted for future processor implementations. | 
 |  * | 
 |  *	extern int xp_nofault_PIOR(void *remote_register); | 
 |  */ | 
 |  | 
 | 	.global xp_nofault_PIOR | 
 | xp_nofault_PIOR: | 
 | 	mov	r8=r0			// Stage a success return value | 
 | 	ld8.acq	r9=[r32];;		// PIO Read the specified register | 
 | 	adds	r9=1,r9;;		// Add to force consumption | 
 | 	srlz.i;;			// Allow time for MCA to surface | 
 | 	br.ret.sptk.many b0;;		// Return success | 
 |  | 
 | 	.global xp_error_PIOR | 
 | xp_error_PIOR: | 
 | 	mov	r8=1			// Return value of 1 | 
 | 	br.ret.sptk.many b0;;		// Return failure |