1/*
2 * This header was generated from the Linux kernel headers by update_headers.py,
3 * to provide necessary information from kernel to userspace, such as constants,
4 * structures, and macros, and thus, contains no copyrightable information.
5 */
6#ifndef __ASM_SIGCONTEXT_H
7#define __ASM_SIGCONTEXT_H
8#ifndef __ASSEMBLY__
9#include <linux/types.h>
10struct sigcontext {
11	__u64 fault_address;
12
13	__u64 regs[31];
14	__u64 sp;
15	__u64 pc;
16	__u64 pstate;
17
18	__u8 __reserved[4096] __attribute__((__aligned__(16)));
19};
20struct _aarch64_ctx {
21	__u32 magic;
22	__u32 size;
23};
24#define FPSIMD_MAGIC	0x46508001
25struct fpsimd_context {
26	struct _aarch64_ctx head;
27	__u32 fpsr;
28	__u32 fpcr;
29	__uint128_t vregs[32];
30};
31#define ESR_MAGIC	0x45535201
32struct esr_context {
33	struct _aarch64_ctx head;
34	__u64 esr;
35};
36#define EXTRA_MAGIC	0x45585401
37struct extra_context {
38	struct _aarch64_ctx head;
39	__u64 datap;
40	__u32 size;
41	__u32 __reserved[3];
42};
43#define SVE_MAGIC	0x53564501
44struct sve_context {
45	struct _aarch64_ctx head;
46	__u16 vl;
47	__u16 __reserved[3];
48};
49#endif
50#define SVE_VQ_BYTES		16
51#define SVE_VQ_MIN		1
52#define SVE_VQ_MAX		512
53#define SVE_VL_MIN		(SVE_VQ_MIN * SVE_VQ_BYTES)
54#define SVE_VL_MAX		(SVE_VQ_MAX * SVE_VQ_BYTES)
55#define SVE_NUM_ZREGS		32
56#define SVE_NUM_PREGS		16
57#define sve_vl_valid(vl) \
58	((vl) % SVE_VQ_BYTES == 0 && (vl) >= SVE_VL_MIN && (vl) <= SVE_VL_MAX)
59#define sve_vq_from_vl(vl)	((vl) / SVE_VQ_BYTES)
60#define sve_vl_from_vq(vq)	((vq) * SVE_VQ_BYTES)
61#define SVE_SIG_ZREG_SIZE(vq)	((__u32)(vq) * SVE_VQ_BYTES)
62#define SVE_SIG_PREG_SIZE(vq)	((__u32)(vq) * (SVE_VQ_BYTES / 8))
63#define SVE_SIG_FFR_SIZE(vq)	SVE_SIG_PREG_SIZE(vq)
64#define SVE_SIG_REGS_OFFSET					\
65	((sizeof(struct sve_context) + (SVE_VQ_BYTES - 1))	\
66		/ SVE_VQ_BYTES * SVE_VQ_BYTES)
67#define SVE_SIG_ZREGS_OFFSET	SVE_SIG_REGS_OFFSET
68#define SVE_SIG_ZREG_OFFSET(vq, n) \
69	(SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREG_SIZE(vq) * (n))
70#define SVE_SIG_ZREGS_SIZE(vq) \
71	(SVE_SIG_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_SIG_ZREGS_OFFSET)
72#define SVE_SIG_PREGS_OFFSET(vq) \
73	(SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREGS_SIZE(vq))
74#define SVE_SIG_PREG_OFFSET(vq, n) \
75	(SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREG_SIZE(vq) * (n))
76#define SVE_SIG_PREGS_SIZE(vq) \
77	(SVE_SIG_PREG_OFFSET(vq, SVE_NUM_PREGS) - SVE_SIG_PREGS_OFFSET(vq))
78#define SVE_SIG_FFR_OFFSET(vq) \
79	(SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREGS_SIZE(vq))
80#define SVE_SIG_REGS_SIZE(vq) \
81	(SVE_SIG_FFR_OFFSET(vq) + SVE_SIG_FFR_SIZE(vq) - SVE_SIG_REGS_OFFSET)
82#define SVE_SIG_CONTEXT_SIZE(vq) (SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq))
83#endif
84