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