diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h')
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h index 9eec807a23..f505c2560a 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h @@ -16,5 +16,41 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#define SIGCONTEXT struct sigcontext * -#define GET_PC(__ctx) ((void *) ((__ctx)->si_regs.pc)) +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +/* The sparc32 kernel signal frame for SA_SIGINFO is defined as: + + struct rt_signal_frame32 + { + struct sparc_stackf32 ss; + compat_siginfo_t info; + struct pt_regs32 regs; <- void *ctx + compat_sigset_t mask; + u32 fpu_save; + unsigned int insns[2]; + compat_stack_t stack; + unsigned int extra_size; + siginfo_extra_v8plus_t v8plus; + u32 rwin_save; + } __attribute__((aligned(8))); + + Unlike other architectures, sparc32 passes pt_regs32 REGS pointer as + the third argument to a sa_sigaction handler with SA_SIGINFO enabled. */ + +struct pt_regs32 +{ + unsigned int psr; + unsigned int pc; + unsigned int npc; + unsigned int y; + unsigned int u_regs[16]; +}; + +static inline uintptr_t +sigcontext_get_pc (const struct pt_regs32 *ctx) +{ + return ctx->pc; +} + +#endif |