1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (C) 2021 ARM Limited
4 *
5 * Check that the SME vector length reported in signal contexts is the
6 * expected one.
7 */
8
9 #include <signal.h>
10 #include <ucontext.h>
11 #include <sys/prctl.h>
12
13 #include "test_signals_utils.h"
14 #include "testcases.h"
15
16 struct fake_sigframe sf;
17 unsigned int vl;
18
get_sme_vl(struct tdescr * td)19 static bool get_sme_vl(struct tdescr *td)
20 {
21 int ret = prctl(PR_SME_GET_VL);
22 if (ret == -1)
23 return false;
24
25 vl = ret;
26
27 return true;
28 }
29
sme_vl(struct tdescr * td,siginfo_t * si,ucontext_t * uc)30 static int sme_vl(struct tdescr *td, siginfo_t *si, ucontext_t *uc)
31 {
32 size_t resv_sz, offset;
33 struct _aarch64_ctx *head = GET_SF_RESV_HEAD(sf);
34 struct za_context *za;
35
36 /* Get a signal context which should have a ZA frame in it */
37 if (!get_current_context(td, &sf.uc, sizeof(sf.uc)))
38 return 1;
39
40 resv_sz = GET_SF_RESV_SIZE(sf);
41 head = get_header(head, ZA_MAGIC, resv_sz, &offset);
42 if (!head) {
43 fprintf(stderr, "No ZA context\n");
44 return 1;
45 }
46 za = (struct za_context *)head;
47
48 if (za->vl != vl) {
49 fprintf(stderr, "ZA sigframe VL %u, expected %u\n",
50 za->vl, vl);
51 return 1;
52 } else {
53 fprintf(stderr, "got expected VL %u\n", vl);
54 }
55
56 td->pass = 1;
57
58 return 0;
59 }
60
61 struct tdescr tde = {
62 .name = "SME VL",
63 .descr = "Check that we get the right SME VL reported",
64 .feats_required = FEAT_SME,
65 .timeout = 3,
66 .init = get_sme_vl,
67 .run = sme_vl,
68 };
69