blob: 440e22c348e94350f9808a878b19f14ba5a09908 [file] [log] [blame]
Greg Kroah-Hartmane2be04c2017-11-01 15:09:13 +01001/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
David Howells4262a722012-10-11 11:05:13 +01002/*
3 * Copyright (C) 2012 ARM Ltd.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17#ifndef _UAPI__ASM_SIGCONTEXT_H
18#define _UAPI__ASM_SIGCONTEXT_H
19
Ameya Thakur3a658e72014-12-21 12:53:22 -080020#ifdef CONFIG_64BIT
Dave Martind0b8cd32017-10-31 15:51:03 +000021#ifndef __ASSEMBLY__
22
David Howells4262a722012-10-11 11:05:13 +010023#include <linux/types.h>
24
25/*
26 * Signal context structure - contains all info to do with the state
27 * before the signal handler was invoked.
28 */
29struct sigcontext {
30 __u64 fault_address;
31 /* AArch64 registers */
32 __u64 regs[31];
33 __u64 sp;
34 __u64 pc;
35 __u64 pstate;
36 /* 4K reserved for FP/SIMD state and future expansion */
37 __u8 __reserved[4096] __attribute__((__aligned__(16)));
38};
39
40/*
Dave Martinbb4322f2017-06-15 15:03:41 +010041 * Allocation of __reserved[]:
42 * (Note: records do not necessarily occur in the order shown here.)
43 *
44 * size description
45 *
46 * 0x210 fpsimd_context
47 * 0x10 esr_context
Dave Martind0b8cd32017-10-31 15:51:03 +000048 * 0x8a0 sve_context (vl <= 64) (optional)
Dave Martin33f08262017-06-20 18:23:39 +010049 * 0x20 extra_context (optional)
Dave Martinbb4322f2017-06-15 15:03:41 +010050 * 0x10 terminator (null _aarch64_ctx)
51 *
Dave Martind0b8cd32017-10-31 15:51:03 +000052 * 0x510 (reserved for future allocation)
Dave Martinbb4322f2017-06-15 15:03:41 +010053 *
54 * New records that can exceed this space need to be opt-in for userspace, so
55 * that an expanded signal frame is not generated unexpectedly. The mechanism
56 * for opting in will depend on the extension that generates each new record.
57 * The above table documents the maximum set and sizes of records than can be
58 * generated when userspace does not opt in for any such extension.
59 */
60
61/*
David Howells4262a722012-10-11 11:05:13 +010062 * Header to be used at the beginning of structures extending the user
63 * context. Such structures must be placed after the rt_sigframe on the stack
64 * and be 16-byte aligned. The last structure must be a dummy one with the
65 * magic and size set to 0.
66 */
67struct _aarch64_ctx {
68 __u32 magic;
69 __u32 size;
70};
71
72#define FPSIMD_MAGIC 0x46508001
73
74struct fpsimd_context {
75 struct _aarch64_ctx head;
76 __u32 fpsr;
77 __u32 fpcr;
78 __uint128_t vregs[32];
79};
80
Catalin Marinas15af1942013-09-16 15:19:27 +010081/* ESR_EL1 context */
82#define ESR_MAGIC 0x45535201
83
84struct esr_context {
85 struct _aarch64_ctx head;
Mark Salter5e406452014-06-11 21:14:42 +010086 __u64 esr;
Catalin Marinas15af1942013-09-16 15:19:27 +010087};
David Howells4262a722012-10-11 11:05:13 +010088
Dave Martin33f08262017-06-20 18:23:39 +010089/*
90 * extra_context: describes extra space in the signal frame for
91 * additional structures that don't fit in sigcontext.__reserved[].
92 *
93 * Note:
94 *
95 * 1) fpsimd_context, esr_context and extra_context must be placed in
96 * sigcontext.__reserved[] if present. They cannot be placed in the
97 * extra space. Any other record can be placed either in the extra
98 * space or in sigcontext.__reserved[], unless otherwise specified in
99 * this file.
100 *
101 * 2) There must not be more than one extra_context.
102 *
103 * 3) If extra_context is present, it must be followed immediately in
104 * sigcontext.__reserved[] by the terminating null _aarch64_ctx.
105 *
106 * 4) The extra space to which datap points must start at the first
107 * 16-byte aligned address immediately after the terminating null
108 * _aarch64_ctx that follows the extra_context structure in
109 * __reserved[]. The extra space may overrun the end of __reserved[],
110 * as indicated by a sufficiently large value for the size field.
111 *
112 * 5) The extra space must itself be terminated with a null
113 * _aarch64_ctx.
114 */
115#define EXTRA_MAGIC 0x45585401
116
117struct extra_context {
118 struct _aarch64_ctx head;
119 __u64 datap; /* 16-byte aligned pointer to extra space cast to __u64 */
120 __u32 size; /* size in bytes of the extra space */
121 __u32 __reserved[3];
122};
123
Dave Martind0b8cd32017-10-31 15:51:03 +0000124#define SVE_MAGIC 0x53564501
125
126struct sve_context {
127 struct _aarch64_ctx head;
128 __u16 vl;
129 __u16 __reserved[3];
130};
131
132#endif /* !__ASSEMBLY__ */
133
134/*
135 * The SVE architecture leaves space for future expansion of the
136 * vector length beyond its initial architectural limit of 2048 bits
137 * (16 quadwords).
Dave Martince699082017-10-31 15:51:20 +0000138 *
139 * See linux/Documentation/arm64/sve.txt for a description of the VL/VQ
140 * terminology.
Dave Martind0b8cd32017-10-31 15:51:03 +0000141 */
142#define SVE_VQ_BYTES 16 /* number of bytes per quadword */
143
144#define SVE_VQ_MIN 1
145#define SVE_VQ_MAX 512
146
147#define SVE_VL_MIN (SVE_VQ_MIN * SVE_VQ_BYTES)
148#define SVE_VL_MAX (SVE_VQ_MAX * SVE_VQ_BYTES)
149
150#define SVE_NUM_ZREGS 32
151#define SVE_NUM_PREGS 16
152
153#define sve_vl_valid(vl) \
154 ((vl) % SVE_VQ_BYTES == 0 && (vl) >= SVE_VL_MIN && (vl) <= SVE_VL_MAX)
155#define sve_vq_from_vl(vl) ((vl) / SVE_VQ_BYTES)
156#define sve_vl_from_vq(vq) ((vq) * SVE_VQ_BYTES)
157
158/*
159 * If the SVE registers are currently live for the thread at signal delivery,
160 * sve_context.head.size >=
161 * SVE_SIG_CONTEXT_SIZE(sve_vq_from_vl(sve_context.vl))
162 * and the register data may be accessed using the SVE_SIG_*() macros.
163 *
164 * If sve_context.head.size <
165 * SVE_SIG_CONTEXT_SIZE(sve_vq_from_vl(sve_context.vl)),
166 * the SVE registers were not live for the thread and no register data
167 * is included: in this case, the SVE_SIG_*() macros should not be
168 * used except for this check.
169 *
170 * The same convention applies when returning from a signal: a caller
171 * will need to remove or resize the sve_context block if it wants to
172 * make the SVE registers live when they were previously non-live or
173 * vice-versa. This may require the the caller to allocate fresh
174 * memory and/or move other context blocks in the signal frame.
175 *
176 * Changing the vector length during signal return is not permitted:
177 * sve_context.vl must equal the thread's current vector length when
178 * doing a sigreturn.
179 *
180 *
181 * Note: for all these macros, the "vq" argument denotes the SVE
182 * vector length in quadwords (i.e., units of 128 bits).
183 *
184 * The correct way to obtain vq is to use sve_vq_from_vl(vl). The
185 * result is valid if and only if sve_vl_valid(vl) is true. This is
186 * guaranteed for a struct sve_context written by the kernel.
187 *
188 *
189 * Additional macros describe the contents and layout of the payload.
190 * For each, SVE_SIG_x_OFFSET(args) is the start offset relative to
191 * the start of struct sve_context, and SVE_SIG_x_SIZE(args) is the
192 * size in bytes:
193 *
194 * x type description
195 * - ---- -----------
196 * REGS the entire SVE context
197 *
198 * ZREGS __uint128_t[SVE_NUM_ZREGS][vq] all Z-registers
199 * ZREG __uint128_t[vq] individual Z-register Zn
200 *
201 * PREGS uint16_t[SVE_NUM_PREGS][vq] all P-registers
202 * PREG uint16_t[vq] individual P-register Pn
203 *
204 * FFR uint16_t[vq] first-fault status register
205 *
206 * Additional data might be appended in the future.
207 */
208
209#define SVE_SIG_ZREG_SIZE(vq) ((__u32)(vq) * SVE_VQ_BYTES)
210#define SVE_SIG_PREG_SIZE(vq) ((__u32)(vq) * (SVE_VQ_BYTES / 8))
211#define SVE_SIG_FFR_SIZE(vq) SVE_SIG_PREG_SIZE(vq)
212
213#define SVE_SIG_REGS_OFFSET \
214 ((sizeof(struct sve_context) + (SVE_VQ_BYTES - 1)) \
215 / SVE_VQ_BYTES * SVE_VQ_BYTES)
216
217#define SVE_SIG_ZREGS_OFFSET SVE_SIG_REGS_OFFSET
218#define SVE_SIG_ZREG_OFFSET(vq, n) \
219 (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREG_SIZE(vq) * (n))
220#define SVE_SIG_ZREGS_SIZE(vq) \
221 (SVE_SIG_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_SIG_ZREGS_OFFSET)
222
223#define SVE_SIG_PREGS_OFFSET(vq) \
224 (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREGS_SIZE(vq))
225#define SVE_SIG_PREG_OFFSET(vq, n) \
226 (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREG_SIZE(vq) * (n))
227#define SVE_SIG_PREGS_SIZE(vq) \
228 (SVE_SIG_PREG_OFFSET(vq, SVE_NUM_PREGS) - SVE_SIG_PREGS_OFFSET(vq))
229
230#define SVE_SIG_FFR_OFFSET(vq) \
231 (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREGS_SIZE(vq))
232
233#define SVE_SIG_REGS_SIZE(vq) \
234 (SVE_SIG_FFR_OFFSET(vq) + SVE_SIG_FFR_SIZE(vq) - SVE_SIG_REGS_OFFSET)
235
236#define SVE_SIG_CONTEXT_SIZE(vq) (SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq))
Ameya Thakur3a658e72014-12-21 12:53:22 -0800237#else /* CONFIG_64BIT */
Dave Martind0b8cd32017-10-31 15:51:03 +0000238
Ameya Thakur3a658e72014-12-21 12:53:22 -0800239/*
240 * Signal context structure - contains all info to do with the state
241 * before the signal handler was invoked. Note: only add new entries
242 * to the end of the structure.
243 */
244struct sigcontext {
245 unsigned long trap_no;
246 unsigned long error_code;
247 unsigned long oldmask;
248 unsigned long arm_r0;
249 unsigned long arm_r1;
250 unsigned long arm_r2;
251 unsigned long arm_r3;
252 unsigned long arm_r4;
253 unsigned long arm_r5;
254 unsigned long arm_r6;
255 unsigned long arm_r7;
256 unsigned long arm_r8;
257 unsigned long arm_r9;
258 unsigned long arm_r10;
259 unsigned long arm_fp;
260 unsigned long arm_ip;
261 unsigned long arm_sp;
262 unsigned long arm_lr;
263 unsigned long arm_pc;
264 unsigned long arm_cpsr;
265 unsigned long fault_address;
266};
267#endif /* CONFIG_64BIT */
Dave Martind0b8cd32017-10-31 15:51:03 +0000268
David Howells4262a722012-10-11 11:05:13 +0100269#endif /* _UAPI__ASM_SIGCONTEXT_H */