hc
2024-05-10 61598093bbdd283a7edc367d900f223070ead8d2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
 * 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.
 *
 * Derived from IRIX <sys/SN/nmi.h>, Revision 1.5.
 *
 * Copyright (C) 1992 - 1997 Silicon Graphics, Inc.
 */
#ifndef __ASM_SN_NMI_H
#define __ASM_SN_NMI_H
 
#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 */