Skip to content

Commit 1a792b5

Browse files
brooniectmarinas
authored andcommitted
kselftest/arm64: signal: Handle ZA signal context in core code
As part of the generic code for signal handling test cases we parse all signal frames to make sure they have at least the basic form we expect and that there are no unexpected frames present in the signal context. Add coverage of the ZA signal frame to this code. Signed-off-by: Mark Brown <broonie@kernel.org> Reviewed-by: Shuah Khan <skhan@linuxfoundation.org> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Link: https://lore.kernel.org/r/20220419112247.711548-34-broonie@kernel.org Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
1 parent 4126bde commit 1a792b5

2 files changed

Lines changed: 38 additions & 1 deletion

File tree

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,39 @@ bool validate_sve_context(struct sve_context *sve, char **err)
7575
return true;
7676
}
7777

78+
bool validate_za_context(struct za_context *za, char **err)
79+
{
80+
/* Size will be rounded up to a multiple of 16 bytes */
81+
size_t regs_size
82+
= ((ZA_SIG_CONTEXT_SIZE(sve_vq_from_vl(za->vl)) + 15) / 16) * 16;
83+
84+
if (!za || !err)
85+
return false;
86+
87+
/* Either a bare za_context or a za_context followed by regs data */
88+
if ((za->head.size != sizeof(struct za_context)) &&
89+
(za->head.size != regs_size)) {
90+
*err = "bad size for ZA context";
91+
return false;
92+
}
93+
94+
if (!sve_vl_valid(za->vl)) {
95+
*err = "SME VL in ZA context invalid";
96+
97+
return false;
98+
}
99+
100+
return true;
101+
}
102+
78103
bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
79104
{
80105
bool terminated = false;
81106
size_t offs = 0;
82107
int flags = 0;
83108
struct extra_context *extra = NULL;
84109
struct sve_context *sve = NULL;
110+
struct za_context *za = NULL;
85111
struct _aarch64_ctx *head =
86112
(struct _aarch64_ctx *)uc->uc_mcontext.__reserved;
87113

@@ -120,6 +146,13 @@ bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
120146
sve = (struct sve_context *)head;
121147
flags |= SVE_CTX;
122148
break;
149+
case ZA_MAGIC:
150+
if (flags & ZA_CTX)
151+
*err = "Multiple ZA_MAGIC";
152+
/* Size is validated in validate_za_context() */
153+
za = (struct za_context *)head;
154+
flags |= ZA_CTX;
155+
break;
123156
case EXTRA_MAGIC:
124157
if (flags & EXTRA_CTX)
125158
*err = "Multiple EXTRA_MAGIC";
@@ -165,6 +198,9 @@ bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
165198
if (flags & SVE_CTX)
166199
if (!validate_sve_context(sve, err))
167200
return false;
201+
if (flags & ZA_CTX)
202+
if (!validate_za_context(za, err))
203+
return false;
168204

169205
head = GET_RESV_NEXT_HEAD(head);
170206
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616

1717
#define FPSIMD_CTX (1 << 0)
1818
#define SVE_CTX (1 << 1)
19-
#define EXTRA_CTX (1 << 2)
19+
#define ZA_CTX (1 << 2)
20+
#define EXTRA_CTX (1 << 3)
2021

2122
#define KSFT_BAD_MAGIC 0xdeadbeef
2223

0 commit comments

Comments
 (0)