| .. | .. |
|---|
| 77 | 77 | __uint128_t vregs[32]; |
|---|
| 78 | 78 | }; |
|---|
| 79 | 79 | |
|---|
| 80 | +/* |
|---|
| 81 | + * Note: similarly to all other integer fields, each V-register is stored in an |
|---|
| 82 | + * endianness-dependent format, with the byte at offset i from the start of the |
|---|
| 83 | + * in-memory representation of the register value containing |
|---|
| 84 | + * |
|---|
| 85 | + * bits [(7 + 8 * i) : (8 * i)] of the register on little-endian hosts; or |
|---|
| 86 | + * bits [(127 - 8 * i) : (120 - 8 * i)] on big-endian hosts. |
|---|
| 87 | + */ |
|---|
| 88 | + |
|---|
| 80 | 89 | /* ESR_EL1 context */ |
|---|
| 81 | 90 | #define ESR_MAGIC 0x45535201 |
|---|
| 82 | 91 | |
|---|
| .. | .. |
|---|
| 130 | 139 | |
|---|
| 131 | 140 | #endif /* !__ASSEMBLY__ */ |
|---|
| 132 | 141 | |
|---|
| 142 | +#include <asm/sve_context.h> |
|---|
| 143 | + |
|---|
| 133 | 144 | /* |
|---|
| 134 | 145 | * The SVE architecture leaves space for future expansion of the |
|---|
| 135 | 146 | * vector length beyond its initial architectural limit of 2048 bits |
|---|
| 136 | 147 | * (16 quadwords). |
|---|
| 137 | 148 | * |
|---|
| 138 | | - * See linux/Documentation/arm64/sve.txt for a description of the VL/VQ |
|---|
| 149 | + * See linux/Documentation/arm64/sve.rst for a description of the VL/VQ |
|---|
| 139 | 150 | * terminology. |
|---|
| 140 | 151 | */ |
|---|
| 141 | | -#define SVE_VQ_BYTES 16 /* number of bytes per quadword */ |
|---|
| 152 | +#define SVE_VQ_BYTES __SVE_VQ_BYTES /* bytes per quadword */ |
|---|
| 142 | 153 | |
|---|
| 143 | | -#define SVE_VQ_MIN 1 |
|---|
| 144 | | -#define SVE_VQ_MAX 512 |
|---|
| 154 | +#define SVE_VQ_MIN __SVE_VQ_MIN |
|---|
| 155 | +#define SVE_VQ_MAX __SVE_VQ_MAX |
|---|
| 145 | 156 | |
|---|
| 146 | | -#define SVE_VL_MIN (SVE_VQ_MIN * SVE_VQ_BYTES) |
|---|
| 147 | | -#define SVE_VL_MAX (SVE_VQ_MAX * SVE_VQ_BYTES) |
|---|
| 157 | +#define SVE_VL_MIN __SVE_VL_MIN |
|---|
| 158 | +#define SVE_VL_MAX __SVE_VL_MAX |
|---|
| 148 | 159 | |
|---|
| 149 | | -#define SVE_NUM_ZREGS 32 |
|---|
| 150 | | -#define SVE_NUM_PREGS 16 |
|---|
| 160 | +#define SVE_NUM_ZREGS __SVE_NUM_ZREGS |
|---|
| 161 | +#define SVE_NUM_PREGS __SVE_NUM_PREGS |
|---|
| 151 | 162 | |
|---|
| 152 | | -#define sve_vl_valid(vl) \ |
|---|
| 153 | | - ((vl) % SVE_VQ_BYTES == 0 && (vl) >= SVE_VL_MIN && (vl) <= SVE_VL_MAX) |
|---|
| 154 | | -#define sve_vq_from_vl(vl) ((vl) / SVE_VQ_BYTES) |
|---|
| 155 | | -#define sve_vl_from_vq(vq) ((vq) * SVE_VQ_BYTES) |
|---|
| 163 | +#define sve_vl_valid(vl) __sve_vl_valid(vl) |
|---|
| 164 | +#define sve_vq_from_vl(vl) __sve_vq_from_vl(vl) |
|---|
| 165 | +#define sve_vl_from_vq(vq) __sve_vl_from_vq(vq) |
|---|
| 156 | 166 | |
|---|
| 157 | 167 | /* |
|---|
| 158 | 168 | * If the SVE registers are currently live for the thread at signal delivery, |
|---|
| .. | .. |
|---|
| 169 | 179 | * The same convention applies when returning from a signal: a caller |
|---|
| 170 | 180 | * will need to remove or resize the sve_context block if it wants to |
|---|
| 171 | 181 | * make the SVE registers live when they were previously non-live or |
|---|
| 172 | | - * vice-versa. This may require the the caller to allocate fresh |
|---|
| 182 | + * vice-versa. This may require the caller to allocate fresh |
|---|
| 173 | 183 | * memory and/or move other context blocks in the signal frame. |
|---|
| 174 | 184 | * |
|---|
| 175 | 185 | * Changing the vector length during signal return is not permitted: |
|---|
| .. | .. |
|---|
| 203 | 213 | * FFR uint16_t[vq] first-fault status register |
|---|
| 204 | 214 | * |
|---|
| 205 | 215 | * Additional data might be appended in the future. |
|---|
| 216 | + * |
|---|
| 217 | + * Unlike vregs[] in fpsimd_context, each SVE scalable register (Z-, P- or FFR) |
|---|
| 218 | + * is encoded in memory in an endianness-invariant format, with the byte at |
|---|
| 219 | + * offset i from the start of the in-memory representation containing bits |
|---|
| 220 | + * [(7 + 8 * i) : (8 * i)] of the register value. |
|---|
| 206 | 221 | */ |
|---|
| 207 | 222 | |
|---|
| 208 | | -#define SVE_SIG_ZREG_SIZE(vq) ((__u32)(vq) * SVE_VQ_BYTES) |
|---|
| 209 | | -#define SVE_SIG_PREG_SIZE(vq) ((__u32)(vq) * (SVE_VQ_BYTES / 8)) |
|---|
| 210 | | -#define SVE_SIG_FFR_SIZE(vq) SVE_SIG_PREG_SIZE(vq) |
|---|
| 223 | +#define SVE_SIG_ZREG_SIZE(vq) __SVE_ZREG_SIZE(vq) |
|---|
| 224 | +#define SVE_SIG_PREG_SIZE(vq) __SVE_PREG_SIZE(vq) |
|---|
| 225 | +#define SVE_SIG_FFR_SIZE(vq) __SVE_FFR_SIZE(vq) |
|---|
| 211 | 226 | |
|---|
| 212 | 227 | #define SVE_SIG_REGS_OFFSET \ |
|---|
| 213 | | - ((sizeof(struct sve_context) + (SVE_VQ_BYTES - 1)) \ |
|---|
| 214 | | - / SVE_VQ_BYTES * SVE_VQ_BYTES) |
|---|
| 228 | + ((sizeof(struct sve_context) + (__SVE_VQ_BYTES - 1)) \ |
|---|
| 229 | + / __SVE_VQ_BYTES * __SVE_VQ_BYTES) |
|---|
| 215 | 230 | |
|---|
| 216 | | -#define SVE_SIG_ZREGS_OFFSET SVE_SIG_REGS_OFFSET |
|---|
| 231 | +#define SVE_SIG_ZREGS_OFFSET \ |
|---|
| 232 | + (SVE_SIG_REGS_OFFSET + __SVE_ZREGS_OFFSET) |
|---|
| 217 | 233 | #define SVE_SIG_ZREG_OFFSET(vq, n) \ |
|---|
| 218 | | - (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREG_SIZE(vq) * (n)) |
|---|
| 219 | | -#define SVE_SIG_ZREGS_SIZE(vq) \ |
|---|
| 220 | | - (SVE_SIG_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_SIG_ZREGS_OFFSET) |
|---|
| 234 | + (SVE_SIG_REGS_OFFSET + __SVE_ZREG_OFFSET(vq, n)) |
|---|
| 235 | +#define SVE_SIG_ZREGS_SIZE(vq) __SVE_ZREGS_SIZE(vq) |
|---|
| 221 | 236 | |
|---|
| 222 | 237 | #define SVE_SIG_PREGS_OFFSET(vq) \ |
|---|
| 223 | | - (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREGS_SIZE(vq)) |
|---|
| 238 | + (SVE_SIG_REGS_OFFSET + __SVE_PREGS_OFFSET(vq)) |
|---|
| 224 | 239 | #define SVE_SIG_PREG_OFFSET(vq, n) \ |
|---|
| 225 | | - (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREG_SIZE(vq) * (n)) |
|---|
| 226 | | -#define SVE_SIG_PREGS_SIZE(vq) \ |
|---|
| 227 | | - (SVE_SIG_PREG_OFFSET(vq, SVE_NUM_PREGS) - SVE_SIG_PREGS_OFFSET(vq)) |
|---|
| 240 | + (SVE_SIG_REGS_OFFSET + __SVE_PREG_OFFSET(vq, n)) |
|---|
| 241 | +#define SVE_SIG_PREGS_SIZE(vq) __SVE_PREGS_SIZE(vq) |
|---|
| 228 | 242 | |
|---|
| 229 | 243 | #define SVE_SIG_FFR_OFFSET(vq) \ |
|---|
| 230 | | - (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREGS_SIZE(vq)) |
|---|
| 244 | + (SVE_SIG_REGS_OFFSET + __SVE_FFR_OFFSET(vq)) |
|---|
| 231 | 245 | |
|---|
| 232 | 246 | #define SVE_SIG_REGS_SIZE(vq) \ |
|---|
| 233 | | - (SVE_SIG_FFR_OFFSET(vq) + SVE_SIG_FFR_SIZE(vq) - SVE_SIG_REGS_OFFSET) |
|---|
| 247 | + (__SVE_FFR_OFFSET(vq) + __SVE_FFR_SIZE(vq)) |
|---|
| 234 | 248 | |
|---|
| 235 | | -#define SVE_SIG_CONTEXT_SIZE(vq) (SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq)) |
|---|
| 236 | | - |
|---|
| 249 | +#define SVE_SIG_CONTEXT_SIZE(vq) \ |
|---|
| 250 | + (SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq)) |
|---|
| 237 | 251 | |
|---|
| 238 | 252 | #endif /* _UAPI__ASM_SIGCONTEXT_H */ |
|---|