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. */
13struct 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
38typedef 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
51typedef struct {
52	unsigned long locals[8];
53	unsigned long ins[8];
54} __siginfo_reg_window;
55
56typedef 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
63typedef 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. */
72struct 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
95typedef 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