linux/arch/mips/include/uapi/asm/ucontext.h
Paul Burton f1fe2d21f4 MIPS: Add definitions for extended context
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>
2015-09-03 12:07:58 +02:00

66 lines
2.1 KiB
C

#ifndef __MIPS_UAPI_ASM_UCONTEXT_H
#define __MIPS_UAPI_ASM_UCONTEXT_H
/**
* struct extcontext - extended context header structure
* @magic: magic value identifying the type of extended context
* @size: the size in bytes of the enclosing structure
*
* Extended context structures provide context which does not fit within struct
* sigcontext. They are placed sequentially in memory at the end of struct
* ucontext and struct sigframe, with each extended context structure beginning
* with a header defined by this struct. The type of context represented is
* indicated by the magic field. Userland may check each extended context
* structure against magic values that it recognises. The size field allows any
* unrecognised context to be skipped, allowing for future expansion. The end
* of the extended context data is indicated by the magic value
* END_EXTCONTEXT_MAGIC.
*/
struct extcontext {
unsigned int magic;
unsigned int size;
};
/**
* struct msa_extcontext - MSA extended context structure
* @ext: the extended context header, with magic == MSA_EXTCONTEXT_MAGIC
* @wr: the most significant 64 bits of each MSA vector register
* @csr: the value of the MSA control & status register
*
* If MSA context is live for a task at the time a signal is delivered to it,
* this structure will hold the MSA context of the task as it was prior to the
* signal delivery.
*/
struct msa_extcontext {
struct extcontext ext;
#define MSA_EXTCONTEXT_MAGIC 0x784d5341 /* xMSA */
unsigned long long wr[32];
unsigned int csr;
};
#define END_EXTCONTEXT_MAGIC 0x78454e44 /* xEND */
/**
* struct ucontext - user context structure
* @uc_flags:
* @uc_link:
* @uc_stack:
* @uc_mcontext: holds basic processor state
* @uc_sigmask:
* @uc_extcontext: holds extended processor state
*/
struct ucontext {
/* Historic fields matching asm-generic */
unsigned long uc_flags;
struct ucontext *uc_link;
stack_t uc_stack;
struct sigcontext uc_mcontext;
sigset_t uc_sigmask;
/* Extended context structures may follow ucontext */
unsigned long long uc_extcontext[0];
};
#endif /* __MIPS_UAPI_ASM_UCONTEXT_H */