1bd703d88SSam Ravnborg #ifndef __SPARC_SIGCONTEXT_H
2bd703d88SSam Ravnborg #define __SPARC_SIGCONTEXT_H
3bd703d88SSam Ravnborg 
4bd703d88SSam Ravnborg #ifdef __KERNEL__
5bd703d88SSam Ravnborg #include <asm/ptrace.h>
6bd703d88SSam Ravnborg 
7bd703d88SSam Ravnborg #ifndef __ASSEMBLY__
8bd703d88SSam Ravnborg 
9bd703d88SSam Ravnborg #define __SUNOS_MAXWIN   31
10bd703d88SSam Ravnborg 
11bd703d88SSam Ravnborg /* This is what SunOS does, so shall I unless we use new 32bit signals or rt signals. */
12bd703d88SSam Ravnborg struct sigcontext32 {
13bd703d88SSam Ravnborg 	int sigc_onstack;      /* state to restore */
14bd703d88SSam Ravnborg 	int sigc_mask;         /* sigmask to restore */
15bd703d88SSam Ravnborg 	int sigc_sp;           /* stack pointer */
16bd703d88SSam Ravnborg 	int sigc_pc;           /* program counter */
17bd703d88SSam Ravnborg 	int sigc_npc;          /* next program counter */
18bd703d88SSam Ravnborg 	int sigc_psr;          /* for condition codes etc */
19bd703d88SSam Ravnborg 	int sigc_g1;           /* User uses these two registers */
20bd703d88SSam Ravnborg 	int sigc_o0;           /* within the trampoline code. */
21bd703d88SSam Ravnborg 
22bd703d88SSam Ravnborg 	/* Now comes information regarding the users window set
23bd703d88SSam Ravnborg 	 * at the time of the signal.
24bd703d88SSam Ravnborg 	 */
25bd703d88SSam Ravnborg 	int sigc_oswins;       /* outstanding windows */
26bd703d88SSam Ravnborg 
27bd703d88SSam Ravnborg 	/* stack ptrs for each regwin buf */
28bd703d88SSam Ravnborg 	unsigned sigc_spbuf[__SUNOS_MAXWIN];
29bd703d88SSam Ravnborg 
30bd703d88SSam Ravnborg 	/* Windows to restore after signal */
31bd703d88SSam Ravnborg 	struct reg_window32 sigc_wbuf[__SUNOS_MAXWIN];
32bd703d88SSam Ravnborg };
33bd703d88SSam Ravnborg 
34bd703d88SSam Ravnborg 
35bd703d88SSam Ravnborg /* This is what we use for 32bit new non-rt signals. */
36bd703d88SSam Ravnborg 
37bd703d88SSam Ravnborg typedef struct {
38bd703d88SSam Ravnborg 	struct {
39bd703d88SSam Ravnborg 		unsigned int psr;
40bd703d88SSam Ravnborg 		unsigned int pc;
41bd703d88SSam Ravnborg 		unsigned int npc;
42bd703d88SSam Ravnborg 		unsigned int y;
43bd703d88SSam Ravnborg 		unsigned int u_regs[16]; /* globals and ins */
44bd703d88SSam Ravnborg 	}			si_regs;
45bd703d88SSam Ravnborg 	int			si_mask;
46bd703d88SSam Ravnborg } __siginfo32_t;
47bd703d88SSam Ravnborg 
485598473aSDavid S. Miller #define __SIGC_MAXWIN	7
495598473aSDavid S. Miller 
505598473aSDavid S. Miller typedef struct {
515598473aSDavid S. Miller 	unsigned long locals[8];
525598473aSDavid S. Miller 	unsigned long ins[8];
535598473aSDavid S. Miller } __siginfo_reg_window;
545598473aSDavid S. Miller 
555598473aSDavid S. Miller typedef struct {
565598473aSDavid S. Miller 	int			wsaved;
575598473aSDavid S. Miller 	__siginfo_reg_window	reg_window[__SIGC_MAXWIN];
585598473aSDavid S. Miller 	unsigned long		rwbuf_stkptrs[__SIGC_MAXWIN];
595598473aSDavid S. Miller } __siginfo_rwin_t;
605598473aSDavid S. Miller 
61bd703d88SSam Ravnborg #ifdef CONFIG_SPARC64
62bd703d88SSam Ravnborg typedef struct {
63bd703d88SSam Ravnborg 	unsigned   int si_float_regs [64];
64bd703d88SSam Ravnborg 	unsigned   long si_fsr;
65bd703d88SSam Ravnborg 	unsigned   long si_gsr;
66bd703d88SSam Ravnborg 	unsigned   long si_fprs;
67bd703d88SSam Ravnborg } __siginfo_fpu_t;
68bd703d88SSam Ravnborg 
69bd703d88SSam Ravnborg /* This is what SunOS doesn't, so we have to write this alone
70bd703d88SSam Ravnborg    and do it properly. */
71bd703d88SSam Ravnborg struct sigcontext {
72bd703d88SSam Ravnborg 	/* The size of this array has to match SI_MAX_SIZE from siginfo.h */
73bd703d88SSam Ravnborg 	char			sigc_info[128];
74bd703d88SSam Ravnborg 	struct {
75bd703d88SSam Ravnborg 		unsigned long	u_regs[16]; /* globals and ins */
76bd703d88SSam Ravnborg 		unsigned long	tstate;
77bd703d88SSam Ravnborg 		unsigned long	tpc;
78bd703d88SSam Ravnborg 		unsigned long	tnpc;
79bd703d88SSam Ravnborg 		unsigned int	y;
80bd703d88SSam Ravnborg 		unsigned int	fprs;
81bd703d88SSam Ravnborg 	}			sigc_regs;
82bd703d88SSam Ravnborg 	__siginfo_fpu_t *	sigc_fpu_save;
83bd703d88SSam Ravnborg 	struct {
84bd703d88SSam Ravnborg 		void	*	ss_sp;
85bd703d88SSam Ravnborg 		int		ss_flags;
86bd703d88SSam Ravnborg 		unsigned long	ss_size;
87bd703d88SSam Ravnborg 	}			sigc_stack;
88bd703d88SSam Ravnborg 	unsigned long		sigc_mask;
895598473aSDavid S. Miller 	__siginfo_rwin_t *	sigc_rwin_save;
90bd703d88SSam Ravnborg };
91bd703d88SSam Ravnborg 
92a439fe51SSam Ravnborg #else
93bd703d88SSam Ravnborg 
94bd703d88SSam Ravnborg typedef struct {
95bd703d88SSam Ravnborg 	unsigned long si_float_regs [32];
96bd703d88SSam Ravnborg 	unsigned long si_fsr;
97bd703d88SSam Ravnborg 	unsigned long si_fpqdepth;
98bd703d88SSam Ravnborg 	struct {
99bd703d88SSam Ravnborg 		unsigned long *insn_addr;
100bd703d88SSam Ravnborg 		unsigned long insn;
101bd703d88SSam Ravnborg 	} si_fpqueue [16];
102bd703d88SSam Ravnborg } __siginfo_fpu_t;
103bd703d88SSam Ravnborg #endif /* (CONFIG_SPARC64) */
104bd703d88SSam Ravnborg 
105bd703d88SSam Ravnborg 
106bd703d88SSam Ravnborg #endif /* !(__ASSEMBLY__) */
107bd703d88SSam Ravnborg 
108bd703d88SSam Ravnborg #endif /* (__KERNEL__) */
109bd703d88SSam Ravnborg 
110bd703d88SSam Ravnborg #endif /* !(__SPARC_SIGCONTEXT_H) */
111