Skip to content

Commit c1f67a1

Browse files
brooniectmarinas
authored andcommitted
kselftest/arm64: signal: Check SVE signal frame shows expected vector length
As a basic check that the SVE signal frame is being set up correctly verify that the vector length in the signal frame is the vector length that the process has. Signed-off-by: Mark Brown <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Catalin Marinas <[email protected]>
1 parent ace19b1 commit c1f67a1

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# SPDX-License-Identifier: GPL-2.0-only
22
mangle_*
33
fake_sigreturn_*
4+
sve_*
45
!*.[ch]
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
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+
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+
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+
};

0 commit comments

Comments
 (0)