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