@@ -25,6 +25,7 @@ typedef struct sigcontext {
2525#define FPSIMD_MAGIC 0x46508001
2626#define ESR_MAGIC 0x45535201
2727#define EXTRA_MAGIC 0x45585401
28+ #define SVE_MAGIC 0x53564501
2829struct _aarch64_ctx {
2930 unsigned int magic ;
3031 unsigned int size ;
@@ -45,6 +46,44 @@ struct extra_context {
4546 unsigned int size ;
4647 unsigned int __reserved [3 ];
4748};
49+ struct sve_context {
50+ struct _aarch64_ctx head ;
51+ unsigned short vl ;
52+ unsigned short __reserved [3 ];
53+ };
54+ #define SVE_VQ_BYTES 16
55+ #define SVE_VQ_MIN 1
56+ #define SVE_VQ_MAX 512
57+ #define SVE_VL_MIN (SVE_VQ_MIN * SVE_VQ_BYTES)
58+ #define SVE_VL_MAX (SVE_VQ_MAX * SVE_VQ_BYTES)
59+ #define SVE_NUM_ZREGS 32
60+ #define SVE_NUM_PREGS 16
61+ #define sve_vl_valid (vl ) \
62+ ((vl) % SVE_VQ_BYTES == 0 && (vl) >= SVE_VL_MIN && (vl) <= SVE_VL_MAX)
63+ #define sve_vq_from_vl (vl ) ((vl) / SVE_VQ_BYTES)
64+ #define sve_vl_from_vq (vq ) ((vq) * SVE_VQ_BYTES)
65+ #define SVE_SIG_ZREG_SIZE (vq ) ((unsigned)(vq) * SVE_VQ_BYTES)
66+ #define SVE_SIG_PREG_SIZE (vq ) ((unsigned)(vq) * (SVE_VQ_BYTES / 8))
67+ #define SVE_SIG_FFR_SIZE (vq ) SVE_SIG_PREG_SIZE(vq)
68+ #define SVE_SIG_REGS_OFFSET \
69+ ((sizeof(struct sve_context) + (SVE_VQ_BYTES - 1)) \
70+ / SVE_VQ_BYTES * SVE_VQ_BYTES)
71+ #define SVE_SIG_ZREGS_OFFSET SVE_SIG_REGS_OFFSET
72+ #define SVE_SIG_ZREG_OFFSET (vq , n ) \
73+ (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREG_SIZE(vq) * (n))
74+ #define SVE_SIG_ZREGS_SIZE (vq ) \
75+ (SVE_SIG_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_SIG_ZREGS_OFFSET)
76+ #define SVE_SIG_PREGS_OFFSET (vq ) \
77+ (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREGS_SIZE(vq))
78+ #define SVE_SIG_PREG_OFFSET (vq , n ) \
79+ (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREG_SIZE(vq) * (n))
80+ #define SVE_SIG_PREGS_SIZE (vq ) \
81+ (SVE_SIG_PREG_OFFSET(vq, SVE_NUM_PREGS) - SVE_SIG_PREGS_OFFSET(vq))
82+ #define SVE_SIG_FFR_OFFSET (vq ) \
83+ (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREGS_SIZE(vq))
84+ #define SVE_SIG_REGS_SIZE (vq ) \
85+ (SVE_SIG_FFR_OFFSET(vq) + SVE_SIG_FFR_SIZE(vq) - SVE_SIG_REGS_OFFSET)
86+ #define SVE_SIG_CONTEXT_SIZE (vq ) (SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq))
4887#else
4988typedef struct {
5089 long double __regs [18 + 256 ];
0 commit comments