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