[PATCH v11 35/40] kselftest/arm64: signal: Handle ZA signal context in core code
Shuah Khan
skhan at linuxfoundation.org
Mon Feb 7 17:01:49 PST 2022
On 2/7/22 8:21 AM, Mark Brown wrote:
> 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 at kernel.org>
> ---
> .../arm64/signal/testcases/testcases.c | 36 +++++++++++++++++++
> .../arm64/signal/testcases/testcases.h | 3 +-
> 2 files changed, 38 insertions(+), 1 deletion(-)
>
> diff --git a/tools/testing/selftests/arm64/signal/testcases/testcases.c b/tools/testing/selftests/arm64/signal/testcases/testcases.c
> index 8c2a57fc2f9c..84c36bee4d82 100644
> --- a/tools/testing/selftests/arm64/signal/testcases/testcases.c
> +++ b/tools/testing/selftests/arm64/signal/testcases/testcases.c
> @@ -75,6 +75,31 @@ bool validate_sve_context(struct sve_context *sve, char **err)
> return true;
> }
>
> +bool validate_za_context(struct za_context *za, char **err)
> +{
> + /* Size will be rounded up to a multiple of 16 bytes */
> + size_t regs_size
> + = ((ZA_SIG_CONTEXT_SIZE(sve_vq_from_vl(za->vl)) + 15) / 16) * 16;
> +
> + if (!za || !err)
> + return false;
> +
> + /* Either a bare za_context or a za_context followed by regs data */
> + if ((za->head.size != sizeof(struct za_context)) &&
> + (za->head.size != regs_size)) {
> + *err = "bad size for ZA context";
> + return false;
> + }
> +
> + if (!sve_vl_valid(za->vl)) {
> + *err = "SME VL in ZA context invalid";
> +
> + return false;
> + }
> +
> + return true;
> +}
> +
> bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
> {
> bool terminated = false;
> @@ -82,6 +107,7 @@ bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
> int flags = 0;
> struct extra_context *extra = NULL;
> struct sve_context *sve = NULL;
> + struct za_context *za = NULL;
> struct _aarch64_ctx *head =
> (struct _aarch64_ctx *)uc->uc_mcontext.__reserved;
>
> @@ -120,6 +146,13 @@ bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
> sve = (struct sve_context *)head;
> flags |= SVE_CTX;
> break;
> + case ZA_MAGIC:
> + if (flags & ZA_CTX)
> + *err = "Multiple ZA_MAGIC";
Is this considered an error?
> + /* Size is validated in validate_za_context() */
> + za = (struct za_context *)head;
> + flags |= ZA_CTX;
> + break;
> case EXTRA_MAGIC:
> if (flags & EXTRA_CTX)
> *err = "Multiple EXTRA_MAGIC";
> @@ -165,6 +198,9 @@ bool validate_reserved(ucontext_t *uc, size_t resv_sz, char **err)
> if (flags & SVE_CTX)
> if (!validate_sve_context(sve, err))
> return false;
> + if (flags & ZA_CTX)
> + if (!validate_za_context(za, err))
If validate_za_context() finds an error, the above "Multiple ZA_MAGIC" will
be overwritten? Is that the intent?
> + return false;
>
> head = GET_RESV_NEXT_HEAD(head);
> }
> diff --git a/tools/testing/selftests/arm64/signal/testcases/testcases.h b/tools/testing/selftests/arm64/signal/testcases/testcases.h
> index ad884c135314..49f1d5de7b5b 100644
> --- a/tools/testing/selftests/arm64/signal/testcases/testcases.h
> +++ b/tools/testing/selftests/arm64/signal/testcases/testcases.h
> @@ -16,7 +16,8 @@
>
> #define FPSIMD_CTX (1 << 0)
> #define SVE_CTX (1 << 1)
> -#define EXTRA_CTX (1 << 2)
> +#define ZA_CTX (1 << 2)
> +#define EXTRA_CTX (1 << 3)
>
> #define KSFT_BAD_MAGIC 0xdeadbeef
>
>
With these explained or fixed:
Reviewed-by: Shuah Khan <skhan at linuxfoundation.org>
thanks,
-- Shuah
thanks,
-- Shuah
More information about the linux-arm-kernel
mailing list