Skip to content

Commit afe6f18

Browse files
brooniectmarinas
authored andcommitted
kselftest/arm64: Teach the generic signal context validation about ZT
Add ZT to the set of signal contexts that the shared code understands and validates the form of. Signed-off-by: Mark Brown <broonie@kernel.org> Link: https://lore.kernel.org/r/20221208-arm64-sme2-v4-17-f2fa0aef982f@kernel.org Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
1 parent 6382937 commit afe6f18

2 files changed

Lines changed: 37 additions & 0 deletions

File tree

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,26 @@ bool validate_za_context(struct za_context *za, char **err)
108108
return true;
109109
}
110110

111+
bool validate_zt_context(struct zt_context *zt, char **err)
112+
{
113+
if (!zt || !err)
114+
return false;
115+
116+
/* If the context is present there should be at least one register */
117+
if (zt->nregs == 0) {
118+
*err = "no registers";
119+
return false;
120+
}
121+
122+
/* Size should agree with the number of registers */
123+
if (zt->head.size != ZT_SIG_CONTEXT_SIZE(zt->nregs)) {
124+
*err = "register count does not match size";
125+
return false;
126+
}
127+
128+
return true;
129+
}
130+
111131
bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
112132
{
113133
bool terminated = false;
@@ -117,6 +137,7 @@ bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
117137
struct extra_context *extra = NULL;
118138
struct sve_context *sve = NULL;
119139
struct za_context *za = NULL;
140+
struct zt_context *zt = NULL;
120141
struct _aarch64_ctx *head =
121142
(struct _aarch64_ctx *)uc->uc_mcontext.__reserved;
122143
void *extra_data = NULL;
@@ -177,6 +198,13 @@ bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
177198
za = (struct za_context *)head;
178199
new_flags |= ZA_CTX;
179200
break;
201+
case ZT_MAGIC:
202+
if (flags & ZT_CTX)
203+
*err = "Multiple ZT_MAGIC";
204+
/* Size is validated in validate_za_context() */
205+
zt = (struct zt_context *)head;
206+
new_flags |= ZT_CTX;
207+
break;
180208
case EXTRA_MAGIC:
181209
if (flags & EXTRA_CTX)
182210
*err = "Multiple EXTRA_MAGIC";
@@ -234,6 +262,9 @@ bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
234262
if (new_flags & ZA_CTX)
235263
if (!validate_za_context(za, err))
236264
return false;
265+
if (new_flags & ZT_CTX)
266+
if (!validate_zt_context(zt, err))
267+
return false;
237268

238269
flags |= new_flags;
239270

@@ -245,6 +276,11 @@ bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
245276
return false;
246277
}
247278

279+
if (terminated && (flags & ZT_CTX) && !(flags & ZA_CTX)) {
280+
*err = "ZT context but no ZA context";
281+
return false;
282+
}
283+
248284
return true;
249285
}
250286

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#define SVE_CTX (1 << 1)
1919
#define ZA_CTX (1 << 2)
2020
#define EXTRA_CTX (1 << 3)
21+
#define ZT_CTX (1 << 4)
2122

2223
#define KSFT_BAD_MAGIC 0xdeadbeef
2324

0 commit comments

Comments
 (0)