Skip to content

Commit ace19b1

Browse files
brooniectmarinas
authored andcommitted
kselftest/arm64: signal: Support signal frames with SVE register data
A signal frame with SVE may validly either be a bare struct sve_context or a struct sve_context followed by vector length dependent register data. Support either in the generic helpers for the signal tests, and while we're at it validate the SVE vector length reported. Signed-off-by: Mark Brown <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Catalin Marinas <[email protected]>
1 parent d4e4dc4 commit ace19b1

File tree

1 file changed

+31
-3
lines changed
  • tools/testing/selftests/arm64/signal/testcases

1 file changed

+31
-3
lines changed

tools/testing/selftests/arm64/signal/testcases/testcases.c

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,38 @@ bool validate_extra_context(struct extra_context *extra, char **err)
5050
return true;
5151
}
5252

53+
bool validate_sve_context(struct sve_context *sve, char **err)
54+
{
55+
/* Size will be rounded up to a multiple of 16 bytes */
56+
size_t regs_size
57+
= ((SVE_SIG_CONTEXT_SIZE(sve_vq_from_vl(sve->vl)) + 15) / 16) * 16;
58+
59+
if (!sve || !err)
60+
return false;
61+
62+
/* Either a bare sve_context or a sve_context followed by regs data */
63+
if ((sve->head.size != sizeof(struct sve_context)) &&
64+
(sve->head.size != regs_size)) {
65+
*err = "bad size for SVE context";
66+
return false;
67+
}
68+
69+
if (!sve_vl_valid(sve->vl)) {
70+
*err = "SVE VL invalid";
71+
72+
return false;
73+
}
74+
75+
return true;
76+
}
77+
5378
bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
5479
{
5580
bool terminated = false;
5681
size_t offs = 0;
5782
int flags = 0;
5883
struct extra_context *extra = NULL;
84+
struct sve_context *sve = NULL;
5985
struct _aarch64_ctx *head =
6086
(struct _aarch64_ctx *)uc->uc_mcontext.__reserved;
6187

@@ -90,9 +116,8 @@ bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
90116
case SVE_MAGIC:
91117
if (flags & SVE_CTX)
92118
*err = "Multiple SVE_MAGIC";
93-
else if (head->size !=
94-
sizeof(struct sve_context))
95-
*err = "Bad size for sve_context";
119+
/* Size is validated in validate_sve_context() */
120+
sve = (struct sve_context *)head;
96121
flags |= SVE_CTX;
97122
break;
98123
case EXTRA_MAGIC:
@@ -137,6 +162,9 @@ bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
137162
if (flags & EXTRA_CTX)
138163
if (!validate_extra_context(extra, err))
139164
return false;
165+
if (flags & SVE_CTX)
166+
if (!validate_sve_context(sve, err))
167+
return false;
140168

141169
head = GET_RESV_NEXT_HEAD(head);
142170
}

0 commit comments

Comments
 (0)