126 строки
3.3 KiB
C
126 строки
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 */
|