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