forked from Minki/linux
f1fe2d21f4
The context introduced by MSA needs to be saved around signals. However, we can't increase the size of struct sigcontext because that will change the offset of the signal mask in struct sigframe or struct ucontext. This patch instead places the new context immediately after the struct sigframe for traditional signals, or similarly after struct ucontext for RT signals. The layout of struct sigframe & struct ucontext is identical from their sigcontext fields onwards, so the offset from the sigcontext to the extended context will always be the same regardless of the type of signal. Userland will be able to search through the extended context by using the magic values to detect which types of context are present. Any unrecognised context can be skipped over using the size field of struct extcontext. Once the magic value END_EXTCONTEXT_MAGIC is seen it is known that there are no further extended context structures to examine. This approach is somewhat similar to that taken by ARM to save VFP & other context at the end of struct ucontext. Userland can determine whether extended context is present by checking for the USED_EXTCONTEXT bit in the sc_used_math field of struct sigcontext. Whilst this could potentially change the historic semantics of sc_used_math if further extended context which does not imply FP context were to be introduced in the future, I have been unable to find any userland code making use of sc_used_math at all. Using one of the fields described as unused in struct sigcontext was considered, but the kernel does not already write to those fields so there would be no guarantee of the field being clear on older kernels. Other alternatives would be to have userland check the kernel version, or to have a HWCAP bit indicating presence of extended context. However there is a desire to have the context & information required to decode it be self contained such that, for example, debuggers could decode the saved context easily. [ralf@linux-mips.org: Fixed conflict.] Signed-off-by: Paul Burton <paul.burton@imgtec.com> Cc: linux-mips@linux-mips.org Cc: Guenter Roeck <linux@roeck-us.net> Cc: Matthew Fortune <matthew.fortune@imgtec.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com> Cc: Alex Smith <alex@alex-smith.me.uk> Cc: linux-kernel@vger.kernel.org Cc: Richard Weinberger <richard@nod.at> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Markos Chandras <markos.chandras@imgtec.com> Cc: Daniel Borkmann <dborkman@redhat.com> Cc: Maciej W. Rozycki <macro@codesourcery.com> Patchwork: https://patchwork.linux-mips.org/patch/10795/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
91 lines
2.5 KiB
C
91 lines
2.5 KiB
C
/*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
* Copyright (C) 1996, 1997, 1999 by Ralf Baechle
|
|
* Copyright (C) 1999 Silicon Graphics, Inc.
|
|
*/
|
|
#ifndef _UAPI_ASM_SIGCONTEXT_H
|
|
#define _UAPI_ASM_SIGCONTEXT_H
|
|
|
|
#include <linux/types.h>
|
|
#include <asm/sgidefs.h>
|
|
|
|
/* scalar FP context was used */
|
|
#define USED_FP (1 << 0)
|
|
|
|
/* the value of Status.FR when context was saved */
|
|
#define USED_FR1 (1 << 1)
|
|
|
|
/* FR=1, but with odd singles in bits 63:32 of preceding even double */
|
|
#define USED_HYBRID_FPRS (1 << 2)
|
|
|
|
/* extended context was used, see struct extcontext for details */
|
|
#define USED_EXTCONTEXT (1 << 3)
|
|
|
|
#if _MIPS_SIM == _MIPS_SIM_ABI32
|
|
|
|
/*
|
|
* Keep this struct definition in sync with the sigcontext fragment
|
|
* in arch/mips/kernel/asm-offsets.c
|
|
*/
|
|
struct sigcontext {
|
|
unsigned int sc_regmask; /* Unused */
|
|
unsigned int sc_status; /* Unused */
|
|
unsigned long long sc_pc;
|
|
unsigned long long sc_regs[32];
|
|
unsigned long long sc_fpregs[32];
|
|
unsigned int sc_acx; /* Was sc_ownedfp */
|
|
unsigned int sc_fpc_csr;
|
|
unsigned int sc_fpc_eir; /* Unused */
|
|
unsigned int sc_used_math;
|
|
unsigned int sc_dsp; /* dsp status, was sc_ssflags */
|
|
unsigned long long sc_mdhi;
|
|
unsigned long long sc_mdlo;
|
|
unsigned long sc_hi1; /* Was sc_cause */
|
|
unsigned long sc_lo1; /* Was sc_badvaddr */
|
|
unsigned long sc_hi2; /* Was sc_sigset[4] */
|
|
unsigned long sc_lo2;
|
|
unsigned long sc_hi3;
|
|
unsigned long sc_lo3;
|
|
};
|
|
|
|
#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
|
|
|
|
#if _MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32
|
|
|
|
#include <linux/posix_types.h>
|
|
/*
|
|
* Keep this struct definition in sync with the sigcontext fragment
|
|
* in arch/mips/kernel/asm-offsets.c
|
|
*
|
|
* Warning: this structure illdefined with sc_badvaddr being just an unsigned
|
|
* int so it was changed to unsigned long in 2.6.0-test1. This may break
|
|
* binary compatibility - no prisoners.
|
|
* DSP ASE in 2.6.12-rc4. Turn sc_mdhi and sc_mdlo into an array of four
|
|
* entries, add sc_dsp and sc_reserved for padding. No prisoners.
|
|
*/
|
|
struct sigcontext {
|
|
__u64 sc_regs[32];
|
|
__u64 sc_fpregs[32];
|
|
__u64 sc_mdhi;
|
|
__u64 sc_hi1;
|
|
__u64 sc_hi2;
|
|
__u64 sc_hi3;
|
|
__u64 sc_mdlo;
|
|
__u64 sc_lo1;
|
|
__u64 sc_lo2;
|
|
__u64 sc_lo3;
|
|
__u64 sc_pc;
|
|
__u32 sc_fpc_csr;
|
|
__u32 sc_used_math;
|
|
__u32 sc_dsp;
|
|
__u32 sc_reserved;
|
|
};
|
|
|
|
|
|
#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32 */
|
|
|
|
#endif /* _UAPI_ASM_SIGCONTEXT_H */
|