126 lines
		
	
	
	
		
			3.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			126 lines
		
	
	
	
		
			3.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * 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) 1992 - 1997 Silicon Graphics, Inc.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#ifndef __ASM_SN_NMI_H
							 | 
						||
| 
								 | 
							
								#define __ASM_SN_NMI_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ident "$Revision: 1.5 $"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <asm/sn/addrs.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * The launch data structure resides at a fixed place in each node's memory
							 | 
						||
| 
								 | 
							
								 * and is used to communicate between the master processor and the slave
							 | 
						||
| 
								 | 
							
								 * processors.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * The master stores launch parameters in the launch structure
							 | 
						||
| 
								 | 
							
								 * corresponding to a target processor that is in a slave loop, then sends
							 | 
						||
| 
								 | 
							
								 * an interrupt to the slave processor.  The slave calls the desired
							 | 
						||
| 
								 | 
							
								 * function, followed by an optional rendezvous function, then returns to
							 | 
						||
| 
								 | 
							
								 * the slave loop.  The master does not wait for the slaves before
							 | 
						||
| 
								 | 
							
								 * returning.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * There is an array of launch structures, one per CPU on the node.  One
							 | 
						||
| 
								 | 
							
								 * interrupt level is used per CPU.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define NMI_MAGIC		0x48414d4d455201
							 | 
						||
| 
								 | 
							
								#define NMI_SIZEOF		0x40
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define NMI_OFF_MAGIC		0x00	/* Struct offsets for assembly      */
							 | 
						||
| 
								 | 
							
								#define NMI_OFF_FLAGS		0x08
							 | 
						||
| 
								 | 
							
								#define NMI_OFF_CALL		0x10
							 | 
						||
| 
								 | 
							
								#define NMI_OFF_CALLC		0x18
							 | 
						||
| 
								 | 
							
								#define NMI_OFF_CALLPARM	0x20
							 | 
						||
| 
								 | 
							
								#define NMI_OFF_GMASTER		0x28
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * The NMI routine is called only if the complement address is
							 | 
						||
| 
								 | 
							
								 * correct.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Before control is transferred to a routine, the complement address
							 | 
						||
| 
								 | 
							
								 * is zeroed (invalidated) to prevent an accidental call from a spurious
							 | 
						||
| 
								 | 
							
								 * interrupt.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef __ASSEMBLY__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct nmi_s {
							 | 
						||
| 
								 | 
							
									volatile unsigned long	 magic;		/* Magic number */
							 | 
						||
| 
								 | 
							
									volatile unsigned long	 flags;		/* Combination of flags above */
							 | 
						||
| 
								 | 
							
									volatile void *call_addr;	/* Routine for slave to call        */
							 | 
						||
| 
								 | 
							
									volatile void *call_addr_c;	/* 1's complement of address        */
							 | 
						||
| 
								 | 
							
									volatile void *call_parm;	/* Single parm passed to call	    */
							 | 
						||
| 
								 | 
							
									volatile unsigned long	 gmaster;	/* Flag true only on global master*/
							 | 
						||
| 
								 | 
							
								} nmi_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* !__ASSEMBLY__ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Following definitions are needed both in the prom & the kernel
							 | 
						||
| 
								 | 
							
								 * to identify the format of the nmi cpu register save area in the
							 | 
						||
| 
								 | 
							
								 * low memory on each node.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#ifndef __ASSEMBLY__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct reg_struct {
							 | 
						||
| 
								 | 
							
									unsigned long	gpr[32];
							 | 
						||
| 
								 | 
							
									unsigned long	sr;
							 | 
						||
| 
								 | 
							
									unsigned long	cause;
							 | 
						||
| 
								 | 
							
									unsigned long	epc;
							 | 
						||
| 
								 | 
							
									unsigned long	badva;
							 | 
						||
| 
								 | 
							
									unsigned long	error_epc;
							 | 
						||
| 
								 | 
							
									unsigned long	cache_err;
							 | 
						||
| 
								 | 
							
									unsigned long	nmi_sr;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* !__ASSEMBLY__ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* These are the assembly language offsets into the reg_struct structure */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define R0_OFF		0x0
							 | 
						||
| 
								 | 
							
								#define R1_OFF		0x8
							 | 
						||
| 
								 | 
							
								#define R2_OFF		0x10
							 | 
						||
| 
								 | 
							
								#define R3_OFF		0x18
							 | 
						||
| 
								 | 
							
								#define R4_OFF		0x20
							 | 
						||
| 
								 | 
							
								#define R5_OFF		0x28
							 | 
						||
| 
								 | 
							
								#define R6_OFF		0x30
							 | 
						||
| 
								 | 
							
								#define R7_OFF		0x38
							 | 
						||
| 
								 | 
							
								#define R8_OFF		0x40
							 | 
						||
| 
								 | 
							
								#define R9_OFF		0x48
							 | 
						||
| 
								 | 
							
								#define R10_OFF		0x50
							 | 
						||
| 
								 | 
							
								#define R11_OFF		0x58
							 | 
						||
| 
								 | 
							
								#define R12_OFF		0x60
							 | 
						||
| 
								 | 
							
								#define R13_OFF		0x68
							 | 
						||
| 
								 | 
							
								#define R14_OFF		0x70
							 | 
						||
| 
								 | 
							
								#define R15_OFF		0x78
							 | 
						||
| 
								 | 
							
								#define R16_OFF		0x80
							 | 
						||
| 
								 | 
							
								#define R17_OFF		0x88
							 | 
						||
| 
								 | 
							
								#define R18_OFF		0x90
							 | 
						||
| 
								 | 
							
								#define R19_OFF		0x98
							 | 
						||
| 
								 | 
							
								#define R20_OFF		0xa0
							 | 
						||
| 
								 | 
							
								#define R21_OFF		0xa8
							 | 
						||
| 
								 | 
							
								#define R22_OFF		0xb0
							 | 
						||
| 
								 | 
							
								#define R23_OFF		0xb8
							 | 
						||
| 
								 | 
							
								#define R24_OFF		0xc0
							 | 
						||
| 
								 | 
							
								#define R25_OFF		0xc8
							 | 
						||
| 
								 | 
							
								#define R26_OFF		0xd0
							 | 
						||
| 
								 | 
							
								#define R27_OFF		0xd8
							 | 
						||
| 
								 | 
							
								#define R28_OFF		0xe0
							 | 
						||
| 
								 | 
							
								#define R29_OFF		0xe8
							 | 
						||
| 
								 | 
							
								#define R30_OFF		0xf0
							 | 
						||
| 
								 | 
							
								#define R31_OFF		0xf8
							 | 
						||
| 
								 | 
							
								#define SR_OFF		0x100
							 | 
						||
| 
								 | 
							
								#define CAUSE_OFF	0x108
							 | 
						||
| 
								 | 
							
								#define EPC_OFF		0x110
							 | 
						||
| 
								 | 
							
								#define BADVA_OFF	0x118
							 | 
						||
| 
								 | 
							
								#define ERROR_EPC_OFF	0x120
							 | 
						||
| 
								 | 
							
								#define CACHE_ERR_OFF	0x128
							 | 
						||
| 
								 | 
							
								#define NMISR_OFF	0x130
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* __ASM_SN_NMI_H */
							 |