1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (C) 2021 ARM Limited
4 *
5 * Check that the SVE 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_sve_vl(struct tdescr * td)19 static bool get_sve_vl(struct tdescr *td)
20 {
21 int ret = prctl(PR_SVE_GET_VL);
22 if (ret == -1)
23 return false;
24
25 vl = ret;
26
27 return true;
28 }
29
sve_vl(struct tdescr * td,siginfo_t * si,ucontext_t * uc)30 static int sve_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 sve_context *sve;
35
36 /* Get a signal context which should have a SVE frame in it */
37 if (!get_current_context(td, &sf.uc))
38 return 1;
39
40 resv_sz = GET_SF_RESV_SIZE(sf);
41 head = get_header(head, SVE_MAGIC, resv_sz, &offset);
42 if (!head) {
43 fprintf(stderr, "No SVE context\n");
44 return 1;
45 }
46 sve = (struct sve_context *)head;
47
48 if (sve->vl != vl) {
49 fprintf(stderr, "sigframe VL %u, expected %u\n",
50 sve->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 = "SVE VL",
63 .descr = "Check that we get the right SVE VL reported",
64 .feats_required = FEAT_SVE,
65 .timeout = 3,
66 .init = get_sve_vl,
67 .run = sve_vl,
68 };
69