Path: blob/master/tools/testing/selftests/arm64/signal/testcases/ssve_regs.c
26295 views
// SPDX-License-Identifier: GPL-2.01/*2* Copyright (C) 2021 ARM Limited3*4* Verify that the streaming SVE register context in signal frames is5* set up as expected.6*/78#include <kselftest.h>9#include <signal.h>10#include <ucontext.h>11#include <sys/prctl.h>1213#include "test_signals_utils.h"14#include "sve_helpers.h"15#include "testcases.h"1617static union {18ucontext_t uc;19char buf[1024 * 64];20} context;2122static bool sme_get_vls(struct tdescr *td)23{24int res = sve_fill_vls(VLS_USE_SME, 1);2526if (!res)27return true;2829if (res == KSFT_SKIP)30td->result = KSFT_SKIP;3132return false;33}3435static void setup_ssve_regs(void)36{37/* smstart sm; real data is TODO */38asm volatile(".inst 0xd503437f" : : : );39}4041static int do_one_sme_vl(struct tdescr *td, siginfo_t *si, ucontext_t *uc,42unsigned int vl)43{44size_t offset;45struct _aarch64_ctx *head = GET_BUF_RESV_HEAD(context);46struct sve_context *ssve;47int ret;4849fprintf(stderr, "Testing VL %d\n", vl);5051ret = prctl(PR_SME_SET_VL, vl);52if (ret != vl) {53fprintf(stderr, "Failed to set VL, got %d\n", ret);54return 1;55}5657/*58* Get a signal context which should have a SVE frame and registers59* in it.60*/61setup_ssve_regs();62if (!get_current_context(td, &context.uc, sizeof(context)))63return 1;6465head = get_header(head, SVE_MAGIC, GET_BUF_RESV_SIZE(context),66&offset);67if (!head) {68fprintf(stderr, "No SVE context\n");69return 1;70}7172ssve = (struct sve_context *)head;73if (ssve->vl != vl) {74fprintf(stderr, "Got VL %d, expected %d\n", ssve->vl, vl);75return 1;76}7778if (!(ssve->flags & SVE_SIG_FLAG_SM)) {79fprintf(stderr, "SVE_SIG_FLAG_SM not set in SVE record\n");80return 1;81}8283/* The actual size validation is done in get_current_context() */84fprintf(stderr, "Got expected size %u and VL %d\n",85head->size, ssve->vl);8687if (get_svcr() != 0) {88fprintf(stderr, "Unexpected SVCR %lx\n", get_svcr());89return 1;90}9192return 0;93}9495static int sme_regs(struct tdescr *td, siginfo_t *si, ucontext_t *uc)96{97int i;9899for (i = 0; i < nvls; i++) {100if (do_one_sme_vl(td, si, uc, vls[i]))101return 1;102}103104td->pass = 1;105106return 0;107}108109struct tdescr tde = {110.name = "Streaming SVE registers",111.descr = "Check that we get the right Streaming SVE registers reported",112.feats_required = FEAT_SME,113.timeout = 3,114.init = sme_get_vls,115.run = sme_regs,116};117118119