1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 1992 - 1997 Silicon Graphics, Inc. 7 */ 8 #ifndef __ASM_SN_NMI_H 9 #define __ASM_SN_NMI_H 10 11 #ident "$Revision: 1.5 $" 12 13 #include <asm/sn/addrs.h> 14 15 /* 16 * The launch data structure resides at a fixed place in each node's memory 17 * and is used to communicate between the master processor and the slave 18 * processors. 19 * 20 * The master stores launch parameters in the launch structure 21 * corresponding to a target processor that is in a slave loop, then sends 22 * an interrupt to the slave processor. The slave calls the desired 23 * function, followed by an optional rendezvous function, then returns to 24 * the slave loop. The master does not wait for the slaves before 25 * returning. 26 * 27 * There is an array of launch structures, one per CPU on the node. One 28 * interrupt level is used per CPU. 29 */ 30 31 #define NMI_MAGIC 0x48414d4d455201 32 #define NMI_SIZEOF 0x40 33 34 #define NMI_OFF_MAGIC 0x00 /* Struct offsets for assembly */ 35 #define NMI_OFF_FLAGS 0x08 36 #define NMI_OFF_CALL 0x10 37 #define NMI_OFF_CALLC 0x18 38 #define NMI_OFF_CALLPARM 0x20 39 #define NMI_OFF_GMASTER 0x28 40 41 /* 42 * The NMI routine is called only if the complement address is 43 * correct. 44 * 45 * Before control is transferred to a routine, the complement address 46 * is zeroed (invalidated) to prevent an accidental call from a spurious 47 * interrupt. 48 * 49 */ 50 51 #ifndef __ASSEMBLY__ 52 53 typedef struct nmi_s { 54 volatile unsigned long magic; /* Magic number */ 55 volatile unsigned long flags; /* Combination of flags above */ 56 volatile void *call_addr; /* Routine for slave to call */ 57 volatile void *call_addr_c; /* 1's complement of address */ 58 volatile void *call_parm; /* Single parm passed to call */ 59 volatile unsigned long gmaster; /* Flag true only on global master*/ 60 } nmi_t; 61 62 #endif /* !__ASSEMBLY__ */ 63 64 /* Following definitions are needed both in the prom & the kernel 65 * to identify the format of the nmi cpu register save area in the 66 * low memory on each node. 67 */ 68 #ifndef __ASSEMBLY__ 69 70 struct reg_struct { 71 unsigned long gpr[32]; 72 unsigned long sr; 73 unsigned long cause; 74 unsigned long epc; 75 unsigned long badva; 76 unsigned long error_epc; 77 unsigned long cache_err; 78 unsigned long nmi_sr; 79 }; 80 81 #endif /* !__ASSEMBLY__ */ 82 83 /* These are the assembly language offsets into the reg_struct structure */ 84 85 #define R0_OFF 0x0 86 #define R1_OFF 0x8 87 #define R2_OFF 0x10 88 #define R3_OFF 0x18 89 #define R4_OFF 0x20 90 #define R5_OFF 0x28 91 #define R6_OFF 0x30 92 #define R7_OFF 0x38 93 #define R8_OFF 0x40 94 #define R9_OFF 0x48 95 #define R10_OFF 0x50 96 #define R11_OFF 0x58 97 #define R12_OFF 0x60 98 #define R13_OFF 0x68 99 #define R14_OFF 0x70 100 #define R15_OFF 0x78 101 #define R16_OFF 0x80 102 #define R17_OFF 0x88 103 #define R18_OFF 0x90 104 #define R19_OFF 0x98 105 #define R20_OFF 0xa0 106 #define R21_OFF 0xa8 107 #define R22_OFF 0xb0 108 #define R23_OFF 0xb8 109 #define R24_OFF 0xc0 110 #define R25_OFF 0xc8 111 #define R26_OFF 0xd0 112 #define R27_OFF 0xd8 113 #define R28_OFF 0xe0 114 #define R29_OFF 0xe8 115 #define R30_OFF 0xf0 116 #define R31_OFF 0xf8 117 #define SR_OFF 0x100 118 #define CAUSE_OFF 0x108 119 #define EPC_OFF 0x110 120 #define BADVA_OFF 0x118 121 #define ERROR_EPC_OFF 0x120 122 #define CACHE_ERR_OFF 0x128 123 #define NMISR_OFF 0x130 124 125 #endif /* __ASM_SN_NMI_H */ 126