|  | /* | 
|  | * 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 |