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